Default prolink installation

This commit is contained in:
Mo Bitar
2017-12-28 11:30:36 -06:00
parent 8c15438d00
commit f2d88d287d
6 changed files with 50 additions and 16 deletions

View File

@@ -299,14 +299,14 @@ angular.module('app.frontend')
console.log("AuthManager received resolved UserPreferences", resolvedSingleton); console.log("AuthManager received resolved UserPreferences", resolvedSingleton);
this.userPreferences = resolvedSingleton; this.userPreferences = resolvedSingleton;
this.userPreferencesDidChange(); this.userPreferencesDidChange();
}, () => { }, (valueCallback) => {
// Safe to create. Create and return object. // Safe to create. Create and return object.
var prefs = new Item({content_type: prefsContentType}); var prefs = new Item({content_type: prefsContentType});
modelManager.addItem(prefs); modelManager.addItem(prefs);
prefs.setDirty(true); prefs.setDirty(true);
console.log("Created new prefs", prefs); console.log("Created new prefs", prefs);
$rootScope.sync(); $rootScope.sync();
return prefs; valueCallback(prefs);
}); });
this.userPreferencesDidChange = function() { this.userPreferencesDidChange = function() {

View File

@@ -7,16 +7,14 @@ class RoomBar {
}; };
} }
controller($rootScope, $scope, desktopManager, syncManager, modelManager, componentManager, $timeout) { controller($rootScope, $scope, desktopManager, syncManager, modelManager, componentManager, $timeout, singletonManager, packageManager) {
'ngInject'; 'ngInject';
$scope.componentManager = componentManager; $scope.componentManager = componentManager;
$scope.rooms = []; $scope.rooms = [];
modelManager.addItemSyncObserver("room-bar", "SN|Component", (allItems, validItems, deletedItems, source) => { modelManager.addItemSyncObserver("room-bar", "SN|Component", (allItems, validItems, deletedItems, source) => {
$scope.rooms = _.uniq($scope.rooms $scope.rooms = _.uniq($scope.rooms.concat(allItems.filter((candidate) => {return candidate.area == "rooms"})))
.concat(allItems
.filter((candidate) => {return candidate.area == "rooms"})))
.filter((candidate) => {return !candidate.deleted}); .filter((candidate) => {return !candidate.deleted});
}); });
@@ -55,6 +53,18 @@ class RoomBar {
room.show = false; room.show = false;
this.componentManager.deactivateComponent(room); this.componentManager.deactivateComponent(room);
} }
// Handle singleton ProLink instance
singletonManager.registerSingleton({content_type: "SN|Component", package_info: {identifier: "org.standardnotes.prolink"}}, (resolvedSingleton) => {
console.log("Roombar received resolved ProLink", resolvedSingleton);
}, (valueCallback) => {
console.log("Creating prolink");
// Safe to create. Create and return object.
let url = window._prolink_package_url;
packageManager.installPackage(url, (component) => {
valueCallback(component);
})
});
} }

View File

