diff --git a/app/assets/javascripts/app/frontend/controllers/editor.js b/app/assets/javascripts/app/frontend/controllers/editor.js index 8ffe14a7e..9c6b0accc 100644 --- a/app/assets/javascripts/app/frontend/controllers/editor.js +++ b/app/assets/javascripts/app/frontend/controllers/editor.js @@ -63,12 +63,12 @@ angular.module('app.frontend') } } }) - .controller('EditorCtrl', function ($sce, $timeout, apiController, modelManager, markdownRenderer, $rootScope) { + .controller('EditorCtrl', function ($sce, $timeout, apiController, markdownRenderer, $rootScope) { this.setNote = function(note, oldNote) { this.editorMode = 'edit'; - if(note.content.text.length == 0 && note.dummy) { + if(note.safeText().length == 0 && note.dummy) { this.focusTitle(100); } @@ -104,7 +104,7 @@ angular.module('app.frontend') } this.renderedContent = function() { - return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.content.text)); + return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText())); } var statusTimeout; @@ -207,7 +207,7 @@ angular.module('app.frontend') var original = this.note.presentation_name; this.note.presentation_name = this.url.token; - modelManager.addDirtyItems([this.note]); + this.note.dirty = true; apiController.sync(function(response){ if(!response) { diff --git a/app/assets/javascripts/app/frontend/controllers/home.js b/app/assets/javascripts/app/frontend/controllers/home.js index 912cc47f9..aa226bd12 100644 --- a/app/assets/javascripts/app/frontend/controllers/home.js +++ b/app/assets/javascripts/app/frontend/controllers/home.js @@ -5,7 +5,7 @@ angular.module('app.frontend') var onUserSet = function() { apiController.setUser($scope.defaultUser); $scope.allTag = new Tag({all: true}); - $scope.allTag.content.title = "All"; + $scope.allTag.title = "All"; $scope.tags = modelManager.tags; $scope.allTag.notes = modelManager.notes; @@ -43,14 +43,18 @@ angular.module('app.frontend') $scope.tagsSelectionMade = function(tag) { $scope.selectedTag = tag; + + if($scope.selectedNote && $scope.selectedNote.dummy) { + modelManager.removeItemLocally($scope.selectedNote); + } } $scope.tagsAddNew = function(tag) { - modelManager.addTag(tag); + modelManager.addItem(tag); } $scope.tagsSave = function(tag, callback) { - modelManager.addDirtyItems([tag]); + tag.dirty = true; apiController.sync(callback); } @@ -62,7 +66,7 @@ angular.module('app.frontend') var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid}); if(!newTag.all) { - modelManager.addTagToNote(newTag, originalNote); + modelManager.createRelationshipBetweenItems(newTag, originalNote); } apiController.sync(function(){}); @@ -75,9 +79,9 @@ angular.module('app.frontend') $scope.notesRemoveTag = function(tag) { var validNotes = Note.filterDummyNotes(tag.notes); if(validNotes == 0) { - modelManager.deleteTag(tag); + modelManager.setItemToBeDeleted(tag); // if no more notes, delete tag - apiController.deleteItem(tag, function(){ + apiController.sync(function(){ // force scope tags to update on sub directives $scope.tags = []; $timeout(function(){ @@ -94,10 +98,10 @@ angular.module('app.frontend') } $scope.notesAddNew = function(note) { - modelManager.addNote(note); + modelManager.addItem(note); if(!$scope.selectedTag.all) { - modelManager.addTagToNote($scope.selectedTag, note); + modelManager.createRelationshipBetweenItems($scope.selectedTag, note); $scope.updateAllTag(); } } @@ -107,7 +111,7 @@ angular.module('app.frontend') */ $scope.saveNote = function(note, callback) { - modelManager.addDirtyItems(note); + note.dirty = true; apiController.sync(function(){ note.hasChanges = false; @@ -120,17 +124,18 @@ angular.module('app.frontend') $scope.deleteNote = function(note) { - modelManager.deleteNote(note); + modelManager.setItemToBeDeleted(note); if(note == $scope.selectedNote) { $scope.selectedNote = null; } if(note.dummy) { + modelManager.removeItemLocally(note); return; } - apiController.deleteItem(note, function(success){}) + apiController.sync(null); } /* diff --git a/app/assets/javascripts/app/frontend/controllers/notes.js b/app/assets/javascripts/app/frontend/controllers/notes.js index fcd8856a2..fd47d8efa 100644 --- a/app/assets/javascripts/app/frontend/controllers/notes.js +++ b/app/assets/javascripts/app/frontend/controllers/notes.js @@ -110,8 +110,8 @@ angular.module('app.frontend') this.createNewNote = function() { var title = "New Note" + (this.tag.notes ? (" " + (this.tag.notes.length + 1)) : ""); - this.newNote = new Note({dummy: true}); - this.newNote.content.title = title; + this.newNote = new Note({dummy: true, text: ""}); + this.newNote.title = title; this.selectNote(this.newNote); this.addNew()(this.newNote); } @@ -122,7 +122,7 @@ angular.module('app.frontend') if(this.noteFilter.text.length == 0) { note.visible = true; } else { - note.visible = note.content.title.toLowerCase().includes(this.noteFilter.text) || note.content.text.toLowerCase().includes(this.noteFilter.text); + note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text); } return note.visible; }.bind(this) diff --git a/app/assets/javascripts/app/frontend/controllers/tags.js b/app/assets/javascripts/app/frontend/controllers/tags.js index a7d66df62..a7f3cc3c7 100644 --- a/app/assets/javascripts/app/frontend/controllers/tags.js +++ b/app/assets/javascripts/app/frontend/controllers/tags.js @@ -62,8 +62,8 @@ angular.module('app.frontend') if(this.editingTag) { return; } - - this.newTag = new Tag(); + + this.newTag = new Tag({}); this.selectedTag = this.newTag; this.editingTag = this.newTag; this.addNew()(this.newTag); @@ -71,7 +71,7 @@ angular.module('app.frontend') var originalTagName = ""; this.onTagTitleFocus = function(tag) { - originalTagName = tag.content.title; + originalTagName = tag.title; } this.tagTitleDidChange = function(tag) { @@ -80,14 +80,14 @@ angular.module('app.frontend') this.saveTag = function($event, tag) { this.editingTag = null; - if(tag.content.title.length == 0) { - tag.content.title = originalTagName; + if(tag.title.length == 0) { + tag.title = originalTagName; originalTagName = ""; return; } $event.target.blur(); - if(!tag.content.title || tag.content.title.length == 0) { + if(!tag.title || tag.title.length == 0) { return; } diff --git a/app/assets/javascripts/app/frontend/models/api/item.js b/app/assets/javascripts/app/frontend/models/api/item.js index dcb8138f2..6e1cc4a9b 100644 --- a/app/assets/javascripts/app/frontend/models/api/item.js +++ b/app/assets/javascripts/app/frontend/models/api/item.js @@ -1,54 +1,12 @@ class Item { + constructor(json_obj) { - var content; - - Object.defineProperty(this, "content", { - get: function() { - return content; - }, - set: function(value) { - var finalValue = value; - - if(typeof value === 'string') { - try { - var decodedValue = JSON.parse(value); - finalValue = decodedValue; - } - catch(e) { - finalValue = value; - } - } - content = finalValue; - }, - enumerable: true, - }); - - _.merge(this, json_obj); - - if(this.created_at) { - this.created_at = new Date(this.created_at); - this.updated_at = new Date(this.updated_at); - } else { - this.created_at = new Date(); - this.updated_at = new Date(); - } + this.updateFromJSON(json_obj); if(!this.uuid) { this.uuid = Neeto.crypto.generateUUID(); } - - this.setContentRaw = function(rawContent) { - content = rawContent; - } - - if(!this.content) { - this.content = {}; - } - - if(!this.content.references) { - this.content.references = []; - } } static sortItemsByDate(items) { @@ -57,31 +15,67 @@ class Item { }); } - addReference(reference) { - this.content.references.push(reference); - this.content.references = _.uniq(this.content.references); - this.updateReferencesLocalMapping(); + get contentObject() { + // console.log("getting content object from content", this.content); + if(!this.content) { + return {}; + } + + if(this.content !== null && typeof this.content === 'object') { + // this is the case when mapping localStorage content, in which case the content is already parsed + return this.content; + } + + return JSON.parse(this.content); } - removeReference(reference) { - _.remove(this.content.references, _.find(this.content.references, {uuid: reference.uuid})); - this.updateReferencesLocalMapping(); + updateFromJSON(json) { + _.merge(this, json); + if(this.created_at) { + this.created_at = new Date(this.created_at); + this.updated_at = new Date(this.updated_at); + } else { + this.created_at = new Date(); + this.updated_at = new Date(); + } + + if(json.content) { + this.mapContentToLocalProperties(this.contentObject); + } } - referencesMatchingContentType(contentType) { - return this.content.references.filter(function(reference){ - return reference.content_type == contentType; - }); + mapContentToLocalProperties(contentObj) { + + } + + createContentJSONFromProperties() { + return this.structureParams(); + } + + referenceParams() { + // must override + } + + structureParams() { + return {references: this.referenceParams()} + } + + addItemAsRelationship(item) { + // must override + } + + removeItemAsRelationship(item) { + // must override + } + + removeFromRelationships() { + // must override } mergeMetadataFromItem(item) { _.merge(this, _.omit(item, ["content"])); } - updateReferencesLocalMapping() { - // should be overriden to manage local properties - } - referencesAffectedBySharingChange() { // should be overriden to determine which references should be decrypted/encrypted return null; @@ -92,7 +86,7 @@ class Item { } isEncrypted() { - return this.encryptionEnabled() && typeof this.content === 'string' ? true : false; + return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false; } encryptionEnabled() { diff --git a/app/assets/javascripts/app/frontend/models/app/extension.js b/app/assets/javascripts/app/frontend/models/app/extension.js index 282f87953..d98817151 100644 --- a/app/assets/javascripts/app/frontend/models/app/extension.js +++ b/app/assets/javascripts/app/frontend/models/app/extension.js @@ -1,5 +1,6 @@ class Extension extends Item { constructor(json) { + super(json); _.merge(this, json); this.actions = this.actions.map(function(action){ diff --git a/app/assets/javascripts/app/frontend/models/app/note.js b/app/assets/javascripts/app/frontend/models/app/note.js index 2aa891b26..3b444fe75 100644 --- a/app/assets/javascripts/app/frontend/models/app/note.js +++ b/app/assets/javascripts/app/frontend/models/app/note.js @@ -6,14 +6,52 @@ class Note extends Item { if(!this.tags) { this.tags = []; } + } - if(!this.content.title) { - this.content.title = ""; - } + mapContentToLocalProperties(contentObject) { + super.mapContentToLocalProperties(contentObject) + this.title = contentObject.title; + this.text = contentObject.text; + } - if(!this.content.text) { - this.content.text = ""; + referenceParams() { + var references = _.map(this.tags, function(tag){ + return {uuid: tag.uuid, content_type: tag.content_type}; + }) + return references; + } + + structureParams() { + var params = { + title: this.title, + text: this.text + }; + + _.merge(params, super.structureParams()); + return params; + } + + addItemAsRelationship(item) { + if(item.content_type == "Tag") { + if(!_.find(this.tags, item)) { + this.tags.push(item); + } } + super.addItemAsRelationship(item); + } + + removeItemAsRelationship(item) { + if(item.content_type == "Tag") { + _.pull(this.tags, item); + } + super.removeItemAsRelationship(item); + } + + removeFromRelationships() { + this.tags.forEach(function(tag){ + _.pull(tag.notes, this); + tag.dirty = true; + }) } static filterDummyNotes(notes) { @@ -21,11 +59,6 @@ class Note extends Item { return filtered; } - updateReferencesLocalMapping() { - super.updateReferencesLocalMapping(); - this.tags = this.referencesMatchingContentType("Tag"); - } - referencesAffectedBySharingChange() { return super.referencesAffectedBySharingChange(); } @@ -39,6 +72,14 @@ class Note extends Item { return false; } + safeText() { + return this.text || ""; + } + + safeTitle() { + return this.title || ""; + } + toJSON() { return {uuid: this.uuid} } diff --git a/app/assets/javascripts/app/frontend/models/app/tag.js b/app/assets/javascripts/app/frontend/models/app/tag.js index 31c20745f..7bd4f74c4 100644 --- a/app/assets/javascripts/app/frontend/models/app/tag.js +++ b/app/assets/javascripts/app/frontend/models/app/tag.js @@ -6,22 +6,57 @@ class Tag extends Item { if(!this.notes) { this.notes = []; } + } - if(!this.content.title) { - this.content.title = ""; + mapContentToLocalProperties(contentObject) { + super.mapContentToLocalProperties(contentObject) + this.title = contentObject.title; + } + + referenceParams() { + var references = _.map(this.notes, function(note){ + return {uuid: note.uuid, content_type: note.content_type}; + }) + return references; + } + + structureParams() { + var params = { + title: this.title + }; + + _.merge(params, super.structureParams()); + return params; + } + + addItemAsRelationship(item) { + if(item.content_type == "Note") { + if(!_.find(this.notes, item)) { + this.notes.unshift(item); + } } + super.addItemAsRelationship(item); + } + + removeItemAsRelationship(item) { + if(item.content_type == "Note") { + _.pull(this.notes, item); + } + super.removeItemAsRelationship(item); + } + + removeFromRelationships() { + this.notes.forEach(function(note){ + _.pull(note.tags, this); + note.dirty = true; + }) } get content_type() { return "Tag"; } - updateReferencesLocalMapping() { - super.updateReferencesLocalMapping(); - this.notes = this.referencesMatchingContentType("Note"); - } - referencesAffectedBySharingChange() { - return this.referencesMatchingContentType("Note"); + return this.notes; } } diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index e2d822db1..3c0db048a 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -218,20 +218,24 @@ angular.module('app.frontend') this.syncWithOptions = function(callback, options = {}) { if(!this.user.uuid) { - this.writeItemsToLocalStorage(); - modelManager.clearDirtyItems(); - if(callback) { - callback(); - } + this.writeItemsToLocalStorage(function(responseItems){ + this.handleItemsResponse(responseItems); + modelManager.clearDirtyItems(); + if(callback) { + callback(); + } + }.bind(this)) return; } - var dirtyItems = modelManager.dirtyItems; + var dirtyItems = modelManager.getDirtyItems(); var request = Restangular.one("items/sync"); 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; } @@ -272,11 +276,10 @@ angular.module('app.frontend') this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) { var itemCopy = _.cloneDeep(item); - var params = {uuid: item.uuid, content_type: item.content_type, presentation_name: item.presentation_name, deleted: item.deleted}; + console.assert(!item.dummy, "Item is dummy, should not have gotten here.", item.dummy) - itemCopy.content.references = _.map(itemCopy.content.references, function(reference){ - return {uuid: reference.uuid, content_type: reference.content_type}; - }) + var params = {uuid: item.uuid, content_type: item.content_type, + presentation_name: item.presentation_name, deleted: item.deleted}; if(encrypted) { this.encryptSingleItem(itemCopy, this.retrieveMk()); @@ -285,7 +288,7 @@ angular.module('app.frontend') params.auth_hash = itemCopy.auth_hash; } else { - params.content = forExportFile ? itemCopy.content : "000" + Neeto.crypto.base64(JSON.stringify(itemCopy.content)); + params.content = forExportFile ? itemCopy.content : "000" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties())); if(!forExportFile) { params.enc_item_key = null; params.auth_hash = null; @@ -299,13 +302,6 @@ angular.module('app.frontend') return params; } - - this.deleteItem = function(item, callback) { - item.deleted = true; - modelManager.addDirtyItems([item]); - this.sync(callback); - } - this.shareItem = function(item, callback) { if(!this.user.uuid) { alert("You must be signed in to share."); @@ -315,7 +311,9 @@ angular.module('app.frontend') var shareFn = function() { item.presentation_name = "_auto_"; var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); - modelManager.addDirtyItems(needsUpdate); + needsUpdate.forEach(function(needingUpdate){ + needingUpdate.dirty = true; + }) this.sync(); }.bind(this) @@ -340,7 +338,9 @@ angular.module('app.frontend') this.unshareItem = function(item, callback) { item.presentation_name = null; var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); - modelManager.addDirtyItems(needsUpdate); + needsUpdate.forEach(function(needingUpdate){ + needingUpdate.dirty = true; + }) this.sync(null); } @@ -351,7 +351,9 @@ angular.module('app.frontend') this.importJSONData = function(jsonString, callback) { var data = JSON.parse(jsonString); modelManager.mapResponseItemsToLocalModels(data.items); - modelManager.addDirtyItems(modelManager.items); + modelManager.items.forEach(function(item){ + item.dirty = true; + }) this.syncWithOptions(callback, {additionalFields: ["created_at", "updated_at"]}); } @@ -399,7 +401,7 @@ angular.module('app.frontend') request.items.forEach(function(item){ if(item.tag_id) { var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0]; - item.tag_name = tag.content.title; + item.tag_name = tag.title; } }) request.post().then(function(response){ @@ -417,11 +419,13 @@ angular.module('app.frontend') return JSON.parse(JSON.stringify(object)); } - this.writeItemsToLocalStorage = function() { + this.writeItemsToLocalStorage = function(callback) { var items = _.map(modelManager.items, function(item){ - return this.paramsForItem(item, false, ["created_at", "updated_at"], true) + return this.paramsForItem(item, false, ["created_at", "updated_at"], false) }.bind(this)); + console.log("writing items to local", items); this.writeToLocalStorage('items', items); + callback(items); } this.writeToLocalStorage = function(key, value) { @@ -431,7 +435,7 @@ angular.module('app.frontend') this.loadLocalItemsAndUser = function() { var user = {}; var items = JSON.parse(localStorage.getItem('items')) || []; - items = modelManager.mapResponseItemsToLocalModels(items); + items = this.handleItemsResponse(items); Item.sortItemsByDate(items); user.items = items; user.shouldMerge = true; @@ -490,7 +494,7 @@ angular.module('app.frontend') var ek = Neeto.crypto.firstHalfOfKey(item_key); var ak = Neeto.crypto.secondHalfOfKey(item_key); - var encryptedContent = "001" + Neeto.crypto.encryptText(JSON.stringify(item.content), ek); + var encryptedContent = "001" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek); var authHash = Neeto.crypto.hmac256(encryptedContent, ak); item.content = encryptedContent; diff --git a/app/assets/javascripts/app/services/itemManager.js b/app/assets/javascripts/app/services/itemManager.js index 89977ba08..e69de29bb 100644 --- a/app/assets/javascripts/app/services/itemManager.js +++ b/app/assets/javascripts/app/services/itemManager.js @@ -1,112 +0,0 @@ -class ItemManager { - - constructor() { - this._items = []; - } - - get items() { - return this._items; - } - - findItem(itemId) { - return _.find(this.items, {uuid: itemId}); - } - - addItems(items) { - this._items = _.uniq(this.items.concat(items)); - } - - mapResponseItemsToLocalModels(items) { - return this.mapResponseItemsToLocalModelsOmittingFields(items, null) - } - - mapResponseItemsToLocalModelsOmittingFields(items, omitFields) { - var models = [] - for (var json_obj of items) { - json_obj = _.omit(json_obj, omitFields || []) - var item = this.findItem(json_obj["uuid"]); - if(json_obj["deleted"] == true) { - if(item) { - this.deleteItem(item) - } - continue; - } - - if(item) { - _.merge(item, json_obj); - } else { - item = this.createItem(json_obj); - } - - models.push(item) - } - this.addItems(models) - this.resolveReferences() - return models; - } - - createItem(json_obj) { - if(json_obj.content_type == "Note") { - return new Note(json_obj); - } else if(json_obj.content_type == "Tag") { - return new Tag(json_obj); - } else { - return new Item(json_obj); - } - } - - resolveReferences() { - this.items.forEach(function(item){ - // build out references, safely handle broken references - item.content.references = _.reduce(item.content.references, function(accumulator, reference){ - var item = this.findItem(reference.uuid); - if(item) { - accumulator.push(item); - } - return accumulator; - }.bind(this), []); - }.bind(this)); - } - - itemsForContentType(contentType) { - return this.items.filter(function(item){ - return item.content_type == contentType; - }); - } - - addItem(item) { - if(!this.findItem(item.uuid)) { - this.items.push(item); - } - } - - // returns dirty item references that need saving - deleteItem(item) { - var dirty = []; - _.remove(this.items, item); - var length = item.content.references.length; - // note that references are deleted in this for loop, so you have to be careful how you iterate - for(var i = 0; i < length; i++) { - var referencedItem = item.content.references[0]; - // console.log("removing references between items", referencedItem, item); - var _dirty = this.removeReferencesBetweenItems(referencedItem, item); - dirty = dirty.concat(_dirty); - } - - return dirty; - } - - removeReferencesBetweenItems(itemOne, itemTwo) { - itemOne.removeReference(itemTwo); - itemTwo.removeReference(itemOne); - return [itemOne, itemTwo]; - } - - createReferencesBetweenItems(itemOne, itemTwo) { - itemOne.addReference(itemTwo); - itemTwo.addReference(itemOne); - return [itemOne, itemTwo]; - } -} - -angular.module('app.frontend').service('itemManager', ItemManager); diff --git a/app/assets/javascripts/app/services/modelManager.js b/app/assets/javascripts/app/services/modelManager.js index 0a940a02f..af2eea3d5 100644 --- a/app/assets/javascripts/app/services/modelManager.js +++ b/app/assets/javascripts/app/services/modelManager.js @@ -1,25 +1,107 @@ -class ModelManager extends ItemManager { +class ModelManager { constructor() { - super(); this.notes = []; this.tags = []; - this.dirtyItems = []; this.changeObservers = []; + this.items = []; + } + + findItem(itemId) { + return _.find(this.items, {uuid: itemId}); + } + + mapResponseItemsToLocalModels(items) { + return this.mapResponseItemsToLocalModelsOmittingFields(items, null); + } + + mapResponseItemsToLocalModelsOmittingFields(items, omitFields) { + var models = [] + for (var json_obj of items) { + json_obj = _.omit(json_obj, omitFields || []) + var item = this.findItem(json_obj["uuid"]); + if(json_obj["deleted"] == true) { + if(item) { + this.removeItemLocally(item) + } + continue; + } + + _.omit(json_obj, omitFields); + + if(!item) { + item = this.createItem(json_obj); + } else { + item.updateFromJSON(json_obj); + } + + models.push(item) + } + this.addItems(models) + this.resolveReferences() + return models; + } + + createItem(json_obj) { + if(json_obj.content_type == "Note") { + return new Note(json_obj); + } else if(json_obj.content_type == "Tag") { + return new Tag(json_obj); + } else { + return new Item(json_obj); + } + } + + addItems(items) { + this.items = _.uniq(this.items.concat(items)); + + items.forEach(function(item){ + if(item.content_type == "Tag") { + if(!_.find(this.tags, {uuid: item.uuid})) { + this.tags.unshift(item); + } + } else if(item.content_type == "Note") { + if(!_.find(this.notes, {uuid: item.uuid})) { + this.notes.unshift(item); + } + } + }.bind(this)) + + } + + addItem(item) { + this.addItems([item]) + } + + itemsForContentType(contentType) { + return this.items.filter(function(item){ + return item.content_type == contentType; + }); } resolveReferences() { - super.resolveReferences() + for(var item of this.items) { + var contentObject = item.contentObject; + if(!contentObject.references) { + continue; + } + + for(var reference of contentObject.references) { + var referencedItem = this.findItem(reference.uuid); + if(referencedItem) { + item.addItemAsRelationship(referencedItem); + } else { + console.log("Unable to find item:", reference.uuid); + } + } + } this.notes.push.apply(this.notes, _.difference(this.itemsForContentType("Note"), this.notes)); Item.sortItemsByDate(this.notes); - this.notes.forEach(function(note){ - note.updateReferencesLocalMapping(); - }) this.tags.push.apply(this.tags, _.difference(this.itemsForContentType("Tag"), this.tags)); this.tags.forEach(function(tag){ - tag.updateReferencesLocalMapping(); + Item.sortItemsByDate(tag.notes); }) } @@ -31,86 +113,65 @@ class ModelManager extends ItemManager { _.remove(this.changeObservers, _.find(this.changeObservers, {id: id})); } - addDirtyItems(items) { - if(!(items instanceof Array)) { - items = [items]; - } - - this.dirtyItems = this.dirtyItems.concat(items); - this.dirtyItems = _.uniq(this.dirtyItems); - } - get filteredNotes() { return Note.filterDummyNotes(this.notes); } - clearDirtyItems() { - console.log("Clearing dirty items", this.dirtyItems); + notifyObserversOfSyncCompletion() { for(var observer of this.changeObservers) { var changedItems = this.dirtyItems.filter(function(item){return item.content_type == observer.type}); console.log("observer:", observer, "items", changedItems); observer.callback(changedItems); } - this.dirtyItems = []; } - addNote(note) { - if(!_.find(this.notes, {uuid: note.uuid})) { - this.notes.unshift(note); - this.addItem(note); + getDirtyItems() { + return this.items.filter(function(item){return item.dirty == true && !item.dummy}) + } + + clearDirtyItems() { + this.notifyObserversOfSyncCompletion(); + + this.getDirtyItems().forEach(function(item){ + item.dirty = false; + }) + } + + setItemToBeDeleted(item) { + item.deleted = true; + item.dirty = true; + item.removeFromRelationships(); + } + + removeItemLocally(item) { + _.pull(this.items, item); + + if(item.content_type == "Tag") { + _.pull(this.tags, item); + } else if(item.content_type == "Note") { + _.pull(this.notes, item); } } - addTag(tag) { - this.tags.unshift(tag); - this.addItem(tag); + /* + Relationships + */ + + createRelationshipBetweenItems(itemOne, itemTwo) { + itemOne.addItemAsRelationship(itemTwo); + itemTwo.addItemAsRelationship(itemOne); + + itemOne.dirty = true; + itemTwo.dirty = true; } - addTagToNote(tag, note) { - var dirty = this.createReferencesBetweenItems(tag, note); - this.refreshRelationshipsForTag(tag); - this.refreshRelationshipsForNote(note); - this.addDirtyItems(dirty); - } + removeRelationshipBetweenItems(itemOne, itemTwo) { + itemOne.removeItemAsRelationship(itemTwo); + itemTwo.removeItemAsRelationship(itemOne); - refreshRelationshipsForTag(tag) { - tag.notes = tag.referencesMatchingContentType("Note"); - Item.sortItemsByDate(tag.notes); + itemOne.dirty = true; + itemTwo.dirty = true; } - - refreshRelationshipsForNote(note) { - note.tags = note.referencesMatchingContentType("Tag"); - } - - removeTagFromNote(tag, note) { - var dirty = this.removeReferencesBetweenItems(tag, note); - this.addDirtyItems(dirty); - } - - deleteItem(item) { - var dirty = super.deleteItem(item); - if(item.content_type == "Note") { - _.remove(this.notes, item); - } else if(item.content_type == "Tag") { - _.remove(this.tags, item); - } - return dirty; - } - - deleteNote(note) { - var dirty = this.deleteItem(note); - _.remove(this.notes, note); - if(!note.dummy) { - this.addDirtyItems(dirty); - } - } - - deleteTag(tag) { - var dirty = this.deleteItem(tag); - _.remove(this.tags, tag); - this.addDirtyItems(dirty); - } - } angular.module('app.frontend').service('modelManager', ModelManager); diff --git a/app/assets/templates/frontend/editor.html.haml b/app/assets/templates/frontend/editor.html.haml index e71dff27f..33ae72a9a 100644 --- a/app/assets/templates/frontend/editor.html.haml +++ b/app/assets/templates/frontend/editor.html.haml @@ -2,7 +2,7 @@ .content .section-title-bar.editor-heading{"ng-class" => "{'shared' : ctrl.note.isPublic() }"} .title - %input.input#note-title-editor{"ng-model" => "ctrl.note.content.title", "ng-keyup" => "$event.keyCode == 13 && ctrl.saveTitle($event)", + %input.input#note-title-editor{"ng-model" => "ctrl.note.title", "ng-keyup" => "$event.keyCode == 13 && ctrl.saveTitle($event)", "ng-disabled" => "ctrl.note.locked", "ng-change" => "ctrl.nameChanged()", "ng-focus" => "ctrl.onNameFocus()", "select-on-click" => "true"} .save-status {{ctrl.noteStatus}} @@ -51,8 +51,6 @@ .sampler-container{"ng-if" => "ctrl.showSampler", "ng-click" => "ctrl.focusEditor()"} %strong.name-sampler.sampler{"typewrite" => "true", "text" => "ctrl.demoNoteNames", "type-delay" => "30", "initial-delay" => "1.5s", "iteration-callback" => "ctrl.callback", "prebegin-fn" => "ctrl.prebeginFn", "iteration-delay" => "2000", "cursor" => ""} - %code{"ng-if" => "ctrl.currentDemoContent.text"} - .content-sampler.sampler{"typewrite" => "true", "text" => "ctrl.currentDemoContent.text", "type-delay" => "10", "iteration-callback" => "ctrl.contentCallback"} - %textarea.editable#note-text-editor{"ng-disabled" => "ctrl.note.locked", "ng-show" => "ctrl.editorMode == 'edit'", "ng-model" => "ctrl.note.content.text", + %textarea.editable#note-text-editor{"ng-disabled" => "ctrl.note.locked", "ng-show" => "ctrl.editorMode == 'edit'", "ng-model" => "ctrl.note.text", "ng-change" => "ctrl.contentChanged()", "ng-click" => "ctrl.clickedTextArea()", "ng-focus" => "ctrl.onContentFocus()"} .preview{"ng-if" => "ctrl.editorMode == 'preview'", "ng-bind-html" => "ctrl.renderedContent()", "ng-dblclick" => "ctrl.onPreviewDoubleClick()"} diff --git a/app/assets/templates/frontend/notes.html.haml b/app/assets/templates/frontend/notes.html.haml index d075bd8bb..da1ad6684 100644 --- a/app/assets/templates/frontend/notes.html.haml +++ b/app/assets/templates/frontend/notes.html.haml @@ -1,7 +1,7 @@ .section.notes .content .section-title-bar.notes-title-bar - .title {{ctrl.tag.content.title}} notes + .title {{ctrl.tag.title}} notes .add-button{"ng-click" => "ctrl.createNewNote()"} + %br .filter-section @@ -34,5 +34,5 @@ "ng-click" => "ctrl.selectNote(note)", "ng-class" => "{'selected' : ctrl.selectedNote == note}", "ng-attr-draggable" => "{{note.dummy ? undefined : 'true'}}", "note" => "note"} .name - {{note.content.title}} + {{note.title}} .date {{(note.created_at | appDateTime) || 'Now'}} diff --git a/app/assets/templates/frontend/tags.html.haml b/app/assets/templates/frontend/tags.html.haml index 83ffba5e2..b865d4880 100644 --- a/app/assets/templates/frontend/tags.html.haml +++ b/app/assets/templates/frontend/tags.html.haml @@ -6,13 +6,13 @@ {{ctrl.test}} .tag{"ng-if" => "ctrl.allTag", "ng-click" => "ctrl.selectTag(ctrl.allTag)", "ng-class" => "{'selected' : ctrl.selectedTag == ctrl.allTag}", "droppable" => true, "drop" => "ctrl.handleDrop", "tag" => "ctrl.allTag"} - %input.title{"ng-disabled" => "true", "ng-model" => "ctrl.allTag.content.title"} + %input.title{"ng-disabled" => "true", "ng-model" => "ctrl.allTag.title"} .count {{ctrl.noteCount(ctrl.allTag)}} .tag{"ng-repeat" => "tag in ctrl.tags", "ng-click" => "ctrl.selectTag(tag)", "ng-class" => "{'selected' : ctrl.selectedTag == tag}", "droppable" => true, "drop" => "ctrl.handleDrop", "tag" => "tag"} .icon.icon-rss{"ng-if" => "tag.isPublic()"} - %input.title{"ng-disabled" => "tag != ctrl.selectedTag", "ng-model" => "tag.content.title", + %input.title{"ng-disabled" => "tag != ctrl.selectedTag", "ng-model" => "tag.title", "ng-keyup" => "$event.keyCode == 13 && ctrl.saveTag($event, tag)", "mb-autofocus" => "true", "should-focus" => "ctrl.newTag", "ng-change" => "ctrl.tagTitleDidChange(tag)", "ng-focus" => "ctrl.onTagTitleFocus(tag)"} .count {{ctrl.noteCount(tag)}} diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index 8f61addaf..2fc2bf03a 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", { var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } @@ -513,12 +515,12 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); }); } }; -}).controller('EditorCtrl', function ($sce, $timeout, apiController, modelManager, markdownRenderer, $rootScope) { +}).controller('EditorCtrl', function ($sce, $timeout, apiController, markdownRenderer, $rootScope) { this.setNote = function (note, oldNote) { this.editorMode = 'edit'; - if (note.content.text.length == 0 && note.dummy) { + if (note.safeText().length == 0 && note.dummy) { this.focusTitle(100); } @@ -554,7 +556,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); }; this.renderedContent = function () { - return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.content.text)); + return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText())); }; var statusTimeout; @@ -654,7 +656,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); var original = this.note.presentation_name; this.note.presentation_name = this.url.token; - modelManager.addDirtyItems([this.note]); + this.note.dirty = true; apiController.sync(function (response) { if (!response) { @@ -916,7 +918,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); var onUserSet = function onUserSet() { apiController.setUser($scope.defaultUser); $scope.allTag = new Tag({ all: true }); - $scope.allTag.content.title = "All"; + $scope.allTag.title = "All"; $scope.tags = modelManager.tags; $scope.allTag.notes = modelManager.notes; @@ -954,14 +956,18 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); $scope.tagsSelectionMade = function (tag) { $scope.selectedTag = tag; + + if ($scope.selectedNote && $scope.selectedNote.dummy) { + modelManager.removeItemLocally($scope.selectedNote); + } }; $scope.tagsAddNew = function (tag) { - modelManager.addTag(tag); + modelManager.addItem(tag); }; $scope.tagsSave = function (tag, callback) { - modelManager.addDirtyItems([tag]); + tag.dirty = true; apiController.sync(callback); }; @@ -973,7 +979,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); var originalNote = _.find(modelManager.notes, { uuid: noteCopy.uuid }); if (!newTag.all) { - modelManager.addTagToNote(newTag, originalNote); + modelManager.createRelationshipBetweenItems(newTag, originalNote); } apiController.sync(function () {}); @@ -986,9 +992,9 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); $scope.notesRemoveTag = function (tag) { var validNotes = Note.filterDummyNotes(tag.notes); if (validNotes == 0) { - modelManager.deleteTag(tag); + modelManager.setItemToBeDeleted(tag); // if no more notes, delete tag - apiController.deleteItem(tag, function () { + apiController.sync(function () { // force scope tags to update on sub directives $scope.tags = []; $timeout(function () { @@ -1005,10 +1011,10 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); }; $scope.notesAddNew = function (note) { - modelManager.addNote(note); + modelManager.addItem(note); if (!$scope.selectedTag.all) { - modelManager.addTagToNote($scope.selectedTag, note); + modelManager.createRelationshipBetweenItems($scope.selectedTag, note); $scope.updateAllTag(); } }; @@ -1018,7 +1024,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); */ $scope.saveNote = function (note, callback) { - modelManager.addDirtyItems(note); + note.dirty = true; apiController.sync(function () { note.hasChanges = false; @@ -1031,17 +1037,18 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); $scope.deleteNote = function (note) { - modelManager.deleteNote(note); + modelManager.setItemToBeDeleted(note); if (note == $scope.selectedNote) { $scope.selectedNote = null; } if (note.dummy) { + modelManager.removeItemLocally(note); return; } - apiController.deleteItem(note, function (success) {}); + apiController.sync(null); }; /* @@ -1161,8 +1168,8 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); this.createNewNote = function () { var title = "New Note" + (this.tag.notes ? " " + (this.tag.notes.length + 1) : ""); - this.newNote = new Note({ dummy: true }); - this.newNote.content.title = title; + this.newNote = new Note({ dummy: true, text: "" }); + this.newNote.title = title; this.selectNote(this.newNote); this.addNew()(this.newNote); }; @@ -1173,7 +1180,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); if (this.noteFilter.text.length == 0) { note.visible = true; } else { - note.visible = note.content.title.toLowerCase().includes(this.noteFilter.text) || note.content.text.toLowerCase().includes(this.noteFilter.text); + note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text); } return note.visible; }.bind(this); @@ -1249,7 +1256,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); return; } - this.newTag = new Tag(); + this.newTag = new Tag({}); this.selectedTag = this.newTag; this.editingTag = this.newTag; this.addNew()(this.newTag); @@ -1257,7 +1264,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); var originalTagName = ""; this.onTagTitleFocus = function (tag) { - originalTagName = tag.content.title; + originalTagName = tag.title; }; this.tagTitleDidChange = function (tag) { @@ -1266,14 +1273,14 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); this.saveTag = function ($event, tag) { this.editingTag = null; - if (tag.content.title.length == 0) { - tag.content.title = originalTagName; + if (tag.title.length == 0) { + tag.title = originalTagName; originalTagName = ""; return; } $event.target.blur(); - if (!tag.content.title || tag.content.title.length == 0) { + if (!tag.title || tag.title.length == 0) { return; } @@ -1310,85 +1317,67 @@ var Item = function () { function Item(json_obj) { _classCallCheck(this, Item); - var content; - - Object.defineProperty(this, "content", { - get: function get() { - return content; - }, - set: function set(value) { - var finalValue = value; - - if (typeof value === 'string') { - try { - var decodedValue = JSON.parse(value); - finalValue = decodedValue; - } catch (e) { - finalValue = value; - } - } - content = finalValue; - }, - enumerable: true - }); - - _.merge(this, json_obj); - - if (this.created_at) { - this.created_at = new Date(this.created_at); - this.updated_at = new Date(this.updated_at); - } else { - this.created_at = new Date(); - this.updated_at = new Date(); - } + this.updateFromJSON(json_obj); if (!this.uuid) { this.uuid = Neeto.crypto.generateUUID(); } - - this.setContentRaw = function (rawContent) { - content = rawContent; - }; - - if (!this.content) { - this.content = {}; - } - - if (!this.content.references) { - this.content.references = []; - } } _createClass(Item, [{ - key: 'addReference', - value: function addReference(reference) { - this.content.references.push(reference); - this.content.references = _.uniq(this.content.references); - this.updateReferencesLocalMapping(); + key: 'updateFromJSON', + value: function updateFromJSON(json) { + _.merge(this, json); + if (this.created_at) { + this.created_at = new Date(this.created_at); + this.updated_at = new Date(this.updated_at); + } else { + this.created_at = new Date(); + this.updated_at = new Date(); + } + + if (json.content) { + this.mapContentToLocalProperties(this.contentObject); + } } }, { - key: 'removeReference', - value: function removeReference(reference) { - _.remove(this.content.references, _.find(this.content.references, { uuid: reference.uuid })); - this.updateReferencesLocalMapping(); + key: 'mapContentToLocalProperties', + value: function mapContentToLocalProperties(contentObj) {} + }, { + key: 'createContentJSONFromProperties', + value: function createContentJSONFromProperties() { + return this.structureParams(); } }, { - key: 'referencesMatchingContentType', - value: function referencesMatchingContentType(contentType) { - return this.content.references.filter(function (reference) { - return reference.content_type == contentType; - }); + key: 'referenceParams', + value: function referenceParams() { + // must override + } + }, { + key: 'structureParams', + value: function structureParams() { + return { references: this.referenceParams() }; + } + }, { + key: 'addItemAsRelationship', + value: function addItemAsRelationship(item) { + // must override + } + }, { + key: 'removeItemAsRelationship', + value: function removeItemAsRelationship(item) { + // must override + } + }, { + key: 'removeFromRelationships', + value: function removeFromRelationships() { + // must override } }, { key: 'mergeMetadataFromItem', value: function mergeMetadataFromItem(item) { _.merge(this, _.omit(item, ["content"])); } - }, { - key: 'updateReferencesLocalMapping', - value: function updateReferencesLocalMapping() { - // should be overriden to manage local properties - } }, { key: 'referencesAffectedBySharingChange', value: function referencesAffectedBySharingChange() { @@ -1403,7 +1392,7 @@ var Item = function () { }, { key: 'isEncrypted', value: function isEncrypted() { - return this.encryptionEnabled() && typeof this.content === 'string' ? true : false; + return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false; } }, { key: 'encryptionEnabled', @@ -1415,6 +1404,21 @@ var Item = function () { value: function presentationURL() { return this.presentation_url; } + }, { + key: 'contentObject', + get: function get() { + // console.log("getting content object from content", this.content); + if (!this.content) { + return {}; + } + + if (this.content !== null && _typeof(this.content) === 'object') { + // this is the case when mapping localStorage content, in which case the content is already parsed + return this.content; + } + + return JSON.parse(this.content); + } }], [{ key: 'sortItemsByDate', value: function sortItemsByDate(items) { @@ -1431,42 +1435,36 @@ var Item = function () { var Extension = function (_Item) { _inherits(Extension, _Item); - function Extension(json_obj) { + function Extension(json) { _classCallCheck(this, Extension); - var _this3 = _possibleConstructorReturn(this, (Extension.__proto__ || Object.getPrototypeOf(Extension)).call(this, json_obj)); + var _this3 = _possibleConstructorReturn(this, (Extension.__proto__ || Object.getPrototypeOf(Extension)).call(this, json)); - if (!_this3.notes) { - _this3.notes = []; - } + _.merge(_this3, json); - if (!_this3.content.title) { - _this3.content.title = ""; - } + _this3.actions = _this3.actions.map(function (action) { + return new Action(action); + }); return _this3; } - _createClass(Extension, [{ - key: 'updateReferencesLocalMapping', - value: function updateReferencesLocalMapping() { - _get(Extension.prototype.__proto__ || Object.getPrototypeOf(Extension.prototype), 'updateReferencesLocalMapping', this).call(this); - this.notes = this.referencesMatchingContentType("Note"); - } - }, { - key: 'referencesAffectedBySharingChange', - value: function referencesAffectedBySharingChange() { - return this.referencesMatchingContentType("Note"); - } - }, { - key: 'content_type', - get: function get() { - return "Tag"; - } - }]); - return Extension; }(Item); +var Action = function Action(json) { + _classCallCheck(this, Action); + + _.merge(this, json); + + var comps = this.type.split(":"); + if (comps.length > 0) { + this.repeatable = true; + this.repeatType = comps[0]; // 'watch' or 'poll' + this.repeatVerb = comps[1]; // http verb + this.repeatFrequency = comps[2]; + } +}; + ; var Note = function (_Item2) { _inherits(Note, _Item2); @@ -1479,28 +1477,76 @@ var Note = function (_Item2) { if (!_this4.tags) { _this4.tags = []; } - - if (!_this4.content.title) { - _this4.content.title = ""; - } - - if (!_this4.content.text) { - _this4.content.text = ""; - } return _this4; } _createClass(Note, [{ - key: 'updateReferencesLocalMapping', - value: function updateReferencesLocalMapping() { - _get(Note.prototype.__proto__ || Object.getPrototypeOf(Note.prototype), 'updateReferencesLocalMapping', this).call(this); - this.tags = this.referencesMatchingContentType("Tag"); + key: 'mapContentToLocalProperties', + value: function mapContentToLocalProperties(contentObject) { + _get(Note.prototype.__proto__ || Object.getPrototypeOf(Note.prototype), 'mapContentToLocalProperties', this).call(this, contentObject); + this.title = contentObject.title; + this.text = contentObject.text; + } + }, { + key: 'referenceParams', + value: function referenceParams() { + var references = _.map(this.tags, function (tag) { + return { uuid: tag.uuid, content_type: tag.content_type }; + }); + return references; + } + }, { + key: 'structureParams', + value: function structureParams() { + var params = { + title: this.title, + text: this.text + }; + + _.merge(params, _get(Note.prototype.__proto__ || Object.getPrototypeOf(Note.prototype), 'structureParams', this).call(this)); + return params; + } + }, { + key: 'addItemAsRelationship', + value: function addItemAsRelationship(item) { + if (item.content_type == "Tag") { + if (!_.find(this.tags, item)) { + this.tags.push(item); + } + } + _get(Note.prototype.__proto__ || Object.getPrototypeOf(Note.prototype), 'addItemAsRelationship', this).call(this, item); + } + }, { + key: 'removeItemAsRelationship', + value: function removeItemAsRelationship(item) { + if (item.content_type == "Tag") { + _.pull(this.tags, item); + } + _get(Note.prototype.__proto__ || Object.getPrototypeOf(Note.prototype), 'removeItemAsRelationship', this).call(this, item); + } + }, { + key: 'removeFromRelationships', + value: function removeFromRelationships() { + this.tags.forEach(function (tag) { + _.pull(tag.notes, this); + tag.dirty = true; + }); } }, { key: 'referencesAffectedBySharingChange', value: function referencesAffectedBySharingChange() { return _get(Note.prototype.__proto__ || Object.getPrototypeOf(Note.prototype), 'referencesAffectedBySharingChange', this).call(this); } + }, { + key: 'safeText', + value: function safeText() { + return this.text || ""; + } + }, { + key: 'safeTitle', + value: function safeTitle() { + return this.title || ""; + } }, { key: 'toJSON', value: function toJSON() { @@ -1578,23 +1624,63 @@ var Tag = function (_Item3) { if (!_this5.notes) { _this5.notes = []; } - - if (!_this5.content.title) { - _this5.content.title = ""; - } return _this5; } _createClass(Tag, [{ - key: 'updateReferencesLocalMapping', - value: function updateReferencesLocalMapping() { - _get(Tag.prototype.__proto__ || Object.getPrototypeOf(Tag.prototype), 'updateReferencesLocalMapping', this).call(this); - this.notes = this.referencesMatchingContentType("Note"); + key: 'mapContentToLocalProperties', + value: function mapContentToLocalProperties(contentObject) { + _get(Tag.prototype.__proto__ || Object.getPrototypeOf(Tag.prototype), 'mapContentToLocalProperties', this).call(this, contentObject); + this.title = contentObject.title; + } + }, { + key: 'referenceParams', + value: function referenceParams() { + var references = _.map(this.notes, function (note) { + return { uuid: note.uuid, content_type: note.content_type }; + }); + return references; + } + }, { + key: 'structureParams', + value: function structureParams() { + var params = { + title: this.title + }; + + _.merge(params, _get(Tag.prototype.__proto__ || Object.getPrototypeOf(Tag.prototype), 'structureParams', this).call(this)); + return params; + } + }, { + key: 'addItemAsRelationship', + value: function addItemAsRelationship(item) { + if (item.content_type == "Note") { + if (!_.find(this.notes, item)) { + this.notes.unshift(item); + } + } + _get(Tag.prototype.__proto__ || Object.getPrototypeOf(Tag.prototype), 'addItemAsRelationship', this).call(this, item); + } + }, { + key: 'removeItemAsRelationship', + value: function removeItemAsRelationship(item) { + if (item.content_type == "Note") { + _.pull(this.notes, item); + } + _get(Tag.prototype.__proto__ || Object.getPrototypeOf(Tag.prototype), 'removeItemAsRelationship', this).call(this, item); + } + }, { + key: 'removeFromRelationships', + value: function removeFromRelationships() { + this.notes.forEach(function (note) { + _.pull(note.tags, this); + note.dirty = true; + }); } }, { key: 'referencesAffectedBySharingChange', value: function referencesAffectedBySharingChange() { - return this.referencesMatchingContentType("Note"); + return this.notes; } }, { key: 'content_type', @@ -1825,20 +1911,24 @@ var User = function User(json_obj) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!this.user.uuid) { - this.writeItemsToLocalStorage(); - modelManager.clearDirtyItems(); - if (callback) { - callback(); - } + this.writeItemsToLocalStorage(function (responseItems) { + this.handleItemsResponse(responseItems); + modelManager.clearDirtyItems(); + if (callback) { + callback(); + } + }.bind(this)); return; } - var dirtyItems = modelManager.dirtyItems; + var dirtyItems = modelManager.getDirtyItems(); var request = Restangular.one("items/sync"); 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; } @@ -1878,11 +1968,10 @@ var User = function User(json_obj) { this.paramsForItem = function (item, encrypted, additionalFields, forExportFile) { var itemCopy = _.cloneDeep(item); - var params = { uuid: item.uuid, content_type: item.content_type, presentation_name: item.presentation_name, deleted: item.deleted }; + console.assert(!item.dummy, "Item is dummy, should not have gotten here.", item.dummy); - itemCopy.content.references = _.map(itemCopy.content.references, function (reference) { - return { uuid: reference.uuid, content_type: reference.content_type }; - }); + var params = { uuid: item.uuid, content_type: item.content_type, + presentation_name: item.presentation_name, deleted: item.deleted }; if (encrypted) { this.encryptSingleItem(itemCopy, this.retrieveMk()); @@ -1890,7 +1979,7 @@ var User = function User(json_obj) { params.enc_item_key = itemCopy.enc_item_key; params.auth_hash = itemCopy.auth_hash; } else { - params.content = forExportFile ? itemCopy.content : "000" + Neeto.crypto.base64(JSON.stringify(itemCopy.content)); + params.content = forExportFile ? itemCopy.content : "000" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties())); if (!forExportFile) { params.enc_item_key = null; params.auth_hash = null; @@ -1904,12 +1993,6 @@ var User = function User(json_obj) { return params; }; - this.deleteItem = function (item, callback) { - item.deleted = true; - modelManager.addDirtyItems([item]); - this.sync(callback); - }; - this.shareItem = function (item, callback) { if (!this.user.uuid) { alert("You must be signed in to share."); @@ -1919,7 +2002,9 @@ var User = function User(json_obj) { var shareFn = function () { item.presentation_name = "_auto_"; var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); - modelManager.addDirtyItems(needsUpdate); + needsUpdate.forEach(function (needingUpdate) { + needingUpdate.dirty = true; + }); this.sync(); }.bind(this); @@ -1946,7 +2031,9 @@ var User = function User(json_obj) { this.unshareItem = function (item, callback) { item.presentation_name = null; var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); - modelManager.addDirtyItems(needsUpdate); + needsUpdate.forEach(function (needingUpdate) { + needingUpdate.dirty = true; + }); this.sync(null); }; @@ -1957,7 +2044,9 @@ var User = function User(json_obj) { this.importJSONData = function (jsonString, callback) { var data = JSON.parse(jsonString); modelManager.mapResponseItemsToLocalModels(data.items); - modelManager.addDirtyItems(modelManager.items); + modelManager.items.forEach(function (item) { + item.dirty = true; + }); this.syncWithOptions(callback, { additionalFields: ["created_at", "updated_at"] }); }; @@ -2005,7 +2094,7 @@ var User = function User(json_obj) { var tag = tags.filter(function (tag) { return tag.uuid == item.tag_id; })[0]; - item.tag_name = tag.content.title; + item.tag_name = tag.title; } }); request.post().then(function (response) { @@ -2018,11 +2107,13 @@ var User = function User(json_obj) { return JSON.parse(JSON.stringify(object)); }; - this.writeItemsToLocalStorage = function () { + this.writeItemsToLocalStorage = function (callback) { var items = _.map(modelManager.items, function (item) { - return this.paramsForItem(item, false, ["created_at", "updated_at"], true); + return this.paramsForItem(item, false, ["created_at", "updated_at"], false); }.bind(this)); + console.log("writing items to local", items); this.writeToLocalStorage('items', items); + callback(items); }; this.writeToLocalStorage = function (key, value) { @@ -2032,7 +2123,7 @@ var User = function User(json_obj) { this.loadLocalItemsAndUser = function () { var user = {}; var items = JSON.parse(localStorage.getItem('items')) || []; - items = modelManager.mapResponseItemsToLocalModels(items); + items = this.handleItemsResponse(items); Item.sortItemsByDate(items); user.items = items; user.shouldMerge = true; @@ -2090,7 +2181,7 @@ var User = function User(json_obj) { var ek = Neeto.crypto.firstHalfOfKey(item_key); var ak = Neeto.crypto.secondHalfOfKey(item_key); - var encryptedContent = "001" + Neeto.crypto.encryptText(JSON.stringify(item.content), ek); + var encryptedContent = "001" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek); var authHash = Neeto.crypto.hmac256(encryptedContent, ak); item.content = encryptedContent; @@ -2642,24 +2733,40 @@ angular.module('app.frontend').service('extensionManager', ExtensionManager); return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : ''; }; }); -; -var ItemManager = function () { - function ItemManager() { - _classCallCheck(this, ItemManager); +;;angular.module('app.frontend').service('markdownRenderer', function ($sce) { - this._items = []; + marked.setOptions({ + breaks: true, + sanitize: true + }); + + this.renderedContentForText = function (text) { + if (!text || text.length == 0) { + return ""; + } + return marked(text); + }; + + this.renderHtml = function (html_code) { + return $sce.trustAsHtml(html_code); + }; +}); +; +var ModelManager = function () { + function ModelManager() { + _classCallCheck(this, ModelManager); + + this.notes = []; + this.tags = []; + this.changeObservers = []; + this.items = []; } - _createClass(ItemManager, [{ + _createClass(ModelManager, [{ key: 'findItem', value: function findItem(itemId) { return _.find(this.items, { uuid: itemId }); } - }, { - key: 'addItems', - value: function addItems(items) { - this._items = _.uniq(this.items.concat(items)); - } }, { key: 'mapResponseItemsToLocalModels', value: function mapResponseItemsToLocalModels(items) { @@ -2681,15 +2788,17 @@ var ItemManager = function () { var item = this.findItem(json_obj["uuid"]); if (json_obj["deleted"] == true) { if (item) { - this.deleteItem(item); + this.removeItemLocally(item); } continue; } - if (item) { - _.merge(item, json_obj); - } else { + _.omit(json_obj, omitFields); + + if (!item) { item = this.createItem(json_obj); + } else { + item.updateFromJSON(json_obj); } models.push(item); @@ -2725,19 +2834,27 @@ var ItemManager = function () { } } }, { - key: 'resolveReferences', - value: function resolveReferences() { - this.items.forEach(function (item) { - // build out references, safely handle broken references - item.content.references = _.reduce(item.content.references, function (accumulator, reference) { - var item = this.findItem(reference.uuid); - if (item) { - accumulator.push(item); + key: 'addItems', + value: function addItems(items) { + this.items = _.uniq(this.items.concat(items)); + + items.forEach(function (item) { + if (item.content_type == "Tag") { + if (!_.find(this.tags, { uuid: item.uuid })) { + this.tags.unshift(item); } - return accumulator; - }.bind(this), []); + } else if (item.content_type == "Note") { + if (!_.find(this.notes, { uuid: item.uuid })) { + this.notes.unshift(item); + } + } }.bind(this)); } + }, { + key: 'addItem', + value: function addItem(item) { + this.addItems([item]); + } }, { key: 'itemsForContentType', value: function itemsForContentType(contentType) { @@ -2746,143 +2863,50 @@ var ItemManager = function () { }); } }, { - key: 'addItem', - value: function addItem(item) { - if (!this.findItem(item.uuid)) { - this.items.push(item); - } - } - - // returns dirty item references that need saving - - }, { - key: 'deleteItem', - value: function deleteItem(item) { - var dirty = []; - _.remove(this.items, item); - var length = item.content.references.length; - // note that references are deleted in this for loop, so you have to be careful how you iterate - for (var i = 0; i < length; i++) { - var referencedItem = item.content.references[0]; - // console.log("removing references between items", referencedItem, item); - var _dirty = this.removeReferencesBetweenItems(referencedItem, item); - dirty = dirty.concat(_dirty); - } - - return dirty; - } - }, { - key: 'removeReferencesBetweenItems', - value: function removeReferencesBetweenItems(itemOne, itemTwo) { - itemOne.removeReference(itemTwo); - itemTwo.removeReference(itemOne); - return [itemOne, itemTwo]; - } - }, { - key: 'createReferencesBetweenItems', - value: function createReferencesBetweenItems(itemOne, itemTwo) { - itemOne.addReference(itemTwo); - itemTwo.addReference(itemOne); - return [itemOne, itemTwo]; - } - }, { - key: 'items', - get: function get() { - return this._items; - } - }]); - - return ItemManager; -}(); - -angular.module('app.frontend').service('itemManager', ItemManager); -;angular.module('app.frontend').service('markdownRenderer', function ($sce) { - - marked.setOptions({ - breaks: true, - sanitize: true - }); - - this.renderedContentForText = function (text) { - if (!text || text.length == 0) { - return ""; - } - return marked(text); - }; - - this.renderHtml = function (html_code) { - return $sce.trustAsHtml(html_code); - }; -}); -; -var ModelManager = function (_ItemManager) { - _inherits(ModelManager, _ItemManager); - - function ModelManager() { - _classCallCheck(this, ModelManager); - - var _this6 = _possibleConstructorReturn(this, (ModelManager.__proto__ || Object.getPrototypeOf(ModelManager)).call(this)); - - _this6.notes = []; - _this6.tags = []; - _this6.dirtyItems = []; - _this6.changeObservers = []; - return _this6; - } - - _createClass(ModelManager, [{ key: 'resolveReferences', value: function resolveReferences() { - _get(ModelManager.prototype.__proto__ || Object.getPrototypeOf(ModelManager.prototype), 'resolveReferences', this).call(this); - - this.notes.push.apply(this.notes, _.difference(this.itemsForContentType("Note"), this.notes)); - Item.sortItemsByDate(this.notes); - this.notes.forEach(function (note) { - note.updateReferencesLocalMapping(); - }); - - this.tags.push.apply(this.tags, _.difference(this.itemsForContentType("Tag"), this.tags)); - this.tags.forEach(function (tag) { - tag.updateReferencesLocalMapping(); - }); - } - }, { - key: 'addItemObserver', - value: function addItemObserver(id, type, callback) { - this.changeObservers.push({ id: id, type: type, callback: callback }); - } - }, { - key: 'removeItemObserver', - value: function removeItemObserver(id) { - _.remove(this.changeObservers, _.find(this.changeObservers, { id: id })); - } - }, { - key: 'addDirtyItems', - value: function addDirtyItems(items) { - if (!(items instanceof Array)) { - items = [items]; - } - - this.dirtyItems = this.dirtyItems.concat(items); - this.dirtyItems = _.uniq(this.dirtyItems); - } - }, { - key: 'clearDirtyItems', - value: function clearDirtyItems() { - console.log("Clearing dirty items", this.dirtyItems); var _iteratorNormalCompletion5 = true; var _didIteratorError5 = false; var _iteratorError5 = undefined; try { - for (var _iterator5 = this.changeObservers[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { - var observer = _step5.value; + for (var _iterator5 = this.items[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var item = _step5.value; - var changedItems = this.dirtyItems.filter(function (item) { - return item.content_type == observer.type; - }); - console.log("observer:", observer, "items", changedItems); - observer.callback(changedItems); + var contentObject = item.contentObject; + if (!contentObject.references) { + continue; + } + + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = contentObject.references[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var reference = _step6.value; + + var referencedItem = this.findItem(reference.uuid); + if (referencedItem) { + item.addItemAsRelationship(referencedItem); + } else { + console.log("Unable to find item:", reference.uuid); + } + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6.return) { + _iterator6.return(); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } } } catch (err) { _didIteratorError5 = true; @@ -2899,73 +2923,112 @@ var ModelManager = function (_ItemManager) { } } - this.dirtyItems = []; + this.notes.push.apply(this.notes, _.difference(this.itemsForContentType("Note"), this.notes)); + Item.sortItemsByDate(this.notes); + + this.tags.push.apply(this.tags, _.difference(this.itemsForContentType("Tag"), this.tags)); + this.tags.forEach(function (tag) { + Item.sortItemsByDate(tag.notes); + }); } }, { - key: 'addNote', - value: function addNote(note) { - if (!_.find(this.notes, { uuid: note.uuid })) { - this.notes.unshift(note); - this.addItem(note); + key: 'addItemObserver', + value: function addItemObserver(id, type, callback) { + this.changeObservers.push({ id: id, type: type, callback: callback }); + } + }, { + key: 'removeItemObserver', + value: function removeItemObserver(id) { + _.remove(this.changeObservers, _.find(this.changeObservers, { id: id })); + } + }, { + key: 'notifyObserversOfSyncCompletion', + value: function notifyObserversOfSyncCompletion() { + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; + + try { + for (var _iterator7 = this.changeObservers[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var observer = _step7.value; + + var changedItems = this.dirtyItems.filter(function (item) { + return item.content_type == observer.type; + }); + console.log("observer:", observer, "items", changedItems); + observer.callback(changedItems); + } + } catch (err) { + _didIteratorError7 = true; + _iteratorError7 = err; + } finally { + try { + if (!_iteratorNormalCompletion7 && _iterator7.return) { + _iterator7.return(); + } + } finally { + if (_didIteratorError7) { + throw _iteratorError7; + } + } } } }, { - key: 'addTag', - value: function addTag(tag) { - this.tags.unshift(tag); - this.addItem(tag); + key: 'getDirtyItems', + value: function getDirtyItems() { + return this.items.filter(function (item) { + return item.dirty == true && !item.dummy; + }); } }, { - key: 'addTagToNote', - value: function addTagToNote(tag, note) { - var dirty = this.createReferencesBetweenItems(tag, note); - this.refreshRelationshipsForTag(tag); - this.refreshRelationshipsForNote(note); - this.addDirtyItems(dirty); + key: 'clearDirtyItems', + value: function clearDirtyItems() { + this.notifyObserversOfSyncCompletion(); + + this.getDirtyItems().forEach(function (item) { + item.dirty = false; + }); } }, { - key: 'refreshRelationshipsForTag', - value: function refreshRelationshipsForTag(tag) { - tag.notes = tag.referencesMatchingContentType("Note"); - Item.sortItemsByDate(tag.notes); + key: 'setItemToBeDeleted', + value: function setItemToBeDeleted(item) { + item.deleted = true; + item.dirty = true; + item.removeFromRelationships(); } }, { - key: 'refreshRelationshipsForNote', - value: function refreshRelationshipsForNote(note) { - note.tags = note.referencesMatchingContentType("Tag"); - } - }, { - key: 'removeTagFromNote', - value: function removeTagFromNote(tag, note) { - var dirty = this.removeReferencesBetweenItems(tag, note); - this.addDirtyItems(dirty); - } - }, { - key: 'deleteItem', - value: function deleteItem(item) { - var dirty = _get(ModelManager.prototype.__proto__ || Object.getPrototypeOf(ModelManager.prototype), 'deleteItem', this).call(this, item); - if (item.content_type == "Note") { - _.remove(this.notes, item); - } else if (item.content_type == "Tag") { - _.remove(this.tags, item); - } - return dirty; - } - }, { - key: 'deleteNote', - value: function deleteNote(note) { - var dirty = this.deleteItem(note); - _.remove(this.notes, note); - if (!note.dummy) { - this.addDirtyItems(dirty); + key: 'removeItemLocally', + value: function removeItemLocally(item) { + _.pull(this.items, item); + + if (item.content_type == "Tag") { + _.pull(this.tags, item); + } else if (item.content_type == "Note") { + _.pull(this.notes, item); } } + + /* + Relationships + */ + }, { - key: 'deleteTag', - value: function deleteTag(tag) { - var dirty = this.deleteItem(tag); - _.remove(this.tags, tag); - this.addDirtyItems(dirty); + key: 'createRelationshipBetweenItems', + value: function createRelationshipBetweenItems(itemOne, itemTwo) { + itemOne.addItemAsRelationship(itemTwo); + itemTwo.addItemAsRelationship(itemOne); + + itemOne.dirty = true; + itemTwo.dirty = true; + } + }, { + key: 'removeRelationshipBetweenItems', + value: function removeRelationshipBetweenItems(itemOne, itemTwo) { + itemOne.removeItemAsRelationship(itemTwo); + itemTwo.removeItemAsRelationship(itemOne); + + itemOne.dirty = true; + itemTwo.dirty = true; } }, { key: 'filteredNotes', @@ -2975,7 +3038,7 @@ var ModelManager = function (_ItemManager) { }]); return ModelManager; -}(ItemManager); +}(); angular.module('app.frontend').service('modelManager', ModelManager); ;angular.module('app.frontend').service('serverSideValidation', function ($sce) { diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index 7aaba04ed..2d014cb07 100644 --- a/vendor/assets/javascripts/transpiled.js.map +++ b/vendor/assets/javascripts/transpiled.js.map @@ -1 +1 @@ -{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","email","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","directive","$timeout","restrict","scope","save","remove","note","user","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","apiController","markdownRenderer","editorMode","content","dummy","focusTitle","hasChanges","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","addDirtyItems","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","extensionManager","logout","syncUpdated","$state","serverSideValidation","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","toggleExtensions","showExtensionsMenu","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","executeAction","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","confirm","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","forgotPasswordSubmit","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","downloadDataArchive","setAttribute","itemsDataFile","importFileSelected","files","file","reader","FileReader","onload","e","importJSONData","result","readAsText","showLogin","showRegistration","$scope","bodyClass","onUserSet","setUser","defaultUser","allTag","Tag","all","title","tags","notes","setInterval","getCurrentUser","User","loadLocalItemsAndUser","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","tagsAddNew","addTag","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","addTagToNote","notesRemoveTag","validNotes","Note","filterDummyNotes","deleteTag","deleteItem","notesSelectionMade","selectedNote","notesAddNew","addNote","headerLogout","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","Object","defineProperty","set","value","finalValue","decodedValue","JSON","enumerable","created_at","updated_at","generateUUID","setContentRaw","rawContent","references","reference","push","uniq","updateReferencesLocalMapping","contentType","content_type","item","omit","enc_item_key","presentation_url","items","sort","b","Extension","referencesMatchingContentType","hasOnePublicTag","isPublic","filtered","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","refresh","setItem","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","generateInitialEncryptionKeysForUser","currentKeys","newKeys","_performPasswordChange","reencryptAllItemsAndSave","current_keys","new_keys","patch","verifyEncryptionStatusOfAllItems","allItems","filteredItems","itemsNeedingUpdate","isEncrypted","saveBatchItems","syncWithOptions","options","writeItemsToLocalStorage","clearDirtyItems","dirtyItems","map","createRequestParamsForItem","additionalFields","syncToken","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","undefined","responseItems","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","forExportFile","itemCopy","cloneDeep","deleted","encryptSingleItem","retrieveMk","auth_hash","base64","stringify","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","open","template","resolve","className","disableAnimation","jsonString","mapResponseItemsToLocalModels","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","mergeLocalDataRemotely","tag_id","tag_name","removeItem","staticifyObject","object","writeToLocalStorage","toJson","sortItemsByDate","draftString","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","base64Decode","newMasterKey","oldMasterKey","shouldFocus","$element","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","running","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","charAt","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","extensions","enabledRepeatActions","enabledRepeatActionUrls","oneUrl","registerExtension","pull","removeItemObserver","assert","isRepeatActionEnabled","repeatType","structures","structure","addItemObserver","changedItems","triggerWatchAction","repeatFrequency","lastExecuted","diffInSeconds","repeatVerb","service","$filter","ItemManager","_items","itemId","models","findItem","createItem","addItems","resolveReferences","reduce","accumulator","dirty","referencedItem","_dirty","removeReferencesBetweenItems","itemOne","itemTwo","removeReference","addReference","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","changeObservers","apply","difference","itemsForContentType","id","observer","unshift","addItem","createReferencesBetweenItems","refreshRelationshipsForTag","refreshRelationshipsForNote","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":"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","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({email, password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback(_.merge({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults));\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(!response) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.forgotPasswordSubmit = function() {\n // $auth.requestPasswordReset(this.resetData)\n // .then(function(resp) {\n // this.resetData.response = \"Success\";\n // // handle success response\n // }.bind(this))\n // .catch(function(resp) {\n // // handle error response\n // this.resetData.response = \"Error\";\n // }.bind(this));\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile();\n link.click();\n }\n\n this.importFileSelected = function(files) {\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n apiController.importJSONData(e.target.result, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n // window.location.reload();\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n })\n }\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n this.user.uuid = user.uuid;\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n var onUserSet = function() {\n apiController.setUser($scope.defaultUser);\n $scope.allTag = new Tag({all: true});\n $scope.allTag.content.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n }\n\n apiController.getCurrentUser(function(user){\n if(user) {\n $scope.defaultUser = user;\n $rootScope.title = \"Notes — Standard Notes\";\n onUserSet();\n } else {\n $scope.defaultUser = new User(apiController.loadLocalItemsAndUser());\n onUserSet();\n }\n });\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addTag(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n modelManager.addDirtyItems([tag]);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.addTagToNote(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.deleteTag(tag);\n // if no more notes, delete tag\n apiController.deleteItem(tag, function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addNote(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.addTagToNote($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n modelManager.addDirtyItems(note);\n\n apiController.sync(function(){\n note.hasChanges = false;\n\n if(callback) {\n callback(true);\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.deleteNote(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n return;\n }\n\n apiController.deleteItem(note, function(success){})\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n $scope.defaultUser = apiController.loadLocalItemsAndUser();\n $scope.tags = $scope.defaultUser.tags;\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n user: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!this.user.uuid) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = new Note({dummy: true});\n this.newNote.content.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.content.title.toLowerCase().includes(this.noteFilter.text) || note.content.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n user: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function () {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n \n this.newTag = new Tag();\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.content.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.content.title.length == 0) {\n tag.content.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.content.title || tag.content.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, user, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername(user, $scope.formData.username, function(response){\n var username = response.username;\n user.username = username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n constructor(json_obj) {\n\n var content;\n\n Object.defineProperty(this, \"content\", {\n get: function() {\n return content;\n },\n set: function(value) {\n var finalValue = value;\n\n if(typeof value === 'string') {\n try {\n var decodedValue = JSON.parse(value);\n finalValue = decodedValue;\n }\n catch(e) {\n finalValue = value;\n }\n }\n content = finalValue;\n },\n enumerable: true,\n });\n\n _.merge(this, json_obj);\n\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n\n this.setContentRaw = function(rawContent) {\n content = rawContent;\n }\n\n if(!this.content) {\n this.content = {};\n }\n\n if(!this.content.references) {\n this.content.references = [];\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n addReference(reference) {\n this.content.references.push(reference);\n this.content.references = _.uniq(this.content.references);\n this.updateReferencesLocalMapping();\n }\n\n removeReference(reference) {\n _.remove(this.content.references, _.find(this.content.references, {uuid: reference.uuid}));\n this.updateReferencesLocalMapping();\n }\n\n referencesMatchingContentType(contentType) {\n return this.content.references.filter(function(reference){\n return reference.content_type == contentType;\n });\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n updateReferencesLocalMapping() {\n // should be overriden to manage local properties\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && typeof this.content === 'string' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Extension extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n\n if(!this.content.title) {\n this.content.title = \"\";\n }\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n updateReferencesLocalMapping() {\n super.updateReferencesLocalMapping();\n this.notes = this.referencesMatchingContentType(\"Note\");\n }\n\n referencesAffectedBySharingChange() {\n return this.referencesMatchingContentType(\"Note\");\n }\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n\n if(!this.content.title) {\n this.content.title = \"\";\n }\n\n if(!this.content.text) {\n this.content.text = \"\";\n }\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n updateReferencesLocalMapping() {\n super.updateReferencesLocalMapping();\n this.tags = this.referencesMatchingContentType(\"Tag\");\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n\n if(!this.content.title) {\n this.content.title = \"\";\n }\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n updateReferencesLocalMapping() {\n super.updateReferencesLocalMapping();\n this.notes = this.referencesMatchingContentType(\"Note\");\n }\n\n referencesAffectedBySharingChange() {\n return this.referencesMatchingContentType(\"Note\");\n }\n}\n;class User {\n constructor(json_obj) {\n _.merge(this, json_obj);\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.setUser = function(user) {\n this.user = user;\n }\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n callback(user);\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, keys);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n this.changePassword = function(user, current_password, new_password) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n var data = {};\n data.current_password = currentKeys.pw;\n data.password = newKeys.pw;\n data.password_confirmation = newKeys.pw;\n\n var user = this.user;\n\n this._performPasswordChange(currentKeys, newKeys, function(response){\n if(response && !response.error) {\n // this.showNewPasswordForm = false;\n // reencrypt data with new mk\n this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n if(success) {\n this.setMk(newKeys.mk);\n alert(\"Your password has been changed and your data re-encrypted.\");\n } else {\n // rollback password\n this._performPasswordChange(newKeys, currentKeys, function(response){\n alert(\"There was an error changing your password. Your password has been rolled back.\");\n window.location.reload();\n })\n }\n }.bind(this));\n } else {\n // this.showNewPasswordForm = false;\n alert(\"There was an error changing your password. Please try again.\");\n }\n }.bind(this))\n }.bind(this));\n }.bind(this));\n }.bind(this));\n }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(user, username, callback) {\n var request = Restangular.one(\"users\", user.uuid);\n request.username = username;\n request.patch().then(function(response){\n callback(response.plain());\n })\n }\n\n /*\n Ensures that if encryption is disabled, all local items are uncrypted,\n and that if it's enabled, that all local items are encrypted\n */\n this.verifyEncryptionStatusOfAllItems = function(user, callback) {\n var allItems = user.filteredItems();\n var itemsNeedingUpdate = [];\n allItems.forEach(function(item){\n if(!item.isPublic()) {\n if(item.encryptionEnabled() && !item.isEncrypted()) {\n itemsNeedingUpdate.push(item);\n }\n } else {\n if(item.isEncrypted()) {\n itemsNeedingUpdate.push(item);\n }\n }\n }.bind(this))\n\n if(itemsNeedingUpdate.length > 0) {\n console.log(\"verifying encryption, items need updating\", itemsNeedingUpdate);\n this.saveBatchItems(user, itemsNeedingUpdate, callback)\n }\n }\n\n\n\n /*\n Items\n */\n\n this.syncWithOptions = function(callback, options = {}) {\n if(!this.user.uuid) {\n this.writeItemsToLocalStorage();\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n return;\n }\n\n var dirtyItems = modelManager.dirtyItems;\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.syncToken = response.sync_token;\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n callback(null);\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n var params = {uuid: item.uuid, content_type: item.content_type, presentation_name: item.presentation_name, deleted: item.deleted};\n\n itemCopy.content.references = _.map(itemCopy.content.references, function(reference){\n return {uuid: reference.uuid, content_type: reference.content_type};\n })\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.content : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.content));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n\n this.deleteItem = function(item, callback) {\n item.deleted = true;\n modelManager.addDirtyItems([item]);\n this.sync(callback);\n }\n\n this.shareItem = function(item, callback) {\n if(!this.user.uuid) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n modelManager.addDirtyItems(needsUpdate);\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n user: function() {return this.user}.bind(this),\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n modelManager.addDirtyItems(needsUpdate);\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(jsonString, callback) {\n var data = JSON.parse(jsonString);\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.addDirtyItems(modelManager.items);\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function() {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.items, function(item){\n return _.omit(this.paramsForItem(item, false, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n this.mergeLocalDataRemotely = function(user, callback) {\n var request = Restangular.one(\"users\", user.uuid).one(\"merge\");\n var tags = user.tags;\n request.items = user.items;\n request.items.forEach(function(item){\n if(item.tag_id) {\n var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n item.tag_name = tag.content.title;\n }\n })\n request.post().then(function(response){\n callback();\n localStorage.removeItem('user');\n })\n }\n\n\n\n\n\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeItemsToLocalStorage = function() {\n var items = _.map(modelManager.items, function(item){\n return this.paramsForItem(item, false, [\"created_at\", \"updated_at\"], true)\n }.bind(this));\n this.writeToLocalStorage('items', items);\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItemsAndUser = function() {\n var user = {};\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = modelManager.mapResponseItemsToLocalModels(items);\n Item.sortItemsByDate(items);\n user.items = items;\n user.shouldMerge = true;\n return user;\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n return new Note(JSON.parse(draftString));\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.content), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, masterKey);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = user.filteredItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.extensions = [];\n this.enabledRepeatActions = [];\n this.enabledRepeatActionUrls = localStorage.getItem(\"enabled_ext_urls\") || [];\n }\n\n addExtension(url) {\n console.log(\"Registering URL\", url);\n this.Restangular.oneUrl(url, url).get().then(function(response){\n console.log(\"get response\", response.plain());\n var extension = new Extension(response.plain());\n this.registerExtension(extension);\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n })\n }\n\n registerExtension(extension) {\n this.extensions.push(extension);\n console.log(\"registered extensions\", this.extensions);\n }\n\n executeAction(action, extension, callback) {\n if(action.type == \"get\") {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n console.log(\"Execute action response\", response);\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n }\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n console.log(\"Disabling action\", action);\n _.pull(this.enabledRepeatActionUrls, action.url);\n _.pull(this.enabledRepeatActions, action);\n this.modelManager.removeItemObserver(action.url);\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n console.log(\"Enabling repeat action\", action);\n\n this.enabledRepeatActionUrls.push(action.url);\n this.enabledRepeatActions.push(action);\n\n if(action.repeatType == \"watch\") {\n for(var structure of action.structures) {\n this.modelManager.addItemObserver(action.url, structure.type, function(changedItems){\n this.triggerWatchAction(action, changedItems);\n }.bind(this))\n }\n }\n }\n\n triggerWatchAction(action, changedItems) {\n console.log(\"Watch action triggered\", action, changedItems);\n if(action.repeatFrequency > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeatFrequency) {\n console.log(\"too frequent, returning\");\n return;\n }\n }\n\n if(action.repeatVerb == \"post\") {\n var request = this.Restangular.oneUrl(action.url, action.url);\n request.items = changedItems.map(function(item){\n var params = {uuid: item.uuid, content_type: item.content_type, content: item.content};\n return params;\n })\n request.post().then(function(response){\n console.log(\"watch action response\", response);\n action.lastExecuted = new Date();\n })\n }\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;class ItemManager {\n\n constructor() {\n this._items = [];\n }\n\n get items() {\n return this._items;\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n addItems(items) {\n this._items = _.uniq(this.items.concat(items));\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null)\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.deleteItem(item)\n }\n continue;\n }\n\n if(item) {\n _.merge(item, json_obj);\n } else {\n item = this.createItem(json_obj);\n }\n\n models.push(item)\n }\n this.addItems(models)\n this.resolveReferences()\n return models;\n }\n\n createItem(json_obj) {\n if(json_obj.content_type == \"Note\") {\n return new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n return new Tag(json_obj);\n } else {\n return new Item(json_obj);\n }\n }\n\n resolveReferences() {\n this.items.forEach(function(item){\n // build out references, safely handle broken references\n item.content.references = _.reduce(item.content.references, function(accumulator, reference){\n var item = this.findItem(reference.uuid);\n if(item) {\n accumulator.push(item);\n }\n return accumulator;\n }.bind(this), []);\n }.bind(this));\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n addItem(item) {\n if(!this.findItem(item.uuid)) {\n this.items.push(item);\n }\n }\n\n // returns dirty item references that need saving\n deleteItem(item) {\n var dirty = [];\n _.remove(this.items, item);\n var length = item.content.references.length;\n // note that references are deleted in this for loop, so you have to be careful how you iterate\n for(var i = 0; i < length; i++) {\n var referencedItem = item.content.references[0];\n // console.log(\"removing references between items\", referencedItem, item);\n var _dirty = this.removeReferencesBetweenItems(referencedItem, item);\n dirty = dirty.concat(_dirty);\n }\n\n return dirty;\n }\n\n removeReferencesBetweenItems(itemOne, itemTwo) {\n itemOne.removeReference(itemTwo);\n itemTwo.removeReference(itemOne);\n return [itemOne, itemTwo];\n }\n\n createReferencesBetweenItems(itemOne, itemTwo) {\n itemOne.addReference(itemTwo);\n itemTwo.addReference(itemOne);\n return [itemOne, itemTwo];\n }\n}\n\nangular.module('app.frontend').service('itemManager', ItemManager);\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager extends ItemManager {\n\n constructor() {\n super();\n this.notes = [];\n this.tags = [];\n this.dirtyItems = [];\n this.changeObservers = [];\n }\n\n resolveReferences() {\n super.resolveReferences()\n\n this.notes.push.apply(this.notes, _.difference(this.itemsForContentType(\"Note\"), this.notes));\n Item.sortItemsByDate(this.notes);\n this.notes.forEach(function(note){\n note.updateReferencesLocalMapping();\n })\n\n this.tags.push.apply(this.tags, _.difference(this.itemsForContentType(\"Tag\"), this.tags));\n this.tags.forEach(function(tag){\n tag.updateReferencesLocalMapping();\n })\n }\n\n addItemObserver(id, type, callback) {\n this.changeObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemObserver(id) {\n _.remove(this.changeObservers, _.find(this.changeObservers, {id: id}));\n }\n\n addDirtyItems(items) {\n if(!(items instanceof Array)) {\n items = [items];\n }\n\n this.dirtyItems = this.dirtyItems.concat(items);\n this.dirtyItems = _.uniq(this.dirtyItems);\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n clearDirtyItems() {\n console.log(\"Clearing dirty items\", this.dirtyItems);\n for(var observer of this.changeObservers) {\n var changedItems = this.dirtyItems.filter(function(item){return item.content_type == observer.type});\n console.log(\"observer:\", observer, \"items\", changedItems);\n observer.callback(changedItems);\n }\n this.dirtyItems = [];\n }\n\n addNote(note) {\n if(!_.find(this.notes, {uuid: note.uuid})) {\n this.notes.unshift(note);\n this.addItem(note);\n }\n }\n\n addTag(tag) {\n this.tags.unshift(tag);\n this.addItem(tag);\n }\n\n addTagToNote(tag, note) {\n var dirty = this.createReferencesBetweenItems(tag, note);\n this.refreshRelationshipsForTag(tag);\n this.refreshRelationshipsForNote(note);\n this.addDirtyItems(dirty);\n }\n\n refreshRelationshipsForTag(tag) {\n tag.notes = tag.referencesMatchingContentType(\"Note\");\n Item.sortItemsByDate(tag.notes);\n }\n\n refreshRelationshipsForNote(note) {\n note.tags = note.referencesMatchingContentType(\"Tag\");\n }\n\n removeTagFromNote(tag, note) {\n var dirty = this.removeReferencesBetweenItems(tag, note);\n this.addDirtyItems(dirty);\n }\n\n deleteItem(item) {\n var dirty = super.deleteItem(item);\n if(item.content_type == \"Note\") {\n _.remove(this.notes, item);\n } else if(item.content_type == \"Tag\") {\n _.remove(this.tags, item);\n }\n return dirty;\n }\n\n deleteNote(note) {\n var dirty = this.deleteItem(note);\n _.remove(this.notes, note);\n if(!note.dummy) {\n this.addDirtyItems(dirty);\n }\n }\n\n deleteTag(tag) {\n var dirty = this.deleteItem(tag);\n _.remove(this.tags, tag);\n this.addDirtyItems(dirty);\n }\n\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file +{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","email","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","directive","$timeout","restrict","scope","save","remove","note","user","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","apiController","markdownRenderer","editorMode","safeText","dummy","focusTitle","hasChanges","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","dirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","extensionManager","logout","syncUpdated","$state","serverSideValidation","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","toggleExtensions","showExtensionsMenu","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","executeAction","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","confirm","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","forgotPasswordSubmit","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","downloadDataArchive","setAttribute","itemsDataFile","importFileSelected","files","file","reader","FileReader","onload","e","importJSONData","result","readAsText","showLogin","showRegistration","$scope","bodyClass","onUserSet","setUser","defaultUser","allTag","Tag","all","title","tags","notes","setInterval","getCurrentUser","User","loadLocalItemsAndUser","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","headerLogout","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","JSON","items","sort","b","Extension","actions","map","Action","comps","type","split","repeatable","repeatType","repeatVerb","repeatFrequency","content_type","push","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","domain","$get","ngDialog","ApiController","refresh","setItem","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","generateInitialEncryptionKeysForUser","currentKeys","newKeys","_performPasswordChange","reencryptAllItemsAndSave","current_keys","new_keys","patch","verifyEncryptionStatusOfAllItems","allItems","filteredItems","itemsNeedingUpdate","isEncrypted","saveBatchItems","syncWithOptions","options","writeItemsToLocalStorage","responseItems","handleItemsResponse","clearDirtyItems","dirtyItems","getDirtyItems","createRequestParamsForItem","additionalFields","syncToken","sync_token","retrieved_items","omitFields","saved_items","undefined","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","forExportFile","itemCopy","cloneDeep","assert","deleted","encryptSingleItem","retrieveMk","auth_hash","base64","stringify","createContentJSONFromProperties","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","jsonString","mapResponseItemsToLocalModels","textFile","makeTextFile","Blob","URL","revokeObjectURL","createObjectURL","mergeLocalDataRemotely","tag_id","tag_name","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","base64Decode","newMasterKey","oldMasterKey","shouldFocus","$element","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","running","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","charAt","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","extensions","enabledRepeatActions","enabledRepeatActionUrls","oneUrl","registerExtension","removeItemObserver","isRepeatActionEnabled","structures","structure","addItemObserver","changedItems","triggerWatchAction","lastExecuted","diffInSeconds","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","changeObservers","itemId","models","findItem","createItem","addItems","resolveReferences","uniq","contentType","reference","referencedItem","addItemAsRelationship","apply","difference","itemsForContentType","id","observer","notifyObserversOfSyncCompletion","removeFromRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":"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","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({email, password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback(_.merge({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults));\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(!response) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.forgotPasswordSubmit = function() {\n // $auth.requestPasswordReset(this.resetData)\n // .then(function(resp) {\n // this.resetData.response = \"Success\";\n // // handle success response\n // }.bind(this))\n // .catch(function(resp) {\n // // handle error response\n // this.resetData.response = \"Error\";\n // }.bind(this));\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile();\n link.click();\n }\n\n this.importFileSelected = function(files) {\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n apiController.importJSONData(e.target.result, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n // window.location.reload();\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n })\n }\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n this.user.uuid = user.uuid;\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n var onUserSet = function() {\n apiController.setUser($scope.defaultUser);\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n }\n\n apiController.getCurrentUser(function(user){\n if(user) {\n $scope.defaultUser = user;\n $rootScope.title = \"Notes — Standard Notes\";\n onUserSet();\n } else {\n $scope.defaultUser = new User(apiController.loadLocalItemsAndUser());\n onUserSet();\n }\n });\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.dirty = true;\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.dirty = true;\n\n apiController.sync(function(){\n note.hasChanges = false;\n\n if(callback) {\n callback(true);\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n $scope.defaultUser = apiController.loadLocalItemsAndUser();\n $scope.tags = $scope.defaultUser.tags;\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n user: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!this.user.uuid) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = new Note({dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n user: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function () {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = new Tag({});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, user, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername(user, $scope.formData.username, function(response){\n var username = response.username;\n user.username = username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n // console.log(\"getting content object from content\", this.content);\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeFromRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.actions = this.actions.map(function(action){\n return new Action(action);\n })\n }\n}\n\nclass Action {\n constructor(json) {\n _.merge(this, json);\n\n var comps = this.type.split(\":\");\n if(comps.length > 0) {\n this.repeatable = true;\n this.repeatType = comps[0]; // 'watch' or 'poll'\n this.repeatVerb = comps[1]; // http verb\n this.repeatFrequency = comps[2];\n }\n }\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeFromRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.dirty = true;\n })\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeFromRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.dirty = true;\n })\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;class User {\n constructor(json_obj) {\n _.merge(this, json_obj);\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.setUser = function(user) {\n this.user = user;\n }\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n callback(user);\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, keys);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n this.changePassword = function(user, current_password, new_password) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n var data = {};\n data.current_password = currentKeys.pw;\n data.password = newKeys.pw;\n data.password_confirmation = newKeys.pw;\n\n var user = this.user;\n\n this._performPasswordChange(currentKeys, newKeys, function(response){\n if(response && !response.error) {\n // this.showNewPasswordForm = false;\n // reencrypt data with new mk\n this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n if(success) {\n this.setMk(newKeys.mk);\n alert(\"Your password has been changed and your data re-encrypted.\");\n } else {\n // rollback password\n this._performPasswordChange(newKeys, currentKeys, function(response){\n alert(\"There was an error changing your password. Your password has been rolled back.\");\n window.location.reload();\n })\n }\n }.bind(this));\n } else {\n // this.showNewPasswordForm = false;\n alert(\"There was an error changing your password. Please try again.\");\n }\n }.bind(this))\n }.bind(this));\n }.bind(this));\n }.bind(this));\n }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(user, username, callback) {\n var request = Restangular.one(\"users\", user.uuid);\n request.username = username;\n request.patch().then(function(response){\n callback(response.plain());\n })\n }\n\n /*\n Ensures that if encryption is disabled, all local items are uncrypted,\n and that if it's enabled, that all local items are encrypted\n */\n this.verifyEncryptionStatusOfAllItems = function(user, callback) {\n var allItems = user.filteredItems();\n var itemsNeedingUpdate = [];\n allItems.forEach(function(item){\n if(!item.isPublic()) {\n if(item.encryptionEnabled() && !item.isEncrypted()) {\n itemsNeedingUpdate.push(item);\n }\n } else {\n if(item.isEncrypted()) {\n itemsNeedingUpdate.push(item);\n }\n }\n }.bind(this))\n\n if(itemsNeedingUpdate.length > 0) {\n console.log(\"verifying encryption, items need updating\", itemsNeedingUpdate);\n this.saveBatchItems(user, itemsNeedingUpdate, callback)\n }\n }\n\n\n\n /*\n Items\n */\n\n this.syncWithOptions = function(callback, options = {}) {\n if(!this.user.uuid) {\n this.writeItemsToLocalStorage(function(responseItems){\n this.handleItemsResponse(responseItems);\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }.bind(this))\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.syncToken = response.sync_token;\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n callback(null);\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.content : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.user.uuid) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.dirty = true;\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n user: function() {return this.user}.bind(this),\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.dirty = true;\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(jsonString, callback) {\n var data = JSON.parse(jsonString);\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.items.forEach(function(item){\n item.dirty = true;\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function() {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.items, function(item){\n return _.omit(this.paramsForItem(item, false, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n this.mergeLocalDataRemotely = function(user, callback) {\n var request = Restangular.one(\"users\", user.uuid).one(\"merge\");\n var tags = user.tags;\n request.items = user.items;\n request.items.forEach(function(item){\n if(item.tag_id) {\n var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n item.tag_name = tag.title;\n }\n })\n request.post().then(function(response){\n callback();\n localStorage.removeItem('user');\n })\n }\n\n\n\n\n\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.items, function(item){\n return this.paramsForItem(item, false, [\"created_at\", \"updated_at\"], false)\n }.bind(this));\n console.log(\"writing items to local\", items);\n this.writeToLocalStorage('items', items);\n callback(items);\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItemsAndUser = function() {\n var user = {};\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items);\n Item.sortItemsByDate(items);\n user.items = items;\n user.shouldMerge = true;\n return user;\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n return new Note(JSON.parse(draftString));\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, masterKey);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = user.filteredItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.extensions = [];\n this.enabledRepeatActions = [];\n this.enabledRepeatActionUrls = localStorage.getItem(\"enabled_ext_urls\") || [];\n }\n\n addExtension(url) {\n console.log(\"Registering URL\", url);\n this.Restangular.oneUrl(url, url).get().then(function(response){\n console.log(\"get response\", response.plain());\n var extension = new Extension(response.plain());\n this.registerExtension(extension);\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n })\n }\n\n registerExtension(extension) {\n this.extensions.push(extension);\n console.log(\"registered extensions\", this.extensions);\n }\n\n executeAction(action, extension, callback) {\n if(action.type == \"get\") {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n console.log(\"Execute action response\", response);\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n }\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n console.log(\"Disabling action\", action);\n _.pull(this.enabledRepeatActionUrls, action.url);\n _.pull(this.enabledRepeatActions, action);\n this.modelManager.removeItemObserver(action.url);\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n console.log(\"Enabling repeat action\", action);\n\n this.enabledRepeatActionUrls.push(action.url);\n this.enabledRepeatActions.push(action);\n\n if(action.repeatType == \"watch\") {\n for(var structure of action.structures) {\n this.modelManager.addItemObserver(action.url, structure.type, function(changedItems){\n this.triggerWatchAction(action, changedItems);\n }.bind(this))\n }\n }\n }\n\n triggerWatchAction(action, changedItems) {\n console.log(\"Watch action triggered\", action, changedItems);\n if(action.repeatFrequency > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeatFrequency) {\n console.log(\"too frequent, returning\");\n return;\n }\n }\n\n if(action.repeatVerb == \"post\") {\n var request = this.Restangular.oneUrl(action.url, action.url);\n request.items = changedItems.map(function(item){\n var params = {uuid: item.uuid, content_type: item.content_type, content: item.content};\n return params;\n })\n request.post().then(function(response){\n console.log(\"watch action response\", response);\n action.lastExecuted = new Date();\n })\n }\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.changeObservers = [];\n this.items = [];\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n models.push(item)\n }\n this.addItems(models)\n this.resolveReferences()\n return models;\n }\n\n createItem(json_obj) {\n if(json_obj.content_type == \"Note\") {\n return new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n return new Tag(json_obj);\n } else {\n return new Item(json_obj);\n }\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n }\n }.bind(this))\n\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferences() {\n for(var item of this.items) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n continue;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n } else {\n console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n this.notes.push.apply(this.notes, _.difference(this.itemsForContentType(\"Note\"), this.notes));\n Item.sortItemsByDate(this.notes);\n\n this.tags.push.apply(this.tags, _.difference(this.itemsForContentType(\"Tag\"), this.tags));\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemObserver(id, type, callback) {\n this.changeObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemObserver(id) {\n _.remove(this.changeObservers, _.find(this.changeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n notifyObserversOfSyncCompletion() {\n for(var observer of this.changeObservers) {\n var changedItems = this.dirtyItems.filter(function(item){return item.content_type == observer.type});\n console.log(\"observer:\", observer, \"items\", changedItems);\n observer.callback(changedItems);\n }\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.notifyObserversOfSyncCompletion();\n\n this.getDirtyItems().forEach(function(item){\n item.dirty = false;\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n item.dirty = true;\n item.removeFromRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.dirty = true;\n itemTwo.dirty = true;\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.dirty = true;\n itemTwo.dirty = true;\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file