diff --git a/app/assets/javascripts/app/controllers/footer.js b/app/assets/javascripts/app/controllers/footer.js index b37b94ff1..450133349 100644 --- a/app/assets/javascripts/app/controllers/footer.js +++ b/app/assets/javascripts/app/controllers/footer.js @@ -55,10 +55,6 @@ angular.module('app') this.showAccountMenu = !this.showAccountMenu; } - this.toggleExtensions = function() { - this.showExtensionsMenu = !this.showExtensionsMenu; - } - this.hasPasscode = function() { return passcodeManager.hasPasscode(); } diff --git a/app/assets/javascripts/app/directives/views/globalExtensionsMenu.js b/app/assets/javascripts/app/directives/views/globalExtensionsMenu.js deleted file mode 100644 index 4ae490711..000000000 --- a/app/assets/javascripts/app/directives/views/globalExtensionsMenu.js +++ /dev/null @@ -1,215 +0,0 @@ -class GlobalExtensionsMenu { - - constructor() { - this.restrict = "E"; - this.templateUrl = "directives/global-extensions-menu.html"; - this.scope = { - }; - } - - controller($scope, actionsManager, syncManager, modelManager, themeManager, componentManager, packageManager) { - 'ngInject'; - - $scope.formData = {}; - - $scope.actionsManager = actionsManager; - $scope.themeManager = themeManager; - $scope.componentManager = componentManager; - - $scope.serverExtensions = modelManager.itemsForContentType("SF|Extension"); - - $scope.selectedAction = function(action, extension) { - actionsManager.executeAction(action, extension, null, function(response){ - if(response && response.error) { - action.error = true; - alert("There was an error performing this action. Please try again."); - } else { - action.error = false; - syncManager.sync(null); - } - }) - } - - $scope.changeExtensionEncryptionFormat = function(encrypted, extension) { - extension.encrypted = encrypted; - extension.setDirty(true); - syncManager.sync(); - } - - $scope.deleteActionExtension = function(extension) { - if(confirm("Are you sure you want to delete this extension?")) { - actionsManager.deleteExtension(extension); - } - } - - $scope.reloadExtensionsPressed = function() { - if(confirm("For your security, reloading extensions will disable any currently enabled repeat actions.")) { - actionsManager.refreshExtensionsFromServer(); - } - } - - $scope.deleteTheme = function(theme) { - if(confirm("Are you sure you want to delete this theme?")) { - themeManager.deactivateTheme(theme); - modelManager.setItemToBeDeleted(theme); - syncManager.sync(); - } - } - - $scope.renameExtension = function(extension) { - extension.tempName = extension.name; - extension.rename = true; - } - - $scope.submitExtensionRename = function(extension) { - extension.name = extension.tempName; - extension.tempName = null; - extension.setDirty(true); - extension.rename = false; - syncManager.sync(); - } - - $scope.clickedExtension = function(extension) { - if(extension.rename) { - return; - } - - if($scope.currentlyExpandedExtension && $scope.currentlyExpandedExtension !== extension) { - $scope.currentlyExpandedExtension.showDetails = false; - $scope.currentlyExpandedExtension.rename = false; - } - - extension.showDetails = !extension.showDetails; - - if(extension.showDetails) { - $scope.currentlyExpandedExtension = extension; - } - } - - // Server extensions - - $scope.deleteServerExt = function(ext) { - if(confirm("Are you sure you want to delete and disable this extension?")) { - _.remove($scope.serverExtensions, {uuid: ext.uuid}); - modelManager.setItemToBeDeleted(ext); - syncManager.sync(); - } - } - - $scope.nameForServerExtension = function(ext) { - var url = ext.url; - if(!url) { - return "Invalid Extension"; - } - if(url.includes("gdrive")) { - return "Google Drive Sync"; - } else if(url.includes("file_attacher")) { - return "File Attacher"; - } else if(url.includes("onedrive")) { - return "OneDrive Sync"; - } else if(url.includes("backup.email_archive")) { - return "Daily Email Backups"; - } else if(url.includes("dropbox")) { - return "Dropbox Sync"; - } else if(url.includes("revisions")) { - return "Revision History"; - } else { - return null; - } - } - - - // Components - - $scope.revokePermissions = function(component) { - component.permissions = []; - component.setDirty(true); - syncManager.sync(); - } - - $scope.deleteComponent = function(component) { - if(confirm("Are you sure you want to delete this component?")) { - componentManager.deleteComponent(component); - } - } - - - // Installation - - $scope.submitInstallLink = function() { - - var fullLink = $scope.formData.installLink; - if(!fullLink) { - return; - } - - var completion = function() { - $scope.formData.installLink = ""; - $scope.formData.successfullyInstalled = true; - } - - var links = fullLink.split(","); - for(var link of links) { - var type = getParameterByName("type", link); - - if(type == "sf") { - $scope.handleServerExtensionLink(link, completion); - } else if(type == "editor") { - $scope.handleEditorLink(link, completion); - } else if(link.indexOf(".css") != -1 || type == "theme") { - $scope.handleThemeLink(link, completion); - } else if(type == "component") { - $scope.handleComponentLink(link, completion); - } else if(type == "package") { - $scope.handlePackageLink(link, completion); - } - - else { - $scope.handleActionLink(link, completion); - } - } - } - - $scope.handlePackageLink = function(link, completion) { - packageManager.installPackage(link, completion); - } - - $scope.handleServerExtensionLink = function(link, completion) { - var params = parametersFromURL(link); - params["url"] = link; - var ext = new ServerExtension({content: params}); - ext.setDirty(true); - - modelManager.addItem(ext); - syncManager.sync(); - $scope.serverExtensions.push(ext); - completion(); - } - - $scope.handleThemeLink = function(link, completion) { - themeManager.submitTheme(link); - completion(); - } - - $scope.handleComponentLink = function(link, completion) { - componentManager.installComponent(link); - completion(); - } - - $scope.handleActionLink = function(link, completion) { - if(link) { - actionsManager.addExtension(link, function(response){ - if(!response) { - alert("Unable to register this extension. Make sure the link is valid and try again."); - } else { - completion(); - } - }) - } - } - - } - -} - -angular.module('app').directive('globalExtensionsMenu', () => new GlobalExtensionsMenu); diff --git a/app/assets/templates/directives/global-extensions-menu.html.haml b/app/assets/templates/directives/global-extensions-menu.html.haml deleted file mode 100644 index 04af90463..000000000 --- a/app/assets/templates/directives/global-extensions-menu.html.haml +++ /dev/null @@ -1,138 +0,0 @@ -.panel#global-ext-menu - .panel-body - .container - .float-group.h20 - %h1.tinted.pull-left Extensions - %a.block.pull-right.dashboard-link{"href" => "https://dashboard.standardnotes.org", "target" => "_blank"} Open Dashboard - %div.clear{"ng-if" => "!actionsManager.extensions.length && !themeManager.themes.length && !componentManager.components.length"} - %p Customize your experience with editors, themes, and actions. - .tinted-box.mt-10 - %h3 Available as part of the Extended subscription. - %p.mt-5 Note history - %p.mt-5 Automated backups - %p.mt-5 Editors, themes, and actions - %a{"href" => "https://standardnotes.org/extensions", "target" => "_blank"} - %button.mt-10 - %h3 Learn More - - %div{"ng-if" => "themeManager.themes.length > 0"} - .header.container.section-margin - %h2 Themes - %ul - %li{"ng-repeat" => "theme in themeManager.themes | orderBy: 'name'", "ng-click" => "clickedExtension(theme)"} - .container - %h3 - %input.bold{"ng-if" => "theme.rename", "ng-model" => "theme.tempName", "ng-keyup" => "$event.keyCode == 13 && submitExtensionRename(theme);", "sn-autofocus" => "true", "should-focus" => "true"} - %span{"ng-if" => "!theme.rename"} {{theme.name}} - -# %a{"ng-if" => "!themeManager.isThemeActive(theme)", "ng-click" => "themeManager.activateTheme(theme); $event.stopPropagation();"} Activate - -# %a{"ng-if" => "themeManager.isThemeActive(theme)", "ng-click" => "themeManager.deactivateTheme(theme); $event.stopPropagation();"} Deactivate - .mt-3{"ng-if" => "theme.showDetails"} - .link-group - %a{"ng-click" => "renameExtension(theme); $event.stopPropagation();"} Rename - %a{"ng-click" => "theme.showLink = !theme.showLink; $event.stopPropagation();"} Show Link - %a.red{"ng-click" => "deleteTheme(theme); $event.stopPropagation();"} Delete - %p.small.selectable.wrap{"ng-if" => "theme.showLink"} - {{theme.url}} - - - %div{"ng-if" => "actionsManager.extensions.length"} - .header.container.section-margin - %h2 Actions - %p{"style" => "margin-top: 3px;"} Choose "Actions" in the note editor to use installed actions. - - %ul - %li{"ng-repeat" => "extension in actionsManager.extensions | orderBy: 'name'", "ng-init" => "extension.formData = {}", "ng-click" => "clickedExtension(extension)"} - .container - %h3 - %input.bold{"ng-if" => "extension.rename", "ng-model" => "extension.tempName", "ng-keyup" => "$event.keyCode == 13 && submitExtensionRename(extension);", "sn-autofocus" => "true", "should-focus" => "true"} - %span{"ng-if" => "!extension.rename"} {{extension.name}} - %p.small{"ng-if" => "extension.description"} {{extension.description}} - %div{"ng-if" => "extension.showDetails"} - .mt-10 - %label.block Access Type - %label.normal.block{"ng-click" => " $event.stopPropagation();"} - %input{"type" => "radio", "ng-model" => "extension.encrypted", "ng-value" => "true", "ng-change" => "changeExtensionEncryptionFormat(true, extension);"} - Encrypted - %label.normal.block{"ng-click" => " $event.stopPropagation();"} - %input{"type" => "radio", "ng-model" => "extension.encrypted", "ng-value" => "false", "ng-change" => "changeExtensionEncryptionFormat(false, extension);"} - Decrypted - - .small-v-space - - %ul{"ng-repeat" => "action in extension.actionsInGlobalContext()"} - %li - %label.block {{action.label}} - %em{"style" => "font-style: italic;"} {{action.desc}} - %em{"ng-if" => "action.repeat_mode == 'watch'"} - Repeats when a change is made to your items. - %em{"ng-if" => "action.repeat_mode == 'loop'"} - Repeats at most once every {{action.repeat_timeout}} seconds - %div - %a{"ng-click" => "action.showPermissions = !action.showPermissions"} {{action.showPermissions ? "Hide permissions" : "Show permissions"}} - %div{"ng-if" => "action.showPermissions"} - {{action.permissionsString()}} - %label.block.normal {{action.encryptionModeString()}} - - %div - .mt-5{"ng-if" => "action.repeat_mode"} - %button.light.tinted{"ng-if" => "actionsManager.isRepeatActionEnabled(action)", "ng-click" => "actionsManager.disableRepeatAction(action, extension); $event.stopPropagation();"} Disable - %button.light.tinted{"ng-if" => "!actionsManager.isRepeatActionEnabled(action)", "ng-click" => "actionsManager.enableRepeatAction(action, extension); $event.stopPropagation();"} Enable - %button.light.mt-10{"ng-if" => "!action.running && !action.repeat_mode", "ng-click" => "selectedAction(action, extension); $event.stopPropagation();"} - Perform Action - .spinner.mb-5.block{"ng-if" => "action.running"} - %p.mb-5.mt-5.small{"ng-if" => "!action.error && action.lastExecuted && !action.running"} - Last run {{action.lastExecuted | appDateTime}} - %label.red{"ng-if" => "action.error"} - Error performing action. - - %a.block.mt-5{"ng-click" => "renameExtension(extension); $event.stopPropagation();"} Rename - %a.block.mt-5{"ng-click" => "extension.showURL = !extension.showURL; $event.stopPropagation();"} Show Link - %p.wrap.selectable.small{"ng-if" => "extension.showURL"} {{extension.url}} - %a.block.mt-5{"ng-click" => "deleteActionExtension(extension); $event.stopPropagation();"} Delete - - %div{"ng-if" => "componentManager.components.length > 0"} - .header.container.section-margin - %h2 Components - %ul - %li{"ng-repeat" => "component in componentManager.components | orderBy: 'name'", "ng-click" => "clickedExtension(component)"} - .container - %h3 - %input.bold{"ng-if" => "component.rename", "ng-model" => "component.tempName", "ng-keyup" => "$event.keyCode == 13 && submitExtensionRename(component);", "sn-autofocus" => "true", "should-focus" => "true"} - %span{"ng-if" => "!component.rename"} {{component.name}} - - %div{"ng-if" => "component.isEditor()"} - %a{"ng-if" => "!component.isDefaultEditor()", "ng-click" => "makeEditorDefault(component); $event.stopPropagation();"} Make Default - %a{"ng-if" => "component.isDefaultEditor()", "ng-click" => "removeEditorDefault(component); $event.stopPropagation();"} Remove Default - %div{"ng-if" => "!component.isEditor()"} - %a{"ng-if" => "!componentManager.isComponentActive(component)", "ng-click" => "componentManager.activateComponent(component); $event.stopPropagation();"} Activate - %a{"ng-if" => "componentManager.isComponentActive(component)", "ng-click" => "componentManager.deactivateComponent(component); $event.stopPropagation();"} Deactivate - .mt-3{"ng-if" => "component.showDetails"} - .link-group - %a{"ng-click" => "renameExtension(component); $event.stopPropagation();"} Rename - %a{"ng-click" => "component.showLink = !component.showLink; $event.stopPropagation();"} Show Link - %a{"ng-if" => "component.permissions.length", "ng-click" => "revokePermissions(component); $event.stopPropagation();"} Revoke Permissions - %a.red{"ng-click" => "deleteComponent(component); $event.stopPropagation();"} Delete - %p.small.selectable.wrap{"ng-if" => "component.showLink"} - {{component.url}} - - %div{"ng-if" => "serverExtensions.length > 0"} - .header.container.section-margin - %h2 Server Extensions - %ul - %li{"ng-repeat" => "ext in serverExtensions", "ng-click" => "ext.showDetails = !ext.showDetails"} - .container - %strong.red.medium{"ng-if" => "ext.conflict_of"} Conflicted copy - %h3 {{nameForServerExtension(ext)}} - %div.mt-3{"ng-if" => "ext.showDetails"} - .link-group - %a{"ng-click" => "ext.showUrl = !ext.showUrl; $event.stopPropagation();"} Show Link - %a.red{ "ng-click" => "deleteServerExt(ext); $event.stopPropagation();"} Delete - .wrap.mt-5.selectable{"ng-if" => "ext.showUrl"} {{ext.url}} - - .container.section-margin - %h2.tinted Install - %p.faded Enter an install link - %form.mt-10.mb-10 - %input.form-control{:autofocus => 'autofocus', :name => 'url', :required => true, :autocomplete => "off", - :type => 'url', 'ng-model' => 'formData.installLink', "ng-keyup" => "$event.keyCode == 13 && submitInstallLink();"} - %p.tinted{"ng-if" => "formData.successfullyInstalled"} Successfully installed extension. diff --git a/app/assets/templates/footer.html.haml b/app/assets/templates/footer.html.haml index 33d066153..d719763bc 100644 --- a/app/assets/templates/footer.html.haml +++ b/app/assets/templates/footer.html.haml @@ -8,11 +8,6 @@ .label.title{"ng-class" => "{red: ctrl.error}"} Account %account-menu{"ng-click" => "$event.stopPropagation()", "ng-if" => "ctrl.showAccountMenu", "on-successful-auth" => "ctrl.onAuthSuccess", "close-function" => "ctrl.closeAccountMenu"} - .item{"click-outside" => "ctrl.showExtensionsMenu = false;", "is-open" => "ctrl.showExtensionsMenu"} - .column{"ng-click" => "ctrl.toggleExtensions()"} - .label.title Extensions - %global-extensions-menu{"ng-if" => "ctrl.showExtensionsMenu"} - .item .label.title{"href" => "https://standardnotes.org/help", "target" => "_blank"} Help