keymanager, syncmanager
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
.panel.panel-default.account-panel.panel-right.account-data-menu
|
||||
.panel-body
|
||||
.account-items
|
||||
%section.account-item
|
||||
%h3{"ng-click" => "showSN = !showSN"} Standard Notes Account
|
||||
%account-vendor-account-section{"ng-if" => "showSN"}
|
||||
|
||||
%section.account-item
|
||||
%h3{"ng-click" => "showSync = !showSync"} Sync Providers
|
||||
%account-sync-section{"ng-if" => "showSync"}
|
||||
|
||||
%section.account-item
|
||||
%h3{"ng-click" => "showKeys = !showKeys"} Encryption Keys
|
||||
%account-keys-section{"ng-if" => "showKeys"}
|
||||
|
||||
%section.account-item
|
||||
%h3{"ng-click" => "showIO = !showIO"} Import/Export
|
||||
%import-export-menu{"ng-if" => "showIO"}
|
||||
@@ -0,0 +1,11 @@
|
||||
.account-keys-section
|
||||
.keys
|
||||
.key{"ng-repeat" => "key in keys"}
|
||||
.name {{key.name}}
|
||||
.value {{key.key}}
|
||||
|
||||
%a{"ng-click" => "newKeyData.showForm = !newKeyData.showForm"} Add New Key
|
||||
%form{"ng-if" => "newKeyData.showForm"}
|
||||
%input{"ng-model" => "newKeyData.name", "placeholder" => "Name your key"}
|
||||
%input{"ng-model" => "newKeyData.key", "placeholder" => "Key"}
|
||||
%button.light{"ng-click" => "submitNewKeyForm()"} Add Key
|
||||
@@ -0,0 +1,22 @@
|
||||
.providers
|
||||
.provider{"ng-repeat" => "provider in syncProviders"}
|
||||
.type {{provider.primary == null ? 'Not enabled' : (provider.primary ? 'Primary' : 'Secondary')}}
|
||||
.key{"ng-if" => "provider.keyName"} Using key: {{provider.keyName}}
|
||||
.url {{provider.url}}
|
||||
.options
|
||||
%div{"ng-if" => "!provider.enabled"}
|
||||
%strong Choose encryption key:
|
||||
%select{"ng-model" => "provider.keyName"}
|
||||
%option{"ng-repeat" => "key in keys", "ng-selected" => "{{key.name == provider.keyName}}", "value" => "{{key.name}}"}
|
||||
{{key.name}}
|
||||
%button.light{"ng-click" => "enableSyncProvider(provider, true)"} Enable as Primary sync provider
|
||||
%button.light{"ng-click" => "enableSyncProvider(provider, false)"} Enable as Secondary sync provider
|
||||
%button.light{"ng-click" => "removeSyncProvider(provider)"} Remove Provider
|
||||
%button.light{"ng-if" => "provider.keyName", "ng-click" => "changeEncryptionKey(provider)"} Change Encryption Key
|
||||
|
||||
%a{"ng-click" => "newSyncData.showAddSyncForm = !newSyncData.showAddSyncForm"} Add external sync with Secret URL
|
||||
%form.sync-form{"ng-if" => "newSyncData.showAddSyncForm"}
|
||||
.form-tag.has-feedback
|
||||
%input.form-control{:autofocus => 'autofocus', :name => 'url', :placeholder => 'Secret URL', :required => true, :type => 'url', 'ng-model' => 'newSyncData.url'}
|
||||
%button.btn.dark-button.btn-block{"ng-click" => "submitExternalSyncURL()"}
|
||||
Add External Sync
|
||||
@@ -0,0 +1,42 @@
|
||||
.registration-login
|
||||
%div{"ng-if" => "user"}
|
||||
.email {{user.email}}
|
||||
.server {{serverURL}}
|
||||
.links{"ng-if" => "user"}
|
||||
.link-item
|
||||
%a{"ng-click" => "signOutPressed()"} Sign Out
|
||||
.meta-container
|
||||
.title Local Encryption
|
||||
.desc Notes are encrypted locally before being sent to the server. Neither the server owner nor an intrusive entity can decrypt your locally encrypted notes.
|
||||
.action-container
|
||||
%span.status-title Status:
|
||||
{{encryptionStatusForNotes()}}
|
||||
%div{"ng-if" => "!user"}
|
||||
.meta-container
|
||||
.title Sign in or Register (optional)
|
||||
.desc Enter your <a href="https://standardfile.org" target="_blank">Standard File</a> account information.
|
||||
.action-container
|
||||
%form.account-form{'name' => "loginForm"}
|
||||
.form-tag.has-feedback
|
||||
%input.form-control{:name => 'server', :placeholder => 'Server URL', :required => true, :type => 'text', 'ng-model' => 'loginData.url'}
|
||||
.form-tag.has-feedback
|
||||
%input.form-control.login-input{:autofocus => 'autofocus', :name => 'email', :placeholder => 'Email', :required => true, :type => 'email', 'ng-model' => 'loginData.email'}
|
||||
.form-tag.has-feedback
|
||||
%input.form-control.login-input{:placeholder => 'Password', :name => 'password', :required => true, :type => 'password', 'ng-model' => 'loginData.user_password'}
|
||||
.checkbox{"ng-if" => "localNotesCount() > 0"}
|
||||
%label
|
||||
%input{"type" => "checkbox", "ng-model" => "loginData.mergeLocal", "ng-bind" => "true", "ng-change" => "mergeLocalChanged()"}
|
||||
Merge local notes ({{localNotesCount()}} notes)
|
||||
%button.btn.dark-button.half-button{"ng-click" => "loginSubmitPressed()", "data-style" => "expand-right", "data-size" => "s", "state" => "buttonState"}
|
||||
%span Sign In
|
||||
%button.btn.dark-button.half-button{"ng-click" => "submitRegistrationForm()", "data-style" => "expand-right", "data-size" => "s", "state" => "buttonState"}
|
||||
%span Register
|
||||
%br
|
||||
.login-forgot{"style" => "padding-top: 4px;"}
|
||||
%a.btn.btn-link{"ng-click" => "showResetForm = !showResetForm"} Passwords cannot be forgotten.
|
||||
.panel-status-text{"ng-if" => "loginData.status", "style" => "font-size: 14px;"} {{loginData.status}}
|
||||
|
||||
%div{"ng-if" => "showResetForm"}
|
||||
%p{"style" => "font-size: 13px; text-align: center;"}
|
||||
Because notes are locally encrypted using a secret key derived from your password, there's no way to decrypt these notes if you forget your password.
|
||||
For this reason, Standard Notes cannot offer a password reset option. You <strong>must</strong> make sure to store or remember your password.
|
||||
@@ -0,0 +1,82 @@
|
||||
.panel.panel-default.account-panel.panel-right.extensions-panel
|
||||
.panel-body
|
||||
%div{"style" => "font-size: 18px;", "ng-if" => "!extensionManager.extensions.length"} No extensions installed
|
||||
.registered-extensions{"ng-if" => "extensionManager.extensions.length"}
|
||||
.extension{"ng-repeat" => "extension in extensionManager.extensions", "ng-init" => "extension.formData = {}"}
|
||||
.extension-name {{extension.name}}
|
||||
.encryption-format
|
||||
.title Send data:
|
||||
%label
|
||||
%input{"type" => "radio", "ng-model" => "extension.encrypted", "ng-value" => "true", "ng-change" => "changeExtensionEncryptionFormat(true, extension)"}
|
||||
Encrypted
|
||||
%label
|
||||
%input{"type" => "radio", "ng-model" => "extension.encrypted", "ng-value" => "false", "ng-change" => "changeExtensionEncryptionFormat(false, extension)"}
|
||||
Decrypted
|
||||
.ek-input-wrapper{"ng-if" => "extension.encrypted && (!extensionManager.ekForExtension(extension) || extension.formData.changingKey)"}
|
||||
%input{"ng-model" => "extension.formData.ek", "placeholder" => "Set encryption key"}
|
||||
%button.light{"ng-click" => "setEncryptionKeyForExtension(extension)"} Set
|
||||
.extension-actions
|
||||
.action{"ng-repeat" => "action in extension.actionsInGlobalContext()"}
|
||||
%div{"ng-if" => "!action.sync_provider"}
|
||||
.action-name {{action.label}}
|
||||
.action-desc{"style" => "font-style: italic;"} {{action.desc}}
|
||||
.execute-type{"ng-if" => "action.repeat_mode == 'watch'"}
|
||||
Repeats when a change is made to your items.
|
||||
.execute-type{"ng-if" => "action.repeat_mode == 'loop'"}
|
||||
Repeats at most once every {{action.repeat_timeout}} seconds
|
||||
.action-permissions
|
||||
%a{"ng-click" => "action.showPermissions = !action.showPermissions"} {{action.showPermissions ? "Hide permissions" : "Show permissions"}}
|
||||
%div{"ng-if" => "action.showPermissions"}
|
||||
{{action.permissionsString}}
|
||||
.encryption-type
|
||||
%span {{action.encryptionModeString}}
|
||||
%div{"ng-if" => "action.sync_provider"}
|
||||
.action-name This is a sync provider action.
|
||||
.action-desc{"style" => "margin-top: -5px;"}
|
||||
%p Enabling this sync provider as a primary provider will replace your current sync provider.
|
||||
%p Enabling this sync provider as a secondary provider will save your data with this provider as a backup, but will not be used to pull changes.
|
||||
%p You can have only one primary provider, and multiple secondary providers.
|
||||
|
||||
%div{"ng-if" => "!syncProviderActionIsEnabled(action)"}
|
||||
%button.light.execute{"ng-click" => "enableSyncProvider(action, extension, true)"} Enable as primary sync provider
|
||||
%button.light.execute{"ng-click" => "enableSyncProvider(action, extension, false)"} Enable as backup sync provider
|
||||
%div{"ng-if" => "syncProviderActionIsEnabled(action)"}
|
||||
%button.light.execute{"ng-click" => "disableSyncProvider(action, extension)"} Remove as sync provider
|
||||
|
||||
.execute{"ng-if" => "!action.sync_provider"}
|
||||
%div{"ng-if" => "action.repeat_mode"}
|
||||
%div{"ng-if" => "extensionManager.isRepeatActionEnabled(action)", "ng-click" => "extensionManager.disableRepeatAction(action, extension)"} Disable
|
||||
%div{"ng-if" => "!extensionManager.isRepeatActionEnabled(action)", "ng-click" => "extensionManager.enableRepeatAction(action, extension)"} Enable
|
||||
%div{"ng-if" => "!action.repeat_mode", "ng-click" => "selectedAction(action, extension)"}
|
||||
%div{"ng-if" => "!action.running"}
|
||||
Perform Action
|
||||
%div{"ng-if" => "action.running"}
|
||||
.spinner.execution-spinner
|
||||
.last-run{"ng-if" => "!action.error && action.lastExecuted && !action.running"}
|
||||
Last run {{action.lastExecuted | appDateTime}}
|
||||
.error{"ng-if" => "action.error"}
|
||||
Error performing action.
|
||||
|
||||
|
||||
%a.option-link{"ng-if" => "extension.encrypted && extensionManager.ekForExtension(extension) && !extension.formData.changingKey", "ng-click" => "extension.formData.showEk = !extension.formData.showEk"}
|
||||
Show Encryption Key
|
||||
.show-ek{"style" => "text-align: center", "ng-if" => "extension.formData.showEk"}
|
||||
.ek {{extensionManager.ekForExtension(extension)}}
|
||||
.disclaimer This key is saved locally and never sent to any servers.
|
||||
%a.option-link{"ng-if" => "extension.encrypted && extensionManager.ekForExtension(extension) && !extension.formData.changingKey", "ng-click" => "changeEncryptionKeyPressed(extension)"}
|
||||
Change Encryption Key
|
||||
%a.option-link{"ng-click" => "deleteExtension(extension)"} Remove extension
|
||||
|
||||
.extension-link
|
||||
%a{"ng-click" => "toggleExtensionForm()"} Add new extension
|
||||
|
||||
%form.extension-form{"ng-if" => "showNewExtensionForm"}
|
||||
.form-tag.has-feedback
|
||||
%input.form-control{:autofocus => 'autofocus', :name => 'url', :placeholder => 'Extension URL', :required => true, :type => 'url', 'ng-model' => 'newExtensionData.url'}
|
||||
%button.btn.dark-button.btn-block{"ng-click" => "submitNewExtensionForm()", :type => 'submit', "data-style" => "expand-right", "data-size" => "s", "state" => "buttonState"}
|
||||
%span.ladda-label Add Extension
|
||||
|
||||
.extension-link
|
||||
%a{"ng-click" => "reloadExtensionsPressed()", "ng-if" => "extensionManager.extensions.length > 0"} Reload all extensions
|
||||
.extension-link
|
||||
%a{"href" => "https://standardnotes.org/extensions", "target" => "_blank"} List of available extensions
|
||||
@@ -0,0 +1,26 @@
|
||||
.options{"style" => "font-size: 12px; margin-top: 4px;"}
|
||||
%label.enc-option{"ng-if" => "user"}
|
||||
%input{"type" => "radio", "ng-model" => "archiveFormData.encryption_type", "ng-value" => "'mk'", "ng-change" => "archiveFormData.encryption_type = 'mk'"}
|
||||
Encrypted with Standard File key
|
||||
%label.enc-option
|
||||
%input{"type" => "radio", "ng-model" => "archiveFormData.encryption_type", "ng-value" => "'ek'", "ng-change" => "archiveFormData.encryption_type = 'ek'"}
|
||||
{{user ? 'Encrypted with custom key' : 'Encrypted' }}
|
||||
%div{"ng-if" => "!user || (user && archiveFormData.encryption_type == 'ek')"}
|
||||
%input{"ng-model" => "archiveFormData.ek", "placeholder" => "Encryption key"}
|
||||
%label.enc-option
|
||||
%input{"type" => "radio", "ng-model" => "archiveFormData.encryption_type", "ng-value" => "'none'", "ng-change" => "archiveFormData.encryption_type = 'none'"}
|
||||
Decrypted
|
||||
.action-container
|
||||
%a{"ng-click" => "downloadDataArchive()"} Download Data Archive
|
||||
|
||||
%div{"ng-if" => "!importData.loading"}
|
||||
%label#import-archive
|
||||
%input{"type" => "file", "style" => "display: none;", "file-change" => "->", "handler" => "importFileSelected(files)"}
|
||||
%a.disabled
|
||||
%span
|
||||
Import Data from Archive
|
||||
.import-password{"ng-if" => "importData.requestPassword"}
|
||||
Enter the account password associated with the import file.
|
||||
%input.field{"type" => "text", "ng-model" => "importData.password"}
|
||||
%button{"ng-click" => "submitImportPassword()"} Decrypt & Import
|
||||
.spinner{"ng-if" => "importData.loading"}
|
||||
@@ -1,175 +1,16 @@
|
||||
.header
|
||||
.header-content
|
||||
.menu.left
|
||||
|
||||
.items
|
||||
.item.account
|
||||
%div{"ng-click" => "ctrl.accountMenuPressed()"}
|
||||
%div{"ng-if" => "ctrl.user"} Account
|
||||
%div{"ng-if" => "!ctrl.user"} Sign in or Register
|
||||
.panel.panel-default.account-panel.panel-right{"ng-if" => "ctrl.showAccountMenu"}
|
||||
.panel-body
|
||||
.account-items
|
||||
.account-item.registration-login{"ng-if" => "!ctrl.user"}
|
||||
.account-item
|
||||
.meta-container
|
||||
.title Server
|
||||
.desc Enter your <a href="https://standardfile.org" target="_blank">Standard File</a> server address, or use the default.
|
||||
.action-container
|
||||
%form.account-form{'ng-submit' => 'ctrl.changeServer()', 'name' => "serverChangeForm"}
|
||||
.form-tag.has-feedback
|
||||
%input.form-control{:name => 'server', :placeholder => 'Server URL', :required => true, :type => 'text', 'ng-model' => 'ctrl.serverData.url'}
|
||||
%button.btn.dark-button.btn-block{:type => 'submit', "data-style" => "expand-right", "data-size" => "s", "state" => "buttonState"}
|
||||
%span.ladda-label Set Server
|
||||
.meta-container
|
||||
.title Sign in or Register
|
||||
.desc
|
||||
%form.account-form{'name' => "loginForm"}
|
||||
.form-tag.has-feedback
|
||||
%input.form-control.login-input{:autofocus => 'autofocus', :name => 'email', :placeholder => 'Email', :required => true, :type => 'email', 'ng-model' => 'ctrl.loginData.email'}
|
||||
.form-tag.has-feedback
|
||||
%input.form-control.login-input{:placeholder => 'Password', :name => 'password', :required => true, :type => 'password', 'ng-model' => 'ctrl.loginData.user_password'}
|
||||
.checkbox{"ng-if" => "ctrl.localNotesCount() > 0"}
|
||||
%label
|
||||
%input{"type" => "checkbox", "ng-model" => "ctrl.loginData.mergeLocal", "ng-bind" => "true", "ng-change" => "ctrl.mergeLocalChanged()"}
|
||||
Merge local notes ({{ctrl.localNotesCount()}} notes)
|
||||
%button.btn.dark-button.half-button{"ng-click" => "ctrl.loginSubmitPressed()", "data-style" => "expand-right", "data-size" => "s", "state" => "buttonState"}
|
||||
%span Sign In
|
||||
%button.btn.dark-button.half-button{"ng-click" => "ctrl.submitRegistrationForm()", "data-style" => "expand-right", "data-size" => "s", "state" => "buttonState"}
|
||||
%span Register
|
||||
%br
|
||||
.login-forgot{"style" => "padding-top: 4px;"}
|
||||
%a.btn.btn-link{"ng-click" => "ctrl.showResetForm = !ctrl.showResetForm"} Passwords cannot be forgotten.
|
||||
.panel-status-text{"ng-if" => "ctrl.loginData.status", "style" => "font-size: 14px;"} {{ctrl.loginData.status}}
|
||||
|
||||
%div{"ng-if" => "ctrl.showResetForm"}
|
||||
%p{"style" => "font-size: 13px; text-align: center;"}
|
||||
Because notes are locally encrypted using a secret key derived from your password, there's no way to decrypt these notes if you forget your password.
|
||||
For this reason, Standard Notes cannot offer a password reset option. You <strong>must</strong> make sure to store or remember your password.
|
||||
|
||||
.account-item{"ng-if" => "ctrl.user"}
|
||||
.email {{ctrl.user.email}}
|
||||
.server {{ctrl.serverData.url}}
|
||||
.links{"ng-if" => "ctrl.user"}
|
||||
-# .link-item
|
||||
-# %a{"ng-click" => "ctrl.changePasswordPressed()"} Change Password
|
||||
-# %form.account-form{"ng-if" => "ctrl.showNewPasswordForm", 'ng-submit' => 'ctrl.submitPasswordChange()', 'name' => "passwordChangeForm"}
|
||||
-# .form-tag.has-feedback
|
||||
-# %input.form-control.login-input{:autofocus => 'autofocus', :name => 'current', :placeholder => 'Current password', :required => true, :type => 'password', 'ng-model' => 'ctrl.passwordChangeData.current_password'}
|
||||
-# .form-tag.has-feedback
|
||||
-# %input.form-control.login-input{:placeholder => 'New password', :name => 'password', :required => true, :type => 'password', 'ng-model' => 'ctrl.passwordChangeData.new_password', "autocomplete" => "new-password"}
|
||||
-# .form-tag.has-feedback
|
||||
-# %input.form-control.login-input{:placeholder => 'Confirm password', :name => 'password', :required => true, :type => 'password', 'ng-model' => 'ctrl.passwordChangeData.new_password_confirmation', "autocomplete" => "new-password"}
|
||||
-# %button.btn.dark-button.btn-block{:type => 'submit', "data-style" => "expand-right", "data-size" => "s", "state" => "buttonState"}
|
||||
-# %span.ladda-label Change Password
|
||||
-# .panel-status-text{"ng-if" => "ctrl.passwordChangeData.status", "style" => "font-size: 14px;"}
|
||||
-# {{ctrl.passwordChangeData.status}}
|
||||
.link-item
|
||||
%a{"ng-click" => "ctrl.signOutPressed()"} Sign Out
|
||||
.meta-container
|
||||
.title Local Encryption
|
||||
.desc Notes are encrypted locally before being sent to the server. Neither the server owner nor an intrusive entity can decrypt your locally encrypted notes.
|
||||
.action-container
|
||||
%span.status-title Status:
|
||||
{{ctrl.encryptionStatusForNotes()}}
|
||||
.account-item{"ng-if" => "ctrl.user"}
|
||||
.meta-container
|
||||
.title Data Archives
|
||||
.options{"style" => "font-size: 12px; margin-top: 4px;"}
|
||||
%label
|
||||
%input{"type" => "radio", "ng-model" => "ctrl.archiveEncryptionFormat.encrypted", "ng-value" => "true", "ng-change" => "ctrl.archiveEncryptionFormat.encrypted = true"}
|
||||
Encrypted
|
||||
%label
|
||||
%input{"type" => "radio", "ng-model" => "ctrl.archiveEncryptionFormat.encrypted", "ng-value" => "false", "ng-change" => "ctrl.archiveEncryptionFormat.encrypted = false"}
|
||||
Decrypted
|
||||
.action-container
|
||||
%a{"ng-click" => "ctrl.downloadDataArchive()"} Download Data Archive
|
||||
%br
|
||||
%div{"ng-if" => "!ctrl.importData.loading"}
|
||||
%label#import-archive
|
||||
%input{"type" => "file", "style" => "display: none;", "file-change" => "->", "handler" => "ctrl.importFileSelected(files)"}
|
||||
%a.disabled
|
||||
%span
|
||||
Import Data from Archive
|
||||
.import-password{"ng-if" => "ctrl.importData.requestPassword"}
|
||||
Enter the account password associated with the import file.
|
||||
%input.field{"type" => "text", "ng-model" => "ctrl.importData.password"}
|
||||
%button{"ng-click" => "ctrl.submitImportPassword()"} Decrypt & Import
|
||||
.spinner{"ng-if" => "ctrl.importData.loading"}
|
||||
%a{"ng-click" => "ctrl.accountMenuPressed()"} Data
|
||||
%account-data-menu
|
||||
-# {"ng-if" => "ctrl.showAccountMenu"}
|
||||
|
||||
.item
|
||||
%a{"ng-click" => "ctrl.toggleExtensions()"} Extensions
|
||||
.panel.panel-default.account-panel.panel-right.extensions-panel{"ng-if" => "ctrl.showExtensionsMenu"}
|
||||
.panel-body
|
||||
%div{"style" => "font-size: 18px;", "ng-if" => "!ctrl.extensionManager.extensions.length"} No extensions installed
|
||||
.registered-extensions{"ng-if" => "ctrl.extensionManager.extensions.length"}
|
||||
.extension{"ng-repeat" => "extension in ctrl.extensionManager.extensions"}
|
||||
.extension-name {{extension.name}}
|
||||
.encryption-format
|
||||
.title Send data:
|
||||
%label
|
||||
%input{"type" => "radio", "ng-model" => "extension.encrypted", "ng-value" => "true", "ng-change" => "ctrl.extensionManager.changeExtensionEncryptionFormat(true, extension)"}
|
||||
Encrypted
|
||||
%label
|
||||
%input{"type" => "radio", "ng-model" => "extension.encrypted", "ng-value" => "false", "ng-change" => "ctrl.extensionManager.changeExtensionEncryptionFormat(false, extension)"}
|
||||
Decrypted
|
||||
.encryption-key{"ng-if" => "extension.encrypted"}
|
||||
%input{"ng-model" => "extension.ek", "placeholder" => "Set encryption key"}
|
||||
.extension-actions
|
||||
.action{"ng-repeat" => "action in extension.actionsInGlobalContext()"}
|
||||
%div{"ng-if" => "!action.sync_provider"}
|
||||
.action-name {{action.label}}
|
||||
.action-desc{"style" => "font-style: italic;"} {{action.desc}}
|
||||
.execute-type{"ng-if" => "action.repeat_mode == 'watch'"}
|
||||
Repeats when a change is made to your items.
|
||||
.execute-type{"ng-if" => "action.repeat_mode == 'loop'"}
|
||||
Repeats at most once every {{action.repeat_timeout}} seconds
|
||||
.action-permissions
|
||||
%a{"ng-click" => "action.showPermissions = !action.showPermissions"} {{action.showPermissions ? "Hide permissions" : "Show permissions"}}
|
||||
%div{"ng-if" => "action.showPermissions"}
|
||||
{{action.permissionsString}}
|
||||
.encryption-type
|
||||
%span {{action.encryptionModeString}}
|
||||
%div{"ng-if" => "action.sync_provider"}
|
||||
.action-name This is a sync provider action.
|
||||
.action-desc{"style" => "margin-top: -5px;"}
|
||||
%p Enabling this sync provider as a primary provider will replace your current sync provider.
|
||||
%p Enabling this sync provider as a secondary provider will save your data with this provider as a backup, but will not be used to pull changes.
|
||||
%p You can have only one primary provider, and multiple secondary providers.
|
||||
|
||||
%div{"ng-if" => "!ctrl.syncProviderActionIsEnabled(action)"}
|
||||
.execute{"ng-click" => "ctrl.enableSyncProvider(action, extension, true)"} Enable as primary sync provider
|
||||
.execute{"ng-click" => "ctrl.enableSyncProvider(action, extension, false)"} Enable as backup sync provider
|
||||
%div{"ng-if" => "ctrl.syncProviderActionIsEnabled(action)"}
|
||||
.execute{"ng-click" => "ctrl.disableSyncProvider(action, extension)"} Remove as sync provider
|
||||
|
||||
.execute{"ng-if" => "!action.sync_provider"}
|
||||
%div{"ng-if" => "action.repeat_mode"}
|
||||
%div{"ng-if" => "ctrl.extensionManager.isRepeatActionEnabled(action)", "ng-click" => "ctrl.extensionManager.disableRepeatAction(action, extension)"} Disable
|
||||
%div{"ng-if" => "!ctrl.extensionManager.isRepeatActionEnabled(action)", "ng-click" => "ctrl.extensionManager.enableRepeatAction(action, extension)"} Enable
|
||||
%div{"ng-if" => "!action.repeat_mode", "ng-click" => "ctrl.selectedAction(action, extension)"}
|
||||
%div{"ng-if" => "!action.running"}
|
||||
Perform Action
|
||||
%div{"ng-if" => "action.running"}
|
||||
.spinner.execution-spinner
|
||||
.last-run{"ng-if" => "!action.error && action.lastExecuted && !action.running"}
|
||||
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; text-align: center;"} Remove extension
|
||||
|
||||
.extension-link
|
||||
%a{"ng-click" => "ctrl.toggleExtensionForm()"} Add new extension
|
||||
|
||||
%form.extension-form{"ng-if" => "ctrl.showNewExtensionForm"}
|
||||
.form-tag.has-feedback
|
||||
%input.form-control{:autofocus => 'autofocus', :name => 'url', :placeholder => 'Extension URL', :required => true, :type => 'url', 'ng-model' => 'ctrl.newExtensionData.url'}
|
||||
%button.btn.dark-button.btn-block{"ng-click" => "ctrl.submitNewExtensionForm()", :type => 'submit', "data-style" => "expand-right", "data-size" => "s", "state" => "buttonState"}
|
||||
%span.ladda-label Add Extension
|
||||
|
||||
.extension-link
|
||||
%a{"ng-click" => "ctrl.reloadExtensionsPressed()", "ng-if" => "ctrl.extensionManager.extensions.length > 0"} Reload all extensions
|
||||
.extension-link
|
||||
%a{"href" => "https://standardnotes.org/extensions", "target" => "_blank"} List of available extensions
|
||||
%global-extensions-menu{"ng-if" => "ctrl.showExtensionsMenu"}
|
||||
|
||||
.item
|
||||
%a{"href" => "https://standardnotes.org", "target" => "_blank"}
|
||||
|
||||
Reference in New Issue
Block a user