From 8c9fd9308ddd9d6cc1ffaa00df3b1ec4f5c4b8ee Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Tue, 3 Jul 2018 12:41:12 -0500 Subject: [PATCH] Updates --- Gruntfile.js | 3 +++ .../javascripts/app/controllers/editor.js | 20 +++++++++----- .../javascripts/app/controllers/home.js | 1 - .../javascripts/app/services/dbManager.js | 20 ++++++++++---- test/mocha/models.test.js | 26 +++++++++++++++++++ 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index ae601a6ec..39a79854f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -163,4 +163,7 @@ module.exports = function(grunt) { grunt.registerTask('default', ['haml', 'ngtemplates', 'sass', 'concat:app', 'babel', 'browserify', 'concat:lib', 'concat:dist', 'ngAnnotate', 'concat:css', 'uglify']); + + grunt.registerTask('vendor', ['concat:app', 'babel', 'browserify', + 'concat:lib', 'concat:dist', 'ngAnnotate', 'concat:css', 'uglify']); }; diff --git a/app/assets/javascripts/app/controllers/editor.js b/app/assets/javascripts/app/controllers/editor.js index e51ed23e2..924053b26 100644 --- a/app/assets/javascripts/app/controllers/editor.js +++ b/app/assets/javascripts/app/controllers/editor.js @@ -36,10 +36,6 @@ angular.module('app') this.syncTakingTooLong = false; }.bind(this)); - $rootScope.$on("tag-changed", function(){ - this.loadTagsString(); - }.bind(this)); - // Right now this only handles offline saving status changes. this.syncStatusObserver = syncManager.registerSyncStatusObserver((status) => { if(status.localError) { @@ -80,6 +76,18 @@ angular.module('app') this.loadTagsString(); }); + modelManager.addItemSyncObserver("component-manager", "Tag", (allItems, validItems, deletedItems, source) => { + if(!this.note) { return; } + + for(var tag of allItems) { + // If a tag is deleted then we'll have lost references to notes. Reload anyway. + if(this.note.savedTagsString == null || tag.deleted || tag.hasRelationshipWithItem(this.note)) { + this.loadTagsString(); + return; + } + } + }); + this.noteDidChange = function(note, oldNote) { this.setNote(note, oldNote); this.reloadComponentContext(); @@ -554,7 +562,7 @@ angular.module('app') // Currently extensions are not notified of association until a full server sync completes. // We need a better system for this, but for now, we'll manually notify observers - modelManager.notifySyncObserversOfModels([this.note], SFModelManager.MappingSourceLocalSaved); + modelManager.notifySyncObserversOfModels([tag], SFModelManager.MappingSourceLocalSaved); } } @@ -564,7 +572,7 @@ angular.module('app') // Currently extensions are not notified of association until a full server sync completes. // We need a better system for this, but for now, we'll manually notify observers - modelManager.notifySyncObserversOfModels([this.note], SFModelManager.MappingSourceLocalSaved); + modelManager.notifySyncObserversOfModels([tag], SFModelManager.MappingSourceLocalSaved); } else if(action === "save-items" || action === "save-success" || action == "save-error") { diff --git a/app/assets/javascripts/app/controllers/home.js b/app/assets/javascripts/app/controllers/home.js index 71ccf255b..e8bd8836c 100644 --- a/app/assets/javascripts/app/controllers/home.js +++ b/app/assets/javascripts/app/controllers/home.js @@ -180,7 +180,6 @@ angular.module('app') } tag.setDirty(true); syncManager.sync().then(callback); - $rootScope.$broadcast("tag-changed"); modelManager.resortTag(tag); } diff --git a/app/assets/javascripts/app/services/dbManager.js b/app/assets/javascripts/app/services/dbManager.js index fb9de21d3..d0074a446 100644 --- a/app/assets/javascripts/app/services/dbManager.js +++ b/app/assets/javascripts/app/services/dbManager.js @@ -47,6 +47,10 @@ class DBManager { } }; + request.onblocked = (event) => { + console.error("Request blocked error:", event.target.errorCode); + } + request.onupgradeneeded = (event) => { var db = event.target.result; @@ -106,7 +110,11 @@ class DBManager { }; transaction.onerror = function(event) { - console.log("Transaction error:", event.target.errorCode); + console.error("Transaction error:", event.target.errorCode); + }; + + transaction.onblocked = function(event) { + console.error("Transaction blocked error:", event.target.errorCode); }; transaction.onabort = function(event) { @@ -127,12 +135,14 @@ class DBManager { function putNext() { if (i < items.length) { var item = items[i]; - itemObjectStore.put(item).onsuccess = putNext; + var request = itemObjectStore.put(item); + request.onerror = (event) => { + console.error("DB put error:", event.target.error); + } + request.onsuccess = putNext; ++i; } else { - if(onsuccess){ - onsuccess(); - } + onsuccess && onsuccess(); } } }, null) diff --git a/test/mocha/models.test.js b/test/mocha/models.test.js index df3dd1cce..d2ab15d06 100644 --- a/test/mocha/models.test.js +++ b/test/mocha/models.test.js @@ -157,6 +157,32 @@ describe("notes and tags", () => { expect(tag.notes.length).to.equal(0); }); + it.only('resets cached note tags string when tag is renamed', () => { + let modelManager = Factory.createModelManager(); + + let pair = createRelatedNoteTagPair(); + let noteParams = pair[0]; + let tagParams = pair[1]; + + modelManager.mapResponseItemsToLocalModels([noteParams, tagParams]); + let note = modelManager.allItemsMatchingTypes(["Note"])[0]; + let tag = modelManager.allItemsMatchingTypes(["Tag"])[0]; + + expect(note.tagsString()).to.equal(`#${tagParams.content.title}`); + + var title = Math.random(); + + // Saving involves modifying local state first, then syncing with omitting content. + tag.title = title; + tagParams.content.title = title; + // simulate a save, which omits `content` + modelManager.mapResponseItemsToLocalModelsOmittingFields([tagParams], ['content']); + + // should be null + expect(note.savedTagsString).to.not.be.ok; + expect(note.tagsString()).to.equal(`#${title}`); + }); + it('handles removing relationship between note and tag', () => { let modelManager = Factory.createModelManager();