Grunt -> Webpack, Haml -> Pug
This commit is contained in:
@@ -1,204 +0,0 @@
|
||||
.sn-component
|
||||
.sk-panel#account-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Account
|
||||
%a.sk-a.info.close-button{"ng-click" => "close()"} Close
|
||||
.sk-panel-content
|
||||
.sk-panel-section.sk-panel-hero{"ng-if" => "!user && !formData.showLogin && !formData.showRegister && !formData.mfa"}
|
||||
.sk-panel-row
|
||||
.sk-h1 Sign in or register to enable sync and end-to-end encryption.
|
||||
.sk-panel-row
|
||||
.sk-button-group.stretch
|
||||
.sk-button.info.featured{"ng-click" => "formData.showLogin = true"}
|
||||
.sk-label Sign In
|
||||
.sk-button.info.featured{"ng-click" => "formData.showRegister = true"}
|
||||
.sk-label Register
|
||||
.sk-panel-row.sk-p
|
||||
Standard Notes is free on every platform, and comes standard with sync and encryption.
|
||||
|
||||
.sk-panel-section{"ng-if" => "formData.showLogin || formData.showRegister"}
|
||||
.sk-panel-section-title
|
||||
{{formData.showLogin ? "Sign In" : "Register"}}
|
||||
|
||||
%form.sk-panel-form{"ng-submit" => "submitAuthForm()"}
|
||||
.sk-panel-section
|
||||
%input.sk-input.contrast{:placeholder => 'Email', "sn-autofocus" => 'true',
|
||||
"should-focus" => "true", :name => 'email', :required => true, :type => 'email',
|
||||
'ng-model' => 'formData.email', 'spellcheck' => 'false', "ng-model-options"=> "{allowInvalid: true}"}
|
||||
%input.sk-input.contrast{:placeholder => 'Password', :name => 'password', :required => true, :type => 'password', 'ng-model' => 'formData.user_password', 'sn-enter' => 'submitAuthForm()'}
|
||||
%input.sk-input.contrast{:placeholder => 'Confirm Password', "ng-if" => "formData.showRegister", :name => 'password', :required => true, :type => 'password', 'ng-model' => 'formData.password_conf', 'sn-enter' => 'submitAuthForm()'}
|
||||
.sk-panel-row
|
||||
%a.sk-panel-row.sk-bold{"ng-click" => "formData.showAdvanced = !formData.showAdvanced"}
|
||||
Advanced Options
|
||||
|
||||
.sk-notification.unpadded.contrast.advanced-options.sk-panel-row{"ng-if" => "formData.showAdvanced"}
|
||||
.sk-panel-column.stretch
|
||||
.sk-notification-title.sk-panel-row.padded-row Advanced Options
|
||||
%div.bordered-row.padded-row
|
||||
%label.sk-label Sync Server Domain
|
||||
%input.sk-input.mt-5.sk-base{:name => 'server', :placeholder => 'Server URL', :required => true, :type => 'text', 'ng-model' => 'formData.url'}
|
||||
%label.sk-label.padded-row{"ng-if" => "formData.showLogin"}
|
||||
%input.sk-input{"type" => "checkbox", "ng-model" => "formData.strictSignin"}
|
||||
Use strict sign in
|
||||
%span
|
||||
%a.info{"href" => "https://standardnotes.org/help/security", "target" => "_blank", "rel" => "noopener"} (Learn more)
|
||||
|
||||
.sk-panel-section.form-submit{"ng-if" => "!formData.authenticating"}
|
||||
.sk-button-group.stretch
|
||||
.sk-button.info.featured{'ng-click' => 'submitAuthForm()', "ng-disabled" => "formData.authenticating"}
|
||||
.sk-label {{formData.showLogin ? "Sign In" : "Register"}}
|
||||
|
||||
.sk-notification.neutral{"ng-if" => "formData.showRegister"}
|
||||
.sk-notification-title No Password Reset.
|
||||
.sk-notification-text Because your notes are encrypted using your password, Standard Notes does not have a password reset option. You cannot forget your password.
|
||||
|
||||
.sk-panel-section.no-bottom-pad{"ng-if" => "formData.status"}
|
||||
.sk-horizontal-group
|
||||
.sk-spinner.small.neutral
|
||||
.sk-label {{formData.status}}
|
||||
|
||||
.sk-panel-section.no-bottom-pad{"ng-if" => "!formData.authenticating"}
|
||||
%label.sk-panel-row.justify-left
|
||||
.sk-horizontal-group
|
||||
%input{"type" => "checkbox", "ng-model" => "formData.ephemeral", "ng-true-value" => "false", "ng-false-value" => "true"}
|
||||
Stay signed in
|
||||
%label.sk-panel-row.justify-left{"ng-if" => "notesAndTagsCount() > 0"}
|
||||
.sk-panel-row
|
||||
%input{"type" => "checkbox", "ng-model" => "formData.mergeLocal", "ng-bind" => "true", "ng-change" => "mergeLocalChanged()"}
|
||||
Merge local data ({{notesAndTagsCount()}} notes and tags)
|
||||
|
||||
.sk-panel-section{"ng-if" => "formData.mfa"}
|
||||
%form.sk-panel-form{"ng-submit" => "submitMfaForm()"}
|
||||
.sk-p.sk-panel-row {{formData.mfa.message}}
|
||||
.sk-panel-row
|
||||
%input.sk-input.contrast{:placeholder => "Enter Code", "sn-autofocus" => "true", "should-focus" => "true", :autofocus => "true", :name => 'mfa', :required => true, 'ng-model' => 'formData.userMfaCode'}
|
||||
.sk-button-group.stretch.sk-panel-row.form-submit{"ng-if" => "!formData.status"}
|
||||
%button.sk-button.info.featured{"type" => "submit"}
|
||||
.sk-label Sign In
|
||||
.sk-panel-section.no-bottom-pad{"ng-if" => "formData.status"}
|
||||
.sk-panel-row
|
||||
.sk-panel-row
|
||||
.sk-horizontal-group
|
||||
.sk-spinner.small.neutral
|
||||
.sk-label {{formData.status}}
|
||||
|
||||
%div{"ng-if" => "!formData.showLogin && !formData.showRegister && !formData.mfa"}
|
||||
.sk-panel-section{"ng-if" => "user"}
|
||||
.sk-notification.danger{"ng-if" => "syncStatus.error"}
|
||||
.sk-notification-title Sync Unreachable
|
||||
.sk-notification-text Hmm...we can't seem to sync your account. The reason: {{syncStatus.error.message}}
|
||||
%a.sk-a.info-contrast.sk-bold.sk-panel-row{"href" => "https://standardnotes.org/help", "target" => "_blank", "rel" => "noopener"} Need help?
|
||||
|
||||
.sk-panel-row
|
||||
.sk-panel-column
|
||||
.sk-h1.sk-bold.wrap {{user.email}}
|
||||
.sk-subtitle.subtle.normal {{server}}
|
||||
.sk-horizontal-group{"delay-hide" => "true", "show" => "syncStatus.syncOpInProgress || syncStatus.needsMoreSync", "delay" => "1000"}
|
||||
.sk-spinner.small.info
|
||||
.sk-sublabel
|
||||
{{"Syncing" + (syncStatus.total > 0 ? ":" : "")}}
|
||||
%span{"ng-if" => "syncStatus.total > 0"} {{syncStatus.current}}/{{syncStatus.total}}
|
||||
|
||||
|
||||
.sk-panel-row
|
||||
|
||||
%a.sk-a.info.sk-panel-row.condensed{"ng-click" => "openPasswordWizard('change-pw')"}
|
||||
Change Password
|
||||
%a.sk-a.info.sk-panel-row.condensed{"ng-show" => "user", "ng-click" => "openPrivilegesModal('')"}
|
||||
Manage Privileges
|
||||
%a.sk-panel-row.justify-left.condensed.success{"ng-if" => "securityUpdateAvailable", "ng-click" => "openPasswordWizard('upgrade-security')"}
|
||||
.inline.sk-circle.small.success.mr-8
|
||||
.inline Security Update Available
|
||||
|
||||
.sk-panel-section
|
||||
.sk-panel-section-title Encryption
|
||||
.sk-panel-section-subtitle.info{"ng-if" => "encryptionEnabled()"}
|
||||
{{encryptionStatusForNotes()}}
|
||||
%p.sk-p
|
||||
{{encryptionStatusString()}}
|
||||
|
||||
.sk-panel-section
|
||||
.sk-panel-section-title Passcode Lock
|
||||
%div{"ng-if" => "!hasPasscode()"}
|
||||
%div{"ng-if" => "canAddPasscode"}
|
||||
.sk-panel-row{"ng-if" => "!formData.showPasscodeForm"}
|
||||
.sk-button.info{"ng-click" => "addPasscodeClicked(); $event.stopPropagation();"}
|
||||
.sk-label Add Passcode
|
||||
|
||||
%p.sk-p Add a passcode to lock the application and encrypt on-device key storage.
|
||||
|
||||
%div{"ng-if" => "!canAddPasscode"}
|
||||
%p.sk-p Adding a passcode is not supported in temporary sessions. Please sign out, then sign back in with the "Stay signed in" option checked.
|
||||
|
||||
%form.sk-panel-form{"ng-if" => "formData.showPasscodeForm", "ng-submit" => "submitPasscodeForm()"}
|
||||
.sk-panel-row
|
||||
%input.sk-input.contrast{:type => 'password', "ng-model" => "formData.passcode", "placeholder" => "Passcode", "sn-autofocus" => "true", "should-focus" => "true"}
|
||||
%input.sk-input.contrast{:type => 'password', "ng-model" => "formData.confirmPasscode", "placeholder" => "Confirm Passcode"}
|
||||
.sk-button-group.stretch.sk-panel-row.form-submit
|
||||
%button.sk-button.info{"type" => "submit"}
|
||||
.sk-label Set Passcode
|
||||
%a.neutral.sk-a.sk-panel-row{"ng-click" => "formData.showPasscodeForm = false"} Cancel
|
||||
|
||||
%div{"ng-if" => "hasPasscode() && !formData.showPasscodeForm"}
|
||||
.sk-p
|
||||
Passcode lock is enabled.
|
||||
|
||||
.sk-notification.contrast
|
||||
.sk-notification-title Options
|
||||
.sk-notification-text
|
||||
.sk-panel-row
|
||||
.sk-horizontal-group
|
||||
.sk-h4.sk-bold Autolock
|
||||
%a.sk-a.info{"ng-repeat" => "option in passcodeAutoLockOptions", "ng-click" => "selectAutoLockInterval(option.value)",
|
||||
"ng-class" => "{'boxed' : option.value == selectedAutoLockInterval}"}
|
||||
{{option.label}}
|
||||
.sk-p The autolock timer begins when the window or tab loses focus.
|
||||
|
||||
.sk-panel-row
|
||||
%a.sk-a.info.sk-panel-row.condensed{"ng-show" => "!user", "ng-click" => "openPrivilegesModal('')"} Manage Privileges
|
||||
%a.sk-a.info.sk-panel-row.condensed{"ng-click" => "changePasscodePressed()"} Change Passcode
|
||||
%a.sk-a.danger.sk-panel-row.condensed{"ng-click" => "removePasscodePressed()"} Remove Passcode
|
||||
|
||||
.sk-panel-section{"ng-if" => "!importData.loading"}
|
||||
.sk-panel-section-title Data Backups
|
||||
.sk-p
|
||||
Download a backup of all your data.
|
||||
.sk-panel-row
|
||||
%form.sk-panel-form.sk-panel-row{"ng-if" => "encryptedBackupsAvailable()"}
|
||||
.sk-input-group
|
||||
%label
|
||||
%input{"type" => "radio", "ng-model" => "archiveFormData.encrypted", "ng-value" => "true", "ng-change" => "archiveFormData.encrypted = true"}
|
||||
Encrypted
|
||||
%label
|
||||
%input{"type" => "radio", "ng-model" => "archiveFormData.encrypted", "ng-value" => "false", "ng-change" => "archiveFormData.encrypted = false"}
|
||||
Decrypted
|
||||
|
||||
.sk-button-group.sk-panel-row.justify-left
|
||||
.sk-button.info{"ng-click" => "downloadDataArchive()"}
|
||||
.sk-label Download Backup
|
||||
|
||||
%label.sk-button.info
|
||||
%input{"type" => "file", "style" => "display: none;", "file-change" => "->", "handler" => "importFileSelected(files)"}
|
||||
.sk-label Import Backup
|
||||
|
||||
%span{"ng-if" => "isDesktopApplication()"} Backups are automatically created on desktop and can be managed via the "Backups" top-level menu.
|
||||
|
||||
#import-password-request{"ng-if" => "importData.requestPassword"}
|
||||
%form.sk-panel-form.stretch{"ng-submit" => "submitImportPassword()"}
|
||||
%p Enter the account password associated with the import file.
|
||||
%input.sk-input.contrast.mt-5{:type => 'password', "placeholder" => "Enter File Account Password", "ng-model" => "importData.password", "autofocus" => "true"}
|
||||
.sk-button-group.stretch.sk-panel-row.form-submit
|
||||
%button.sk-button.info{"type" => "submit"}
|
||||
.sk-label Decrypt & Import
|
||||
%p
|
||||
Importing from backup will not overwrite existing data, but instead create a duplicate of any differing data.
|
||||
%p If you'd like to import only a selection of items instead of the whole file, please use the Batch Manager extension.
|
||||
.sk-panel-row
|
||||
.sk-spinner.small.info{"ng-if" => "importData.loading"}
|
||||
.sk-panel-footer
|
||||
.sk-panel-row
|
||||
.sk-p.left.neutral.faded {{appVersion}}
|
||||
%a.sk-a.right{"ng-if" => "formData.showLogin || formData.showRegister", "ng-click" => "formData.showLogin = false; formData.showRegister = false;"}
|
||||
Cancel
|
||||
%a.sk-a.right.danger{"ng-if" => "!formData.showLogin && !formData.showRegister", "ng-click" => "destroyLocalData()"}
|
||||
{{ user ? "Sign out and clear local data" : "Clear all local data" }}
|
||||
180
app/assets/templates/directives/account-menu.pug
Normal file
180
app/assets/templates/directives/account-menu.pug
Normal file
@@ -0,0 +1,180 @@
|
||||
.sn-component
|
||||
#account-panel.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Account
|
||||
a.sk-a.info.close-button(ng-click='close()') Close
|
||||
.sk-panel-content
|
||||
.sk-panel-section.sk-panel-hero(ng-if='!user && !formData.showLogin && !formData.showRegister && !formData.mfa')
|
||||
.sk-panel-row
|
||||
.sk-h1 Sign in or register to enable sync and end-to-end encryption.
|
||||
.sk-panel-row
|
||||
.sk-button-group.stretch
|
||||
.sk-button.info.featured(ng-click='formData.showLogin = true')
|
||||
.sk-label Sign In
|
||||
.sk-button.info.featured(ng-click='formData.showRegister = true')
|
||||
.sk-label Register
|
||||
.sk-panel-row.sk-p
|
||||
| Standard Notes is free on every platform, and comes standard with sync and encryption.
|
||||
.sk-panel-section(ng-if='formData.showLogin || formData.showRegister')
|
||||
.sk-panel-section-title
|
||||
| {{formData.showLogin ? "Sign In" : "Register"}}
|
||||
form.sk-panel-form(ng-submit='submitAuthForm()')
|
||||
.sk-panel-section
|
||||
input.sk-input.contrast(name='email', ng-model='formData.email', ng-model-options='{allowInvalid: true}', placeholder='Email', required='', should-focus='true', sn-autofocus='true', spellcheck='false', type='email')
|
||||
input.sk-input.contrast(name='password', ng-model='formData.user_password', placeholder='Password', required='', sn-enter='submitAuthForm()', type='password')
|
||||
input.sk-input.contrast(name='password', ng-if='formData.showRegister', ng-model='formData.password_conf', placeholder='Confirm Password', required='', sn-enter='submitAuthForm()', type='password')
|
||||
.sk-panel-row
|
||||
a.sk-panel-row.sk-bold(ng-click='formData.showAdvanced = !formData.showAdvanced')
|
||||
| Advanced Options
|
||||
.sk-notification.unpadded.contrast.advanced-options.sk-panel-row(ng-if='formData.showAdvanced')
|
||||
.sk-panel-column.stretch
|
||||
.sk-notification-title.sk-panel-row.padded-row Advanced Options
|
||||
.bordered-row.padded-row
|
||||
label.sk-label Sync Server Domain
|
||||
input.sk-input.mt-5.sk-base(name='server', ng-model='formData.url', placeholder='Server URL', required='', type='text')
|
||||
label.sk-label.padded-row(ng-if='formData.showLogin')
|
||||
input.sk-input(ng-model='formData.strictSignin', type='checkbox')
|
||||
| Use strict sign in
|
||||
span
|
||||
a.info(href='https://standardnotes.org/help/security', rel='noopener', target='_blank') (Learn more)
|
||||
.sk-panel-section.form-submit(ng-if='!formData.authenticating')
|
||||
.sk-button-group.stretch
|
||||
.sk-button.info.featured(ng-click='submitAuthForm()', ng-disabled='formData.authenticating')
|
||||
.sk-label {{formData.showLogin ? "Sign In" : "Register"}}
|
||||
.sk-notification.neutral(ng-if='formData.showRegister')
|
||||
.sk-notification-title No Password Reset.
|
||||
.sk-notification-text
|
||||
| Because your notes are encrypted using your password, Standard Notes does not have a password reset option. You cannot forget your password.
|
||||
.sk-panel-section.no-bottom-pad(ng-if='formData.status')
|
||||
.sk-horizontal-group
|
||||
.sk-spinner.small.neutral
|
||||
.sk-label {{formData.status}}
|
||||
.sk-panel-section.no-bottom-pad(ng-if='!formData.authenticating')
|
||||
label.sk-panel-row.justify-left
|
||||
.sk-horizontal-group
|
||||
input(ng-false-value='true', ng-model='formData.ephemeral', ng-true-value='false', type='checkbox')
|
||||
| Stay signed in
|
||||
label.sk-panel-row.justify-left(ng-if='notesAndTagsCount() > 0')
|
||||
.sk-panel-row
|
||||
input(ng-bind='true', ng-change='mergeLocalChanged()', ng-model='formData.mergeLocal', type='checkbox')
|
||||
| Merge local data ({{notesAndTagsCount()}} notes and tags)
|
||||
.sk-panel-section(ng-if='formData.mfa')
|
||||
form.sk-panel-form(ng-submit='submitMfaForm()')
|
||||
.sk-p.sk-panel-row {{formData.mfa.message}}
|
||||
.sk-panel-row
|
||||
input.sk-input.contrast(autofocus='true', name='mfa', ng-model='formData.userMfaCode', placeholder='Enter Code', required='', should-focus='true', sn-autofocus='true')
|
||||
.sk-button-group.stretch.sk-panel-row.form-submit(ng-if='!formData.status')
|
||||
button.sk-button.info.featured(type='submit')
|
||||
.sk-label Sign In
|
||||
.sk-panel-section.no-bottom-pad(ng-if='formData.status')
|
||||
.sk-panel-row
|
||||
.sk-panel-row
|
||||
.sk-horizontal-group
|
||||
.sk-spinner.small.neutral
|
||||
.sk-label {{formData.status}}
|
||||
div(ng-if='!formData.showLogin && !formData.showRegister && !formData.mfa')
|
||||
.sk-panel-section(ng-if='user')
|
||||
.sk-notification.danger(ng-if='syncStatus.error')
|
||||
.sk-notification-title Sync Unreachable
|
||||
.sk-notification-text
|
||||
| Hmm...we can't seem to sync your account. The reason: {{syncStatus.error.message}}
|
||||
a.sk-a.info-contrast.sk-bold.sk-panel-row(href='https://standardnotes.org/help', rel='noopener', target='_blank') Need help?
|
||||
.sk-panel-row
|
||||
.sk-panel-column
|
||||
.sk-h1.sk-bold.wrap {{user.email}}
|
||||
.sk-subtitle.subtle.normal {{server}}
|
||||
.sk-horizontal-group(delay='1000', delay-hide='true', show='syncStatus.syncOpInProgress || syncStatus.needsMoreSync')
|
||||
.sk-spinner.small.info
|
||||
.sk-sublabel
|
||||
| {{"Syncing" + (syncStatus.total > 0 ? ":" : "")}}
|
||||
span(ng-if='syncStatus.total > 0') {{syncStatus.current}}/{{syncStatus.total}}
|
||||
.sk-panel-row
|
||||
a.sk-a.info.sk-panel-row.condensed(ng-click="openPasswordWizard('change-pw')")
|
||||
| Change Password
|
||||
a.sk-a.info.sk-panel-row.condensed(ng-click="openPrivilegesModal('')", ng-show='user')
|
||||
| Manage Privileges
|
||||
a.sk-panel-row.justify-left.condensed.success(ng-click="openPasswordWizard('upgrade-security')", ng-if='securityUpdateAvailable')
|
||||
.inline.sk-circle.small.success.mr-8
|
||||
.inline Security Update Available
|
||||
.sk-panel-section
|
||||
.sk-panel-section-title Encryption
|
||||
.sk-panel-section-subtitle.info(ng-if='encryptionEnabled()')
|
||||
| {{encryptionStatusForNotes()}}
|
||||
p.sk-p
|
||||
| {{encryptionStatusString()}}
|
||||
.sk-panel-section
|
||||
.sk-panel-section-title Passcode Lock
|
||||
div(ng-if='!hasPasscode()')
|
||||
div(ng-if='canAddPasscode')
|
||||
.sk-panel-row(ng-if='!formData.showPasscodeForm')
|
||||
.sk-button.info(ng-click='addPasscodeClicked(); $event.stopPropagation();')
|
||||
.sk-label Add Passcode
|
||||
p.sk-p Add a passcode to lock the application and encrypt on-device key storage.
|
||||
div(ng-if='!canAddPasscode')
|
||||
p.sk-p
|
||||
| Adding a passcode is not supported in temporary sessions. Please sign out, then sign back in with the "Stay signed in" option checked.
|
||||
form.sk-panel-form(ng-if='formData.showPasscodeForm', ng-submit='submitPasscodeForm()')
|
||||
.sk-panel-row
|
||||
input.sk-input.contrast(ng-model='formData.passcode', placeholder='Passcode', should-focus='true', sn-autofocus='true', type='password')
|
||||
input.sk-input.contrast(ng-model='formData.confirmPasscode', placeholder='Confirm Passcode', type='password')
|
||||
.sk-button-group.stretch.sk-panel-row.form-submit
|
||||
button.sk-button.info(type='submit')
|
||||
.sk-label Set Passcode
|
||||
a.neutral.sk-a.sk-panel-row(ng-click='formData.showPasscodeForm = false') Cancel
|
||||
div(ng-if='hasPasscode() && !formData.showPasscodeForm')
|
||||
.sk-p
|
||||
| Passcode lock is enabled.
|
||||
.sk-notification.contrast
|
||||
.sk-notification-title Options
|
||||
.sk-notification-text
|
||||
.sk-panel-row
|
||||
.sk-horizontal-group
|
||||
.sk-h4.sk-bold Autolock
|
||||
a.sk-a.info(ng-class="{'boxed' : option.value == selectedAutoLockInterval}", ng-click='selectAutoLockInterval(option.value)', ng-repeat='option in passcodeAutoLockOptions')
|
||||
| {{option.label}}
|
||||
.sk-p The autolock timer begins when the window or tab loses focus.
|
||||
.sk-panel-row
|
||||
a.sk-a.info.sk-panel-row.condensed(ng-click="openPrivilegesModal('')", ng-show='!user') Manage Privileges
|
||||
a.sk-a.info.sk-panel-row.condensed(ng-click='changePasscodePressed()') Change Passcode
|
||||
a.sk-a.danger.sk-panel-row.condensed(ng-click='removePasscodePressed()') Remove Passcode
|
||||
.sk-panel-section(ng-if='!importData.loading')
|
||||
.sk-panel-section-title Data Backups
|
||||
.sk-p
|
||||
| Download a backup of all your data.
|
||||
.sk-panel-row
|
||||
form.sk-panel-form.sk-panel-row(ng-if='encryptedBackupsAvailable()')
|
||||
.sk-input-group
|
||||
label
|
||||
input(ng-change='archiveFormData.encrypted = true', ng-model='archiveFormData.encrypted', ng-value='true', type='radio')
|
||||
| Encrypted
|
||||
label
|
||||
input(ng-change='archiveFormData.encrypted = false', ng-model='archiveFormData.encrypted', ng-value='false', type='radio')
|
||||
| Decrypted
|
||||
.sk-button-group.sk-panel-row.justify-left
|
||||
.sk-button.info(ng-click='downloadDataArchive()')
|
||||
.sk-label Download Backup
|
||||
label.sk-button.info
|
||||
input(file-change='->', handler='importFileSelected(files)', style='display: none;', type='file')
|
||||
.sk-label Import Backup
|
||||
span(ng-if='isDesktopApplication()')
|
||||
| Backups are automatically created on desktop and can be managed via the "Backups" top-level menu.
|
||||
#import-password-request(ng-if='importData.requestPassword')
|
||||
form.sk-panel-form.stretch(ng-submit='submitImportPassword()')
|
||||
p Enter the account password associated with the import file.
|
||||
input.sk-input.contrast.mt-5(autofocus='true', ng-model='importData.password', placeholder='Enter File Account Password', type='password')
|
||||
.sk-button-group.stretch.sk-panel-row.form-submit
|
||||
button.sk-button.info(type='submit')
|
||||
.sk-label Decrypt & Import
|
||||
p
|
||||
| Importing from backup will not overwrite existing data, but instead create a duplicate of any differing data.
|
||||
p
|
||||
| If you'd like to import only a selection of items instead of the whole file, please use the Batch Manager extension.
|
||||
.sk-panel-row
|
||||
.sk-spinner.small.info(ng-if='importData.loading')
|
||||
.sk-panel-footer
|
||||
.sk-panel-row
|
||||
.sk-p.left.neutral.faded {{appVersion}}
|
||||
a.sk-a.right(ng-click='formData.showLogin = false; formData.showRegister = false;', ng-if='formData.showLogin || formData.showRegister')
|
||||
| Cancel
|
||||
a.sk-a.right.danger(ng-click='destroyLocalData()', ng-if='!formData.showLogin && !formData.showRegister')
|
||||
| {{ user ? "Sign out and clear local data" : "Clear all local data" }}
|
||||
@@ -1,22 +0,0 @@
|
||||
.sn-component
|
||||
.sk-menu-panel.dropdown-menu
|
||||
|
||||
%a.no-decoration{"ng-if" => "extensions.length == 0", "href" => "https://standardnotes.org/extensions", "target" => "blank", "rel" => "noopener"}
|
||||
%menu-row{"label" => "'Download Actions'"}
|
||||
|
||||
%div{"ng-repeat" => "extension in extensions"}
|
||||
.sk-menu-panel-header{"ng-click" => "extension.hide = !extension.hide; $event.stopPropagation();"}
|
||||
.sk-menu-panel-column
|
||||
.sk-menu-panel-header-title {{extension.name}}
|
||||
.sk-spinner.small.loading{"ng-if" => "extension.loading"}
|
||||
%div{"ng-if" => "extension.hide"} …
|
||||
|
||||
%menu-row{"ng-if" => "!extension.hide", "ng-repeat" => "action in extension.actionsWithContextForItem(item)",
|
||||
"action" => "executeAction(action, extension);", "label" => "action.label", "subtitle" => "action.desc",
|
||||
"spinner-class" => "action.running ? 'info' : null", "sub-rows" => "action.subrows"}
|
||||
.sk-sublabel{"ng-if" => "action.access_type"}
|
||||
Uses
|
||||
%strong {{action.access_type}}
|
||||
access to this note.
|
||||
|
||||
%menu-row{"ng-if" => "extension.actionsWithContextForItem(item).length == 0", "label" => "'No Actions Available'", "faded" => "true"}
|
||||
16
app/assets/templates/directives/actions-menu.pug
Normal file
16
app/assets/templates/directives/actions-menu.pug
Normal file
@@ -0,0 +1,16 @@
|
||||
.sn-component
|
||||
.sk-menu-panel.dropdown-menu
|
||||
a.no-decoration(href='https://standardnotes.org/extensions', ng-if='extensions.length == 0', rel='noopener', target='blank')
|
||||
menu-row(label="'Download Actions'")
|
||||
div(ng-repeat='extension in extensions')
|
||||
.sk-menu-panel-header(ng-click='extension.hide = !extension.hide; $event.stopPropagation();')
|
||||
.sk-menu-panel-column
|
||||
.sk-menu-panel-header-title {{extension.name}}
|
||||
.sk-spinner.small.loading(ng-if='extension.loading')
|
||||
div(ng-if='extension.hide') …
|
||||
menu-row(action='executeAction(action, extension);', label='action.label', ng-if='!extension.hide', ng-repeat='action in extension.actionsWithContextForItem(item)', spinner-class="action.running ? 'info' : null", sub-rows='action.subrows', subtitle='action.desc')
|
||||
.sk-sublabel(ng-if="action.access_type")
|
||||
| Uses
|
||||
strong {{action.access_type}}
|
||||
| access to this note.
|
||||
menu-row(faded='true', label="'No Actions Available'", ng-if='extension.actionsWithContextForItem(item).length == 0')
|
||||
@@ -1,10 +0,0 @@
|
||||
.sk-modal-background{"ng-click" => "dismiss()"}
|
||||
|
||||
.sk-modal-content{"ng-attr-id" => "component-content-outer-{{component.uuid}}"}
|
||||
.sn-component
|
||||
.sk-panel{"ng-attr-id" => "component-content-inner-{{component.uuid}}"}
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title
|
||||
{{component.name}}
|
||||
%a.sk-a.info.close-button{"ng-click" => "dismiss()"} Close
|
||||
%component-view.component-view{"component" => "component"}
|
||||
9
app/assets/templates/directives/component-modal.pug
Normal file
9
app/assets/templates/directives/component-modal.pug
Normal file
@@ -0,0 +1,9 @@
|
||||
.sk-modal-background(ng-click="dismiss()")
|
||||
.sk-modal-content(ng-attr-id="component-content-outer-{{component.uuid}}")
|
||||
.sn-component
|
||||
.sk-panel(ng-attr-id="component-content-inner-{{component.uuid}}")
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title
|
||||
| {{component.name}}
|
||||
a.sk-a.info.close-button(ng-click="dismiss()") Close
|
||||
component-view.component-view(component="component")
|
||||
@@ -1,81 +0,0 @@
|
||||
.sn-component{"ng-if" => "issueLoading"}
|
||||
.sk-app-bar.no-edges.no-top-edge.dynamic-height
|
||||
.left
|
||||
.sk-app-bar-item
|
||||
.sk-label.warning There was an issue loading {{component.name}}.
|
||||
.right
|
||||
.sk-app-bar-item{"ng-click" => "reloadComponent()"}
|
||||
.sk-button.info
|
||||
.sk-label Reload
|
||||
|
||||
.sn-component{"ng-if" => "showNoThemesMessage"}
|
||||
.sk-app-bar.no-edges.no-top-edge.dynamic-height
|
||||
.left
|
||||
.sk-app-bar-item
|
||||
.sk-label.warning This extension does not support themes.
|
||||
.right
|
||||
.sk-app-bar-item{"ng-click" => "noThemesMessageDismiss()"}
|
||||
.sk-label Dismiss
|
||||
.sk-app-bar-item{"ng-click" => "disableActiveTheme()"}
|
||||
.sk-label Disable Active Theme
|
||||
|
||||
.sn-component{"ng-if" => "expired"}
|
||||
.sk-app-bar.no-edges.no-top-edge.dynamic-height
|
||||
.left
|
||||
.sk-app-bar-item
|
||||
.sk-app-bar-item-column
|
||||
.sk-circle.danger.small
|
||||
.sk-app-bar-item-column
|
||||
%div
|
||||
%a.sk-label.sk-base{"href" => "https://dashboard.standardnotes.org", "target" => "_blank", "rel" => "noopener"}
|
||||
Your Extended subscription expired on {{component.dateToLocalizedString(component.valid_until)}}.
|
||||
.sk-p
|
||||
Extensions are in a read-only state.
|
||||
.right
|
||||
.sk-app-bar-item{"ng-click" => "reloadComponent()"}
|
||||
.sk-button.info
|
||||
.sk-label Reload
|
||||
.sk-app-bar-item
|
||||
.sk-app-bar-item-column
|
||||
.sk-button.warning
|
||||
%a.sk-label{"href" => "https://standardnotes.org/help/41/expired", "target" => "_blank", "rel" => "noopener"} Help
|
||||
|
||||
.sn-component{"ng-if" => "error == 'offline-restricted'"}
|
||||
.sk-panel.static
|
||||
.sk-panel-content
|
||||
.sk-panel-section.stretch
|
||||
.sk-panel-column
|
||||
.sk-h1.sk-bold You have restricted this extension to be used offline only.
|
||||
.sk-subtitle Offline extensions are not available in the Web app.
|
||||
.sk-panel-row
|
||||
.sk-panel-row
|
||||
.sk-panel-column
|
||||
.sk-p You can either:
|
||||
%ul
|
||||
%li.sk-p <strong>Enable the Hosted option</strong> for this extension by opening the 'Extensions' menu and toggling 'Use hosted when local is unavailable' under this extension's options. Then press Reload below.
|
||||
%li.sk-p <strong>Use the Desktop application.</strong>
|
||||
.sk-panel-row
|
||||
.sk-button.info{"ng-if" => "!reloading", "ng-click" => "reloadStatus()"}
|
||||
.sk-label Reload
|
||||
.sk-spinner.info.small{"ng-if" => "reloading"}
|
||||
|
||||
.sn-component{"ng-if" => "error == 'url-missing'"}
|
||||
.sk-panel.static
|
||||
.sk-panel-content
|
||||
.sk-panel-section.stretch
|
||||
.sk-panel-section-title This extension is not installed correctly.
|
||||
%p Please uninstall {{component.name}}, then re-install it.
|
||||
|
||||
%p
|
||||
This issue can occur if you access Standard Notes using an older version of the app.
|
||||
Ensure you are running at least version 2.1 on all platforms.
|
||||
|
||||
|
||||
%iframe{"ng-if" => "component && componentValid",
|
||||
"ng-attr-id" => "component-iframe-{{component.uuid}}",
|
||||
"ng-src" => "{{getUrl() | trusted}}", "frameBorder" => "0",
|
||||
"sandbox" => "allow-scripts allow-top-navigation-by-user-activation allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-modals allow-forms",
|
||||
"data-component-id" => "{{component.uuid}}"}
|
||||
Loading
|
||||
|
||||
.loading-overlay{"ng-if" => "loading"}
|
||||
72
app/assets/templates/directives/component-view.pug
Normal file
72
app/assets/templates/directives/component-view.pug
Normal file
@@ -0,0 +1,72 @@
|
||||
.sn-component(ng-if='issueLoading')
|
||||
.sk-app-bar.no-edges.no-top-edge.dynamic-height
|
||||
.left
|
||||
.sk-app-bar-item
|
||||
.sk-label.warning There was an issue loading {{component.name}}.
|
||||
.right
|
||||
.sk-app-bar-item(ng-click='reloadComponent()')
|
||||
.sk-button.info
|
||||
.sk-label Reload
|
||||
.sn-component(ng-if='showNoThemesMessage')
|
||||
.sk-app-bar.no-edges.no-top-edge.dynamic-height
|
||||
.left
|
||||
.sk-app-bar-item
|
||||
.sk-label.warning This extension does not support themes.
|
||||
.right
|
||||
.sk-app-bar-item(ng-click='noThemesMessageDismiss()')
|
||||
.sk-label Dismiss
|
||||
.sk-app-bar-item(ng-click='disableActiveTheme()')
|
||||
.sk-label Disable Active Theme
|
||||
.sn-component(ng-if='expired')
|
||||
.sk-app-bar.no-edges.no-top-edge.dynamic-height
|
||||
.left
|
||||
.sk-app-bar-item
|
||||
.sk-app-bar-item-column
|
||||
.sk-circle.danger.small
|
||||
.sk-app-bar-item-column
|
||||
div
|
||||
a.sk-label.sk-base(href='https://dashboard.standardnotes.org', rel='noopener', target='_blank')
|
||||
| Your Extended subscription expired on {{component.dateToLocalizedString(component.valid_until)}}.
|
||||
.sk-p
|
||||
| Extensions are in a read-only state.
|
||||
.right
|
||||
.sk-app-bar-item(ng-click='reloadComponent()')
|
||||
.sk-button.info
|
||||
.sk-label Reload
|
||||
.sk-app-bar-item
|
||||
.sk-app-bar-item-column
|
||||
.sk-button.warning
|
||||
a.sk-label(href='https://standardnotes.org/help/41/expired', rel='noopener', target='_blank') Help
|
||||
.sn-component(ng-if="error == 'offline-restricted'")
|
||||
.sk-panel.static
|
||||
.sk-panel-content
|
||||
.sk-panel-section.stretch
|
||||
.sk-panel-column
|
||||
.sk-h1.sk-bold You have restricted this extension to be used offline only.
|
||||
.sk-subtitle Offline extensions are not available in the Web app.
|
||||
.sk-panel-row
|
||||
.sk-panel-row
|
||||
.sk-panel-column
|
||||
.sk-p You can either:
|
||||
ul
|
||||
li.sk-p
|
||||
strong Enable the Hosted option
|
||||
| for this extension by opening the 'Extensions' menu and toggling 'Use hosted when local is unavailable' under this extension's options. Then press Reload below.
|
||||
li.sk-p
|
||||
strong Use the Desktop application.
|
||||
.sk-panel-row
|
||||
.sk-button.info(ng-click='reloadStatus()', ng-if='!reloading')
|
||||
.sk-label Reload
|
||||
.sk-spinner.info.small(ng-if='reloading')
|
||||
.sn-component(ng-if="error == 'url-missing'")
|
||||
.sk-panel.static
|
||||
.sk-panel-content
|
||||
.sk-panel-section.stretch
|
||||
.sk-panel-section-title This extension is not installed correctly.
|
||||
p Please uninstall {{component.name}}, then re-install it.
|
||||
p
|
||||
| This issue can occur if you access Standard Notes using an older version of the app.
|
||||
| Ensure you are running at least version 2.1 on all platforms.
|
||||
iframe(data-component-id='{{component.uuid}}', frameborder='0', ng-attr-id='component-iframe-{{component.uuid}}', ng-if='component && componentValid', ng-src='{{getUrl() | trusted}}', sandbox='allow-scripts allow-top-navigation-by-user-activation allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-modals allow-forms')
|
||||
| Loading
|
||||
.loading-overlay(ng-if='loading')
|
||||
@@ -1,27 +0,0 @@
|
||||
.sn-component
|
||||
.sk-modal.large#conflict-resolution-modal
|
||||
.sk-modal-background
|
||||
.sk-modal-content
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
%h1.sk-panel-header-title Conflicted items — choose which version to keep
|
||||
.sk-horizontal-group
|
||||
%a.sk-a.info.close-button{"ng-click" => "keepItem1()"} Keep left
|
||||
%a.sk-a.info.close-button{"ng-click" => "keepItem2()"} Keep right
|
||||
%a.sk-a.info.close-button{"ng-click" => "keepBoth()"} Keep both
|
||||
%a.sk-a.info.close-button{"ng-click" => "export()"} Export
|
||||
%a.sk-a.info.close-button{"ng-click" => "dismiss(); $event.stopPropagation()"} Close
|
||||
.sk-panel-content.selectable
|
||||
.sk-panel-section
|
||||
%h3
|
||||
%strong Content type:
|
||||
{{contentType}}
|
||||
%p You may wish to look at the "created_at" and "updated_at" fields of the items to gain better context in deciding which to keep.
|
||||
#items
|
||||
.sk-panel.static#item1.item
|
||||
%p.normal{"style" => "white-space: pre-wrap; font-size: 16px;"} {{item1Content}}
|
||||
|
||||
.border
|
||||
|
||||
.sk-panel.static#item2.item
|
||||
%p.normal{"style" => "white-space: pre-wrap; font-size: 16px;"} {{item2Content}}
|
||||
@@ -0,0 +1,26 @@
|
||||
.sn-component
|
||||
#conflict-resolution-modal.sk-modal.large
|
||||
.sk-modal-background
|
||||
.sk-modal-content
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
h1.sk-panel-header-title Conflicted items — choose which version to keep
|
||||
.sk-horizontal-group
|
||||
a.sk-a.info.close-button(ng-click="keepItem1()") Keep left
|
||||
a.sk-a.info.close-button(ng-click="keepItem2()") Keep right
|
||||
a.sk-a.info.close-button(ng-click="keepBoth()") Keep both
|
||||
a.sk-a.info.close-button(ng-click="export()") Export
|
||||
a.sk-a.info.close-button(ng-click="dismiss(); $event.stopPropagation()") Close
|
||||
.sk-panel-content.selectable
|
||||
.sk-panel-section
|
||||
h3
|
||||
strong Content type:
|
||||
| {{contentType}}
|
||||
p
|
||||
| You may wish to look at the "created_at" and "updated_at" fields of the items to gain better context in deciding which to keep.
|
||||
#items
|
||||
#item1.sk-panel.static.item
|
||||
p.normal(style="white-space: pre-wrap; font-size: 16px;") {{item1Content}}
|
||||
.border
|
||||
#item2.sk-panel.static.item
|
||||
p.normal(style="white-space: pre-wrap; font-size: 16px;") {{item2Content}}
|
||||
@@ -1,17 +0,0 @@
|
||||
.sn-component
|
||||
.sk-menu-panel.dropdown-menu
|
||||
.sk-menu-panel-section
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Note Editor
|
||||
%menu-row{"label" => "'Plain Editor'", "circle" => "selectedEditor == null && 'success'", "action" => "selectComponent(null)"}
|
||||
|
||||
%menu-row{"ng-repeat" => "editor in editors", "action" => "selectComponent(editor)", "label" => "editor.name",
|
||||
"circle" => "selectedEditor === editor && 'success'",
|
||||
"has-button" => "selectedEditor == editor || defaultEditor == editor", "button-text" => "defaultEditor == editor ? 'Undefault' : 'Set Default'",
|
||||
"button-action" => "toggleDefaultForEditor(editor)", "button-class" => "defaultEditor == editor ? 'warning' : 'info'"}
|
||||
.sk-menu-panel-column{"ng-if" => "component.content.conflict_of || shouldDisplayRunningLocallyLabel(editor)"}
|
||||
%strong.danger.medium-text{"ng-if" => "editor.content.conflict_of"} Conflicted copy
|
||||
.sk-sublabel{"ng-if" => "shouldDisplayRunningLocallyLabel(editor)"} Running Locally
|
||||
|
||||
%a.no-decoration{"ng-if" => "editors.length == 0", "href" => "https://standardnotes.org/extensions", "target" => "blank", "rel" => "noopener"}
|
||||
%menu-row{"label" => "'Download More Editors'"}
|
||||
12
app/assets/templates/directives/editor-menu.pug
Normal file
12
app/assets/templates/directives/editor-menu.pug
Normal file
@@ -0,0 +1,12 @@
|
||||
.sn-component
|
||||
.sk-menu-panel.dropdown-menu
|
||||
.sk-menu-panel-section
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Note Editor
|
||||
menu-row(action='selectComponent(null)', circle="selectedEditor == null && 'success'", label="'Plain Editor'")
|
||||
menu-row(action='selectComponent(editor)', button-action='toggleDefaultForEditor(editor)', button-class="defaultEditor == editor ? 'warning' : 'info'", button-text="defaultEditor == editor ? 'Undefault' : 'Set Default'", circle="selectedEditor === editor && 'success'", has-button='selectedEditor == editor || defaultEditor == editor', label='editor.name', ng-repeat='editor in editors')
|
||||
.sk-menu-panel-column(ng-if='component.content.conflict_of || shouldDisplayRunningLocallyLabel(editor)')
|
||||
strong.danger.medium-text(ng-if='editor.content.conflict_of') Conflicted copy
|
||||
.sk-sublabel(ng-if='shouldDisplayRunningLocallyLabel(editor)') Running Locally
|
||||
a.no-decoration(href='https://standardnotes.org/extensions', ng-if='editors.length == 0', rel='noopener', target='blank')
|
||||
menu-row(label="'Download More Editors'")
|
||||
@@ -6,15 +6,14 @@
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-h1.sk-panel-header-title {{title}}
|
||||
%a.sk-a.info.close-button{"ng-click" => "dismiss()"} Close
|
||||
a.sk-a.info.close-button(ng-click="dismiss()") Close
|
||||
.sk-panel-content
|
||||
.sk-panel-section
|
||||
.sk-p.sk-panel-row {{message}}
|
||||
.sk-panel-row
|
||||
.sk-panel-column.stretch
|
||||
%form{"ng-submit" => "submit()"}
|
||||
%input.sk-input.contrast{:type => '{{type}}', "ng-model" => "formData.input", "placeholder" => "{{placeholder}}", "sn-autofocus" => "true", "should-focus" => "true"}
|
||||
|
||||
form(ng-submit="submit()")
|
||||
input.sk-input.contrast(ng-model="formData.input" placeholder="{{placeholder}}" should-focus="true" sn-autofocus="true" type="{{type}}")
|
||||
.sk-panel-footer
|
||||
%a.sk-a.info.right{"ng-click" => "submit()"}
|
||||
Submit
|
||||
a.sk-a.info.right(ng-click="submit()")
|
||||
| Submit
|
||||
@@ -1,24 +0,0 @@
|
||||
.sk-menu-panel-row.row{"ng-attr-title" => "{{desc}}", "ng-click" => "onClick($event)"}
|
||||
.sk-menu-panel-column
|
||||
.left
|
||||
.sk-menu-panel-column{"ng-if" => "circle && (!circleAlign || circleAlign == 'left')"}
|
||||
.sk-circle.small{"ng-class" => "circle"}
|
||||
.sk-menu-panel-column{"ng-class" => "{'faded' : faded || disabled}"}
|
||||
.sk-label{"ng-class" => "stylekitClass"}
|
||||
{{label}}
|
||||
.sk-sublabel{"ng-if" => "subtitle"}
|
||||
{{subtitle}}
|
||||
%ng-transclude
|
||||
.sk-menu-panel-subrows{"ng-if" => "subRows && subRows.length > 0"}
|
||||
%menu-row{"ng-repeat" => "row in subRows", "action" => "row.onClick()",
|
||||
"label" => "row.label", "subtitle" => "row.subtitle", "spinner-class" => "row.spinnerClass"}
|
||||
|
||||
.sk-menu-panel-column{"ng-if" => "circle && circleAlign == 'right'"}
|
||||
.sk-circle.small{"ng-class" => "circle"}
|
||||
|
||||
.sk-menu-panel-column{"ng-if" => "hasButton"}
|
||||
.sk-button{"ng-click" => "clickButton($event)", "ng-class" => "buttonClass"}
|
||||
.sk-label {{buttonText}}
|
||||
|
||||
.sk-menu-panel-column{"ng-if" => "spinnerClass"}
|
||||
.sk-spinner.small{"ng-class" => "spinnerClass"}
|
||||
20
app/assets/templates/directives/menu-row.pug
Normal file
20
app/assets/templates/directives/menu-row.pug
Normal file
@@ -0,0 +1,20 @@
|
||||
.sk-menu-panel-row.row(ng-attr-title='{{desc}}', ng-click='onClick($event)')
|
||||
.sk-menu-panel-column
|
||||
.left
|
||||
.sk-menu-panel-column(ng-if="circle && (!circleAlign || circleAlign == 'left')")
|
||||
.sk-circle.small(ng-class='circle')
|
||||
.sk-menu-panel-column(ng-class="{'faded' : faded || disabled}")
|
||||
.sk-label(ng-class='stylekitClass')
|
||||
| {{label}}
|
||||
.sk-sublabel(ng-if='subtitle')
|
||||
| {{subtitle}}
|
||||
ng-transclude
|
||||
.sk-menu-panel-subrows(ng-if='subRows && subRows.length > 0')
|
||||
menu-row(action='row.onClick()', label='row.label', ng-repeat='row in subRows', spinner-class='row.spinnerClass', subtitle='row.subtitle')
|
||||
.sk-menu-panel-column(ng-if="circle && circleAlign == 'right'")
|
||||
.sk-circle.small(ng-class='circle')
|
||||
.sk-menu-panel-column(ng-if='hasButton')
|
||||
.sk-button(ng-class='buttonClass', ng-click='clickButton($event)')
|
||||
.sk-label {{buttonText}}
|
||||
.sk-menu-panel-column(ng-if='spinnerClass')
|
||||
.sk-spinner.small(ng-class='spinnerClass')
|
||||
@@ -1,105 +0,0 @@
|
||||
.sn-component
|
||||
#password-wizard.sk-modal.small.auto-height
|
||||
.sk-modal-background
|
||||
.sk-modal-content
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title {{title}}
|
||||
%a.sk-a.info.close-button{"ng-click" => "dismiss()"} Close
|
||||
.sk-panel-content
|
||||
|
||||
%div{"ng-if" => "step == 0"}
|
||||
%div{"ng-if" => "changePassword"}
|
||||
%p.sk-p.sk-panel-row
|
||||
Changing your password involves changing your encryption key, which requires your data to be re-encrypted and synced.
|
||||
If you have many items, syncing your data can take several minutes.
|
||||
%p.sk-p.sk-panel-row You must keep the application window open during this process.
|
||||
%div{"ng-if" => "securityUpdate"}
|
||||
%p.sk-p.sk-panel-row
|
||||
A new update is available for your account. Updates address improvements and enhancements to our security specification.
|
||||
This process will guide you through the update, and perform the steps necessary with your supervision.
|
||||
.sk-panel-row
|
||||
.sk-panel-column
|
||||
%p.sk-p For more information about security updates, please visit
|
||||
%a.sk-a.info{"href" => "https://standardnotes.org/help/security", "target" => "_blank", "rel" => "noopener"} standardnotes.org/help/security.
|
||||
|
||||
%p.sk-panel-row.sk-p
|
||||
.info Press Continue to proceed.
|
||||
|
||||
.sk-panel-section{"ng-if" => "step > 0"}
|
||||
|
||||
.sk-panel-section-title Step {{step}} — {{titleForStep(step)}}
|
||||
|
||||
%div{"ng-if" => "step == 1"}
|
||||
%p.sk-panel-row.sk-p
|
||||
As a result of this process, the entirety of your data will be re-encrypted and synced to your account. This is a generally safe process,
|
||||
but unforeseen factors like poor network connectivity or a sudden shutdown of your computer may cause this process to fail.
|
||||
It's best to be on the safe side before large operations such as this one.
|
||||
.sk-panel-row
|
||||
.sk-panel-row
|
||||
.sk-button-group
|
||||
.sk-button.info{"ng-click" => "downloadBackup(true)"}
|
||||
.sk-label Download Encrypted Backup
|
||||
.sk-button.info{"ng-click" => "downloadBackup(false)"}
|
||||
.sk-label Download Decrypted Backup
|
||||
|
||||
%div{"ng-if" => "step == 2"}
|
||||
%p.sk-p.sk-panel-row
|
||||
As a result of this process, your encryption keys will change.
|
||||
Any device on which you use Standard Notes will need to end its session. After this process completes, you will be asked to sign back in.
|
||||
|
||||
%p.sk-p.bold.sk-panel-row.info-i Please sign out of all applications (excluding this one), including:
|
||||
%ul
|
||||
%li.sk-p Desktop
|
||||
%li.sk-p Web (Chrome, Firefox, Safari)
|
||||
%li.sk-p Mobile (iOS and Android)
|
||||
%p.sk-p.sk-panel-row
|
||||
If you do not currently have access to a device you're signed in on, you may proceed,
|
||||
but must make signing out and back in the first step upon gaining access to that device.
|
||||
%p.sk-p.sk-panel-row Press Continue only when you have completed signing out of all your devices.
|
||||
|
||||
|
||||
%div{"ng-if" => "step == 3"}
|
||||
%div{"ng-if" => "changePassword"}
|
||||
%div{"ng-if" => "securityUpdate"}
|
||||
%p.sk-panel-row Enter your current password. We'll run this through our encryption scheme to generate strong new encryption keys.
|
||||
.sk-panel-row
|
||||
.sk-panel-row
|
||||
.sk-panel-column.stretch
|
||||
%form.sk-panel-form
|
||||
%input.sk-input.contrast{:type => 'password', "ng-model" => "formData.currentPassword", "placeholder" => "Current Password", "sn-autofocus" => "true", "should-focus" => "true"}
|
||||
%input.sk-input.contrast{"ng-if" => "changePassword", :type => 'password', "ng-model" => "formData.newPassword", "placeholder" => "New Password"}
|
||||
%input.sk-input.contrast{"ng-if" => "changePassword", :type => 'password', "ng-model" => "formData.newPasswordConfirmation", "placeholder" => "Confirm New Password"}
|
||||
|
||||
%div{"ng-if" => "step == 4"}
|
||||
%p.sk-panel-row
|
||||
Your data is being re-encrypted with your new keys and synced to your account.
|
||||
%p.sk-panel-row.danger{"ng-if" => "lockContinue"}
|
||||
Do not close this window until this process completes.
|
||||
|
||||
.sk-panel-row
|
||||
.sk-panel-column
|
||||
.sk-spinner.small.inline.info.mr-5{"ng-if" => "formData.processing"}
|
||||
.inline.bold{"ng-class" => "{'info' : !formData.statusError, 'error' : formData.statusError}"}
|
||||
{{formData.status}}
|
||||
.sk-panel-column{"delay-hide" => "true", "show" => "syncStatus.syncOpInProgress || syncStatus.needsMoreSync", "delay" => "1000"}
|
||||
%p.info
|
||||
Syncing {{syncStatus.current}}/{{syncStatus.total}}
|
||||
|
||||
%div{"ng-if" => "step == 5"}
|
||||
%div{"ng-if" => "changePassword"}
|
||||
%p.sk-p.sk-panel-row.info-i Your password has been successfully changed.
|
||||
%div{"ng-if" => "securityUpdate"}
|
||||
%p.sk-p.sk-panel-row.info-i
|
||||
The security update has been successfully applied to your account.
|
||||
%p.sk-p.sk-panel-row
|
||||
Please ensure you are running the latest version of Standard Notes on all platforms to ensure maximum compatibility.
|
||||
|
||||
%p.sk-p.sk-panel-row You may now sign back in on all your devices and close this window.
|
||||
|
||||
.sk-panel-footer
|
||||
.empty
|
||||
%a.sk-a.info.right{"ng-click" => "continue()", "ng-disabled" => "lockContinue", "ng-class" => "{'disabled' : lockContinue}"}
|
||||
.sk-spinner.small.inline.info.mr-5{"ng-if" => "showSpinner"}
|
||||
{{continueTitle}}
|
||||
93
app/assets/templates/directives/password-wizard.pug
Normal file
93
app/assets/templates/directives/password-wizard.pug
Normal file
@@ -0,0 +1,93 @@
|
||||
.sn-component
|
||||
#password-wizard.sk-modal.small.auto-height
|
||||
.sk-modal-background
|
||||
.sk-modal-content
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title {{title}}
|
||||
a.sk-a.info.close-button(ng-click='dismiss()') Close
|
||||
.sk-panel-content
|
||||
div(ng-if='step == 0')
|
||||
div(ng-if='changePassword')
|
||||
p.sk-p.sk-panel-row
|
||||
| Changing your password involves changing your encryption key, which requires your data to be re-encrypted and synced.
|
||||
| If you have many items, syncing your data can take several minutes.
|
||||
p.sk-p.sk-panel-row You must keep the application window open during this process.
|
||||
div(ng-if='securityUpdate')
|
||||
p.sk-p.sk-panel-row
|
||||
| A new update is available for your account. Updates address improvements and enhancements to our security specification.
|
||||
| This process will guide you through the update, and perform the steps necessary with your supervision.
|
||||
.sk-panel-row
|
||||
.sk-panel-column
|
||||
p.sk-p For more information about security updates, please visit
|
||||
a.sk-a.info(href='https://standardnotes.org/help/security', rel='noopener', target='_blank') standardnotes.org/help/security.
|
||||
p.sk-panel-row.sk-p
|
||||
.info Press Continue to proceed.
|
||||
p
|
||||
.sk-panel-section(ng-if='step > 0')
|
||||
.sk-panel-section-title Step {{step}} — {{titleForStep(step)}}
|
||||
div(ng-if='step == 1')
|
||||
p.sk-panel-row.sk-p
|
||||
| As a result of this process, the entirety of your data will be re-encrypted and synced to your account. This is a generally safe process,
|
||||
| but unforeseen factors like poor network connectivity or a sudden shutdown of your computer may cause this process to fail.
|
||||
| It's best to be on the safe side before large operations such as this one.
|
||||
.sk-panel-row
|
||||
.sk-panel-row
|
||||
.sk-button-group
|
||||
.sk-button.info(ng-click='downloadBackup(true)')
|
||||
.sk-label Download Encrypted Backup
|
||||
.sk-button.info(ng-click='downloadBackup(false)')
|
||||
.sk-label Download Decrypted Backup
|
||||
div(ng-if='step == 2')
|
||||
p.sk-p.sk-panel-row
|
||||
| As a result of this process, your encryption keys will change.
|
||||
| Any device on which you use Standard Notes will need to end its session. After this process completes, you will be asked to sign back in.
|
||||
p.sk-p.bold.sk-panel-row.info-i Please sign out of all applications (excluding this one), including:
|
||||
ul
|
||||
li.sk-p Desktop
|
||||
li.sk-p Web (Chrome, Firefox, Safari)
|
||||
li.sk-p Mobile (iOS and Android)
|
||||
p.sk-p.sk-panel-row
|
||||
| If you do not currently have access to a device you're signed in on, you may proceed,
|
||||
| but must make signing out and back in the first step upon gaining access to that device.
|
||||
p.sk-p.sk-panel-row Press Continue only when you have completed signing out of all your devices.
|
||||
div(ng-if='step == 3')
|
||||
div(ng-if='changePassword')
|
||||
div(ng-if='securityUpdate')
|
||||
p.sk-panel-row
|
||||
| Enter your current password. We'll run this through our encryption scheme to generate strong new encryption keys.
|
||||
.sk-panel-row
|
||||
.sk-panel-row
|
||||
.sk-panel-column.stretch
|
||||
form.sk-panel-form
|
||||
input.sk-input.contrast(ng-model='formData.currentPassword', placeholder='Current Password', should-focus='true', sn-autofocus='true', type='password')
|
||||
input.sk-input.contrast(ng-if='changePassword', ng-model='formData.newPassword', placeholder='New Password', type='password')
|
||||
input.sk-input.contrast(ng-if='changePassword', ng-model='formData.newPasswordConfirmation', placeholder='Confirm New Password', type='password')
|
||||
div(ng-if='step == 4')
|
||||
p.sk-panel-row
|
||||
| Your data is being re-encrypted with your new keys and synced to your account.
|
||||
p.sk-panel-row.danger(ng-if='lockContinue')
|
||||
| Do not close this window until this process completes.
|
||||
.sk-panel-row
|
||||
.sk-panel-column
|
||||
.sk-spinner.small.inline.info.mr-5(ng-if='formData.processing')
|
||||
.inline.bold(ng-class="{'info' : !formData.statusError, 'error' : formData.statusError}")
|
||||
| {{formData.status}}
|
||||
.sk-panel-column(delay='1000', delay-hide='true', show='syncStatus.syncOpInProgress || syncStatus.needsMoreSync')
|
||||
p.info
|
||||
| Syncing {{syncStatus.current}}/{{syncStatus.total}}
|
||||
div(ng-if='step == 5')
|
||||
div(ng-if='changePassword')
|
||||
p.sk-p.sk-panel-row.info-i Your password has been successfully changed.
|
||||
div(ng-if='securityUpdate')
|
||||
p.sk-p.sk-panel-row.info-i
|
||||
| The security update has been successfully applied to your account.
|
||||
p.sk-p.sk-panel-row
|
||||
| Please ensure you are running the latest version of Standard Notes on all platforms to ensure maximum compatibility.
|
||||
p.sk-p.sk-panel-row You may now sign back in on all your devices and close this window.
|
||||
.sk-panel-footer
|
||||
.empty
|
||||
a.sk-a.info.right(ng-class="{'disabled' : lockContinue}", ng-click='continue()', ng-disabled='lockContinue')
|
||||
.sk-spinner.small.inline.info.mr-5(ng-if='showSpinner')
|
||||
| {{continueTitle}}
|
||||
@@ -1,23 +0,0 @@
|
||||
.sk-modal-background{"ng-click" => "deny()"}
|
||||
|
||||
.sk-modal-content#permissions-modal
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Activate Extension
|
||||
%a.sk-a.info.close-button{"ng-click" => "deny()"} Cancel
|
||||
.sk-panel-content
|
||||
.sk-panel-section
|
||||
.sk-panel-row
|
||||
.sk-h2
|
||||
%strong {{component.name}}
|
||||
would like to interact with your
|
||||
{{permissionsString}}
|
||||
|
||||
.sk-panel-row
|
||||
%p.sk-p
|
||||
Extensions use an offline messaging system to communicate. Learn more at
|
||||
%a.sk-a.info{"href" => "https://standardnotes.org/permissions", "target" => "_blank", "rel" => "noopener"} https://standardnotes.org/permissions.
|
||||
.sk-panel-footer
|
||||
.sk-button.info.big.block.bold{"ng-click" => "accept()"}
|
||||
.sk-label Continue
|
||||
21
app/assets/templates/directives/permissions-modal.pug
Normal file
21
app/assets/templates/directives/permissions-modal.pug
Normal file
@@ -0,0 +1,21 @@
|
||||
.sk-modal-background(ng-click='deny()')
|
||||
#permissions-modal.sk-modal-content
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Activate Extension
|
||||
a.sk-a.info.close-button(ng-click='deny()') Cancel
|
||||
.sk-panel-content
|
||||
.sk-panel-section
|
||||
.sk-panel-row
|
||||
.sk-h2
|
||||
strong {{component.name}}
|
||||
| would like to interact with your
|
||||
| {{permissionsString}}
|
||||
.sk-panel-row
|
||||
p.sk-p
|
||||
| Extensions use an offline messaging system to communicate. Learn more at
|
||||
a.sk-a.info(href='https://standardnotes.org/permissions', rel='noopener', target='_blank') https://standardnotes.org/permissions.
|
||||
.sk-panel-footer
|
||||
.sk-button.info.big.block.bold(ng-click='accept()')
|
||||
.sk-label Continue
|
||||
@@ -1,29 +0,0 @@
|
||||
.sk-modal-background{"ng-click" => "cancel()"}
|
||||
|
||||
.sk-modal-content#privileges-modal
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Authentication Required
|
||||
%a.close-button.info{"ng-click" => "cancel()"} Cancel
|
||||
.sk-panel-content
|
||||
.sk-panel-section
|
||||
%div{"ng-repeat" => "credential in requiredCredentials"}
|
||||
.sk-p.sk-bold.sk-panel-row
|
||||
%strong {{promptForCredential(credential)}}
|
||||
.sk-panel-row
|
||||
%input.sk-input.contrast{"type" => "password", "ng-model" => "authenticationParameters[credential]",
|
||||
"sn-autofocus" => "true", "should-focus" => "$index == 0", "sn-enter" => "submit()"}
|
||||
.sk-panel-row
|
||||
%label.sk-label.danger{"ng-if" => "isCredentialInFailureState(credential)"} Invalid authentication. Please try again.
|
||||
.sk-panel-row
|
||||
.sk-panel-row
|
||||
.sk-horizontal-group
|
||||
.sk-p.sk-bold Remember For
|
||||
%a.sk-a.info{"ng-repeat" => "option in sessionLengthOptions", "ng-click" => "selectSessionLength(option.value)",
|
||||
"ng-class" => "{'boxed' : option.value == selectedSessionLength}"}
|
||||
{{option.label}}
|
||||
|
||||
.sk-panel-footer.extra-padding
|
||||
.sk-button.info.big.block.bold{"ng-click" => "submit()"}
|
||||
.sk-label Submit
|
||||
25
app/assets/templates/directives/privileges-auth-modal.pug
Normal file
25
app/assets/templates/directives/privileges-auth-modal.pug
Normal file
@@ -0,0 +1,25 @@
|
||||
.sk-modal-background(ng-click="cancel()")
|
||||
#privileges-modal.sk-modal-content
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Authentication Required
|
||||
a.close-button.info(ng-click="cancel()") Cancel
|
||||
.sk-panel-content
|
||||
.sk-panel-section
|
||||
div(ng-repeat="credential in requiredCredentials")
|
||||
.sk-p.sk-bold.sk-panel-row
|
||||
strong {{promptForCredential(credential)}}
|
||||
.sk-panel-row
|
||||
input.sk-input.contrast(ng-model="authenticationParameters[credential]" should-focus="$index == 0" sn-autofocus="true" sn-enter="submit()" type="password")
|
||||
.sk-panel-row
|
||||
label.sk-label.danger(ng-if="isCredentialInFailureState(credential)") Invalid authentication. Please try again.
|
||||
.sk-panel-row
|
||||
.sk-panel-row
|
||||
.sk-horizontal-group
|
||||
.sk-p.sk-bold Remember For
|
||||
a.sk-a.info(ng-class="{'boxed' : option.value == selectedSessionLength}" ng-click="selectSessionLength(option.value)" ng-repeat="option in sessionLengthOptions")
|
||||
| {{option.label}}
|
||||
.sk-panel-footer.extra-padding
|
||||
.sk-button.info.big.block.bold(ng-click="submit()")
|
||||
.sk-label Submit
|
||||
@@ -1,41 +0,0 @@
|
||||
.sk-modal-background{"ng-click" => "cancel()"}
|
||||
|
||||
.sk-modal-content#privileges-modal
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Manage Privileges
|
||||
%a.sk-a.close-button.info{"ng-click" => "cancel()"} Done
|
||||
.sk-panel-content
|
||||
.sk-panel-section
|
||||
%table.sk-table
|
||||
%thead
|
||||
%tr
|
||||
%th
|
||||
%th{"ng-repeat" => "cred in availableCredentials"}
|
||||
.priv-header
|
||||
%strong {{credentialDisplayInfo[cred].label}}
|
||||
.sk-p.font-small{"style" => "margin-top: 2px", "ng-show" => "!credentialDisplayInfo[cred].availability"} Not Configured
|
||||
%tbody
|
||||
%tr{"ng-repeat" => "action in availableActions"}
|
||||
%td
|
||||
.sk-p {{displayInfoForAction(action)}}
|
||||
%th{"ng-repeat" => "credential in availableCredentials"}
|
||||
%input{"type" => "checkbox", "ng-disabled" => "!credentialDisplayInfo[credential].availability", "ng-checked" => "isCredentialRequiredForAction(action, credential)", "ng-click" => "checkboxValueChanged(action, credential)"}
|
||||
|
||||
.sk-panel-section{"ng-if" => "sessionExpirey && !sessionExpired"}
|
||||
.sk-p.sk-panel-row You will not be asked to authenticate until {{sessionExpirey}}.
|
||||
%a.sk-a.sk-panel-row.info{"ng-click" => "clearSession()"} Clear Session
|
||||
.sk-panel-footer
|
||||
.sk-h2.sk-bold About Privileges
|
||||
.sk-panel-section.no-bottom-pad
|
||||
.sk-panel-row
|
||||
.text-content
|
||||
.sk-p
|
||||
Privileges represent interface level authentication for accessing certain items and features.
|
||||
Note that when your application is unlocked, your data exists in temporary memory in an unencrypted state.
|
||||
Privileges are meant to protect against unwanted access in the event of an unlocked application, but do not affect data encryption state.
|
||||
%p.sk-p
|
||||
Privileges sync across your other devices; however, note that if you require
|
||||
a "Local Passcode" privilege, and another device does not have a local passcode set up, the local passcode
|
||||
requirement will be ignored on that device.
|
||||
@@ -0,0 +1,39 @@
|
||||
.sk-modal-background(ng-click='cancel()')
|
||||
#privileges-modal.sk-modal-content
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Manage Privileges
|
||||
a.sk-a.close-button.info(ng-click='cancel()') Done
|
||||
.sk-panel-content
|
||||
.sk-panel-section
|
||||
table.sk-table
|
||||
thead
|
||||
tr
|
||||
th
|
||||
th(ng-repeat='cred in availableCredentials')
|
||||
.priv-header
|
||||
strong {{credentialDisplayInfo[cred].label}}
|
||||
.sk-p.font-small(ng-show='!credentialDisplayInfo[cred].availability', style='margin-top: 2px') Not Configured
|
||||
tbody
|
||||
tr(ng-repeat='action in availableActions')
|
||||
td
|
||||
.sk-p {{displayInfoForAction(action)}}
|
||||
th(ng-repeat='credential in availableCredentials')
|
||||
input(ng-checked='isCredentialRequiredForAction(action, credential)', ng-click='checkboxValueChanged(action, credential)', ng-disabled='!credentialDisplayInfo[credential].availability', type='checkbox')
|
||||
.sk-panel-section(ng-if='sessionExpirey && !sessionExpired')
|
||||
.sk-p.sk-panel-row You will not be asked to authenticate until {{sessionExpirey}}.
|
||||
a.sk-a.sk-panel-row.info(ng-click='clearSession()') Clear Session
|
||||
.sk-panel-footer
|
||||
.sk-h2.sk-bold About Privileges
|
||||
.sk-panel-section.no-bottom-pad
|
||||
.sk-panel-row
|
||||
.text-content
|
||||
.sk-p
|
||||
| Privileges represent interface level authentication for accessing certain items and features.
|
||||
| Note that when your application is unlocked, your data exists in temporary memory in an unencrypted state.
|
||||
| Privileges are meant to protect against unwanted access in the event of an unlocked application, but do not affect data encryption state.
|
||||
p.sk-p
|
||||
| Privileges sync across your other devices; however, note that if you require
|
||||
| a "Local Passcode" privilege, and another device does not have a local passcode set up, the local passcode
|
||||
| requirement will be ignored on that device.
|
||||
@@ -1,17 +0,0 @@
|
||||
.sn-component
|
||||
.sk-modal.medium#item-preview-modal
|
||||
.sk-modal-background
|
||||
.sk-modal-content
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Preview
|
||||
.sk-horizontal-group
|
||||
%a.sk-a.info.close-button{"ng-click" => "restore(false)"} Restore
|
||||
%a.sk-a.info.close-button{"ng-click" => "restore(true)"} Restore as copy
|
||||
%a.sk-a.info.close-button{"ng-click" => "dismiss(); $event.stopPropagation()"} Close
|
||||
.sk-panel-content.selectable{"ng-if" => "!editor"}
|
||||
.sk-h2 {{content.title}}
|
||||
%p.normal.sk-p{"style" => "white-space: pre-wrap; font-size: 16px;"} {{content.text}}
|
||||
|
||||
%component-view.component-view{"ng-if" => "editor", "component" => "editor"}
|
||||
16
app/assets/templates/directives/revision-preview-modal.pug
Normal file
16
app/assets/templates/directives/revision-preview-modal.pug
Normal file
@@ -0,0 +1,16 @@
|
||||
.sn-component
|
||||
#item-preview-modal.sk-modal.medium
|
||||
.sk-modal-background
|
||||
.sk-modal-content
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Preview
|
||||
.sk-horizontal-group
|
||||
a.sk-a.info.close-button(ng-click="restore(false)") Restore
|
||||
a.sk-a.info.close-button(ng-click="restore(true)") Restore as copy
|
||||
a.sk-a.info.close-button(ng-click="dismiss(); $event.stopPropagation()") Close
|
||||
.sk-panel-content.selectable(ng-if="!editor")
|
||||
.sk-h2 {{content.title}}
|
||||
p.normal.sk-p(style="white-space: pre-wrap; font-size: 16px;") {{content.text}}
|
||||
component-view.component-view(component="editor" ng-if="editor")
|
||||
@@ -1,21 +0,0 @@
|
||||
.sn-component#session-history-menu
|
||||
.sk-menu-panel.dropdown-menu
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title {{history.entries.length || 'No'}} revisions
|
||||
%a.sk-a.info.sk-h5{"ng-click" => "showOptions = !showOptions; $event.stopPropagation();"} Options
|
||||
|
||||
%div{"ng-if" => "showOptions"}
|
||||
%menu-row{"label" => "'Clear note local history'", "action" => "clearItemHistory()"}
|
||||
%menu-row{"label" => "'Clear all local history'", "action" => "clearAllHistory()"}
|
||||
%menu-row{"label" => "(autoOptimize ? 'Disable' : 'Enable') + ' auto cleanup'", "action" => "toggleAutoOptimize()"}
|
||||
.sk-sublabel
|
||||
Automatically cleans up small revisions to conserve space.
|
||||
%menu-row{"label" => "(diskEnabled ? 'Disable' : 'Enable') + ' saving history to disk'", "action" => "toggleDiskSaving()"}
|
||||
.sk-sublabel
|
||||
Saving to disk is not recommended. Decreases performance and increases app loading time and memory footprint.
|
||||
|
||||
%menu-row{"ng-repeat" => "revision in entries",
|
||||
"action" => "openRevision(revision);",
|
||||
"label" => "revision.previewTitle()"}
|
||||
.sk-sublabel.opaque{"ng-class" => "classForRevision(revision)"}
|
||||
{{revision.previewSubTitle()}}
|
||||
17
app/assets/templates/directives/session-history-menu.pug
Normal file
17
app/assets/templates/directives/session-history-menu.pug
Normal file
@@ -0,0 +1,17 @@
|
||||
#session-history-menu.sn-component
|
||||
.sk-menu-panel.dropdown-menu
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title {{history.entries.length || 'No'}} revisions
|
||||
a.sk-a.info.sk-h5(ng-click='showOptions = !showOptions; $event.stopPropagation();') Options
|
||||
div(ng-if='showOptions')
|
||||
menu-row(action='clearItemHistory()', label="'Clear note local history'")
|
||||
menu-row(action='clearAllHistory()', label="'Clear all local history'")
|
||||
menu-row(action='toggleAutoOptimize()', label="(autoOptimize ? 'Disable' : 'Enable') + ' auto cleanup'")
|
||||
.sk-sublabel
|
||||
| Automatically cleans up small revisions to conserve space.
|
||||
menu-row(action='toggleDiskSaving()', label="(diskEnabled ? 'Disable' : 'Enable') + ' saving history to disk'")
|
||||
.sk-sublabel
|
||||
| Saving to disk is not recommended. Decreases performance and increases app loading time and memory footprint.
|
||||
menu-row(action='openRevision(revision);', label='revision.previewTitle()', ng-repeat='revision in entries')
|
||||
.sk-sublabel.opaque(ng-class='classForRevision(revision)')
|
||||
| {{revision.previewSubTitle()}}
|
||||
@@ -1,60 +0,0 @@
|
||||
.sn-component
|
||||
.sk-panel.sk-panel-right#sync-resolution-menu
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Out of Sync
|
||||
%a.sk-a.info.close-button{"ng-click" => "close()"} Close
|
||||
.sk-panel-content
|
||||
|
||||
.sk-panel-section
|
||||
.sk-panel-row.sk-p
|
||||
We've detected that the data on the server may not match the data in the current application session.
|
||||
.sk-p.sk-panel-row
|
||||
.sk-panel-column
|
||||
%strong.sk-panel-row Option 1 — Restart App:
|
||||
.sk-p Quit the application and re-open it. Sometimes, this may resolve the issue.
|
||||
.sk-p.sk-panel-row
|
||||
.sk-panel-column
|
||||
%strong.sk-panel-row Option 2 (recommended) — Sign Out:
|
||||
.sk-p Sign out of your account, then sign back in. This will ensure your data is consistent with the server.
|
||||
Be sure to download a backup of your data before doing so.
|
||||
.sk-p.sk-panel-row
|
||||
.sk-panel-column
|
||||
%strong.sk-panel-row Option 3 — Sync Resolution:
|
||||
.sk-p
|
||||
We can attempt to reconcile changes by downloading all data from the server.
|
||||
No existing data will be overwritten. If the local contents of an item differ from what the server has,
|
||||
a conflicted copy will be created.
|
||||
|
||||
%div{"ng-if" => "!status.backupFinished"}
|
||||
.sk-p.sk-panel-row
|
||||
Please download a backup before we attempt to perform a full account sync resolution.
|
||||
.sk-panel-row
|
||||
.sk-button-group
|
||||
.sk-button.info{"ng-click" => "downloadBackup(true)"}
|
||||
.sk-label Encrypted
|
||||
.sk-button.info{"ng-click" => "downloadBackup(false)"}
|
||||
.sk-label Decrypted
|
||||
.sk-button.danger{"ng-click" => "skipBackup()"}
|
||||
.sk-label Skip
|
||||
|
||||
%div{"ng-if" => "status.backupFinished"}
|
||||
.sk-panel-row{"ng-if" => "!status.resolving && !status.attemptedResolution"}
|
||||
.sk-button.info{"ng-click" => "performSyncResolution()"}
|
||||
.sk-label Perform Sync Resolution
|
||||
|
||||
.sk-panel-row.justify-left{"ng-if" => "status.resolving"}
|
||||
.sk-horizontal-group
|
||||
.sk-spinner.small.info
|
||||
.sk-label Attempting sync resolution...
|
||||
|
||||
.sk-panel-column{"ng-if" => "status.fail"}
|
||||
.sk-panel-row.sk-label.danger Sync Resolution Failed
|
||||
.sk-p.sk-panel-row
|
||||
We attempted to reconcile local content and server content, but were unable to do so.
|
||||
At this point, we recommend signing out of your account and signing back in. You may
|
||||
wish to download a data backup before doing so.
|
||||
|
||||
.sk-panel-column{"ng-if" => "status.success"}
|
||||
.sk-panel-row.sk-label.success Sync Resolution Success
|
||||
.sk-p.sk-panel-row
|
||||
Your local data is now in sync with the server. You may close this window.
|
||||
55
app/assets/templates/directives/sync-resolution-menu.pug
Normal file
55
app/assets/templates/directives/sync-resolution-menu.pug
Normal file
@@ -0,0 +1,55 @@
|
||||
.sn-component
|
||||
#sync-resolution-menu.sk-panel.sk-panel-right
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Out of Sync
|
||||
a.sk-a.info.close-button(ng-click='close()') Close
|
||||
.sk-panel-content
|
||||
.sk-panel-section
|
||||
.sk-panel-row.sk-p
|
||||
| We've detected that the data on the server may not match the data in the current application session.
|
||||
.sk-p.sk-panel-row
|
||||
.sk-panel-column
|
||||
strong.sk-panel-row Option 1 — Restart App:
|
||||
.sk-p Quit the application and re-open it. Sometimes, this may resolve the issue.
|
||||
.sk-p.sk-panel-row
|
||||
.sk-panel-column
|
||||
strong.sk-panel-row Option 2 (recommended) — Sign Out:
|
||||
.sk-p
|
||||
| Sign out of your account, then sign back in. This will ensure your data is consistent with the server.
|
||||
| Be sure to download a backup of your data before doing so.
|
||||
.sk-p.sk-panel-row
|
||||
.sk-panel-column
|
||||
strong.sk-panel-row Option 3 — Sync Resolution:
|
||||
.sk-p
|
||||
| We can attempt to reconcile changes by downloading all data from the server.
|
||||
| No existing data will be overwritten. If the local contents of an item differ from what the server has,
|
||||
| a conflicted copy will be created.
|
||||
div(ng-if='!status.backupFinished')
|
||||
.sk-p.sk-panel-row
|
||||
| Please download a backup before we attempt to perform a full account sync resolution.
|
||||
.sk-panel-row
|
||||
.sk-button-group
|
||||
.sk-button.info(ng-click='downloadBackup(true)')
|
||||
.sk-label Encrypted
|
||||
.sk-button.info(ng-click='downloadBackup(false)')
|
||||
.sk-label Decrypted
|
||||
.sk-button.danger(ng-click='skipBackup()')
|
||||
.sk-label Skip
|
||||
div(ng-if='status.backupFinished')
|
||||
.sk-panel-row(ng-if='!status.resolving && !status.attemptedResolution')
|
||||
.sk-button.info(ng-click='performSyncResolution()')
|
||||
.sk-label Perform Sync Resolution
|
||||
.sk-panel-row.justify-left(ng-if='status.resolving')
|
||||
.sk-horizontal-group
|
||||
.sk-spinner.small.info
|
||||
.sk-label Attempting sync resolution...
|
||||
.sk-panel-column(ng-if='status.fail')
|
||||
.sk-panel-row.sk-label.danger Sync Resolution Failed
|
||||
.sk-p.sk-panel-row
|
||||
| We attempted to reconcile local content and server content, but were unable to do so.
|
||||
| At this point, we recommend signing out of your account and signing back in. You may
|
||||
| wish to download a data backup before doing so.
|
||||
.sk-panel-column(ng-if='status.success')
|
||||
.sk-panel-row.sk-label.success Sync Resolution Success
|
||||
.sk-p.sk-panel-row
|
||||
| Your local data is now in sync with the server. You may close this window.
|
||||
@@ -1,102 +0,0 @@
|
||||
.section.editor#editor-column.sn-component{"aria-label" => "Note"}
|
||||
.sn-component
|
||||
.sk-app-bar.no-edges{"ng-if" => "ctrl.note.locked", "ng-init" => "ctrl.lockText = 'Note Locked'", "ng-mouseover" => "ctrl.lockText = 'Unlock'", "ng-mouseleave" => "ctrl.lockText = 'Note Locked'"}
|
||||
.left
|
||||
.sk-app-bar-item{"ng-click" => "ctrl.toggleLockNote()"}
|
||||
.sk-label.warning
|
||||
%i.icon.ion-locked
|
||||
{{ctrl.lockText}}
|
||||
|
||||
#editor-title-bar.section-title-bar{"ng-show" => "ctrl.note && !ctrl.note.errorDecrypting", "ng-class" => "{'locked' : ctrl.note.locked }"}
|
||||
.title
|
||||
%input.input#note-title-editor{"ng-model" => "ctrl.note.title", "ng-keyup" => "$event.keyCode == 13 && ctrl.onTitleEnter($event)",
|
||||
"ng-change" => "ctrl.onTitleChange()", "ng-focus" => "ctrl.onNameFocus()", "ng-blur" => "ctrl.onNameBlur()",
|
||||
"select-on-click" => "true", "ng-disabled" => "ctrl.note.locked", "spellcheck" => "false"}
|
||||
|
||||
#save-status
|
||||
.message{"ng-class" => "{'warning sk-bold': ctrl.syncTakingTooLong, 'danger sk-bold': ctrl.saveError}"} {{ctrl.noteStatus.message}}
|
||||
.desc{"ng-show" => "ctrl.noteStatus.desc"} {{ctrl.noteStatus.desc}}
|
||||
|
||||
.editor-tags
|
||||
#note-tags-component-container{"ng-if" => "ctrl.tagsComponent"}
|
||||
%component-view.component-view{ "component" => "ctrl.tagsComponent", "ng-style" => "ctrl.note.locked && {'pointer-events' : 'none'}", "ng-class" => "{'locked' : ctrl.note.locked }"}
|
||||
%input.tags-input{"ng-if" => "!(ctrl.tagsComponent && ctrl.tagsComponent.active)", "type" => "text", "ng-keyup" => "$event.keyCode == 13 && $event.target.blur();",
|
||||
"ng-model" => "ctrl.tagsString", "placeholder" => "#tags", "ng-blur" => "ctrl.updateTagsFromTagsString($event, ctrl.tagsString)",
|
||||
"spellcheck" => "false", "ng-disabled" => "ctrl.note.locked"}
|
||||
|
||||
.sn-component{"ng-if" => "ctrl.note"}
|
||||
.sk-app-bar.no-edges#editor-menu-bar
|
||||
.left
|
||||
.sk-app-bar-item{"ng-click" => "ctrl.toggleMenu('showMenu')", "ng-class" => "{'selected' : ctrl.showMenu}", "click-outside" => "ctrl.showMenu = false;", "is-open" => "ctrl.showMenu"}
|
||||
.sk-label Options
|
||||
.sk-menu-panel.dropdown-menu{"ng-if" => "ctrl.showMenu"}
|
||||
.sk-menu-panel-section
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Note Options
|
||||
%menu-row{"label" => "ctrl.note.pinned ? 'Unpin' : 'Pin'", "action" => "ctrl.selectedMenuItem(true); ctrl.togglePin()", "desc" => "'Pin or unpin a note from the top of your list'"}
|
||||
%menu-row{"label" => "ctrl.note.archived ? 'Unarchive' : 'Archive'", "action" => "ctrl.selectedMenuItem(true); ctrl.toggleArchiveNote()", "desc" => "'Archive or unarchive a note from your Archived system tag'"}
|
||||
%menu-row{"label" => "ctrl.note.locked ? 'Unlock' : 'Lock'", "action" => "ctrl.selectedMenuItem(true); ctrl.toggleLockNote()", "desc" => "'Locking notes prevents unintentional editing'"}
|
||||
%menu-row{"label" => "ctrl.note.content.protected ? 'Unprotect' : 'Protect'", "action" => "ctrl.selectedMenuItem(true); ctrl.toggleProtectNote()", "desc" => "'Protecting a note will require credentials to view it (Manage Privileges via Account menu)'"}
|
||||
%menu-row{"label" => "'Preview'", "circle" => "ctrl.note.content.hidePreview ? 'danger' : 'success'", "circle-align" => "'right'", "action" => "ctrl.selectedMenuItem(true); ctrl.toggleNotePreview()", "desc" => "'Hide or unhide the note preview from the list of notes'"}
|
||||
%menu-row{"ng-show" => "!ctrl.altKeyDown && !ctrl.note.content.trashed && !ctrl.note.errorDecrypting", "label" => "'Move to Trash'", "action" => "ctrl.selectedMenuItem(); ctrl.deleteNote()", "stylekit-class" => "'warning'", "desc" => "'Send this note to the trash'"}
|
||||
%menu-row{"ng-show" => "!ctrl.note.content.trashed && ctrl.note.errorDecrypting", "label" => "'Delete Permanently'", "action" => "ctrl.selectedMenuItem(); ctrl.deleteNotePermanantely()", "stylekit-class" => "'danger'", "desc" => "'Delete this note permanently from all your devices'"}
|
||||
|
||||
%div{"ng-if" => "ctrl.note.content.trashed || ctrl.altKeyDown"}
|
||||
%menu-row{"label" => "'Restore'", "ng-show" => "ctrl.note.content.trashed", "action" => "ctrl.selectedMenuItem(true); ctrl.restoreTrashedNote()", "stylekit-class" => "'info'", "desc" => "'Undelete this note and restore it back into your notes'"}
|
||||
%menu-row{"label" => "'Delete Permanently'", "action" => "ctrl.selectedMenuItem(true); ctrl.deleteNotePermanantely()", "stylekit-class" => "'danger'", "desc" => "'Delete this note permanently from all your devices'"}
|
||||
%menu-row{"label" => "'Empty Trash'", "ng-show" => "ctrl.note.content.trashed || !ctrl.altKeyDown", "subtitle" => "ctrl.getTrashCount() + ' notes in trash'", "action" => "ctrl.selectedMenuItem(true); ctrl.emptyTrash()", "stylekit-class" => "'danger'", "desc" => "'Permanently delete all notes in the trash'"}
|
||||
|
||||
.sk-menu-panel-section
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Global Display
|
||||
|
||||
%menu-row{"label" => "'Monospace Font'", "circle" => "ctrl.monospaceFont ? 'success' : 'neutral'", "action" => "ctrl.selectedMenuItem(true); ctrl.toggleKey('monospaceFont')",
|
||||
"desc" => "'Toggles the font style for the default editor'", "subtitle" => "ctrl.selectedEditor ? 'Not available with editor extensions' : null", "disabled" => "ctrl.selectedEditor"}
|
||||
|
||||
%menu-row{"label" => "'Spellcheck'", "circle" => "ctrl.spellcheck ? 'success' : 'neutral'", "action" => "ctrl.selectedMenuItem(true); ctrl.toggleKey('spellcheck')",
|
||||
"desc" => "'Toggles spellcheck for the default editor'", "subtitle" => "ctrl.selectedEditor ? 'Not available with editor extensions' : (ctrl.isDesktop ? 'May degrade editor performance' : null)", "disabled" => "ctrl.selectedEditor"}
|
||||
|
||||
%menu-row{"label" => "'Margin Resizers'", "circle" => "ctrl.marginResizersEnabled ? 'success' : 'neutral'", "action" => "ctrl.selectedMenuItem(true); ctrl.toggleKey('marginResizersEnabled')",
|
||||
"desc" => "'Allows for editor left and right margins to be resized'", "faded" => "!ctrl.marginResizersEnabled"}
|
||||
|
||||
.sk-app-bar-item{"ng-click" => "ctrl.toggleMenu('showEditorMenu')", "ng-class" => "{'selected' : ctrl.showEditorMenu}", "click-outside" => "ctrl.showEditorMenu = false;", "is-open" => "ctrl.showEditorMenu"}
|
||||
.sk-label Editor
|
||||
%editor-menu{"ng-if" => "ctrl.showEditorMenu", "callback" => "ctrl.editorMenuOnSelect", "selected-editor" => "ctrl.selectedEditor", "current-item" => "ctrl.note"}
|
||||
|
||||
.sk-app-bar-item{"ng-click" => "ctrl.toggleMenu('showExtensions')", "ng-class" => "{'selected' : ctrl.showExtensions}", "click-outside" => "ctrl.showExtensions = false;", "is-open" => "ctrl.showExtensions"}
|
||||
.sk-label Actions
|
||||
%actions-menu{"ng-if" => "ctrl.showExtensions", "item" => "ctrl.note"}
|
||||
|
||||
.sk-app-bar-item{"ng-click" => "ctrl.toggleMenu('showSessionHistory')", "click-outside" => "ctrl.showSessionHistory = false;", "is-open" => "ctrl.showSessionHistory"}
|
||||
.sk-label Session History
|
||||
%session-history-menu{"ng-if" => "ctrl.showSessionHistory", "item" => "ctrl.note"}
|
||||
|
||||
.editor-content#editor-content{"ng-if" => "ctrl.noteReady && !ctrl.note.errorDecrypting"}
|
||||
|
||||
%panel-resizer.left{"ng-if" => "ctrl.marginResizersEnabled", "panel-id" => "'editor-content'", "on-resize-finish" => "ctrl.onPanelResizeFinish","control" => "ctrl.leftResizeControl", "min-width" => 300, "property" => "'left'", "hoverable" => "true"}
|
||||
|
||||
%component-view.component-view{"ng-if" => "ctrl.selectedEditor", "component" => "ctrl.selectedEditor", "on-load" => "ctrl.onEditorLoad"}
|
||||
|
||||
%textarea.editable#note-text-editor{"ng-if" => "!ctrl.selectedEditor", "ng-model" => "ctrl.note.text", "ng-readonly" => "ctrl.note.locked",
|
||||
"ng-change" => "ctrl.contentChanged()", "ng-trim" => "false", "ng-click" => "ctrl.clickedTextArea()",
|
||||
"ng-focus" => "ctrl.onContentFocus()", "dir" => "auto", "ng-attr-spellcheck" => "{{ctrl.spellcheck}}",
|
||||
"ng-model-options"=>"{ debounce: ctrl.EditorNgDebounce }"}
|
||||
{{ctrl.onSystemEditorLoad()}}
|
||||
|
||||
%panel-resizer{"ng-if" => "ctrl.marginResizersEnabled", "panel-id" => "'editor-content'", "on-resize-finish" => "ctrl.onPanelResizeFinish", "control" => "ctrl.rightResizeControl", "min-width" => 300, "hoverable" => "true", "property" => "'right'"}
|
||||
|
||||
.section{"ng-show" => "ctrl.note.errorDecrypting"}
|
||||
%p.medium-padding{"style" => "padding-top: 0 !important;"} There was an error decrypting this item. Ensure you are running the latest version of this app, then sign out and sign back in to try again.
|
||||
|
||||
#editor-pane-component-stack{"ng-show" => "ctrl.note"}
|
||||
#component-stack-menu-bar.sk-app-bar.no-edges{"ng-if" => "ctrl.componentStack.length"}
|
||||
.left
|
||||
.sk-app-bar-item{"ng-repeat" => "component in ctrl.componentStack", "ng-click" => "ctrl.toggleStackComponentForCurrentItem(component)"}
|
||||
.sk-app-bar-item-column
|
||||
.sk-circle.small{"ng-class" => "{'info' : !component.hidden && component.active, 'neutral' : component.hidden || !component.active}"}
|
||||
.sk-app-bar-item-column
|
||||
.sk-label {{component.name}}
|
||||
|
||||
.sn-component
|
||||
%component-view.component-view.component-stack-item{"ng-repeat" => "component in ctrl.componentStack",
|
||||
"ng-if" => "component.active", "ng-show" => "!component.hidden", "manual-dealloc" => "true", "component" => "component"}
|
||||
72
app/assets/templates/editor.pug
Normal file
72
app/assets/templates/editor.pug
Normal file
@@ -0,0 +1,72 @@
|
||||
#editor-column.section.editor.sn-component(aria-label='Note')
|
||||
.sn-component
|
||||
.sk-app-bar.no-edges(ng-if='ctrl.note.locked', ng-init="ctrl.lockText = 'Note Locked'", ng-mouseleave="ctrl.lockText = 'Note Locked'", ng-mouseover="ctrl.lockText = 'Unlock'")
|
||||
.left
|
||||
.sk-app-bar-item(ng-click='ctrl.toggleLockNote()')
|
||||
.sk-label.warning
|
||||
i.icon.ion-locked
|
||||
| {{ctrl.lockText}}
|
||||
#editor-title-bar.section-title-bar(ng-class="{'locked' : ctrl.note.locked}", ng-show='ctrl.note && !ctrl.note.errorDecrypting')
|
||||
.title
|
||||
input#note-title-editor.input(ng-blur='ctrl.onNameBlur()', ng-change='ctrl.onTitleChange()', ng-disabled='ctrl.note.locked', ng-focus='ctrl.onNameFocus()', ng-keyup='$event.keyCode == 13 && ctrl.onTitleEnter($event)', ng-model='ctrl.note.title', select-on-click='true', spellcheck='false')
|
||||
#save-status
|
||||
.message(ng-class="{'warning sk-bold': ctrl.syncTakingTooLong, 'danger sk-bold': ctrl.saveError}") {{ctrl.noteStatus.message}}
|
||||
.desc(ng-show='ctrl.noteStatus.desc') {{ctrl.noteStatus.desc}}
|
||||
.editor-tags
|
||||
#note-tags-component-container(ng-if='ctrl.tagsComponent')
|
||||
component-view.component-view(component='ctrl.tagsComponent', ng-class="{'locked' : ctrl.note.locked}", ng-style="ctrl.note.locked && {'pointer-events' : 'none'}")
|
||||
input.tags-input(ng-blur='ctrl.updateTagsFromTagsString($event, ctrl.tagsString)', ng-disabled='ctrl.note.locked', ng-if='!(ctrl.tagsComponent && ctrl.tagsComponent.active)', ng-keyup='$event.keyCode == 13 && $event.target.blur();', ng-model='ctrl.tagsString', placeholder='#tags', spellcheck='false', type='text')
|
||||
.sn-component(ng-if='ctrl.note')
|
||||
#editor-menu-bar.sk-app-bar.no-edges
|
||||
.left
|
||||
.sk-app-bar-item(click-outside='ctrl.showMenu = false;', is-open='ctrl.showMenu', ng-class="{'selected' : ctrl.showMenu}", ng-click="ctrl.toggleMenu('showMenu')")
|
||||
.sk-label Options
|
||||
.sk-menu-panel.dropdown-menu(ng-if='ctrl.showMenu')
|
||||
.sk-menu-panel-section
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Note Options
|
||||
menu-row(action='ctrl.selectedMenuItem(true); ctrl.togglePin()', desc="'Pin or unpin a note from the top of your list'", label="ctrl.note.pinned ? 'Unpin' : 'Pin'")
|
||||
menu-row(action='ctrl.selectedMenuItem(true); ctrl.toggleArchiveNote()', desc="'Archive or unarchive a note from your Archived system tag'", label="ctrl.note.archived ? 'Unarchive' : 'Archive'")
|
||||
menu-row(action='ctrl.selectedMenuItem(true); ctrl.toggleLockNote()', desc="'Locking notes prevents unintentional editing'", label="ctrl.note.locked ? 'Unlock' : 'Lock'")
|
||||
menu-row(action='ctrl.selectedMenuItem(true); ctrl.toggleProtectNote()', desc="'Protecting a note will require credentials to view it (Manage Privileges via Account menu)'", label="ctrl.note.content.protected ? 'Unprotect' : 'Protect'")
|
||||
menu-row(action='ctrl.selectedMenuItem(true); ctrl.toggleNotePreview()', circle="ctrl.note.content.hidePreview ? 'danger' : 'success'", circle-align="'right'", desc="'Hide or unhide the note preview from the list of notes'", label="'Preview'")
|
||||
menu-row(action='ctrl.selectedMenuItem(); ctrl.deleteNote()', desc="'Send this note to the trash'", label="'Move to Trash'", ng-show='!ctrl.altKeyDown && !ctrl.note.content.trashed && !ctrl.note.errorDecrypting', stylekit-class="'warning'")
|
||||
menu-row(action='ctrl.selectedMenuItem(); ctrl.deleteNotePermanantely()', desc="'Delete this note permanently from all your devices'", label="'Delete Permanently'", ng-show='!ctrl.note.content.trashed && ctrl.note.errorDecrypting', stylekit-class="'danger'")
|
||||
div(ng-if='ctrl.note.content.trashed || ctrl.altKeyDown')
|
||||
menu-row(action='ctrl.selectedMenuItem(true); ctrl.restoreTrashedNote()', desc="'Undelete this note and restore it back into your notes'", label="'Restore'", ng-show='ctrl.note.content.trashed', stylekit-class="'info'")
|
||||
menu-row(action='ctrl.selectedMenuItem(true); ctrl.deleteNotePermanantely()', desc="'Delete this note permanently from all your devices'", label="'Delete Permanently'", stylekit-class="'danger'")
|
||||
menu-row(action='ctrl.selectedMenuItem(true); ctrl.emptyTrash()', desc="'Permanently delete all notes in the trash'", label="'Empty Trash'", ng-show='ctrl.note.content.trashed || !ctrl.altKeyDown', stylekit-class="'danger'", subtitle="ctrl.getTrashCount() + ' notes in trash'")
|
||||
.sk-menu-panel-section
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Global Display
|
||||
menu-row(action="ctrl.selectedMenuItem(true); ctrl.toggleKey('monospaceFont')", circle="ctrl.monospaceFont ? 'success' : 'neutral'", desc="'Toggles the font style for the default editor'", disabled='ctrl.selectedEditor', label="'Monospace Font'", subtitle="ctrl.selectedEditor ? 'Not available with editor extensions' : null")
|
||||
menu-row(action="ctrl.selectedMenuItem(true); ctrl.toggleKey('spellcheck')", circle="ctrl.spellcheck ? 'success' : 'neutral'", desc="'Toggles spellcheck for the default editor'", disabled='ctrl.selectedEditor', label="'Spellcheck'", subtitle="ctrl.selectedEditor ? 'Not available with editor extensions' : (ctrl.isDesktop ? 'May degrade editor performance' : null)")
|
||||
menu-row(action="ctrl.selectedMenuItem(true); ctrl.toggleKey('marginResizersEnabled')", circle="ctrl.marginResizersEnabled ? 'success' : 'neutral'", desc="'Allows for editor left and right margins to be resized'", faded='!ctrl.marginResizersEnabled', label="'Margin Resizers'")
|
||||
.sk-app-bar-item(click-outside='ctrl.showEditorMenu = false;', is-open='ctrl.showEditorMenu', ng-class="{'selected' : ctrl.showEditorMenu}", ng-click="ctrl.toggleMenu('showEditorMenu')")
|
||||
.sk-label Editor
|
||||
editor-menu(callback='ctrl.editorMenuOnSelect', current-item='ctrl.note', ng-if='ctrl.showEditorMenu', selected-editor='ctrl.selectedEditor')
|
||||
.sk-app-bar-item(click-outside='ctrl.showExtensions = false;', is-open='ctrl.showExtensions', ng-class="{'selected' : ctrl.showExtensions}", ng-click="ctrl.toggleMenu('showExtensions')")
|
||||
.sk-label Actions
|
||||
actions-menu(item='ctrl.note', ng-if='ctrl.showExtensions')
|
||||
.sk-app-bar-item(click-outside='ctrl.showSessionHistory = false;', is-open='ctrl.showSessionHistory', ng-click="ctrl.toggleMenu('showSessionHistory')")
|
||||
.sk-label Session History
|
||||
session-history-menu(item='ctrl.note', ng-if='ctrl.showSessionHistory')
|
||||
#editor-content.editor-content(ng-if='ctrl.noteReady && !ctrl.note.errorDecrypting')
|
||||
panel-resizer.left(control='ctrl.leftResizeControl', hoverable='true', min-width='300', ng-if='ctrl.marginResizersEnabled', on-resize-finish='ctrl.onPanelResizeFinish', panel-id="'editor-content'", property="'left'")
|
||||
component-view.component-view(component='ctrl.selectedEditor', ng-if='ctrl.selectedEditor', on-load='ctrl.onEditorLoad')
|
||||
textarea#note-text-editor.editable(dir='auto', ng-attr-spellcheck='{{ctrl.spellcheck}}', ng-change='ctrl.contentChanged()', ng-click='ctrl.clickedTextArea()', ng-focus='ctrl.onContentFocus()', ng-if='!ctrl.selectedEditor', ng-model='ctrl.note.text', ng-model-options='{ debounce: ctrl.EditorNgDebounce}', ng-readonly='ctrl.note.locked', ng-trim='false')
|
||||
| {{ctrl.onSystemEditorLoad()}}
|
||||
panel-resizer(control='ctrl.rightResizeControl', hoverable='true', min-width='300', ng-if='ctrl.marginResizersEnabled', on-resize-finish='ctrl.onPanelResizeFinish', panel-id="'editor-content'", property="'right'")
|
||||
.section(ng-show='ctrl.note.errorDecrypting')
|
||||
p.medium-padding(style='padding-top: 0 !important;')
|
||||
| There was an error decrypting this item. Ensure you are running the latest version of this app, then sign out and sign back in to try again.
|
||||
#editor-pane-component-stack(ng-show='ctrl.note')
|
||||
#component-stack-menu-bar.sk-app-bar.no-edges(ng-if='ctrl.componentStack.length')
|
||||
.left
|
||||
.sk-app-bar-item(ng-click='ctrl.toggleStackComponentForCurrentItem(component)', ng-repeat='component in ctrl.componentStack')
|
||||
.sk-app-bar-item-column
|
||||
.sk-circle.small(ng-class="{'info' : !component.hidden && component.active, 'neutral' : component.hidden || !component.active}")
|
||||
.sk-app-bar-item-column
|
||||
.sk-label {{component.name}}
|
||||
.sn-component
|
||||
component-view.component-view.component-stack-item(component='component', manual-dealloc='true', ng-if='component.active', ng-repeat='component in ctrl.componentStack', ng-show='!component.hidden')
|
||||
@@ -1,64 +0,0 @@
|
||||
.sn-component
|
||||
#footer-bar.sk-app-bar.no-edges.no-bottom-edge
|
||||
.left
|
||||
|
||||
.sk-app-bar-item{"ng-click" => "ctrl.accountMenuPressed()", "click-outside" => "ctrl.clickOutsideAccountMenu()", "is-open" => "ctrl.showAccountMenu"}
|
||||
.sk-app-bar-item-column
|
||||
.sk-circle.small{"ng-class" => "ctrl.error ? 'danger' : (ctrl.getUser() ? 'info' : 'neutral')"}
|
||||
.sk-app-bar-item-column
|
||||
.sk-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"}
|
||||
|
||||
.sk-app-bar-item
|
||||
%a.no-decoration.sk-label.title{"href" => "https://standardnotes.org/help", "target" => "_blank", "rel" => "noopener"}
|
||||
Help
|
||||
|
||||
.sk-app-bar-item.border
|
||||
|
||||
.sk-app-bar-item{"ng-repeat" => "room in ctrl.rooms track by room.uuid"}
|
||||
.sk-app-bar-item-column{"ng-click" => "ctrl.selectRoom(room)"}
|
||||
.sk-label {{room.name}}
|
||||
%component-modal{"ng-if" => "room.showRoom", "component" => "room", "on-dismiss" => "ctrl.onRoomDismiss"}
|
||||
|
||||
|
||||
.center
|
||||
.sk-app-bar-item{"ng-show" => "ctrl.arbitraryStatusMessage"}
|
||||
.sk-app-bar-item-column
|
||||
%span.neutral.sk-label {{ctrl.arbitraryStatusMessage}}
|
||||
|
||||
.right
|
||||
.sk-app-bar-item{"ng-show" => "ctrl.securityUpdateAvailable", "ng-click" => "ctrl.openSecurityUpdate()"}
|
||||
%span.success.sk-label Security update available.
|
||||
|
||||
.sk-app-bar-item{"ng-show" => "ctrl.newUpdateAvailable == true", "ng-click" => "ctrl.clickedNewUpdateAnnouncement()"}
|
||||
%span.info.sk-label New update available.
|
||||
|
||||
.sk-app-bar-item.no-pointer{"ng-if" => "ctrl.lastSyncDate && !ctrl.isRefreshing"}
|
||||
.sk-label.subtle
|
||||
Last refreshed {{ctrl.lastSyncDate | appDateTime}}
|
||||
|
||||
.sk-app-bar-item{"ng-if" => "(ctrl.outOfSync && !ctrl.isRefreshing) || ctrl.showSyncResolution", "ng-click" => "ctrl.toggleSyncResolutionMenu()"}
|
||||
.sk-label.warning{"ng-if" => "ctrl.outOfSync"} Potentially Out of Sync
|
||||
%sync-resolution-menu{"ng-if" => "ctrl.showSyncResolution", "ng-click" => "$event.stopPropagation();", "close-function" => "ctrl.toggleSyncResolutionMenu"}
|
||||
|
||||
.sk-app-bar-item{"ng-if" => "ctrl.lastSyncDate && ctrl.isRefreshing"}
|
||||
.sk-spinner.small
|
||||
|
||||
.sk-app-bar-item{"ng-if" => "ctrl.offline"}
|
||||
.sk-label Offline
|
||||
.sk-app-bar-item{"ng-if" => "!ctrl.offline", "ng-click" => "ctrl.refreshData()"}
|
||||
.sk-label Refresh
|
||||
|
||||
.sk-app-bar-item.border{"ng-if" => "ctrl.dockShortcuts.length > 0"}
|
||||
|
||||
.sk-app-bar-item.dock-shortcut{"ng-repeat" => "shortcut in ctrl.dockShortcuts"}
|
||||
.sk-app-bar-item-column{"ng-click" => "ctrl.selectShortcut(shortcut)", "ng-class" => "{'underline': shortcut.component.active}"}
|
||||
.div{"ng-if" => "shortcut.icon.type == 'circle'", "title" => "{{shortcut.name}}"}
|
||||
.sk-circle.small{"ng-style" => "{'background-color': shortcut.icon.background_color, 'border-color': shortcut.icon.border_color}"}
|
||||
.div{"ng-if" => "shortcut.icon.type == 'svg'", "title" => "{{shortcut.name}}"}
|
||||
.svg-item{"ng-attr-id" => "dock-svg-{{shortcut.component.uuid}}", "elem-ready" => "ctrl.initSvgForShortcut(shortcut)"}
|
||||
|
||||
.sk-app-bar-item.border{"ng-if" => "ctrl.hasPasscode()"}
|
||||
.sk-app-bar-item#lock-item{"ng-if" => "ctrl.hasPasscode()", "ng-click" => "ctrl.lockApp()", "title" => "Locks application and wipes unencrypted data from memory."}
|
||||
.sk-label
|
||||
%i.icon.ion-locked#footer-lock-icon
|
||||
49
app/assets/templates/footer.pug
Normal file
49
app/assets/templates/footer.pug
Normal file
@@ -0,0 +1,49 @@
|
||||
.sn-component
|
||||
#footer-bar.sk-app-bar.no-edges.no-bottom-edge
|
||||
.left
|
||||
.sk-app-bar-item(click-outside='ctrl.clickOutsideAccountMenu()', is-open='ctrl.showAccountMenu', ng-click='ctrl.accountMenuPressed()')
|
||||
.sk-app-bar-item-column
|
||||
.sk-circle.small(ng-class="ctrl.error ? 'danger' : (ctrl.getUser() ? 'info' : 'neutral')")
|
||||
.sk-app-bar-item-column
|
||||
.sk-label.title(ng-class='{red: ctrl.error}') Account
|
||||
account-menu(close-function='ctrl.closeAccountMenu', ng-click='$event.stopPropagation()', ng-if='ctrl.showAccountMenu', on-successful-auth='ctrl.onAuthSuccess')
|
||||
.sk-app-bar-item
|
||||
a.no-decoration.sk-label.title(href='https://standardnotes.org/help', rel='noopener', target='_blank')
|
||||
| Help
|
||||
.sk-app-bar-item.border
|
||||
.sk-app-bar-item(ng-repeat='room in ctrl.rooms track by room.uuid')
|
||||
.sk-app-bar-item-column(ng-click='ctrl.selectRoom(room)')
|
||||
.sk-label {{room.name}}
|
||||
component-modal(component='room', ng-if='room.showRoom', on-dismiss='ctrl.onRoomDismiss')
|
||||
.center
|
||||
.sk-app-bar-item(ng-show='ctrl.arbitraryStatusMessage')
|
||||
.sk-app-bar-item-column
|
||||
span.neutral.sk-label {{ctrl.arbitraryStatusMessage}}
|
||||
.right
|
||||
.sk-app-bar-item(ng-click='ctrl.openSecurityUpdate()', ng-show='ctrl.securityUpdateAvailable')
|
||||
span.success.sk-label Security update available.
|
||||
.sk-app-bar-item(ng-click='ctrl.clickedNewUpdateAnnouncement()', ng-show='ctrl.newUpdateAvailable == true')
|
||||
span.info.sk-label New update available.
|
||||
.sk-app-bar-item.no-pointer(ng-if='ctrl.lastSyncDate && !ctrl.isRefreshing')
|
||||
.sk-label.subtle
|
||||
| Last refreshed {{ctrl.lastSyncDate | appDateTime}}
|
||||
.sk-app-bar-item(ng-click='ctrl.toggleSyncResolutionMenu()', ng-if='(ctrl.outOfSync && !ctrl.isRefreshing) || ctrl.showSyncResolution')
|
||||
.sk-label.warning(ng-if='ctrl.outOfSync') Potentially Out of Sync
|
||||
sync-resolution-menu(close-function='ctrl.toggleSyncResolutionMenu', ng-click='$event.stopPropagation();', ng-if='ctrl.showSyncResolution')
|
||||
.sk-app-bar-item(ng-if='ctrl.lastSyncDate && ctrl.isRefreshing')
|
||||
.sk-spinner.small
|
||||
.sk-app-bar-item(ng-if='ctrl.offline')
|
||||
.sk-label Offline
|
||||
.sk-app-bar-item(ng-click='ctrl.refreshData()', ng-if='!ctrl.offline')
|
||||
.sk-label Refresh
|
||||
.sk-app-bar-item.border(ng-if='ctrl.dockShortcuts.length > 0')
|
||||
.sk-app-bar-item.dock-shortcut(ng-repeat='shortcut in ctrl.dockShortcuts')
|
||||
.sk-app-bar-item-column(ng-class="{'underline': shortcut.component.active}", ng-click='ctrl.selectShortcut(shortcut)')
|
||||
.div(ng-if="shortcut.icon.type == 'circle'", title='{{shortcut.name}}')
|
||||
.sk-circle.small(ng-style="{'background-color': shortcut.icon.background_color, 'border-color': shortcut.icon.border_color}")
|
||||
.div(ng-if="shortcut.icon.type == 'svg'", title='{{shortcut.name}}')
|
||||
.svg-item(elem-ready='ctrl.initSvgForShortcut(shortcut)', ng-attr-id='dock-svg-{{shortcut.component.uuid}}')
|
||||
.sk-app-bar-item.border(ng-if='ctrl.hasPasscode()')
|
||||
#lock-item.sk-app-bar-item(ng-click='ctrl.lockApp()', ng-if='ctrl.hasPasscode()', title='Locks application and wipes unencrypted data from memory.')
|
||||
.sk-label
|
||||
i#footer-lock-icon.icon.ion-locked
|
||||
@@ -1,10 +0,0 @@
|
||||
.main-ui-view{"ng-class" => "platform"}
|
||||
|
||||
%lock-screen{"ng-if" => "needsUnlock", "on-success" => "onSuccessfulUnlock"}
|
||||
|
||||
.app#app{"ng-if" => "!needsUnlock", "ng-class" => "appClass"}
|
||||
%tags-section{"save" => "tagsSave", "add-new" => "tagsAddNew", "selection-made" => "tagsSelectionMade", "remove-tag" => "removeTag"}
|
||||
%notes-section{"add-new" => "notesAddNew", "selection-made" => "notesSelectionMade", "tag" => "selectedTag"}
|
||||
%editor-section{"note" => "selectedNote", "remove" => "deleteNote", "update-tags" => "updateTagsForNote"}
|
||||
|
||||
%footer{"ng-if" => "!needsUnlock"}
|
||||
7
app/assets/templates/home.pug
Normal file
7
app/assets/templates/home.pug
Normal file
@@ -0,0 +1,7 @@
|
||||
.main-ui-view(ng-class='platform')
|
||||
lock-screen(ng-if='needsUnlock', on-success='onSuccessfulUnlock')
|
||||
#app.app(ng-class='appClass', ng-if='!needsUnlock')
|
||||
tags-panel(add-new='tagsAddNew', remove-tag='removeTag', save='tagsSave', selection-made='tagsSelectionMade')
|
||||
notes-panel(add-new='notesAddNew', selection-made='notesSelectionMade', tag='selectedTag')
|
||||
editor-panel(note='selectedNote', remove='deleteNote', update-tags='updateTagsForNote')
|
||||
footer(ng-if='!needsUnlock')
|
||||
@@ -1,25 +0,0 @@
|
||||
#lock-screen.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Passcode Required
|
||||
.sk-panel-content
|
||||
.sk-panel-section
|
||||
%form.sk-panel-form.sk-panel-row{"ng-submit" => "submitPasscodeForm()"}
|
||||
.sk-panel-column.stretch
|
||||
%input#passcode-input.center-text.sk-input.contrast{:type => 'password',
|
||||
"ng-model" => "formData.passcode", "autofocus" => "true", "sn-autofocus" => "true", "should-focus" => "true",
|
||||
"placeholder" => "Enter Passcode", "autocomplete" => "new-password"}
|
||||
.sk-button-group.stretch.sk-panel-row.form-submit
|
||||
%button.sk-button.info{"type" => "submit"}
|
||||
.sk-label Unlock
|
||||
|
||||
.sk-panel-footer
|
||||
#passcode-reset
|
||||
%a.sk-a.neutral{"ng-if" => "!formData.showRecovery", "ng-click" => "forgotPasscode()"} Forgot?
|
||||
|
||||
%div{"ng-if" => "formData.showRecovery"}
|
||||
.sk-p
|
||||
If you forgot your local passcode, your only option is to clear your local data from this device
|
||||
and sign back in to your account.
|
||||
.sk-panel-row
|
||||
%a.sk-a.danger.center-text{"ng-click" => "beginDeleteData()"} Delete Local Data
|
||||
21
app/assets/templates/lock-screen.pug
Normal file
21
app/assets/templates/lock-screen.pug
Normal file
@@ -0,0 +1,21 @@
|
||||
#lock-screen.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title Passcode Required
|
||||
.sk-panel-content
|
||||
.sk-panel-section
|
||||
form.sk-panel-form.sk-panel-row(ng-submit='submitPasscodeForm()')
|
||||
.sk-panel-column.stretch
|
||||
input#passcode-input.center-text.sk-input.contrast(autocomplete='new-password', autofocus='true', ng-model='formData.passcode', placeholder='Enter Passcode', should-focus='true', sn-autofocus='true', type='password')
|
||||
.sk-button-group.stretch.sk-panel-row.form-submit
|
||||
button.sk-button.info(type='submit')
|
||||
.sk-label Unlock
|
||||
.sk-panel-footer
|
||||
#passcode-reset
|
||||
a.sk-a.neutral(ng-click='forgotPasscode()', ng-if='!formData.showRecovery') Forgot?
|
||||
div(ng-if='formData.showRecovery')
|
||||
.sk-p
|
||||
| If you forgot your local passcode, your only option is to clear your local data from this device
|
||||
| and sign back in to your account.
|
||||
.sk-panel-row
|
||||
a.sk-a.danger.center-text(ng-click='beginDeleteData()') Delete Local Data
|
||||
@@ -1,71 +0,0 @@
|
||||
.sn-component.section.notes#notes-column{"aria-label" => "Notes"}
|
||||
.content
|
||||
.section-title-bar#notes-title-bar
|
||||
.padded
|
||||
.section-title-bar-header
|
||||
.title {{ctrl.panelTitle}}
|
||||
.sk-button.contrast.wide{"ng-click" => "ctrl.createNewNote()", "title" => "Create a new note in the selected tag"}
|
||||
.sk-label
|
||||
%i.icon.ion-plus.add-button
|
||||
.filter-section{"role" => "search"}
|
||||
%input.filter-bar#search-bar{"select-on-click" => "true", "ng-model" => "ctrl.noteFilter.text", "placeholder" => "Search",
|
||||
"ng-change" => "ctrl.filterTextChanged()", "lowercase" => "true", "ng-blur" => "ctrl.onFilterEnter()", "ng-keyup" => "$event.keyCode == 13 && ctrl.onFilterEnter();",
|
||||
"title" => "Searches notes in the currently selected tag"}
|
||||
#search-clear-button{"ng-show" => "ctrl.noteFilter.text", "ng-click" => "ctrl.clearFilterText();"} ✕
|
||||
.sn-component#notes-menu-bar
|
||||
.sk-app-bar.no-edges
|
||||
.left
|
||||
.sk-app-bar-item{"ng-click" => "ctrl.showMenu = !ctrl.showMenu", "ng-class" => "{'selected' : ctrl.showMenu}"}
|
||||
.sk-app-bar-item-column
|
||||
.sk-label
|
||||
Options
|
||||
.sk-app-bar-item-column
|
||||
.sk-sublabel {{ctrl.optionsSubtitle()}}
|
||||
|
||||
.sk-menu-panel.dropdown-menu#notes-options-menu{"ng-show" => "ctrl.showMenu"}
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Sort By
|
||||
%a.info.sk-h5{"ng-click" => "ctrl.toggleReverseSort()"}
|
||||
{{ctrl.sortReverse === true ? 'Disable Reverse Sort' : 'Enable Reverse Sort'}}
|
||||
|
||||
%menu-row{"label" => "'Date Added'", "circle" => "ctrl.sortBy == 'created_at' && 'success'", "action" => "ctrl.selectedMenuItem(); ctrl.selectedSortByCreated()", "desc" => "'Sort notes by newest first'"}
|
||||
%menu-row{"label" => "'Date Modified'", "circle" => "ctrl.sortBy == 'client_updated_at' && 'success'", "action" => "ctrl.selectedMenuItem(); ctrl.selectedSortByUpdated()", "desc" => "'Sort notes with the most recently updated first'"}
|
||||
%menu-row{"label" => "'Title'", "circle" => "ctrl.sortBy == 'title' && 'success'", "action" => "ctrl.selectedMenuItem(); ctrl.selectedSortByTitle()", "desc" => "'Sort notes alphabetically by their title'"}
|
||||
|
||||
.sk-menu-panel-section
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Display
|
||||
|
||||
%menu-row{"label" => "'Archived Notes'", "circle" => "ctrl.showArchived ? 'success' : 'danger'", "faded" => "!ctrl.showArchived", "action" => "ctrl.selectedMenuItem(); ctrl.togglePrefKey('showArchived')", "desc" => "'Archived notes are usually hidden. You can explicitly show them with this option.'"}
|
||||
%menu-row{"label" => "'Pinned Notes'", "circle" => "ctrl.hidePinned ? 'danger' : 'success'", "faded" => "ctrl.hidePinned", "action" => "ctrl.selectedMenuItem(); ctrl.togglePrefKey('hidePinned')", "desc" => "'Pinned notes always appear on top. You can hide them temporarily with this option so you can focus on other notes in the list.'"}
|
||||
|
||||
%menu-row{"label" => "'Note Preview'", "circle" => "ctrl.hideNotePreview ? 'danger' : 'success'", "faded" => "ctrl.hideNotePreview", "action" => "ctrl.selectedMenuItem(); ctrl.togglePrefKey('hideNotePreview')", "desc" => "'Hide the note preview for a more condensed list of notes'"}
|
||||
%menu-row{"label" => "'Date'", "circle" => "ctrl.hideDate ? 'danger' : 'success'","faded" => "ctrl.hideDate", "action" => "ctrl.selectedMenuItem(); ctrl.togglePrefKey('hideDate')", "desc" => "'Hide the date displayed in each row'"}
|
||||
%menu-row{"label" => "'Tags'", "circle" => "ctrl.hideTags ? 'danger' : 'success'","faded" => "ctrl.hideTags", "action" => "ctrl.selectedMenuItem(); ctrl.togglePrefKey('hideTags')", "desc" => "'Hide the list of tags associated with each note'"}
|
||||
|
||||
.scrollable
|
||||
.infinite-scroll#notes-scrollable{"infinite-scroll" => "ctrl.paginate()", "can-load" => "true", "threshold" => "200"}
|
||||
.note{"ng-repeat" => "note in (ctrl.renderedNotes = (ctrl.notes | limitTo:ctrl.notesToDisplay)) track by note.uuid",
|
||||
"ng-click" => "ctrl.selectNote(note, true)", "ng-class" => "{'selected' : ctrl.selectedNote == note}"}
|
||||
|
||||
.note-flags{"ng-show" => "note.flags.length > 0"}
|
||||
.flag{"ng-repeat" => "flag in note.flags", "ng-class" => "flag.class"}
|
||||
.label {{flag.text}}
|
||||
|
||||
.name{"ng-show" => "note.title"}
|
||||
{{note.title}}
|
||||
|
||||
-# Use ng-if and not ng-show here. We don't want previews in the dom at all if protected.
|
||||
.note-preview{"ng-if" => "!ctrl.hideNotePreview && !note.content.hidePreview && !note.content.protected"}
|
||||
.html-preview{"ng-show" => "note.content.preview_html", "ng-bind-html" => "note.content.preview_html"}
|
||||
.plain-preview{"ng-show" => "!note.content.preview_html && note.content.preview_plain"} {{note.content.preview_plain}}
|
||||
.default-preview{"ng-show" => "!note.content.preview_html && !note.content.preview_plain"} {{note.text}}
|
||||
|
||||
.date.faded{"ng-show" => "!ctrl.hideDate"}
|
||||
%span{"ng-show" => "ctrl.sortBy == 'client_updated_at'"} Modified {{note.cachedUpdatedAtString || 'Now'}}
|
||||
%span{"ng-show" => "ctrl.sortBy != 'client_updated_at'"} {{note.cachedCreatedAtString || 'Now'}}
|
||||
|
||||
.tags-string{"ng-show" => "note.shouldShowTags"}
|
||||
.faded {{note.savedTagsString || note.tagsString()}}
|
||||
|
||||
%panel-resizer{"panel-id" => "'notes-column'", "default-width" => 300, "on-resize-finish" => "ctrl.onPanelResize", "control" => "ctrl.panelController", "hoverable" => "true", "collapsable" => "true"}
|
||||
55
app/assets/templates/notes.pug
Normal file
55
app/assets/templates/notes.pug
Normal file
@@ -0,0 +1,55 @@
|
||||
#notes-column.sn-component.section.notes(aria-label='Notes')
|
||||
.content
|
||||
#notes-title-bar.section-title-bar
|
||||
.padded
|
||||
.section-title-bar-header
|
||||
.title {{ctrl.panelTitle}}
|
||||
.sk-button.contrast.wide(ng-click='ctrl.createNewNote()', title='Create a new note in the selected tag')
|
||||
.sk-label
|
||||
i.icon.ion-plus.add-button
|
||||
.filter-section(role='search')
|
||||
input#search-bar.filter-bar(lowercase='true', ng-blur='ctrl.onFilterEnter()', ng-change='ctrl.filterTextChanged()', ng-keyup='$event.keyCode == 13 && ctrl.onFilterEnter();', ng-model='ctrl.noteFilter.text', placeholder='Search', select-on-click='true', title='Searches notes in the currently selected tag')
|
||||
#search-clear-button(ng-click='ctrl.clearFilterText();', ng-show='ctrl.noteFilter.text') ✕
|
||||
#notes-menu-bar.sn-component
|
||||
.sk-app-bar.no-edges
|
||||
.left
|
||||
.sk-app-bar-item(ng-class="{'selected' : ctrl.showMenu}", ng-click='ctrl.showMenu = !ctrl.showMenu')
|
||||
.sk-app-bar-item-column
|
||||
.sk-label
|
||||
| Options
|
||||
.sk-app-bar-item-column
|
||||
.sk-sublabel {{ctrl.optionsSubtitle()}}
|
||||
#notes-options-menu.sk-menu-panel.dropdown-menu(ng-show='ctrl.showMenu')
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Sort By
|
||||
a.info.sk-h5(ng-click='ctrl.toggleReverseSort()')
|
||||
| {{ctrl.sortReverse === true ? 'Disable Reverse Sort' : 'Enable Reverse Sort'}}
|
||||
menu-row(action="ctrl.selectedMenuItem(); ctrl.selectedSortByCreated()" circle="ctrl.sortBy == 'created_at' && 'success'" desc="'Sort notes by newest first'" label="'Date Added'")
|
||||
menu-row(action="ctrl.selectedMenuItem(); ctrl.selectedSortByUpdated()" circle="ctrl.sortBy == 'client_updated_at' && 'success'" desc="'Sort notes with the most recently updated first'" label="'Date Modified'")
|
||||
menu-row(action="ctrl.selectedMenuItem(); ctrl.selectedSortByTitle()" circle="ctrl.sortBy == 'title' && 'success'" desc="'Sort notes alphabetically by their title'" label="'Title'")
|
||||
.sk-menu-panel-section
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Display
|
||||
menu-row(action="ctrl.selectedMenuItem(); ctrl.togglePrefKey('showArchived')" circle="ctrl.showArchived ? 'success' : 'danger'" desc="'Archived notes are usually hidden. You can explicitly show them with this option.'" faded="!ctrl.showArchived" label="'Archived Notes'")
|
||||
menu-row(action="ctrl.selectedMenuItem(); ctrl.togglePrefKey('hidePinned')" circle="ctrl.hidePinned ? 'danger' : 'success'" desc="'Pinned notes always appear on top. You can hide them temporarily with this option so you can focus on other notes in the list.'" faded="ctrl.hidePinned" label="'Pinned Notes'")
|
||||
menu-row(action="ctrl.selectedMenuItem(); ctrl.togglePrefKey('hideNotePreview')" circle="ctrl.hideNotePreview ? 'danger' : 'success'" desc="'Hide the note preview for a more condensed list of notes'" faded="ctrl.hideNotePreview" label="'Note Preview'")
|
||||
menu-row(action="ctrl.selectedMenuItem(); ctrl.togglePrefKey('hideDate')" circle="ctrl.hideDate ? 'danger' : 'success'" desc="'Hide the date displayed in each row'" faded="ctrl.hideDate" label="'Date'")
|
||||
menu-row(action="ctrl.selectedMenuItem(); ctrl.togglePrefKey('hideTags')" circle="ctrl.hideTags ? 'danger' : 'success'" desc="'Hide the list of tags associated with each note'" faded="ctrl.hideTags" label="'Tags'")
|
||||
.scrollable
|
||||
#notes-scrollable.infinite-scroll(can-load='true', infinite-scroll='ctrl.paginate()', threshold='200')
|
||||
.note(ng-class="{'selected' : ctrl.selectedNote == note}", ng-click='ctrl.selectNote(note, true)', ng-repeat='note in (ctrl.renderedNotes = (ctrl.notes | limitTo:ctrl.notesToDisplay)) track by note.uuid')
|
||||
.note-flags(ng-show='note.flags.length > 0')
|
||||
.flag(ng-class='flag.class', ng-repeat='flag in note.flags')
|
||||
.label {{flag.text}}
|
||||
.name(ng-show='note.title')
|
||||
| {{note.title}}
|
||||
.note-preview(ng-if='!ctrl.hideNotePreview && !note.content.hidePreview && !note.content.protected')
|
||||
.html-preview(ng-bind-html='note.content.preview_html', ng-show='note.content.preview_html')
|
||||
.plain-preview(ng-show='!note.content.preview_html && note.content.preview_plain') {{note.content.preview_plain}}
|
||||
.default-preview(ng-show='!note.content.preview_html && !note.content.preview_plain') {{note.text}}
|
||||
.date.faded(ng-show='!ctrl.hideDate')
|
||||
span(ng-show="ctrl.sortBy == 'client_updated_at'") Modified {{note.cachedUpdatedAtString || 'Now'}}
|
||||
span(ng-show="ctrl.sortBy != 'client_updated_at'") {{note.cachedCreatedAtString || 'Now'}}
|
||||
.tags-string(ng-show='note.shouldShowTags')
|
||||
.faded {{note.savedTagsString || note.tagsString()}}
|
||||
panel-resizer(collapsable="true" control="ctrl.panelController" default-width="300" hoverable="true" on-resize-finish="ctrl.onPanelResize" panel-id="'notes-column'")
|
||||
@@ -1,46 +0,0 @@
|
||||
.sn-component.section.tags#tags-column{"aria-label" => "Tags"}
|
||||
|
||||
.component-view-container{"ng-if" => "ctrl.component.active"}
|
||||
%component-view.component-view{"component" => "ctrl.component"}
|
||||
|
||||
#tags-content.content{"ng-if" => "!(ctrl.component && ctrl.component.active)"}
|
||||
.tags-title-section.section-title-bar
|
||||
.section-title-bar-header
|
||||
.sk-h3.title
|
||||
%span.sk-bold Views
|
||||
.sk-button.sk-secondary-contrast.wide{"ng-click" => "ctrl.clickedAddNewTag()", "title" => "Create a new tag"}
|
||||
.sk-label
|
||||
%i.icon.ion-plus.add-button
|
||||
|
||||
.scrollable
|
||||
.infinite-scroll
|
||||
.tag{"ng-repeat" => "tag in ctrl.smartTags", "ng-click" => "ctrl.selectTag(tag)",
|
||||
"ng-class" => "{'selected' : ctrl.selectedTag == tag, 'faded' : !tag.content.isAllTag}"}
|
||||
.tag-info
|
||||
%input.title{"ng-disabled" => "true", "ng-model" => "tag.title"}
|
||||
.count{"ng-show" => "tag.content.isAllTag"} {{tag.cachedNoteCount}}
|
||||
|
||||
.tags-title-section.section-title-bar
|
||||
.section-title-bar-header
|
||||
.sk-h3.title
|
||||
%span.sk-bold Tags
|
||||
.tag{"ng-repeat" => "tag in ctrl.tags track by tag.uuid", "ng-click" => "ctrl.selectTag(tag)", "ng-class" => "{'selected' : ctrl.selectedTag == tag}"}
|
||||
.tag-info
|
||||
.tag-icon #
|
||||
%input.title{"ng-class" => "{'editing' : ctrl.editingTag == tag}", "ng-attr-id" => "tag-{{tag.uuid}}", "ng-click" => "ctrl.selectTag(tag)", "ng-model" => "tag.title",
|
||||
"ng-keyup" => "$event.keyCode == 13 && $event.target.blur()", "sn-autofocus" => "true", "should-focus" => "ctrl.newTag || ctrl.editingTag == tag",
|
||||
"ng-change" => "ctrl.tagTitleDidChange(tag)", "ng-blur" => "ctrl.saveTag($event, tag)", "spellcheck" => "false"}
|
||||
.count {{tag.cachedNoteCount}}
|
||||
|
||||
.danger.small-text.bold{"ng-show" => "tag.content.conflict_of"} Conflicted Copy
|
||||
.danger.small-text.bold{"ng-show" => "tag.errorDecrypting"} Missing Keys
|
||||
|
||||
.menu{"ng-show" => "ctrl.selectedTag == tag"}
|
||||
%a.item{"ng-click" => "ctrl.selectedRenameTag($event, tag)", "ng-show" => "!ctrl.editingTag"} Rename
|
||||
%a.item{"ng-click" => "ctrl.saveTag($event, tag)", "ng-show" => "ctrl.editingTag"} Save
|
||||
%a.item{"ng-click" => "ctrl.selectedDeleteTag(tag)"} Delete
|
||||
|
||||
.no-tags-placeholder{"ng-show" => "ctrl.tags.length == 0"}
|
||||
No tags. Create one using the add button above.
|
||||
|
||||
%panel-resizer{"panel-id" => "'tags-column'", "default-width" => 150, "on-resize-finish" => "ctrl.onPanelResize", "control" => "ctrl.panelController", "hoverable" => "true", "collapsable" => "true"}
|
||||
35
app/assets/templates/tags.pug
Normal file
35
app/assets/templates/tags.pug
Normal file
@@ -0,0 +1,35 @@
|
||||
#tags-column.sn-component.section.tags(aria-label='Tags')
|
||||
.component-view-container(ng-if='ctrl.component.active')
|
||||
component-view.component-view(component='ctrl.component')
|
||||
#tags-content.content(ng-if='!(ctrl.component && ctrl.component.active)')
|
||||
.tags-title-section.section-title-bar
|
||||
.section-title-bar-header
|
||||
.sk-h3.title
|
||||
span.sk-bold Views
|
||||
.sk-button.sk-secondary-contrast.wide(ng-click='ctrl.clickedAddNewTag()', title='Create a new tag')
|
||||
.sk-label
|
||||
i.icon.ion-plus.add-button
|
||||
.scrollable
|
||||
.infinite-scroll
|
||||
.tag(ng-class="{'selected' : ctrl.selectedTag == tag, 'faded' : !tag.content.isAllTag}", ng-click='ctrl.selectTag(tag)', ng-repeat='tag in ctrl.smartTags')
|
||||
.tag-info
|
||||
input.title(ng-disabled='true', ng-model='tag.title')
|
||||
.count(ng-show='tag.content.isAllTag') {{tag.cachedNoteCount}}
|
||||
.tags-title-section.section-title-bar
|
||||
.section-title-bar-header
|
||||
.sk-h3.title
|
||||
span.sk-bold Tags
|
||||
.tag(ng-class="{'selected' : ctrl.selectedTag == tag}", ng-click='ctrl.selectTag(tag)', ng-repeat='tag in ctrl.tags track by tag.uuid')
|
||||
.tag-info
|
||||
.tag-icon #
|
||||
input.title(ng-attr-id='tag-{{tag.uuid}}', ng-blur='ctrl.saveTag($event, tag)', ng-change='ctrl.tagTitleDidChange(tag)', ng-class="{'editing' : ctrl.editingTag == tag}", ng-click='ctrl.selectTag(tag)', ng-keyup='$event.keyCode == 13 && $event.target.blur()', ng-model='tag.title', should-focus='ctrl.newTag || ctrl.editingTag == tag', sn-autofocus='true', spellcheck='false')
|
||||
.count {{tag.cachedNoteCount}}
|
||||
.danger.small-text.bold(ng-show='tag.content.conflict_of') Conflicted Copy
|
||||
.danger.small-text.bold(ng-show='tag.errorDecrypting') Missing Keys
|
||||
.menu(ng-show='ctrl.selectedTag == tag')
|
||||
a.item(ng-click='ctrl.selectedRenameTag($event, tag)', ng-show='!ctrl.editingTag') Rename
|
||||
a.item(ng-click='ctrl.saveTag($event, tag)', ng-show='ctrl.editingTag') Save
|
||||
a.item(ng-click='ctrl.selectedDeleteTag(tag)') Delete
|
||||
.no-tags-placeholder(ng-show='ctrl.tags.length == 0')
|
||||
| No tags. Create one using the add button above.
|
||||
panel-resizer(collapsable='true', control='ctrl.panelController', default-width='150', hoverable='true', on-resize-finish='ctrl.onPanelResize', panel-id="'tags-column'")
|
||||
Reference in New Issue
Block a user