@@ -3,6 +3,7 @@ class ModelManager {
constructor(storageManager) { constructor(storageManager) {
ModelManager.MappingSourceRemoteRetrieved = "MappingSourceRemoteRetrieved"; ModelManager.MappingSourceRemoteRetrieved = "MappingSourceRemoteRetrieved";
ModelManager.MappingSourceRemoteSaved = "MappingSourceRemoteSaved"; ModelManager.MappingSourceRemoteSaved = "MappingSourceRemoteSaved";
ModelManager.MappingSourceLocalSaved = "MappingSourceLocalSaved";
ModelManager.MappingSourceLocalRetrieved = "MappingSourceLocalRetrieved"; ModelManager.MappingSourceLocalRetrieved = "MappingSourceLocalRetrieved";
ModelManager.MappingSourceComponentRetrieved = "MappingSourceComponentRetrieved"; ModelManager.MappingSourceComponentRetrieved = "MappingSourceComponentRetrieved";
ModelManager.MappingSourceRemoteActionRetrieved = "MappingSourceRemoteActionRetrieved"; /* aciton-based Extensions like note history */ ModelManager.MappingSourceRemoteActionRetrieved = "MappingSourceRemoteActionRetrieved"; /* aciton-based Extensions like note history */
@@ -103,6 +104,10 @@ class ModelManager {
return tag; return tag;
} }
didSyncModelsOffline(items) {
this.notifySyncObserversOfModels(items, ModelManager.MappingSourceLocalSaved);
}
mapResponseItemsToLocalModels(items, source) { mapResponseItemsToLocalModels(items, source) {
return this.mapResponseItemsToLocalModelsOmittingFields(items, null, source); return this.mapResponseItemsToLocalModelsOmittingFields(items, null, source);
} }

View File

@@ -45,7 +45,7 @@ class SingletonManager {
} }
resolveSingletons(retrievedItems, initialLoad) { resolveSingletons(retrievedItems, initialLoad) {
for(var singletonHandler of this.singletonHandlers) { for(let singletonHandler of this.singletonHandlers) {
var predicate = singletonHandler.predicate; var predicate = singletonHandler.predicate;
var singletonItems = this.filterItemsWithPredicate(retrievedItems, predicate); var singletonItems = this.filterItemsWithPredicate(retrievedItems, predicate);
if(singletonItems.length > 0) { if(singletonItems.length > 0) {
@@ -63,7 +63,7 @@ class SingletonManager {
*/ */
if(allExtantItemsMatchingPredicate.length >= 2) { if(allExtantItemsMatchingPredicate.length >= 2) {
var toDelete = []; var toDelete = [];
for(var extantItem of allExtantItemsMatchingPredicate) { for(let extantItem of allExtantItemsMatchingPredicate) {
if(!singletonItems.includes(extantItem)) { if(!singletonItems.includes(extantItem)) {
// Delete it // Delete it
toDelete.push(extantItem); toDelete.push(extantItem);
@@ -102,10 +102,13 @@ class SingletonManager {
// Retrieved items does not include any items of interest. If we don't have a singleton registered to this handler, // Retrieved items does not include any items of interest. If we don't have a singleton registered to this handler,
// we need to create one. Only do this on actual sync completetions and not on initial data load. Because we want // we need to create one. Only do this on actual sync completetions and not on initial data load. Because we want
// to get the latest from the server before making the decision to create a new item // to get the latest from the server before making the decision to create a new item
if(!singletonHandler.singleton && !initialLoad) { if(!singletonHandler.singleton && !initialLoad && !singletonHandler.pendingCreateBlockCallback) {
var item = singletonHandler.createBlock(); singletonHandler.pendingCreateBlockCallback = true;
singletonHandler.singleton = item; singletonHandler.createBlock((created) => {
singletonHandler.resolutionCallback(item); singletonHandler.singleton = created;
singletonHandler.pendingCreateBlockCallback = false;
singletonHandler.resolutionCallback(created);
});
} }
} }
} }
@@ -113,13 +116,25 @@ class SingletonManager {
filterItemsWithPredicate(items, predicate) { filterItemsWithPredicate(items, predicate) {
return items.filter((candidate) => { return items.filter((candidate) => {
for(var key in predicate) { return this.itemSatisfiesPredicate(candidate, predicate);
if(candidate[key] != predicate[key]) { })
}
itemSatisfiesPredicate(candidate, predicate) {
for(var key in predicate) {
var predicateValue = predicate[key];
var candidateValue = candidate[key];
if(typeof predicateValue == 'object') {
// Check nested properties
if(!this.itemSatisfiesPredicate(candidateValue, predicateValue)) {
return false; return false;
} }
} }
return true; else if(candidateValue != predicateValue) {
}) return false;
}
}
return true;
} }
} }

View File

@@ -64,6 +64,9 @@ class SyncManager {
this.$rootScope.$broadcast("sync:completed", {}); this.$rootScope.$broadcast("sync:completed", {});
// Required in order for modelManager to notify sync observers
this.modelManager.didSyncModelsOffline(items);
if(callback) { if(callback) {
callback({success: true}); callback({success: true});
} }

View File

@@ -30,6 +30,7 @@
<script> <script>
window._default_sf_server = "<%= ENV['SF_DEFAULT_SERVER'] %>"; window._default_sf_server = "<%= ENV['SF_DEFAULT_SERVER'] %>";
window._prolink_package_url = "<%= ENV['PROLINK_URL'] %>";
</script> </script>
<% if Rails.env.development? %> <% if Rails.env.development? %>