From 15a227daa271dc4f076727e32f852235f28a59a1 Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Fri, 16 Dec 2016 00:44:49 -0600 Subject: [PATCH] presentations --- .../app/frontend/controllers/editor.js | 16 +- .../app/frontend/controllers/notes.js | 28 +-- .../app/frontend/models/api/item.js | 9 +- .../app/frontend/models/app/note.js | 4 + .../app/frontend/models/app/tag.js | 4 + app/assets/javascripts/app/frontend/routes.js | 42 ---- .../javascripts/app/services/apiController.js | 85 ++++---- .../templates/frontend/editor.html.haml | 5 +- app/assets/templates/frontend/notes.html.haml | 4 +- vendor/assets/javascripts/transpiled.js | 182 +++++++----------- vendor/assets/javascripts/transpiled.js.map | 2 +- 11 files changed, 132 insertions(+), 249 deletions(-) diff --git a/app/assets/javascripts/app/frontend/controllers/editor.js b/app/assets/javascripts/app/frontend/controllers/editor.js index faea42c35..11b1e8cef 100644 --- a/app/assets/javascripts/app/frontend/controllers/editor.js +++ b/app/assets/javascripts/app/frontend/controllers/editor.js @@ -228,20 +228,20 @@ angular.module('app.frontend') this.editUrlPressed = function() { this.showMenu = false; var url = this.publicUrlForNote(this.note); - url = url.replace(this.note.presentation.root_path, ""); - this.url = {base: url, token : this.note.presentation.root_path}; + url = url.replace(this.note.presentation_name, ""); + this.url = {base: url, token : this.note.presentation_name}; this.editingUrl = true; } this.saveUrl = function($event) { $event.target.blur(); - var original = this.note.presentation.relative_path; - this.note.presentation.relative_path = this.url.token; + var original = this.note.presentation_name; + this.note.presentation_name = this.url.token; - apiController.updatePresentation(this.note, this.note.presentation, function(response){ + apiController.saveItems([this.note], function(response){ if(!response) { - this.note.presentation.relative_path = original; + this.note.presentation_name = original; this.url.token = original; alert("This URL is not available."); } else { @@ -259,14 +259,14 @@ angular.module('app.frontend') a.click(); } - apiController.shareItem(this.user, this.note, function(note){ + apiController.shareItem(this.note, function(note){ openInNewTab(this.publicUrlForNote(note)); }.bind(this)) this.showMenu = false; } this.unshareNote = function() { - apiController.unshareItem(this.user, this.note, function(note){ + apiController.unshareItem(this.note, function(note){ }) this.showMenu = false; diff --git a/app/assets/javascripts/app/frontend/controllers/notes.js b/app/assets/javascripts/app/frontend/controllers/notes.js index 9c2359ae8..154935b23 100644 --- a/app/assets/javascripts/app/frontend/controllers/notes.js +++ b/app/assets/javascripts/app/frontend/controllers/notes.js @@ -25,7 +25,7 @@ angular.module('app.frontend') } } }) - .controller('NotesCtrl', function (apiController, $timeout, ngDialog, $rootScope) { + .controller('NotesCtrl', function (apiController, $timeout, $rootScope) { $rootScope.$on("editorFocused", function(){ this.showMenu = false; @@ -81,38 +81,16 @@ angular.module('app.frontend') return; } - var callback = function(username) { - apiController.shareItem(this.user, this.tag, function(response){ - }) - }.bind(this); - - if(!this.user.username) { - ngDialog.open({ - template: 'frontend/modals/username.html', - controller: 'UsernameModalCtrl', - resolve: { - user: function() {return this.user}.bind(this), - callback: function() {return callback} - }, - className: 'ngdialog-theme-default', - disableAnimation: true - }); - } else { - callback(this.user.username); - } + apiController.shareItem(this.tag, function(response){}) } this.selectedTagUnshare = function() { this.showMenu = false; - apiController.unshareItem(this.user, this.tag, function(response){ + apiController.unshareItem(this.tag, function(response){ }) } - this.publicUrlForTag = function() { - return this.tag.presentation.url; - } - this.selectFirstNote = function(createNew) { var visibleNotes = this.tag.notes.filter(function(note){ return note.visible; diff --git a/app/assets/javascripts/app/frontend/models/api/item.js b/app/assets/javascripts/app/frontend/models/api/item.js index c29069895..6f0d5f629 100644 --- a/app/assets/javascripts/app/frontend/models/api/item.js +++ b/app/assets/javascripts/app/frontend/models/api/item.js @@ -64,8 +64,13 @@ class Item { // should be overriden to manage local properties } + referencesAffectedBySharingChange() { + // should be overriden to determine which references should be decrypted/encrypted + return null; + } + isPublic() { - return this.presentation; + return this.presentation_name; } isEncrypted() { @@ -77,7 +82,7 @@ class Item { } presentationURL() { - return this.presentation.url; + return this.presentation_url; } } diff --git a/app/assets/javascripts/app/frontend/models/app/note.js b/app/assets/javascripts/app/frontend/models/app/note.js index ce553efe6..70a67cf03 100644 --- a/app/assets/javascripts/app/frontend/models/app/note.js +++ b/app/assets/javascripts/app/frontend/models/app/note.js @@ -23,6 +23,10 @@ class Note extends Item { this.tags = this.referencesMatchingContentType("Tag"); } + referencesAffectedBySharingChange() { + return super.referencesAffectedBySharingChange(); + } + get hasOnePublicTag() { var hasPublicTag = false; this.tags.forEach(function(tag){ diff --git a/app/assets/javascripts/app/frontend/models/app/tag.js b/app/assets/javascripts/app/frontend/models/app/tag.js index c08883db7..9ab3f835a 100644 --- a/app/assets/javascripts/app/frontend/models/app/tag.js +++ b/app/assets/javascripts/app/frontend/models/app/tag.js @@ -20,4 +20,8 @@ class Tag extends Item { super.updateReferencesLocalMapping(); this.notes = this.referencesMatchingContentType("Note"); } + + referencesAffectedBySharingChange() { + return this.referencesMatchingContentType("Note"); + } } diff --git a/app/assets/javascripts/app/frontend/routes.js b/app/assets/javascripts/app/frontend/routes.js index 864af16c2..56d5a04cc 100644 --- a/app/assets/javascripts/app/frontend/routes.js +++ b/app/assets/javascripts/app/frontend/routes.js @@ -18,34 +18,6 @@ angular.module('app.frontend') } }) - .state('presentation', { - url: '/:root_path', - parent: 'base', - views: { - 'content@' : { - templateUrl: 'frontend/presentation.html', - controller: "PresentationCtrl" - } - }, - resolve: { - presentation: getPresentation - } - }) - - .state('tag', { - url: '/:root_path/:secondary_path', - parent: 'base', - views: { - 'content@' : { - templateUrl: 'frontend/presentation.html', - controller: "PresentationCtrl" - } - }, - resolve: { - presentation: getPresentation - } - }) - // Auth routes .state('auth', { abstract: true, @@ -89,20 +61,6 @@ angular.module('app.frontend') } }); - function getPresentation ($q, $state, $stateParams, Restangular) { - var deferred = $q.defer(); - var restangularQuery = Restangular.one('presentations', 'show_by_path'); - restangularQuery.get({root_path: $stateParams.root_path, secondary_path: $stateParams.secondary_path}) - .then(function(response) { - deferred.resolve(response); - }) - .catch(function(response) { - $state.go('404'); - }); - - return deferred.promise; - } - // Default fall back route $urlRouterProvider.otherwise(function($injector, $location){ var state = $injector.get('$state'); diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index e12d17910..73661d5c0 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -20,11 +20,11 @@ angular.module('app.frontend') } - this.$get = function(Restangular, modelManager) { - return new ApiController(Restangular, modelManager); + this.$get = function(Restangular, modelManager, ngDialog) { + return new ApiController(Restangular, modelManager, ngDialog); } - function ApiController(Restangular, modelManager) { + function ApiController(Restangular, modelManager, ngDialog) { this.setUser = function(user) { this.user = user; @@ -65,6 +65,7 @@ angular.module('app.frontend') Restangular.one("users/current").get().then(function(response){ var plain = response.plain(); var items = plain.items; + console.log("retreived items", plain); this.decryptItemsWithLocalKey(items); callback(plain); }.bind(this)) @@ -143,9 +144,9 @@ angular.module('app.frontend') */ this.setUsername = function(user, username, callback) { - var request = Restangular.one("users", user.uuid).one("set_username"); + var request = Restangular.one("users", user.uuid); request.username = username; - request.post().then(function(response){ + request.patch().then(function(response){ callback(response.plain()); }) } @@ -205,9 +206,6 @@ angular.module('app.frontend') request.post().then(function(response) { var savedItems = response.items; console.log("response items", savedItems); - // items.forEach(function(item) { - // _.merge(item, _.find(savedItems, {uuid: item.uuid})); - // }) callback(response); }) } @@ -215,7 +213,8 @@ angular.module('app.frontend') this.createRequestParamsForItem = function(item) { var itemCopy = _.cloneDeep(item); - var params = {uuid: item.uuid, content_type: item.content_type}; + var params = {uuid: item.uuid, content_type: item.content_type, presentation_name: item.presentation_name}; + itemCopy.content.references = _.map(itemCopy.content.references, function(reference){ return {uuid: reference.uuid, content_type: reference.content_type}; }) @@ -248,55 +247,43 @@ angular.module('app.frontend') } this.shareItem = function(item, callback) { + console.log("sharing item", item); if(!this.user.uuid) { alert("You must be signed in to share."); - } else { - Restangular.one("users", this.user.uuid).one("items", item.uuid).one("presentations").post() - .then(function(response){ - var presentation = response.plain(); - _.merge(item, {presentation: presentation}); - callback(item); + return; + } - // decrypt references - if(item.references.length > 0) { - this.saveBatchItems(item.references, function(success){}) - } - }) + var shareFn = function() { + item.presentation_name = "_auto_"; + var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); + this.saveItems(needsUpdate, function(success){}) + }.bind(this) + + if(!this.user.username) { + ngDialog.open({ + template: 'frontend/modals/username.html', + controller: 'UsernameModalCtrl', + resolve: { + user: function() {return this.user}.bind(this), + callback: function() { + return shareFn; + } + }, + className: 'ngdialog-theme-default', + disableAnimation: true + }); + } else { + shareFn(); } } this.unshareItem = function(item, callback) { - var request = Restangular.one("users", this.user.uuid).one("items", item.uuid).one("presentations", item.presentation.uuid); - request.remove().then(function(response){ - item.presentation = null; - callback(null); - - // encrypt references - if(item.references.length > 0) { - this.saveBatchItems(item.references, function(success){}) - } - }) + console.log("unsharing item", item); + item.presentation_name = null; + var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); + this.saveItems(needsUpdate, function(success){}) } - - /* - Presentations - */ - - this.updatePresentation = function(resource, presentation, callback) { - var request = Restangular.one("users", this.user.uuid) - .one("items", resource.uuid) - .one("presentations", resource.presentation.uuid); - _.merge(request, presentation); - request.patch().then(function(response){ - callback(response.plain()); - }) - .catch(function(error){ - callback(nil); - }) - } - - /* Import */ diff --git a/app/assets/templates/frontend/editor.html.haml b/app/assets/templates/frontend/editor.html.haml index f3e1c0acc..47f9dd4a1 100644 --- a/app/assets/templates/frontend/editor.html.haml +++ b/app/assets/templates/frontend/editor.html.haml @@ -17,9 +17,6 @@ %span.sr-only %ul.dropdown-menu.dropdown-menu-left.nt-dropdown-menu.dark{"ng-if" => "ctrl.showMenu && !ctrl.note.locked"} - -# %li - -# %a.text{"ng-click" => "ctrl.selectedMenuItem(); ctrl.saveNote($event, note)"} Save - -# .shortcut Cmd + S %li %a.text{"ng-click" => "ctrl.selectedMenuItem(); ctrl.toggleFullScreen()"} Toggle Fullscreen .shortcut Cmd + O @@ -40,7 +37,7 @@ .panel-body{"style" => "text-align: center; color: black;"} This editor is Markdown enabled. .menu-right-container - .public-link{"ng-if" => "ctrl.note.presentation"} + .public-link{"ng-if" => "ctrl.note.isPublic()"} %a.url{"ng-if" => "!ctrl.editingUrl", "href" => "{{ctrl.publicUrlForNote(ctrl.note)}}", "target" => "_blank"} %span.icon-rss.icon {{ctrl.publicUrlForNote(note)}} diff --git a/app/assets/templates/frontend/notes.html.haml b/app/assets/templates/frontend/notes.html.haml index 2b3c21fca..2466b4826 100644 --- a/app/assets/templates/frontend/notes.html.haml +++ b/app/assets/templates/frontend/notes.html.haml @@ -22,9 +22,9 @@ %a.text{"ng-click" => "ctrl.selectedMenuItem(); ctrl.selectedTagDelete()"} Delete Tag .menu-right-container .public-link{"ng-if" => "ctrl.tag.presentation"} - %a.url{"ng-if" => "!ctrl.editingUrl", "href" => "{{ctrl.publicUrlForTag(ctrl.tag)}}", "target" => "_blank"} + %a.url{"ng-if" => "!ctrl.editingUrl", "href" => "{{ctrl.tag.presentationURL()}}", "target" => "_blank"} %span.icon-rss.icon - {{ctrl.publicUrlForTag()}} + {{ctrl.tag.presentationURL()}} .edit-url{"ng-if" => "ctrl.editingUrl"} {{ctrl.url.base}} %input.input{"ng-model" => "ctrl.url.token", "ng-keyup" => "$event.keyCode == 13 && ctrl.saveUrl($event)", diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index 762ad6ed8..b15c175d0 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -52,30 +52,6 @@ angular.module('app.frontend', ['ui.router', 'ng-token-auth', 'restangular', 'ip controller: 'HomeCtrl' } } - }).state('presentation', { - url: '/:root_path', - parent: 'base', - views: { - 'content@': { - templateUrl: 'frontend/presentation.html', - controller: "PresentationCtrl" - } - }, - resolve: { - presentation: getPresentation - } - }).state('tag', { - url: '/:root_path/:secondary_path', - parent: 'base', - views: { - 'content@': { - templateUrl: 'frontend/presentation.html', - controller: "PresentationCtrl" - } - }, - resolve: { - presentation: getPresentation - } }) // Auth routes @@ -117,18 +93,6 @@ angular.module('app.frontend', ['ui.router', 'ng-token-auth', 'restangular', 'ip } }); - function getPresentation($q, $state, $stateParams, Restangular) { - var deferred = $q.defer(); - var restangularQuery = Restangular.one('presentations', 'show_by_path'); - restangularQuery.get({ root_path: $stateParams.root_path, secondary_path: $stateParams.secondary_path }).then(function (response) { - deferred.resolve(response); - }).catch(function (response) { - $state.go('404'); - }); - - return deferred.promise; - } - // Default fall back route $urlRouterProvider.otherwise(function ($injector, $location) { var state = $injector.get('$state'); @@ -372,20 +336,20 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); this.editUrlPressed = function () { this.showMenu = false; var url = this.publicUrlForNote(this.note); - url = url.replace(this.note.presentation.root_path, ""); - this.url = { base: url, token: this.note.presentation.root_path }; + url = url.replace(this.note.presentation_name, ""); + this.url = { base: url, token: this.note.presentation_name }; this.editingUrl = true; }; this.saveUrl = function ($event) { $event.target.blur(); - var original = this.note.presentation.relative_path; - this.note.presentation.relative_path = this.url.token; + var original = this.note.presentation_name; + this.note.presentation_name = this.url.token; - apiController.updatePresentation(this.note, this.note.presentation, function (response) { + apiController.saveItems([this.note], function (response) { if (!response) { - this.note.presentation.relative_path = original; + this.note.presentation_name = original; this.url.token = original; alert("This URL is not available."); } else { @@ -403,14 +367,14 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); a.click(); } - apiController.shareItem(this.user, this.note, function (note) { + apiController.shareItem(this.note, function (note) { openInNewTab(this.publicUrlForNote(note)); }.bind(this)); this.showMenu = false; }; this.unshareNote = function () { - apiController.unshareItem(this.user, this.note, function (note) {}); + apiController.unshareItem(this.note, function (note) {}); this.showMenu = false; }; @@ -767,7 +731,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); }); } }; -}).controller('NotesCtrl', function (apiController, $timeout, ngDialog, $rootScope) { +}).controller('NotesCtrl', function (apiController, $timeout, $rootScope) { $rootScope.$on("editorFocused", function () { this.showMenu = false; @@ -823,37 +787,12 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); return; } - var _callback = function (username) { - apiController.shareItem(this.user, this.tag, function (response) {}); - }.bind(this); - - if (!this.user.username) { - ngDialog.open({ - template: 'frontend/modals/username.html', - controller: 'UsernameModalCtrl', - resolve: { - user: function () { - return this.user; - }.bind(this), - callback: function callback() { - return _callback; - } - }, - className: 'ngdialog-theme-default', - disableAnimation: true - }); - } else { - _callback(this.user.username); - } + apiController.shareItem(this.tag, function (response) {}); }; this.selectedTagUnshare = function () { this.showMenu = false; - apiController.unshareItem(this.user, this.tag, function (response) {}); - }; - - this.publicUrlForTag = function () { - return this.tag.presentation.url; + apiController.unshareItem(this.tag, function (response) {}); }; this.selectFirstNote = function (createNew) { @@ -1090,10 +1029,16 @@ var Item = function () { value: function updateReferencesLocalMapping() { // should be overriden to manage local properties } + }, { + key: 'referencesAffectedBySharingChange', + value: function referencesAffectedBySharingChange() { + // should be overriden to determine which references should be decrypted/encrypted + return null; + } }, { key: 'isPublic', value: function isPublic() { - return this.presentation; + return this.presentation_name; } }, { key: 'isEncrypted', @@ -1108,7 +1053,7 @@ var Item = function () { }, { key: 'presentationURL', value: function presentationURL() { - return this.presentation.url; + return this.presentation_url; } }]); @@ -1141,6 +1086,11 @@ var Note = function (_Item) { _get(Note.prototype.__proto__ || Object.getPrototypeOf(Note.prototype), 'updateReferencesLocalMapping', this).call(this); this.tags = this.referencesMatchingContentType("Tag"); } + }, { + key: 'referencesAffectedBySharingChange', + value: function referencesAffectedBySharingChange() { + return _get(Note.prototype.__proto__ || Object.getPrototypeOf(Note.prototype), 'referencesAffectedBySharingChange', this).call(this); + } }, { key: 'toJSON', value: function toJSON() { @@ -1207,6 +1157,11 @@ var Tag = function (_Item2) { _get(Tag.prototype.__proto__ || Object.getPrototypeOf(Tag.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() { @@ -1244,11 +1199,11 @@ var User = function User(json_obj) { return url; }; - this.$get = function (Restangular, modelManager) { - return new ApiController(Restangular, modelManager); + this.$get = function (Restangular, modelManager, ngDialog) { + return new ApiController(Restangular, modelManager, ngDialog); }; - function ApiController(Restangular, modelManager) { + function ApiController(Restangular, modelManager, ngDialog) { this.setUser = function (user) { this.user = user; @@ -1288,6 +1243,7 @@ var User = function User(json_obj) { Restangular.one("users/current").get().then(function (response) { var plain = response.plain(); var items = plain.items; + console.log("retreived items", plain); this.decryptItemsWithLocalKey(items); callback(plain); }.bind(this)).catch(function (error) { @@ -1364,9 +1320,9 @@ var User = function User(json_obj) { */ this.setUsername = function (user, username, callback) { - var request = Restangular.one("users", user.uuid).one("set_username"); + var request = Restangular.one("users", user.uuid); request.username = username; - request.post().then(function (response) { + request.patch().then(function (response) { callback(response.plain()); }); }; @@ -1424,9 +1380,6 @@ var User = function User(json_obj) { request.post().then(function (response) { var savedItems = response.items; console.log("response items", savedItems); - // items.forEach(function(item) { - // _.merge(item, _.find(savedItems, {uuid: item.uuid})); - // }) callback(response); }); }; @@ -1434,7 +1387,8 @@ var User = function User(json_obj) { this.createRequestParamsForItem = function (item) { var itemCopy = _.cloneDeep(item); - var params = { uuid: item.uuid, content_type: item.content_type }; + var params = { uuid: item.uuid, content_type: item.content_type, presentation_name: item.presentation_name }; + itemCopy.content.references = _.map(itemCopy.content.references, function (reference) { return { uuid: reference.uuid, content_type: reference.content_type }; }); @@ -1464,47 +1418,43 @@ var User = function User(json_obj) { }; this.shareItem = function (item, callback) { + console.log("sharing item", item); if (!this.user.uuid) { alert("You must be signed in to share."); - } else { - Restangular.one("users", this.user.uuid).one("items", item.uuid).one("presentations").post().then(function (response) { - var presentation = response.plain(); - _.merge(item, { presentation: presentation }); - callback(item); + return; + } - // decrypt references - if (item.references.length > 0) { - this.saveBatchItems(item.references, function (success) {}); - } + var shareFn = function () { + item.presentation_name = "_auto_"; + var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); + this.saveItems(needsUpdate, function (success) {}); + }.bind(this); + + if (!this.user.username) { + ngDialog.open({ + template: 'frontend/modals/username.html', + controller: 'UsernameModalCtrl', + resolve: { + user: function () { + return this.user; + }.bind(this), + callback: function callback() { + return shareFn; + } + }, + className: 'ngdialog-theme-default', + disableAnimation: true }); + } else { + shareFn(); } }; this.unshareItem = function (item, callback) { - var request = Restangular.one("users", this.user.uuid).one("items", item.uuid).one("presentations", item.presentation.uuid); - request.remove().then(function (response) { - item.presentation = null; - callback(null); - - // encrypt references - if (item.references.length > 0) { - this.saveBatchItems(item.references, function (success) {}); - } - }); - }; - - /* - Presentations - */ - - this.updatePresentation = function (resource, presentation, callback) { - var request = Restangular.one("users", this.user.uuid).one("items", resource.uuid).one("presentations", resource.presentation.uuid); - _.merge(request, presentation); - request.patch().then(function (response) { - callback(response.plain()); - }).catch(function (error) { - callback(nil); - }); + console.log("unsharing item", item); + item.presentation_name = null; + var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []); + this.saveItems(needsUpdate, function (success) {}); }; /* diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index 70933e648..5bf37a5ca 100644 --- a/vendor/assets/javascripts/transpiled.js.map +++ b/vendor/assets/javascripts/transpiled.js.map @@ -1 +1 @@ -{"version":3,"sources":["app.js"],"names":["Neeto","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","_","extend","Authorization","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","resolve","presentation","getPresentation","$rootScope","$stateParams","resetData","reset_password_token","email","$on","event","toState","toParams","fromState","fromParams","options","$q","$state","Restangular","deferred","defer","restangularQuery","one","get","root_path","secondary_path","then","response","catch","go","promise","otherwise","$injector","$location","path","html5Mode","BaseCtrl","modelManager","directive","$timeout","restrict","scope","save","remove","note","user","replace","controllerAs","bindToController","link","elem","attrs","ctrl","handler","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","window","addEventListener","removeEventListener","$watch","oldNote","setNote","$sce","apiController","markdownRenderer","demoNotes","title","content","showSampler","uuid","filteredNotes","length","demoNoteNames","map","currentDemoContent","text","prebeginFn","bind","callback","index","contentCallback","editorMode","focusTitle","hasChanges","dummy","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","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","base","saveUrl","original","relative_path","updatePresentation","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","$auth","serverSideValidation","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password","password_confirmation","changePassword","current_password","new_password","hasLocalData","mergeLocalChanged","shouldMerge","confirm","loginSubmitPressed","loginData","login","user_password","errors","onAuthSuccess","submitRegistrationForm","register","forgotPasswordSubmit","requestPasswordReset","resp","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","downloadDataArchive","setAttribute","notesDataFile","importFileSelected","files","file","reader","FileReader","onload","e","importJSONData","result","console","log","readAsText","mergeLocalDataRemotely","showLogin","showRegistration","$scope","bodyClass","description","onUserSet","setUser","defaultUser","allTag","Tag","all","name","tags","getCurrentUser","User","items","json_obj","content_type","Note","Item","localUser","updateAllTag","notes","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","tagsAddNew","addTag","tagsSave","saveItems","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","addTagToNote","saveDirtyItems","notesRemoveTag","validNotes","filterDummyNotes","deleteItem","notesSelectionMade","selectedNote","notesAddNew","addNote","unshift","addDirtyItems","headerLogout","addNew","selectionMade","removeTag","tagDidChange","ngDialog","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","username","open","template","className","disableAnimation","selectedTagUnshare","publicUrlForTag","createNew","visibleNotes","filter","newNote","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","formData","saveUsername","setUsername","closeThisDialog","Object","defineProperty","set","value","finalValue","decodedValue","JSON","parse","enumerable","merge","crypto","generateUUID","setContentRaw","rawContent","references","reference","push","uniq","updateReferencesLocalMapping","contentType","loc_eek","referencesMatchingContentType","hasOnePublicTag","hasPublicTag","isPublic","filtered","provider","domainName","domain_comps","hostname","split","domain","protocol","port","$get","ApiController","refresh","setItem","plain","decryptItemsWithLocalKey","error","keys","generateEncryptionKeysForUser","setGk","gk","request","pw","post","current_keys","new_keys","_performPasswordChange","reencryptAllItemsAndSave","patch","verifyEncryptionStatusOfAllItems","allItems","filteredItems","itemsNeedingUpdate","item","isEncrypted","saveBatchItems","dirtyItems","clearDirtyItems","createRequestParamsForItem","savedItems","itemCopy","cloneDeep","encryptSingleItem","retrieveGk","stringify","writeUserToLocalStorage","resource","nil","jsonString","encryptSingleItemWithLocalKey","itemsDataFile","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","presentationParams","id","presentable_type","presentable_id","created_at","modified_at","tag_id","tag_name","removeItem","staticifyObject","object","saveUser","filterDummyItems","writeToLocalStorage","key","toJson","draftString","ek","decryptText","generateRandomEncryptionKey","encryptText","local_encryption_scheme","encryptItems","encryptItemsWithLocalKey","encryptNonPublicItemsWithLocalKey","nonpublic","pending_share","decryptSingleItemWithLocalKey","decryptSingleItem","local_eek","decryptItems","newKey","oldKey","ItemManager","itemId","referencesForItemId","dirty","i","referencedItem","_dirty","removeReferencesBetweenItems","concat","itemOne","itemTwo","removeReference","addReference","_items","resolveReferences","service","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","groups","Array","createReferencesBetweenItems","refreshRelationshipsForTag","refreshRelationshipsForNote","sort","b","Date","itemsForContentType","showErrors","formErrors","form","$setDirty","$setValidity","$error","server","join","parseErrors","shouldFocus","$element","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","undefined","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","toString","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","running","auxStyle","start","typewrite","updateIt","charIndex","arrIndex","updateValue","substring","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","slice","charAt","parseInt","prop","toUpperCase","val","html","newVal","oldVal","generateRandomKey","CryptoJS","lib","WordArray","random","d","getTime","performance","now","c","r","Math","floor","encrypted_content","AES","decrypt","enc","Utf8","encrypt","salt","passphrase","PBKDF2","keySize","sha256","SHA256","generateAsymmetricKeyPair","input","output","hasher","algo","SHA512","iterations","firstHalf","clone","secondHalf","sigBytes","outputLength","words"],"mappings":"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","file":"transpiled.js","sourcesContent":["'use strict';\n\nvar Neeto = Neeto || {};\n\nangular\n .module('app.frontend', [\n 'ui.router',\n 'ng-token-auth',\n 'restangular',\n 'ipCookie',\n 'oc.lazyLoad',\n 'angularLazyImg',\n 'ngDialog'\n ])\n // Configure path to API\n .config(function (RestangularProvider, apiControllerProvider) {\n RestangularProvider.setDefaultHeaders({\"Content-Type\": \"application/json\"});\n\n var url = apiControllerProvider.defaultServerURL();\n RestangularProvider.setBaseUrl(url);\n\n RestangularProvider.setFullRequestInterceptor(function(element, operation, route, url, headers, params, httpConfig) {\n var token = localStorage.getItem(\"jwt\");\n if(token) {\n headers = _.extend(headers, {Authorization: \"Bearer \" + localStorage.getItem(\"jwt\")});\n }\n\n return {\n element: element,\n params: params,\n headers: headers,\n httpConfig: httpConfig\n };\n });\n })\n;angular.module('app.frontend')\n .config(function ($stateProvider, $urlRouterProvider, $locationProvider) {\n\n $stateProvider\n .state('base', {\n abstract: true,\n })\n\n // Homepage\n .state('home', {\n url: '/',\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/home.html',\n controller: 'HomeCtrl'\n }\n }\n })\n\n .state('presentation', {\n url: '/:root_path',\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/presentation.html',\n controller: \"PresentationCtrl\"\n }\n },\n resolve: {\n presentation: getPresentation\n }\n })\n\n .state('tag', {\n url: '/:root_path/:secondary_path',\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/presentation.html',\n controller: \"PresentationCtrl\"\n }\n },\n resolve: {\n presentation: getPresentation\n }\n })\n\n // Auth routes\n .state('auth', {\n abstract: true,\n url: '/auth',\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/auth/wrapper.html',\n }\n }\n })\n .state('auth.login', {\n url: '/login',\n templateUrl: 'frontend/auth/login.html',\n })\n .state('auth.forgot', {\n url: '/forgot',\n templateUrl: 'frontend/auth/forgot.html',\n })\n .state('auth.reset', {\n url: '/reset?reset_password_token&email',\n templateUrl: 'frontend/auth/reset.html',\n controller: function($rootScope, $stateParams) {\n $rootScope.resetData = {reset_password_token: $stateParams.reset_password_token, email: $stateParams.email};\n\n // Clear reset_password_token on change state\n $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams, options) {\n $rootScope.reset_password_token = null;\n });\n },\n })\n\n\n // 404 Error\n .state('404', {\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/errors/404.html'\n }\n }\n });\n\n function getPresentation ($q, $state, $stateParams, Restangular) {\n var deferred = $q.defer();\n var restangularQuery = Restangular.one('presentations', 'show_by_path');\n restangularQuery.get({root_path: $stateParams.root_path, secondary_path: $stateParams.secondary_path})\n .then(function(response) {\n deferred.resolve(response);\n })\n .catch(function(response) {\n $state.go('404');\n });\n\n return deferred.promise;\n }\n\n // Default fall back route\n $urlRouterProvider.otherwise(function($injector, $location){\n var state = $injector.get('$state');\n state.go('404');\n return $location.path();\n });\n\n // enable HTML5 Mode for SEO\n $locationProvider.html5Mode(true);\n\n });\n;class BaseCtrl {\n constructor($rootScope, modelManager) {\n // $rootScope.resetPasswordSubmit = function() {\n // var new_keys = Neeto.crypto.generateEncryptionKeysForUser($rootScope.resetData.password, $rootScope.resetData.email);\n // var data = _.clone($rootScope.resetData);\n // data.password = new_keys.pw;\n // data.password_confirmation = new_keys.pw;\n // $auth.updatePassword(data);\n // apiController.setGk(new_keys.gk);\n // }\n\n // var note = new Note();\n // note.content = {title: \"hello\", text: \"world\"};\n // console.log(\"note content\", note.content);\n // console.log(\"note title\", note.title);\n // console.log(\"note json\", JSON.stringify(note));\n //\n // console.log(\"Copy\", _.cloneDeep(note));\n }\n}\n\nangular.module('app.frontend').controller('BaseCtrl', BaseCtrl);\n;angular.module('app.frontend')\n .directive(\"editorSection\", function($timeout){\n return {\n restrict: 'E',\n scope: {\n save: \"&\",\n remove: \"&\",\n note: \"=\",\n user: \"=\"\n },\n templateUrl: 'frontend/editor.html',\n replace: true,\n controller: 'EditorCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n\n var handler = function(event) {\n if (event.ctrlKey || event.metaKey) {\n switch (String.fromCharCode(event.which).toLowerCase()) {\n case 's':\n event.preventDefault();\n $timeout(function(){\n ctrl.saveNote(event);\n });\n break;\n case 'e':\n event.preventDefault();\n $timeout(function(){\n ctrl.clickedEditNote();\n })\n break;\n case 'm':\n event.preventDefault();\n $timeout(function(){\n ctrl.toggleMarkdown();\n })\n break;\n case 'o':\n event.preventDefault();\n $timeout(function(){\n ctrl.toggleFullScreen();\n })\n break;\n }\n }\n };\n\n window.addEventListener('keydown', handler);\n\n scope.$on('$destroy', function(){\n window.removeEventListener('keydown', handler);\n })\n\n scope.$watch('ctrl.note', function(note, oldNote){\n if(note) {\n ctrl.setNote(note, oldNote);\n } else {\n ctrl.note = {};\n }\n });\n }\n }\n })\n .controller('EditorCtrl', function ($sce, $timeout, apiController, modelManager, markdownRenderer, $rootScope) {\n\n this.demoNotes = [\n {title: \"Live print a file with tail\", content: \"tail -f log/production.log\"},\n {title: \"Create SSH tunnel\", content: \"ssh -i .ssh/key.pem -N -L 3306:example.com:3306 ec2-user@example.com\"},\n {title: \"List of processes running on port\", content: \"lsof -i:8080\"},\n {title: \"Set ENV from file\", content: \"export $(cat .envfile | xargs)\"},\n {title: \"Find process by name\", content: \"ps -ax | grep \"},\n {title: \"NPM install without sudo\", content: \"sudo chown -R $(whoami) ~/.npm\"},\n {title: \"Email validation regex\", content: \"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$\"},\n {title: \"Ruby generate 256 bit key\", content: \"Digest::SHA256.hexdigest(SecureRandom.random_bytes(32))\"},\n {title: \"Mac add user to user tag\", content: \"sudo dsedittag -o edit -a USERNAME -t user GROUPNAME\"},\n {title: \"Kill Mac OS System Apache\", content: \"sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist\"},\n {title: \"Docker run with mount binding and port\", content: \"docker run -v /home/vagrant/www/app:/var/www/app -p 8080:80 -d kpi/s3\"},\n {title: \"MySQL grant privileges\", content: \"GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'%’;\"},\n {title: \"MySQL list users\", content: \"SELECT User FROM mysql.user;\"},\n ];\n\n this.showSampler = !this.user.uuid && modelManager.filteredNotes.length == 0;\n\n this.demoNoteNames = _.map(this.demoNotes, function(note){\n return note.title;\n });\n\n this.currentDemoContent = {text: null};\n\n this.prebeginFn = function() {\n this.currentDemoContent.text = null;\n }.bind(this)\n\n this.callback = function(index) {\n this.currentDemoContent.text = this.demoNotes[index].text;\n }.bind(this)\n\n this.contentCallback = function(index) {\n }\n\n this.setNote = function(note, oldNote) {\n this.editorMode = 'edit';\n if(note.content.text.length == 0) {\n this.focusTitle(100);\n }\n\n if(oldNote && oldNote != note) {\n if(oldNote.hasChanges) {\n this.save()(oldNote, null);\n } else if(oldNote.dummy) {\n this.remove()(oldNote);\n }\n }\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.content.text));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n apiController.saveDraftToDisk(this.note);\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation.root_path, \"\");\n this.url = {base: url, token : this.note.presentation.root_path};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation.relative_path;\n this.note.presentation.relative_path = this.url.token;\n\n apiController.updatePresentation(this.note, this.note.presentation, function(response){\n if(!response) {\n this.note.presentation.relative_path = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.user, this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.user, this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(){\n return {\n restrict: 'E',\n scope: {\n user: \"=\",\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n\n }\n }\n })\n .controller('HeaderCtrl', function ($auth, $state, apiController, modelManager, serverSideValidation, $timeout) {\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.user, this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 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.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.errors) {\n this.loginData.status = response.errors[0];\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.errors) {\n this.loginData.status = response.errors[0];\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', 'neeto.json');\n link.href = apiController.notesDataFile(this.user);\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 $rootScope.title = \"Notes — Neeto, a secure code box for developers\";\n $rootScope.description = \"A secure code box for developers to store common commands and useful notes.\";\n\n var onUserSet = function() {\n apiController.setUser($scope.defaultUser);\n $scope.allTag = new Tag({all: true});\n $scope.allTag.content.name = \"All\";\n $scope.tags = modelManager.tags;\n\n // apiController.verifyEncryptionStatusOfAllItems($scope.defaultUser, function(success){});\n }\n\n apiController.getCurrentUser(function(response){\n if(response && !response.errors) {\n console.log(\"Get user response\", response);\n $scope.defaultUser = new User(response);\n modelManager.items = _.map(response.items, function(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 $rootScope.title = \"Notes — Neeto\";\n onUserSet();\n } else {\n $scope.defaultUser = new User(apiController.localUser());\n onUserSet();\n }\n });\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n $scope.allTag.notes = modelManager.filteredNotes;\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 apiController.saveItems([tag], 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.saveDirtyItems(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 // if no more notes, delete tag\n apiController.deleteItem($scope.defaultUser, 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 } else {\n $scope.selectedTag.notes.unshift(note);\n }\n\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n modelManager.addDirtyItems(note);\n\n apiController.saveDirtyItems(function(){\n modelManager.addNote(note);\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 $scope.updateAllTag();\n\n if(note.dummy) {\n return;\n }\n\n apiController.deleteItem(note, function(success){})\n apiController.saveDirtyItems(function(){});\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n $scope.defaultUser = apiController.localUser();\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, ngDialog, $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 var callback = function(username) {\n apiController.shareItem(this.user, this.tag, function(response){\n })\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() {return callback}\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n callback(this.user.username);\n }\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.user, this.tag, function(response){\n\n })\n }\n\n this.publicUrlForTag = function() {\n return this.tag.presentation.url;\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.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.content.name;\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.name.length == 0) {\n tag.content.name = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.content.name || tag.content.name.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.root_path;\n user.presentation = response;\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.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 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 updateReferencesLocalMapping() {\n // should be overriden to manage local properties\n }\n\n isPublic() {\n return this.presentation;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && typeof this.content === 'string' ? true : false;\n }\n\n encryptionEnabled() {\n return this.loc_eek;\n }\n\n presentationURL() {\n return this.presentation.url;\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 if(!this.content.title) {\n this.content.title = \"\";\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 get hasOnePublicTag() {\n var hasPublicTag = false;\n this.tags.forEach(function(tag){\n if(tag.isPublic()) {\n hasPublicTag = true;\n return;\n }\n })\n\n return hasPublicTag;\n }\n\n toJSON() {\n return {uuid: this.uuid}\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.name) {\n this.content.name = \"\";\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;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 = location.protocol + \"//\" + domainName() + (location.port ? ':' + location.port: '');\n }\n }\n return url;\n }\n\n\n this.$get = function(Restangular, modelManager) {\n return new ApiController(Restangular, modelManager);\n }\n\n function ApiController(Restangular, modelManager) {\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 = location.protocol + \"//\" + domainName() + (location.port ? ':' + location.port: '');\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.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 plain = response.plain();\n var items = plain.items;\n this.decryptItemsWithLocalKey(items);\n callback(plain);\n }.bind(this))\n .catch(function(error){\n callback(null);\n })\n }\n\n this.login = function(email, password, callback) {\n var keys = Neeto.crypto.generateEncryptionKeysForUser(password, email);\n this.setGk(keys.gk);\n var request = Restangular.one(\"auth/sign_in.json\");\n request.user = {password: keys.pw, email: email};\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n }\n\n this.register = function(email, password, callback) {\n var keys = Neeto.crypto.generateEncryptionKeysForUser(password, email);\n this.setGk(keys.gk);\n var request = Restangular.one(\"auth.json\");\n request.user = {password: keys.pw, email: email};\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n }\n\n this.changePassword = function(user, current_password, new_password) {\n var current_keys = Neeto.crypto.generateEncryptionKeysForUser(current_password, user.email);\n var new_keys = Neeto.crypto.generateEncryptionKeysForUser(new_password, user.email);\n\n var data = {};\n data.current_password = current_keys.pw;\n data.password = new_keys.pw;\n data.password_confirmation = new_keys.pw;\n\n var user = this.user;\n\n this._performPasswordChange(current_keys, new_keys, function(response){\n if(response && !response.errors) {\n // this.showNewPasswordForm = false;\n // reencrypt data with new gk\n this.reencryptAllItemsAndSave(user, new_keys.gk, current_keys.gk, function(success){\n if(success) {\n this.setGk(new_keys.gk);\n alert(\"Your password has been changed and your data re-encrypted.\");\n } else {\n // rollback password\n this._performPasswordChange(new_keys, current_keys, 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 })\n }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n request.user = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\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).one(\"set_username\");\n request.username = username;\n request.post().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.saveDirtyItems = function(callback) {\n var dirtyItems = modelManager.dirtyItems;\n if(dirtyItems.length == 0) {\n callback();\n return;\n }\n\n this.saveItems(dirtyItems, function(response){\n modelManager.clearDirtyItems();\n callback();\n })\n }\n\n this.saveItems = function(items, callback) {\n console.log(\"saving items\", items);\n var request = Restangular.one(\"users\", this.user.uuid).one(\"items\");\n request.items = _.map(items, function(item){\n return this.createRequestParamsForItem(item);\n }.bind(this));\n console.log(\"sending request items\", request.items);\n\n request.post().then(function(response) {\n var savedItems = response.items;\n console.log(\"response items\", savedItems);\n // items.forEach(function(item) {\n // _.merge(item, _.find(savedItems, {uuid: item.uuid}));\n // })\n callback(response);\n })\n }\n\n this.createRequestParamsForItem = function(item) {\n var itemCopy = _.cloneDeep(item);\n\n var params = {uuid: item.uuid, content_type: item.content_type};\n itemCopy.content.references = _.map(itemCopy.content.references, function(reference){\n return {uuid: reference.uuid, content_type: reference.content_type};\n })\n\n if(!item.isPublic()) {\n // encrypted\n this.encryptSingleItem(itemCopy, this.retrieveGk());\n params.content = itemCopy.content;\n params.loc_eek = itemCopy.loc_eek;\n }\n else {\n // decrypted\n params.content = JSON.stringify(item.content);\n params.loc_eek = null;\n }\n return params;\n }\n\n\n this.deleteItem = function(item, callback) {\n if(!this.user.uuid) {\n this.writeUserToLocalStorage(this.user);\n callback(true);\n } else {\n Restangular.one(\"users\", this.user.uuid).one(\"items\", item.uuid).remove()\n .then(function(response) {\n callback(true);\n })\n }\n }\n\n this.shareItem = function(item, callback) {\n if(!this.user.uuid) {\n alert(\"You must be signed in to share.\");\n } else {\n Restangular.one(\"users\", this.user.uuid).one(\"items\", item.uuid).one(\"presentations\").post()\n .then(function(response){\n var presentation = response.plain();\n _.merge(item, {presentation: presentation});\n callback(item);\n\n // decrypt references\n if(item.references.length > 0) {\n this.saveBatchItems(item.references, function(success){})\n }\n })\n }\n }\n\n this.unshareItem = function(item, callback) {\n var request = Restangular.one(\"users\", this.user.uuid).one(\"items\", item.uuid).one(\"presentations\", item.presentation.uuid);\n request.remove().then(function(response){\n item.presentation = null;\n callback(null);\n\n // encrypt references\n if(item.references.length > 0) {\n this.saveBatchItems(item.references, function(success){})\n }\n })\n }\n\n\n /*\n Presentations\n */\n\n this.updatePresentation = function(resource, presentation, callback) {\n var request = Restangular.one(\"users\", this.user.uuid)\n .one(\"items\", resource.uuid)\n .one(\"presentations\", resource.presentation.uuid);\n _.merge(request, presentation);\n request.patch().then(function(response){\n callback(response.plain());\n })\n .catch(function(error){\n callback(nil);\n })\n }\n\n\n /*\n Import\n */\n\n this.importJSONData = function(jsonString, callback) {\n var data = JSON.parse(jsonString);\n var user = new User(data);\n console.log(\"importing data\", JSON.parse(jsonString));\n user.items.forEach(function(item) {\n if(item.isPublic()) {\n item.setContentRaw(JSON.stringify(item.content));\n } else {\n this.encryptSingleItemWithLocalKey(item);\n }\n\n // prevent circular links\n item.tag = null;\n }.bind(this))\n\n user.tags.forEach(function(tag){\n // prevent circular links\n tag.items = null;\n })\n\n var request = Restangular.one(\"import\");\n request.data = {items: user.items, tags: user.tags};\n request.post().then(function(response){\n callback(true, response);\n })\n .catch(function(error){\n callback(false, error);\n })\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(user) {\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 presentationParams = function(presentation) {\n if(!presentation) {\n return null;\n }\n\n return {\n id: presentation.uuid,\n uuid: presentation.uuid,\n root_path: presentation.root_path,\n relative_path: presentation.relative_path,\n presentable_type: presentation.presentable_type,\n presentable_id: presentation.presentable_id,\n created_at: presentation.created_at,\n modified_at: presentation.modified_at,\n }\n }\n\n var items = _.map(user.filteredItems(), function(item){\n return {\n id: item.uuid,\n uuid: item.uuid,\n content: item.content,\n tag_id: item.tag_id,\n created_at: item.created_at,\n modified_at: item.modified_at,\n presentation: presentationParams(item.presentation)\n }\n });\n\n var tags = _.map(user.tags, function(tag){\n return {\n id: tag.uuid,\n uuid: tag.uuid,\n name: tag.name,\n created_at: tag.created_at,\n modified_at: tag.modified_at,\n presentation: presentationParams(tag.presentation)\n }\n });\n\n var data = {\n items: items,\n tags: tags\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\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.name;\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.writeUserToLocalStorage = function(user) {\n var saveUser = _.cloneDeep(user);\n saveUser.items = Item.filterDummyItems(saveUser.items);\n saveUser.tags.forEach(function(tag){\n tag.items = null;\n }.bind(this))\n this.writeToLocalStorage('user', saveUser);\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.localUser = function() {\n var user = JSON.parse(localStorage.getItem('user'));\n if(!user) {\n user = {items: [], tags: []};\n }\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 Item(JSON.parse(draftString));\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveGk = function() {\n if(!this.gk) {\n this.gk = localStorage.getItem(\"gk\");\n }\n return this.gk;\n }\n\n this.setGk = function(gk) {\n localStorage.setItem('gk', gk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"gk\");\n }\n\n this.encryptSingleItem = function(item, key) {\n var ek = null;\n if(item.loc_eek) {\n ek = Neeto.crypto.decryptText(item.loc_eek, key);\n } else {\n ek = Neeto.crypto.generateRandomEncryptionKey();\n item.loc_eek = Neeto.crypto.encryptText(ek, key);\n }\n item.content = Neeto.crypto.encryptText(JSON.stringify(item.content), ek);\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.encryptItems = function(items, key) {\n items.forEach(function(item){\n this.encryptSingleItem(item, key);\n }.bind(this));\n }\n\n this.encryptSingleItemWithLocalKey = function(item) {\n this.encryptSingleItem(item, this.retrieveGk());\n }\n\n this.encryptItemsWithLocalKey = function(items) {\n this.encryptItems(items, this.retrieveGk());\n }\n\n this.encryptNonPublicItemsWithLocalKey = function(items) {\n var nonpublic = items.filter(function(item){\n return !item.isPublic() && !item.pending_share;\n })\n this.encryptItems(nonpublic, this.retrieveGk());\n }\n\n this.decryptSingleItemWithLocalKey = function(item) {\n this.decryptSingleItem(item, this.retrieveGk());\n }\n\n this.decryptSingleItem = function(item, key) {\n var ek = Neeto.crypto.decryptText(item.loc_eek || item.local_eek, key);\n var content = Neeto.crypto.decryptText(item.content, ek);\n // console.log(\"decrypted contnet\", content);\n item.content = content;\n }\n\n this.decryptItems = function(items, key) {\n items.forEach(function(item){\n // console.log(\"is encrypted?\", item);\n if(item.loc_eek && typeof item.content === 'string') {\n this.decryptSingleItem(item, key);\n }\n }.bind(this));\n }\n\n this.decryptItemsWithLocalKey = function(items) {\n this.decryptItems(items, this.retrieveGk());\n }\n\n this.reencryptAllItemsAndSave = function(user, newKey, oldKey, callback) {\n var items = user.filteredItems();\n items.forEach(function(item){\n if(item.loc_eek && typeof item.content === 'string') {\n // first decrypt eek with old key\n var ek = Neeto.crypto.decryptText(item.loc_eek, oldKey);\n // now encrypt ek with new key\n item.loc_eek = Neeto.crypto.encryptText(ek, newKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;class ItemManager {\n\n set items(items) {\n this._items = items;\n this.resolveReferences();\n }\n\n get items() {\n return this._items;\n }\n\n referencesForItemId(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n resolveReferences() {\n this.items.forEach(function(item){\n // build out references\n item.content.references = _.map(item.content.references, function(reference){\n return this.referencesForItemId(reference.uuid);\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 // 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.groups = [];\n this.dirtyItems = [];\n }\n\n set items(items) {\n super.items = items;\n this.notes = this.itemsForContentType(\"Note\");\n this.notes.forEach(function(note){\n note.updateReferencesLocalMapping();\n })\n\n this.tags = this.itemsForContentType(\"Tag\");\n this.tags.forEach(function(tag){\n tag.updateReferencesLocalMapping();\n })\n }\n\n get items() {\n return super.items;\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 this.dirtyItems = [];\n }\n\n addNote(note) {\n if(!_.find(this.notes, {uuid: note.uuid})) {\n this.notes.unshift(note);\n }\n }\n\n addTag(tag) {\n this.tags.unshift(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 tag.notes.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\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 deleteNote(note) {\n var dirty = this.deleteItem(note);\n _.remove(this.notes, note);\n this.addDirtyItems(dirty);\n }\n\n deleteTag(tag) {\n var dirty = this.deleteItem(tag);\n _.remove(this.tags, tag);\n this.addDirtyItems(dirty);\n }\n\n filteredNotes() {\n return Note.filterDummyNotes(this.notes);\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;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;var Neeto = Neeto || {};\n\nNeeto.crypto = {\n\n generateRandomKey: function() {\n return CryptoJS.lib.WordArray.random(256/8).toString();\n },\n\n generateUUID: function() {\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 decryptText: function(encrypted_content, key) {\n return CryptoJS.AES.decrypt(encrypted_content, key).toString(CryptoJS.enc.Utf8);\n },\n\n encryptText: function(text, key) {\n return CryptoJS.AES.encrypt(text, key).toString();\n },\n\n generateRandomEncryptionKey: function() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 256/32 }).toString();\n },\n\n sha256: function(text) {\n return CryptoJS.SHA256(text).toString();\n },\n\n /** Generates two deterministic 256 bit keys based on one input */\n generateAsymmetricKeyPair: function(input, salt) {\n var output = CryptoJS.PBKDF2(input, salt, { keySize: 512/32, hasher: CryptoJS.algo.SHA512, iterations: 3000 });\n var firstHalf = _.clone(output);\n var secondHalf = _.clone(output);\n var sigBytes = output.sigBytes/2;\n var outputLength = output.words.length;\n firstHalf.words = output.words.slice(0, outputLength/2);\n secondHalf.words = output.words.slice(outputLength/2, outputLength);\n firstHalf.sigBytes = sigBytes;\n secondHalf.sigBytes = sigBytes;\n return [firstHalf.toString(), secondHalf.toString()];\n },\n\n generateEncryptionKeysForUser: function(password, email) {\n var keys = Neeto.crypto.generateAsymmetricKeyPair(password, email);\n var pw = keys[0];\n var gk = keys[1];\n\n return {pw: pw, gk: gk};\n }\n };\n"]} \ No newline at end of file +{"version":3,"sources":["app.js"],"names":["Neeto","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","_","extend","Authorization","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","$rootScope","$stateParams","resetData","reset_password_token","email","$on","event","toState","toParams","fromState","fromParams","options","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","modelManager","directive","$timeout","restrict","scope","save","remove","note","user","replace","controllerAs","bindToController","link","elem","attrs","ctrl","handler","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","window","addEventListener","removeEventListener","$watch","oldNote","setNote","$sce","apiController","markdownRenderer","demoNotes","title","content","showSampler","uuid","filteredNotes","length","demoNoteNames","map","currentDemoContent","text","prebeginFn","bind","callback","index","contentCallback","editorMode","focusTitle","hasChanges","dummy","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","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","saveItems","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","$auth","$state","serverSideValidation","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password","password_confirmation","changePassword","current_password","new_password","hasLocalData","mergeLocalChanged","shouldMerge","confirm","loginSubmitPressed","loginData","login","user_password","errors","onAuthSuccess","submitRegistrationForm","register","forgotPasswordSubmit","requestPasswordReset","then","resp","catch","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","downloadDataArchive","setAttribute","notesDataFile","importFileSelected","files","file","reader","FileReader","onload","e","importJSONData","result","console","log","readAsText","mergeLocalDataRemotely","showLogin","showRegistration","$scope","bodyClass","description","onUserSet","setUser","defaultUser","allTag","Tag","all","name","tags","getCurrentUser","User","items","json_obj","content_type","Note","Item","localUser","updateAllTag","notes","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","tagsAddNew","addTag","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","addTagToNote","saveDirtyItems","notesRemoveTag","validNotes","filterDummyNotes","deleteItem","notesSelectionMade","selectedNote","notesAddNew","addNote","unshift","addDirtyItems","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","root_path","presentation","closeThisDialog","Object","defineProperty","set","value","finalValue","decodedValue","JSON","parse","enumerable","merge","crypto","generateUUID","setContentRaw","rawContent","references","reference","push","uniq","updateReferencesLocalMapping","contentType","loc_eek","presentation_url","referencesMatchingContentType","hasOnePublicTag","hasPublicTag","isPublic","filtered","provider","domainName","domain_comps","hostname","split","domain","protocol","port","$get","ngDialog","ApiController","refresh","setItem","one","plain","decryptItemsWithLocalKey","error","keys","generateEncryptionKeysForUser","setGk","gk","request","pw","post","current_keys","new_keys","_performPasswordChange","reencryptAllItemsAndSave","patch","verifyEncryptionStatusOfAllItems","allItems","filteredItems","itemsNeedingUpdate","item","isEncrypted","saveBatchItems","dirtyItems","clearDirtyItems","createRequestParamsForItem","savedItems","itemCopy","cloneDeep","encryptSingleItem","retrieveGk","stringify","writeUserToLocalStorage","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","open","template","resolve","className","disableAnimation","jsonString","encryptSingleItemWithLocalKey","itemsDataFile","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","presentationParams","id","relative_path","presentable_type","presentable_id","created_at","modified_at","tag_id","tag_name","removeItem","staticifyObject","object","saveUser","filterDummyItems","writeToLocalStorage","key","toJson","draftString","ek","decryptText","generateRandomEncryptionKey","encryptText","local_encryption_scheme","encryptItems","encryptItemsWithLocalKey","encryptNonPublicItemsWithLocalKey","nonpublic","pending_share","decryptSingleItemWithLocalKey","decryptSingleItem","local_eek","decryptItems","newKey","oldKey","ItemManager","itemId","referencesForItemId","dirty","i","referencedItem","_dirty","removeReferencesBetweenItems","itemOne","itemTwo","removeReference","addReference","_items","resolveReferences","service","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","groups","Array","createReferencesBetweenItems","refreshRelationshipsForTag","refreshRelationshipsForNote","sort","b","Date","itemsForContentType","showErrors","formErrors","form","$setDirty","$setValidity","$error","server","join","parseErrors","shouldFocus","$element","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","undefined","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","toString","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","running","auxStyle","start","typewrite","updateIt","charIndex","arrIndex","updateValue","substring","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","slice","charAt","parseInt","prop","toUpperCase","val","html","newVal","oldVal","generateRandomKey","CryptoJS","lib","WordArray","random","d","getTime","performance","now","c","r","Math","floor","encrypted_content","AES","decrypt","enc","Utf8","encrypt","salt","passphrase","PBKDF2","keySize","sha256","SHA256","generateAsymmetricKeyPair","input","output","hasher","algo","SHA512","iterations","firstHalf","clone","secondHalf","sigBytes","outputLength","words"],"mappings":"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","file":"transpiled.js","sourcesContent":["'use strict';\n\nvar Neeto = Neeto || {};\n\nangular\n .module('app.frontend', [\n 'ui.router',\n 'ng-token-auth',\n 'restangular',\n 'ipCookie',\n 'oc.lazyLoad',\n 'angularLazyImg',\n 'ngDialog'\n ])\n // Configure path to API\n .config(function (RestangularProvider, apiControllerProvider) {\n RestangularProvider.setDefaultHeaders({\"Content-Type\": \"application/json\"});\n\n var url = apiControllerProvider.defaultServerURL();\n RestangularProvider.setBaseUrl(url);\n\n RestangularProvider.setFullRequestInterceptor(function(element, operation, route, url, headers, params, httpConfig) {\n var token = localStorage.getItem(\"jwt\");\n if(token) {\n headers = _.extend(headers, {Authorization: \"Bearer \" + localStorage.getItem(\"jwt\")});\n }\n\n return {\n element: element,\n params: params,\n headers: headers,\n httpConfig: httpConfig\n };\n });\n })\n;angular.module('app.frontend')\n .config(function ($stateProvider, $urlRouterProvider, $locationProvider) {\n\n $stateProvider\n .state('base', {\n abstract: true,\n })\n\n // Homepage\n .state('home', {\n url: '/',\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/home.html',\n controller: 'HomeCtrl'\n }\n }\n })\n\n // Auth routes\n .state('auth', {\n abstract: true,\n url: '/auth',\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/auth/wrapper.html',\n }\n }\n })\n .state('auth.login', {\n url: '/login',\n templateUrl: 'frontend/auth/login.html',\n })\n .state('auth.forgot', {\n url: '/forgot',\n templateUrl: 'frontend/auth/forgot.html',\n })\n .state('auth.reset', {\n url: '/reset?reset_password_token&email',\n templateUrl: 'frontend/auth/reset.html',\n controller: function($rootScope, $stateParams) {\n $rootScope.resetData = {reset_password_token: $stateParams.reset_password_token, email: $stateParams.email};\n\n // Clear reset_password_token on change state\n $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams, options) {\n $rootScope.reset_password_token = null;\n });\n },\n })\n\n\n // 404 Error\n .state('404', {\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/errors/404.html'\n }\n }\n });\n\n // Default fall back route\n $urlRouterProvider.otherwise(function($injector, $location){\n var state = $injector.get('$state');\n state.go('404');\n return $location.path();\n });\n\n // enable HTML5 Mode for SEO\n $locationProvider.html5Mode(true);\n\n });\n;class BaseCtrl {\n constructor($rootScope, modelManager) {\n // $rootScope.resetPasswordSubmit = function() {\n // var new_keys = Neeto.crypto.generateEncryptionKeysForUser($rootScope.resetData.password, $rootScope.resetData.email);\n // var data = _.clone($rootScope.resetData);\n // data.password = new_keys.pw;\n // data.password_confirmation = new_keys.pw;\n // $auth.updatePassword(data);\n // apiController.setGk(new_keys.gk);\n // }\n\n // var note = new Note();\n // note.content = {title: \"hello\", text: \"world\"};\n // console.log(\"note content\", note.content);\n // console.log(\"note title\", note.title);\n // console.log(\"note json\", JSON.stringify(note));\n //\n // console.log(\"Copy\", _.cloneDeep(note));\n }\n}\n\nangular.module('app.frontend').controller('BaseCtrl', BaseCtrl);\n;angular.module('app.frontend')\n .directive(\"editorSection\", function($timeout){\n return {\n restrict: 'E',\n scope: {\n save: \"&\",\n remove: \"&\",\n note: \"=\",\n user: \"=\"\n },\n templateUrl: 'frontend/editor.html',\n replace: true,\n controller: 'EditorCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n\n var handler = function(event) {\n if (event.ctrlKey || event.metaKey) {\n switch (String.fromCharCode(event.which).toLowerCase()) {\n case 's':\n event.preventDefault();\n $timeout(function(){\n ctrl.saveNote(event);\n });\n break;\n case 'e':\n event.preventDefault();\n $timeout(function(){\n ctrl.clickedEditNote();\n })\n break;\n case 'm':\n event.preventDefault();\n $timeout(function(){\n ctrl.toggleMarkdown();\n })\n break;\n case 'o':\n event.preventDefault();\n $timeout(function(){\n ctrl.toggleFullScreen();\n })\n break;\n }\n }\n };\n\n window.addEventListener('keydown', handler);\n\n scope.$on('$destroy', function(){\n window.removeEventListener('keydown', handler);\n })\n\n scope.$watch('ctrl.note', function(note, oldNote){\n if(note) {\n ctrl.setNote(note, oldNote);\n } else {\n ctrl.note = {};\n }\n });\n }\n }\n })\n .controller('EditorCtrl', function ($sce, $timeout, apiController, modelManager, markdownRenderer, $rootScope) {\n\n this.demoNotes = [\n {title: \"Live print a file with tail\", content: \"tail -f log/production.log\"},\n {title: \"Create SSH tunnel\", content: \"ssh -i .ssh/key.pem -N -L 3306:example.com:3306 ec2-user@example.com\"},\n {title: \"List of processes running on port\", content: \"lsof -i:8080\"},\n {title: \"Set ENV from file\", content: \"export $(cat .envfile | xargs)\"},\n {title: \"Find process by name\", content: \"ps -ax | grep \"},\n {title: \"NPM install without sudo\", content: \"sudo chown -R $(whoami) ~/.npm\"},\n {title: \"Email validation regex\", content: \"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$\"},\n {title: \"Ruby generate 256 bit key\", content: \"Digest::SHA256.hexdigest(SecureRandom.random_bytes(32))\"},\n {title: \"Mac add user to user tag\", content: \"sudo dsedittag -o edit -a USERNAME -t user GROUPNAME\"},\n {title: \"Kill Mac OS System Apache\", content: \"sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist\"},\n {title: \"Docker run with mount binding and port\", content: \"docker run -v /home/vagrant/www/app:/var/www/app -p 8080:80 -d kpi/s3\"},\n {title: \"MySQL grant privileges\", content: \"GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'%’;\"},\n {title: \"MySQL list users\", content: \"SELECT User FROM mysql.user;\"},\n ];\n\n this.showSampler = !this.user.uuid && modelManager.filteredNotes.length == 0;\n\n this.demoNoteNames = _.map(this.demoNotes, function(note){\n return note.title;\n });\n\n this.currentDemoContent = {text: null};\n\n this.prebeginFn = function() {\n this.currentDemoContent.text = null;\n }.bind(this)\n\n this.callback = function(index) {\n this.currentDemoContent.text = this.demoNotes[index].text;\n }.bind(this)\n\n this.contentCallback = function(index) {\n }\n\n this.setNote = function(note, oldNote) {\n this.editorMode = 'edit';\n if(note.content.text.length == 0) {\n this.focusTitle(100);\n }\n\n if(oldNote && oldNote != note) {\n if(oldNote.hasChanges) {\n this.save()(oldNote, null);\n } else if(oldNote.dummy) {\n this.remove()(oldNote);\n }\n }\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.content.text));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n apiController.saveDraftToDisk(this.note);\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n\n apiController.saveItems([this.note], function(response){\n if(!response) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(){\n return {\n restrict: 'E',\n scope: {\n user: \"=\",\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n\n }\n }\n })\n .controller('HeaderCtrl', function ($auth, $state, apiController, modelManager, serverSideValidation, $timeout) {\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.user, this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 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.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.errors) {\n this.loginData.status = response.errors[0];\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.errors) {\n this.loginData.status = response.errors[0];\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', 'neeto.json');\n link.href = apiController.notesDataFile(this.user);\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 $rootScope.title = \"Notes — Neeto, a secure code box for developers\";\n $rootScope.description = \"A secure code box for developers to store common commands and useful notes.\";\n\n var onUserSet = function() {\n apiController.setUser($scope.defaultUser);\n $scope.allTag = new Tag({all: true});\n $scope.allTag.content.name = \"All\";\n $scope.tags = modelManager.tags;\n\n // apiController.verifyEncryptionStatusOfAllItems($scope.defaultUser, function(success){});\n }\n\n apiController.getCurrentUser(function(response){\n if(response && !response.errors) {\n console.log(\"Get user response\", response);\n $scope.defaultUser = new User(response);\n modelManager.items = _.map(response.items, function(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 $rootScope.title = \"Notes — Neeto\";\n onUserSet();\n } else {\n $scope.defaultUser = new User(apiController.localUser());\n onUserSet();\n }\n });\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n $scope.allTag.notes = modelManager.filteredNotes;\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 apiController.saveItems([tag], 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.saveDirtyItems(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 // if no more notes, delete tag\n apiController.deleteItem($scope.defaultUser, 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 } else {\n $scope.selectedTag.notes.unshift(note);\n }\n\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n modelManager.addDirtyItems(note);\n\n apiController.saveDirtyItems(function(){\n modelManager.addNote(note);\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 $scope.updateAllTag();\n\n if(note.dummy) {\n return;\n }\n\n apiController.deleteItem(note, function(success){})\n apiController.saveDirtyItems(function(){});\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n $scope.defaultUser = apiController.localUser();\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.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.content.name;\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.name.length == 0) {\n tag.content.name = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.content.name || tag.content.name.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.root_path;\n user.presentation = response;\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.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 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 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.loc_eek;\n }\n\n presentationURL() {\n return this.presentation_url;\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 if(!this.content.title) {\n this.content.title = \"\";\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 var hasPublicTag = false;\n this.tags.forEach(function(tag){\n if(tag.isPublic()) {\n hasPublicTag = true;\n return;\n }\n })\n\n return hasPublicTag;\n }\n\n toJSON() {\n return {uuid: this.uuid}\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.name) {\n this.content.name = \"\";\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 = location.protocol + \"//\" + domainName() + (location.port ? ':' + location.port: '');\n }\n }\n return url;\n }\n\n\n this.$get = function(Restangular, modelManager, ngDialog) {\n return new ApiController(Restangular, modelManager, ngDialog);\n }\n\n function ApiController(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 = location.protocol + \"//\" + domainName() + (location.port ? ':' + location.port: '');\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.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 plain = response.plain();\n var items = plain.items;\n console.log(\"retreived items\", plain);\n this.decryptItemsWithLocalKey(items);\n callback(plain);\n }.bind(this))\n .catch(function(error){\n callback(null);\n })\n }\n\n this.login = function(email, password, callback) {\n var keys = Neeto.crypto.generateEncryptionKeysForUser(password, email);\n this.setGk(keys.gk);\n var request = Restangular.one(\"auth/sign_in.json\");\n request.user = {password: keys.pw, email: email};\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n }\n\n this.register = function(email, password, callback) {\n var keys = Neeto.crypto.generateEncryptionKeysForUser(password, email);\n this.setGk(keys.gk);\n var request = Restangular.one(\"auth.json\");\n request.user = {password: keys.pw, email: email};\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n }\n\n this.changePassword = function(user, current_password, new_password) {\n var current_keys = Neeto.crypto.generateEncryptionKeysForUser(current_password, user.email);\n var new_keys = Neeto.crypto.generateEncryptionKeysForUser(new_password, user.email);\n\n var data = {};\n data.current_password = current_keys.pw;\n data.password = new_keys.pw;\n data.password_confirmation = new_keys.pw;\n\n var user = this.user;\n\n this._performPasswordChange(current_keys, new_keys, function(response){\n if(response && !response.errors) {\n // this.showNewPasswordForm = false;\n // reencrypt data with new gk\n this.reencryptAllItemsAndSave(user, new_keys.gk, current_keys.gk, function(success){\n if(success) {\n this.setGk(new_keys.gk);\n alert(\"Your password has been changed and your data re-encrypted.\");\n } else {\n // rollback password\n this._performPasswordChange(new_keys, current_keys, 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 })\n }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n request.user = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\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.saveDirtyItems = function(callback) {\n var dirtyItems = modelManager.dirtyItems;\n if(dirtyItems.length == 0) {\n callback();\n return;\n }\n\n this.saveItems(dirtyItems, function(response){\n modelManager.clearDirtyItems();\n callback();\n })\n }\n\n this.saveItems = function(items, callback) {\n console.log(\"saving items\", items);\n var request = Restangular.one(\"users\", this.user.uuid).one(\"items\");\n request.items = _.map(items, function(item){\n return this.createRequestParamsForItem(item);\n }.bind(this));\n console.log(\"sending request items\", request.items);\n\n request.post().then(function(response) {\n var savedItems = response.items;\n console.log(\"response items\", savedItems);\n callback(response);\n })\n }\n\n this.createRequestParamsForItem = function(item) {\n var itemCopy = _.cloneDeep(item);\n\n var params = {uuid: item.uuid, content_type: item.content_type, presentation_name: item.presentation_name};\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(!item.isPublic()) {\n // encrypted\n this.encryptSingleItem(itemCopy, this.retrieveGk());\n params.content = itemCopy.content;\n params.loc_eek = itemCopy.loc_eek;\n }\n else {\n // decrypted\n params.content = JSON.stringify(item.content);\n params.loc_eek = null;\n }\n return params;\n }\n\n\n this.deleteItem = function(item, callback) {\n if(!this.user.uuid) {\n this.writeUserToLocalStorage(this.user);\n callback(true);\n } else {\n Restangular.one(\"users\", this.user.uuid).one(\"items\", item.uuid).remove()\n .then(function(response) {\n callback(true);\n })\n }\n }\n\n this.shareItem = function(item, callback) {\n console.log(\"sharing item\", item);\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 this.saveItems(needsUpdate, function(success){})\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 console.log(\"unsharing item\", item);\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n this.saveItems(needsUpdate, function(success){})\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(jsonString, callback) {\n var data = JSON.parse(jsonString);\n var user = new User(data);\n console.log(\"importing data\", JSON.parse(jsonString));\n user.items.forEach(function(item) {\n if(item.isPublic()) {\n item.setContentRaw(JSON.stringify(item.content));\n } else {\n this.encryptSingleItemWithLocalKey(item);\n }\n\n // prevent circular links\n item.tag = null;\n }.bind(this))\n\n user.tags.forEach(function(tag){\n // prevent circular links\n tag.items = null;\n })\n\n var request = Restangular.one(\"import\");\n request.data = {items: user.items, tags: user.tags};\n request.post().then(function(response){\n callback(true, response);\n })\n .catch(function(error){\n callback(false, error);\n })\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(user) {\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 presentationParams = function(presentation) {\n if(!presentation) {\n return null;\n }\n\n return {\n id: presentation.uuid,\n uuid: presentation.uuid,\n root_path: presentation.root_path,\n relative_path: presentation.relative_path,\n presentable_type: presentation.presentable_type,\n presentable_id: presentation.presentable_id,\n created_at: presentation.created_at,\n modified_at: presentation.modified_at,\n }\n }\n\n var items = _.map(user.filteredItems(), function(item){\n return {\n id: item.uuid,\n uuid: item.uuid,\n content: item.content,\n tag_id: item.tag_id,\n created_at: item.created_at,\n modified_at: item.modified_at,\n presentation: presentationParams(item.presentation)\n }\n });\n\n var tags = _.map(user.tags, function(tag){\n return {\n id: tag.uuid,\n uuid: tag.uuid,\n name: tag.name,\n created_at: tag.created_at,\n modified_at: tag.modified_at,\n presentation: presentationParams(tag.presentation)\n }\n });\n\n var data = {\n items: items,\n tags: tags\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\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.name;\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.writeUserToLocalStorage = function(user) {\n var saveUser = _.cloneDeep(user);\n saveUser.items = Item.filterDummyItems(saveUser.items);\n saveUser.tags.forEach(function(tag){\n tag.items = null;\n }.bind(this))\n this.writeToLocalStorage('user', saveUser);\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.localUser = function() {\n var user = JSON.parse(localStorage.getItem('user'));\n if(!user) {\n user = {items: [], tags: []};\n }\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 Item(JSON.parse(draftString));\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveGk = function() {\n if(!this.gk) {\n this.gk = localStorage.getItem(\"gk\");\n }\n return this.gk;\n }\n\n this.setGk = function(gk) {\n localStorage.setItem('gk', gk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"gk\");\n }\n\n this.encryptSingleItem = function(item, key) {\n var ek = null;\n if(item.loc_eek) {\n ek = Neeto.crypto.decryptText(item.loc_eek, key);\n } else {\n ek = Neeto.crypto.generateRandomEncryptionKey();\n item.loc_eek = Neeto.crypto.encryptText(ek, key);\n }\n item.content = Neeto.crypto.encryptText(JSON.stringify(item.content), ek);\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.encryptItems = function(items, key) {\n items.forEach(function(item){\n this.encryptSingleItem(item, key);\n }.bind(this));\n }\n\n this.encryptSingleItemWithLocalKey = function(item) {\n this.encryptSingleItem(item, this.retrieveGk());\n }\n\n this.encryptItemsWithLocalKey = function(items) {\n this.encryptItems(items, this.retrieveGk());\n }\n\n this.encryptNonPublicItemsWithLocalKey = function(items) {\n var nonpublic = items.filter(function(item){\n return !item.isPublic() && !item.pending_share;\n })\n this.encryptItems(nonpublic, this.retrieveGk());\n }\n\n this.decryptSingleItemWithLocalKey = function(item) {\n this.decryptSingleItem(item, this.retrieveGk());\n }\n\n this.decryptSingleItem = function(item, key) {\n var ek = Neeto.crypto.decryptText(item.loc_eek || item.local_eek, key);\n var content = Neeto.crypto.decryptText(item.content, ek);\n // console.log(\"decrypted contnet\", content);\n item.content = content;\n }\n\n this.decryptItems = function(items, key) {\n items.forEach(function(item){\n // console.log(\"is encrypted?\", item);\n if(item.loc_eek && typeof item.content === 'string') {\n this.decryptSingleItem(item, key);\n }\n }.bind(this));\n }\n\n this.decryptItemsWithLocalKey = function(items) {\n this.decryptItems(items, this.retrieveGk());\n }\n\n this.reencryptAllItemsAndSave = function(user, newKey, oldKey, callback) {\n var items = user.filteredItems();\n items.forEach(function(item){\n if(item.loc_eek && typeof item.content === 'string') {\n // first decrypt eek with old key\n var ek = Neeto.crypto.decryptText(item.loc_eek, oldKey);\n // now encrypt ek with new key\n item.loc_eek = Neeto.crypto.encryptText(ek, newKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;class ItemManager {\n\n set items(items) {\n this._items = items;\n this.resolveReferences();\n }\n\n get items() {\n return this._items;\n }\n\n referencesForItemId(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n resolveReferences() {\n this.items.forEach(function(item){\n // build out references\n item.content.references = _.map(item.content.references, function(reference){\n return this.referencesForItemId(reference.uuid);\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 // 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.groups = [];\n this.dirtyItems = [];\n }\n\n set items(items) {\n super.items = items;\n this.notes = this.itemsForContentType(\"Note\");\n this.notes.forEach(function(note){\n note.updateReferencesLocalMapping();\n })\n\n this.tags = this.itemsForContentType(\"Tag\");\n this.tags.forEach(function(tag){\n tag.updateReferencesLocalMapping();\n })\n }\n\n get items() {\n return super.items;\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 this.dirtyItems = [];\n }\n\n addNote(note) {\n if(!_.find(this.notes, {uuid: note.uuid})) {\n this.notes.unshift(note);\n }\n }\n\n addTag(tag) {\n this.tags.unshift(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 tag.notes.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\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 deleteNote(note) {\n var dirty = this.deleteItem(note);\n _.remove(this.notes, note);\n this.addDirtyItems(dirty);\n }\n\n deleteTag(tag) {\n var dirty = this.deleteItem(tag);\n _.remove(this.tags, tag);\n this.addDirtyItems(dirty);\n }\n\n filteredNotes() {\n return Note.filterDummyNotes(this.notes);\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;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;var Neeto = Neeto || {};\n\nNeeto.crypto = {\n\n generateRandomKey: function() {\n return CryptoJS.lib.WordArray.random(256/8).toString();\n },\n\n generateUUID: function() {\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 decryptText: function(encrypted_content, key) {\n return CryptoJS.AES.decrypt(encrypted_content, key).toString(CryptoJS.enc.Utf8);\n },\n\n encryptText: function(text, key) {\n return CryptoJS.AES.encrypt(text, key).toString();\n },\n\n generateRandomEncryptionKey: function() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 256/32 }).toString();\n },\n\n sha256: function(text) {\n return CryptoJS.SHA256(text).toString();\n },\n\n /** Generates two deterministic 256 bit keys based on one input */\n generateAsymmetricKeyPair: function(input, salt) {\n var output = CryptoJS.PBKDF2(input, salt, { keySize: 512/32, hasher: CryptoJS.algo.SHA512, iterations: 3000 });\n var firstHalf = _.clone(output);\n var secondHalf = _.clone(output);\n var sigBytes = output.sigBytes/2;\n var outputLength = output.words.length;\n firstHalf.words = output.words.slice(0, outputLength/2);\n secondHalf.words = output.words.slice(outputLength/2, outputLength);\n firstHalf.sigBytes = sigBytes;\n secondHalf.sigBytes = sigBytes;\n return [firstHalf.toString(), secondHalf.toString()];\n },\n\n generateEncryptionKeysForUser: function(password, email) {\n var keys = Neeto.crypto.generateAsymmetricKeyPair(password, email);\n var pw = keys[0];\n var gk = keys[1];\n\n return {pw: pw, gk: gk};\n }\n };\n"]} \ No newline at end of file