diff --git a/app/assets/javascripts/app/frontend/controllers/editor.js b/app/assets/javascripts/app/frontend/controllers/editor.js index 73ef0102b..2c89c93c3 100644 --- a/app/assets/javascripts/app/frontend/controllers/editor.js +++ b/app/assets/javascripts/app/frontend/controllers/editor.js @@ -83,6 +83,8 @@ angular.module('app.frontend') this.setNote = function(note, oldNote) { this.editorMode = 'edit'; + this.showExtensions = false; + this.showMenu = false; if(note.safeText().length == 0 && note.dummy) { this.focusTitle(100); diff --git a/app/assets/javascripts/app/services/directives/contextualExtensionsMenu.js b/app/assets/javascripts/app/services/directives/contextualExtensionsMenu.js index 375ea39d5..a0ed0e97d 100644 --- a/app/assets/javascripts/app/services/directives/contextualExtensionsMenu.js +++ b/app/assets/javascripts/app/services/directives/contextualExtensionsMenu.js @@ -10,7 +10,21 @@ class ContextualExtensionsMenu { controller($scope, modelManager, extensionManager) { 'ngInject'; - $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item); + + $scope.extensions = _.map(extensionManager.extensionsInContextOfItem($scope.item), function(ext){ + return _.cloneDeep(ext); + }); + + for(let ext of $scope.extensions) { + ext.loading = true; + extensionManager.loadExtensionInContextOfItem(ext, $scope.item, function(scopedExtension) { + ext.loading = false; + if(scopedExtension) { + _.merge(ext, scopedExtension); + ext.actions = scopedExtension.actions; + } + }) + } $scope.executeAction = function(action, extension) { action.running = true; diff --git a/app/assets/javascripts/app/services/extensionManager.js b/app/assets/javascripts/app/services/extensionManager.js index e06aa527b..4be4ecff0 100644 --- a/app/assets/javascripts/app/services/extensionManager.js +++ b/app/assets/javascripts/app/services/extensionManager.js @@ -71,6 +71,24 @@ class ExtensionManager { this.apiController.sync(null); } + /* + Loads an extension in the context of a certain item. The server then has the chance to respond with actions that are + relevant just to this item. The response extension is not saved, just displayed as a one-time thing. + */ + loadExtensionInContextOfItem(extension, item, callback) { + this.Restangular.oneUrl(extension.url, extension.url).customGET("", {content_type: item.content_type, item_uuid: item.uuid}).then(function(response){ + var scopedExtension = new Extension(response.plain()); + callback(scopedExtension); + }.bind(this)) + .catch(function(response){ + console.log("Error loading extension", response); + callback(null); + }) + } + + /* + Registers new extension and saves it to user's account + */ retrieveExtensionFromServer(url, callback) { this.Restangular.oneUrl(url, url).get().then(function(response){ var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain()); diff --git a/app/assets/stylesheets/app/_directives.scss b/app/assets/stylesheets/app/_directives.scss index 1ab586a6c..4ca0da65b 100644 --- a/app/assets/stylesheets/app/_directives.scss +++ b/app/assets/stylesheets/app/_directives.scss @@ -12,6 +12,7 @@ padding-top: 12px; padding-left: 10px; padding-bottom: 10px; + position: relative; > .name { font-size: 14px; @@ -23,6 +24,14 @@ font-weight: normal; margin-top: 2px; } + + > .loading { + position: absolute; + height: 15px; + width: 15px; + right: 10px; + top: 20px; + } } ul { diff --git a/app/assets/templates/frontend/directives/contextual-menu.html.haml b/app/assets/templates/frontend/directives/contextual-menu.html.haml index bdc1ea5ce..c30f5da5e 100644 --- a/app/assets/templates/frontend/directives/contextual-menu.html.haml +++ b/app/assets/templates/frontend/directives/contextual-menu.html.haml @@ -5,6 +5,7 @@ .access Can access your data %strong {{accessTypeForExtension(extension)}} + .spinner.loading{"ng-if" => "extension.loading"} %ul %li.action{"ng-repeat" => "action in extension.actionsWithContextForItem(item)", "ng-click" => "executeAction(action, extension)"} .name {{action.label}} diff --git a/app/assets/templates/frontend/header.html.haml b/app/assets/templates/frontend/header.html.haml index 31ba30548..5bdc562cb 100644 --- a/app/assets/templates/frontend/header.html.haml +++ b/app/assets/templates/frontend/header.html.haml @@ -139,7 +139,7 @@ Last run {{action.lastExecuted | appDateTime}} .error{"ng-if" => "action.error"} Error performing action. - %a{"ng-click" => "ctrl.deleteExtension(extension)", "style" => "margin-top: 22px; display: block;"} Remove extension + %a{"ng-click" => "ctrl.deleteExtension(extension)", "style" => "margin-top: 22px; display: block; text-align: center;"} Remove extension .extension-link %a{"ng-click" => "ctrl.toggleExtensionForm()"} Add new extension