Merge branch '004' into develop
This commit is contained in:
@@ -75,6 +75,7 @@
|
||||
input.sk-input.mt-5.sk-base(
|
||||
name='server',
|
||||
ng-model='self.state.formData.url',
|
||||
ng-change='self.onHostInputChange()'
|
||||
placeholder='Server URL',
|
||||
required='',
|
||||
type='text'
|
||||
@@ -122,14 +123,14 @@
|
||||
)
|
||||
p.sk-p Stay signed in
|
||||
label.sk-panel-row.justify-left(ng-if='self.notesAndTagsCount() > 0')
|
||||
.sk-panel-row
|
||||
input(
|
||||
ng-bind='true',
|
||||
ng-change='self.mergeLocalChanged()',
|
||||
ng-model='self.state.formData.mergeLocal',
|
||||
type='checkbox'
|
||||
)
|
||||
| Merge local data ({{self.notesAndTagsCount()}} notes and tags)
|
||||
.sk-horizontal-group.tight
|
||||
input(
|
||||
ng-bind='true',
|
||||
ng-change='self.mergeLocalChanged()',
|
||||
ng-model='self.state.formData.mergeLocal',
|
||||
type='checkbox'
|
||||
)
|
||||
p.sk-p Merge local data ({{self.notesAndTagsCount()}} notes and tags)
|
||||
.sk-panel-section(ng-if='self.state.formData.mfa')
|
||||
form.sk-panel-form(ng-submit='self.submitMfaForm()')
|
||||
.sk-p.sk-panel-row {{self.state.formData.mfa.message}}
|
||||
@@ -188,7 +189,7 @@
|
||||
) {{self.syncStatus.current}}/{{self.syncStatus.total}}
|
||||
.sk-panel-row
|
||||
a.sk-a.info.sk-panel-row.condensed(
|
||||
ng-click="self.openPasswordWizard('change-pw')"
|
||||
ng-click="self.openPasswordWizard()"
|
||||
)
|
||||
| Change Password
|
||||
a.sk-a.info.sk-panel-row.condensed(
|
||||
@@ -196,21 +197,15 @@
|
||||
ng-show='self.state.user'
|
||||
)
|
||||
| Manage Privileges
|
||||
a.sk-panel-row.justify-left.condensed.success(
|
||||
ng-click="self.openPasswordWizard('upgrade-security')",
|
||||
ng-if='self.state.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='self.encryptionEnabled()')
|
||||
.sk-panel-section-subtitle.info(ng-if='self.state.encryptionEnabled')
|
||||
| {{self.encryptionStatusForNotes()}}
|
||||
p.sk-p
|
||||
| {{self.encryptionStatusString()}}
|
||||
| {{self.state.encryptionStatusString}}
|
||||
.sk-panel-section
|
||||
.sk-panel-section-title Passcode Lock
|
||||
div(ng-if='!self.hasPasscode()')
|
||||
div(ng-if='!self.state.hasPasscode')
|
||||
div(ng-if='self.state.canAddPasscode')
|
||||
.sk-panel-row(ng-if='!self.state.formData.showPasscodeForm')
|
||||
.sk-button.info(
|
||||
@@ -247,7 +242,7 @@
|
||||
a.neutral.sk-a.sk-panel-row(
|
||||
ng-click='self.state.formData.showPasscodeForm = false'
|
||||
) Cancel
|
||||
div(ng-if='self.hasPasscode() && !self.state.formData.showPasscodeForm')
|
||||
div(ng-if='self.state.hasPasscode && !self.state.formData.showPasscodeForm')
|
||||
.sk-p
|
||||
| Passcode lock is enabled.
|
||||
.sk-notification.contrast
|
||||
@@ -281,7 +276,7 @@
|
||||
.sk-p
|
||||
| Download a backup of all your data.
|
||||
.sk-panel-row
|
||||
form.sk-panel-form.sk-panel-row(ng-if='self.encryptedBackupsAvailable()')
|
||||
form.sk-panel-form.sk-panel-row(ng-if='self.state.encryptionEnabled')
|
||||
.sk-input-group
|
||||
label.sk-horizontal-group.tight
|
||||
input(
|
||||
|
||||
@@ -7,19 +7,24 @@
|
||||
target='blank'
|
||||
)
|
||||
menu-row(label="'Download Actions'")
|
||||
div(ng-repeat='extension in self.state.extensions')
|
||||
div(ng-if='self.loadingExtensions')
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-column
|
||||
.sk-menu-panel-header-title Loading...
|
||||
.sk-spinner.small.loading
|
||||
div(ng-repeat='extension in self.state.extensions track by extension.uuid; self.loadingExtensions = false')
|
||||
.sk-menu-panel-header(
|
||||
ng-click='extension.hide = !extension.hide; $event.stopPropagation();'
|
||||
ng-click='self.updateExtension(extension, { hidden: !extension.hidden }); $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') …
|
||||
div(ng-if='extension.hidden') …
|
||||
menu-row(
|
||||
action='self.executeAction(action, extension);',
|
||||
action='self.executeAction(action, extension)',
|
||||
label='action.label',
|
||||
ng-if='!extension.hide',
|
||||
ng-repeat='action in extension.actionsWithContextForItem(self.props.item)',
|
||||
ng-if='!extension.hidden',
|
||||
ng-repeat='action in extension.actionsWithContextForItem(self.props.item) track by $index',
|
||||
disabled='action.running'
|
||||
spinner-class="action.running ? 'info' : null",
|
||||
sub-rows='action.subrows',
|
||||
subtitle='action.desc'
|
||||
|
||||
@@ -11,5 +11,7 @@
|
||||
| {{ctrl.component.name}}
|
||||
a.sk-a.info.close-button(ng-click="ctrl.dismiss()") Close
|
||||
component-view.component-view(
|
||||
component="ctrl.component"
|
||||
ng-if='ctrl.component.active'
|
||||
component-uuid="ctrl.component.uuid",
|
||||
application='ctrl.application'
|
||||
)
|
||||
|
||||
@@ -4,19 +4,9 @@
|
||||
.sk-app-bar-item
|
||||
.sk-label.warning There was an issue loading {{ctrl.component.name}}.
|
||||
.right
|
||||
.sk-app-bar-item(ng-click='ctrl.reloadComponent()')
|
||||
.sk-app-bar-item(ng-click='ctrl.reloadIframe()')
|
||||
.sk-button.info
|
||||
.sk-label Reload
|
||||
.sn-component(ng-if='ctrl.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='ctrl.dismissNoThemesMessage()')
|
||||
.sk-label Dismiss
|
||||
.sk-app-bar-item(ng-click='ctrl.disableActiveTheme()')
|
||||
.sk-label Disable Active Theme
|
||||
.sn-component(ng-if='ctrl.expired')
|
||||
.sk-app-bar.no-edges.no-top-edge.dynamic-height
|
||||
.left
|
||||
@@ -84,10 +74,11 @@
|
||||
| version of the app.
|
||||
| Ensure you are running at least version 2.1 on all platforms.
|
||||
iframe(
|
||||
data-component-id='{{ctrl.component.uuid}}',
|
||||
data-component-id='{{ctrl.componentUuid}}',
|
||||
frameborder='0',
|
||||
ng-attr-id='component-iframe-{{ctrl.component.uuid}}',
|
||||
ng-if='ctrl.component && ctrl.componentValid',
|
||||
ng-init='ctrl.onIframeInit()'
|
||||
ng-attr-id='component-iframe-{{ctrl.componentUuid}}',
|
||||
ng-if='ctrl.componentUuid && !ctrl.reloading && ctrl.componentValid',
|
||||
ng-src='{{ctrl.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 allow-downloads'
|
||||
)
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
.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="ctrl.keepItem1()") Keep left
|
||||
a.sk-a.info.close-button(ng-click="ctrl.keepItem2()") Keep right
|
||||
a.sk-a.info.close-button(ng-click="ctrl.keepBoth()") Keep both
|
||||
a.sk-a.info.close-button(ng-click="ctrl.export()") Export
|
||||
a.sk-a.info.close-button(
|
||||
ng-click="ctrl.dismiss(); $event.stopPropagation()"
|
||||
) Close
|
||||
.sk-panel-content.selectable
|
||||
.sk-panel-section
|
||||
h3
|
||||
strong Content type:
|
||||
| {{ctrl.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;")
|
||||
| {{ctrl.item1Content}}
|
||||
.border
|
||||
#item2.sk-panel.static.item
|
||||
p.normal(style="white-space: pre-wrap; font-size: 16px;")
|
||||
| {{ctrl.item2Content}}
|
||||
@@ -5,28 +5,25 @@
|
||||
.sk-menu-panel-header-title Note Editor
|
||||
menu-row(
|
||||
action='self.selectComponent(null)',
|
||||
circle="self.selectedEditor == null && 'success'",
|
||||
circle="!self.selectedEditorUuid && 'success'",
|
||||
label="'Plain Editor'"
|
||||
)
|
||||
menu-row(
|
||||
ng-repeat='editor in self.state.editors'
|
||||
ng-repeat='editor in self.state.editors track by editor.uuid'
|
||||
action='self.selectComponent(editor)',
|
||||
button-action='self.toggleDefaultForEditor(editor)',
|
||||
button-class="self.state.defaultEditor == editor ? 'warning' : 'info'",
|
||||
button-text="self.state.defaultEditor == editor ? 'Undefault' : 'Set Default'",
|
||||
circle="self.selectedEditor === editor && 'success'",
|
||||
has-button='self.selectedEditor == editor || self.state.defaultEditor == editor',
|
||||
button-class="self.isEditorSelected(editor) ? 'warning' : 'info'",
|
||||
button-text="self.isEditorDefault(editor) ? 'Undefault' : 'Set Default'",
|
||||
circle="self.isEditorSelected(editor) && 'success'",
|
||||
has-button='self.isEditorSelected(editor) || isEditorDefault(editor)',
|
||||
label='editor.name',
|
||||
)
|
||||
.sk-menu-panel-column(
|
||||
ng-if='editor.content.conflict_of || self.shouldDisplayRunningLocallyLabel(editor)'
|
||||
ng-if='editor.conflictOf'
|
||||
)
|
||||
strong.danger.medium-text(
|
||||
ng-if='editor.content.conflict_of'
|
||||
.info(
|
||||
ng-if='editor.conflictOf'
|
||||
) Conflicted copy
|
||||
.sk-sublabel(
|
||||
ng-if='self.shouldDisplayRunningLocallyLabel(editor)'
|
||||
) Running Locally
|
||||
a.no-decoration(
|
||||
href='https://standardnotes.org/extensions',
|
||||
ng-if='self.state.editors.length == 0',
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
form(ng-submit="ctrl.submit()")
|
||||
input.sk-input.contrast(
|
||||
ng-model="ctrl.formData.input"
|
||||
placeholder="{{ctrl.placeholder}}"
|
||||
should-focus="true"
|
||||
sn-autofocus="true"
|
||||
type="{{ctrl.type}}"
|
||||
|
||||
@@ -5,133 +5,45 @@
|
||||
.sn-component
|
||||
.sk-panel
|
||||
.sk-panel-header
|
||||
.sk-panel-header-title {{ctrl.title}}
|
||||
.sk-panel-header-title {{ctrl.state.title}}
|
||||
a.sk-a.info.close-button(ng-click='ctrl.dismiss()') Close
|
||||
.sk-panel-content
|
||||
div(ng-if='ctrl.step == 0')
|
||||
div(ng-if='ctrl.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='ctrl.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='ctrl.step > 0')
|
||||
.sk-panel-section-title Step {{ctrl.step}} — {{ctrl.titleForStep(ctrl.step)}}
|
||||
div(ng-if='ctrl.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='ctrl.downloadBackup(true)')
|
||||
.sk-label Download Encrypted Backup
|
||||
.sk-button.info(ng-click='ctrl.downloadBackup(false)')
|
||||
.sk-label Download Decrypted Backup
|
||||
div(ng-if='ctrl.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='ctrl.step == 3')
|
||||
div(ng-if='ctrl.changePassword')
|
||||
div(ng-if='ctrl.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='ctrl.formData.currentPassword',
|
||||
placeholder='Current Password',
|
||||
should-focus='true',
|
||||
sn-autofocus='true',
|
||||
type='password'
|
||||
)
|
||||
input.sk-input.contrast(
|
||||
ng-if='ctrl.changePassword',
|
||||
ng-model='ctrl.formData.newPassword',
|
||||
placeholder='New Password',
|
||||
type='password'
|
||||
)
|
||||
input.sk-input.contrast(
|
||||
ng-if='ctrl.changePassword',
|
||||
ng-model='ctrl.formData.newPasswordConfirmation',
|
||||
placeholder='Confirm New Password',
|
||||
type='password'
|
||||
)
|
||||
div(ng-if='ctrl.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='ctrl.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='ctrl.formData.processing')
|
||||
.inline.bold(
|
||||
ng-class="{'info' : !ctrl.formData.statusError, 'error' : ctrl.formData.statusError}"
|
||||
.sk-panel-section(ng-if='ctrl.state.step == 1')
|
||||
.sk-panel-row
|
||||
.sk-panel-column.stretch
|
||||
form.sk-panel-form
|
||||
input.sk-input.contrast(
|
||||
ng-model='ctrl.state.formData.currentPassword',
|
||||
placeholder='Current Password',
|
||||
should-focus='true',
|
||||
sn-autofocus='true',
|
||||
type='password'
|
||||
)
|
||||
| {{ctrl.formData.status}}
|
||||
.sk-panel-column(
|
||||
delay='1000',
|
||||
delay-hide='true',
|
||||
show='ctrl.syncStatus.syncOpInProgress || ctrl.syncStatus.needsMoreSync'
|
||||
)
|
||||
p.info
|
||||
| Syncing {{ctrl.syncStatus.current}}/{{ctrl.syncStatus.total}}
|
||||
div(ng-if='ctrl.step == 5')
|
||||
div(ng-if='ctrl.changePassword')
|
||||
p.sk-p.sk-panel-row.info-i Your password has been successfully changed.
|
||||
div(ng-if='ctrl.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.
|
||||
input.sk-input.contrast(
|
||||
ng-if='ctrl.props.changePassword',
|
||||
ng-model='ctrl.state.formData.newPassword',
|
||||
placeholder='New Password',
|
||||
type='password'
|
||||
)
|
||||
input.sk-input.contrast(
|
||||
ng-if='ctrl.props.changePassword',
|
||||
ng-model='ctrl.state.formData.newPasswordConfirmation',
|
||||
placeholder='Confirm New Password',
|
||||
type='password'
|
||||
)
|
||||
.sk-panel-section(ng-if='ctrl.state.step == 2')
|
||||
div(ng-if='ctrl.props.changePassword')
|
||||
p.sk-p.sk-panel-row.info-i Your password has been successfully changed.
|
||||
div(ng-if='ctrl.props.securityUpdate')
|
||||
p.sk-p.sk-panel-row.info-i
|
||||
| The account 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.
|
||||
.sk-panel-footer
|
||||
.empty
|
||||
a.sk-a.info.right(
|
||||
ng-class="{'disabled' : ctrl.lockContinue}",
|
||||
ng-click='ctrl.nextStep()',
|
||||
ng-disabled='ctrl.lockContinue')
|
||||
.sk-spinner.small.inline.info.mr-5(ng-if='ctrl.showSpinner')
|
||||
| {{ctrl.continueTitle}}
|
||||
ng-disabled='ctrl.state.lockContinue')
|
||||
.sk-spinner.small.inline.info.mr-5(ng-if='ctrl.state.showSpinner')
|
||||
| {{ctrl.state.continueTitle}}
|
||||
|
||||
@@ -46,6 +46,6 @@
|
||||
| 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
|
||||
| require an "Application Passcode" privilege, and another device does not have
|
||||
| an application passcode set up, the application passcode requirement will be ignored
|
||||
| on that device.
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
style="white-space: pre-wrap; font-size: 16px;"
|
||||
) {{ctrl.content.text}}
|
||||
component-view.component-view(
|
||||
component="ctrl.editor"
|
||||
ng-if="ctrl.editor"
|
||||
component-uuid="ctrl.editor.uuid"
|
||||
ng-if="ctrl.editor",
|
||||
application='ctrl.application'
|
||||
)
|
||||
|
||||
@@ -1,253 +0,0 @@
|
||||
#editor-column.section.editor.sn-component(aria-label='Note')
|
||||
.sn-component
|
||||
.sk-app-bar.no-edges(
|
||||
ng-if='self.state.note.locked',
|
||||
ng-init="self.lockText = 'Note Locked'",
|
||||
ng-mouseleave="self.lockText = 'Note Locked'",
|
||||
ng-mouseover="self.lockText = 'Unlock'"
|
||||
)
|
||||
.left
|
||||
.sk-app-bar-item(ng-click='self.toggleLockNote()')
|
||||
.sk-label.warning
|
||||
i.icon.ion-locked
|
||||
| {{self.lockText}}
|
||||
#editor-title-bar.section-title-bar(
|
||||
ng-class="{'locked' : self.state.note.locked}",
|
||||
ng-show='self.state.note && !self.state.note.errorDecrypting'
|
||||
)
|
||||
.title
|
||||
input#note-title-editor.input(
|
||||
ng-blur='self.onNameBlur()',
|
||||
ng-change='self.onTitleChange()',
|
||||
ng-disabled='self.state.note.locked',
|
||||
ng-focus='self.onNameFocus()',
|
||||
ng-keyup='$event.keyCode == 13 && self.onTitleEnter($event)',
|
||||
ng-model='self.state.note.title',
|
||||
select-on-click='true',
|
||||
spellcheck='false')
|
||||
#save-status
|
||||
.message(
|
||||
ng-class="{'warning sk-bold': self.state.syncTakingTooLong, 'danger sk-bold': self.state.saveError}"
|
||||
) {{self.state.noteStatus.message}}
|
||||
.desc(ng-show='self.state.noteStatus.desc') {{self.state.noteStatus.desc}}
|
||||
.editor-tags
|
||||
#note-tags-component-container(ng-if='self.state.tagsComponent')
|
||||
component-view.component-view(
|
||||
component='self.state.tagsComponent',
|
||||
ng-class="{'locked' : self.state.note.locked}",
|
||||
ng-style="self.state.note.locked && {'pointer-events' : 'none'}"
|
||||
)
|
||||
input.tags-input(
|
||||
ng-blur='self.saveTags()',
|
||||
ng-disabled='self.state.note.locked',
|
||||
ng-if='!(self.state.tagsComponent && self.state.tagsComponent.active)',
|
||||
ng-keyup='$event.keyCode == 13 && $event.target.blur();',
|
||||
ng-model='self.state.mutable.tagsString',
|
||||
placeholder='#tags',
|
||||
spellcheck='false',
|
||||
type='text'
|
||||
)
|
||||
.sn-component(ng-if='self.state.note')
|
||||
#editor-menu-bar.sk-app-bar.no-edges
|
||||
.left
|
||||
.sk-app-bar-item(
|
||||
click-outside=`self.setMenuState('showOptionsMenu', false)`,
|
||||
is-open='self.state.showOptionsMenu',
|
||||
ng-class="{'selected' : self.state.showOptionsMenu}",
|
||||
ng-click="self.toggleMenu('showOptionsMenu')"
|
||||
)
|
||||
.sk-label Options
|
||||
.sk-menu-panel.dropdown-menu(ng-if='self.state.showOptionsMenu')
|
||||
.sk-menu-panel-section
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Note Options
|
||||
menu-row(
|
||||
action='self.selectedMenuItem(true); self.togglePin()',
|
||||
desc="'Pin or unpin a note from the top of your list'",
|
||||
label="self.state.note.pinned ? 'Unpin' : 'Pin'"
|
||||
)
|
||||
menu-row(
|
||||
action='self.selectedMenuItem(true); self.toggleArchiveNote()',
|
||||
desc="'Archive or unarchive a note from your Archived system tag'",
|
||||
label="self.state.note.archived ? 'Unarchive' : 'Archive'"
|
||||
)
|
||||
menu-row(
|
||||
action='self.selectedMenuItem(true); self.toggleLockNote()',
|
||||
desc="'Locking notes prevents unintentional editing'",
|
||||
label="self.state.note.locked ? 'Unlock' : 'Lock'"
|
||||
)
|
||||
menu-row(
|
||||
action='self.selectedMenuItem(true); self.toggleProtectNote()',
|
||||
desc=`'Protecting a note will require credentials to view
|
||||
it (Manage Privileges via Account menu)'`,
|
||||
label="self.state.note.content.protected ? 'Unprotect' : 'Protect'"
|
||||
)
|
||||
menu-row(
|
||||
action='self.selectedMenuItem(true); self.toggleNotePreview()',
|
||||
circle="self.state.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='self.selectedMenuItem(); self.deleteNote()',
|
||||
desc="'Send this note to the trash'",
|
||||
label="'Move to Trash'",
|
||||
ng-show='!self.state.altKeyDown && !self.state.note.content.trashed && !self.state.note.errorDecrypting',
|
||||
stylekit-class="'warning'"
|
||||
)
|
||||
menu-row(
|
||||
action='self.selectedMenuItem(); self.deleteNotePermanantely()',
|
||||
desc="'Delete this note permanently from all your devices'",
|
||||
label="'Delete Permanently'",
|
||||
ng-show='!self.state.note.content.trashed && self.state.note.errorDecrypting',
|
||||
stylekit-class="'danger'"
|
||||
)
|
||||
div(ng-if='self.state.note.content.trashed || self.state.altKeyDown')
|
||||
menu-row(
|
||||
action='self.selectedMenuItem(true); self.restoreTrashedNote()',
|
||||
desc="'Undelete this note and restore it back into your notes'",
|
||||
label="'Restore'",
|
||||
ng-show='self.state.note.content.trashed',
|
||||
stylekit-class="'info'"
|
||||
)
|
||||
menu-row(
|
||||
action='self.selectedMenuItem(true); self.deleteNotePermanantely()',
|
||||
desc="'Delete this note permanently from all your devices'",
|
||||
label="'Delete Permanently'",
|
||||
stylekit-class="'danger'"
|
||||
)
|
||||
menu-row(
|
||||
action='self.selectedMenuItem(true); self.emptyTrash()',
|
||||
desc="'Permanently delete all notes in the trash'",
|
||||
label="'Empty Trash'",
|
||||
ng-show='self.state.note.content.trashed || !self.state.altKeyDown',
|
||||
stylekit-class="'danger'",
|
||||
subtitle="self.getTrashCount() + ' notes in trash'"
|
||||
)
|
||||
.sk-menu-panel-section
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Global Display
|
||||
menu-row(
|
||||
action="self.selectedMenuItem(true); self.toggleKey(self.prefKeyMonospace)",
|
||||
circle="self.state.monospaceEnabled ? 'success' : 'neutral'",
|
||||
desc="'Toggles the font style for the default editor'",
|
||||
disabled='self.state.selectedEditor',
|
||||
label="'Monospace Font'",
|
||||
subtitle="self.state.selectedEditor ? 'Not available with editor extensions' : null"
|
||||
)
|
||||
menu-row(
|
||||
action="self.selectedMenuItem(true); self.toggleKey(self.prefKeySpellcheck)",
|
||||
circle="self.state.spellcheck ? 'success' : 'neutral'",
|
||||
desc="'Toggles spellcheck for the default editor'",
|
||||
disabled='self.state.selectedEditor',
|
||||
label="'Spellcheck'",
|
||||
subtitle=`
|
||||
self.state.selectedEditor
|
||||
? 'Not available with editor extensions'
|
||||
: (self.state.isDesktop ? 'May degrade editor performance' : null)
|
||||
`)
|
||||
menu-row(
|
||||
action="self.selectedMenuItem(true); self.toggleKey(self.prefKeyMarginResizers)",
|
||||
circle="self.state.marginResizersEnabled ? 'success' : 'neutral'",
|
||||
desc="'Allows for editor left and right margins to be resized'",
|
||||
faded='!self.state.marginResizersEnabled',
|
||||
label="'Margin Resizers'"
|
||||
)
|
||||
.sk-app-bar-item(
|
||||
click-outside=`self.setMenuState('showEditorMenu', false)`
|
||||
is-open='self.state.showEditorMenu',
|
||||
ng-class="{'selected' : self.state.showEditorMenu}",
|
||||
ng-click="self.toggleMenu('showEditorMenu')"
|
||||
)
|
||||
.sk-label Editor
|
||||
editor-menu(
|
||||
callback='self.editorMenuOnSelect',
|
||||
current-item='self.state.note',
|
||||
ng-if='self.state.showEditorMenu',
|
||||
selected-editor='self.state.selectedEditor'
|
||||
)
|
||||
.sk-app-bar-item(
|
||||
click-outside=`self.setMenuState('showExtensions', false)`,
|
||||
is-open='self.state.showExtensions',
|
||||
ng-class="{'selected' : self.state.showExtensions}",
|
||||
ng-click="self.toggleMenu('showExtensions')"
|
||||
)
|
||||
.sk-label Actions
|
||||
actions-menu(
|
||||
item='self.state.note',
|
||||
ng-if='self.state.showExtensions'
|
||||
)
|
||||
.sk-app-bar-item(
|
||||
click-outside=`self.setMenuState('showSessionHistory', false)`,
|
||||
is-open='self.state.showSessionHistory',
|
||||
ng-click="self.toggleMenu('showSessionHistory')"
|
||||
)
|
||||
.sk-label Session History
|
||||
session-history-menu(
|
||||
item='self.state.note',
|
||||
ng-if='self.state.showSessionHistory'
|
||||
)
|
||||
#editor-content.editor-content(
|
||||
ng-if='self.state.noteReady && !self.state.note.errorDecrypting'
|
||||
)
|
||||
panel-resizer.left(
|
||||
control='self.leftResizeControl',
|
||||
hoverable='true',
|
||||
min-width='300',
|
||||
ng-if='self.state.marginResizersEnabled',
|
||||
on-resize-finish='self.onPanelResizeFinish',
|
||||
panel-id="'editor-content'",
|
||||
property="'left'"
|
||||
)
|
||||
component-view.component-view(
|
||||
component='self.state.selectedEditor',
|
||||
ng-if='self.state.selectedEditor',
|
||||
on-load='self.onEditorLoad'
|
||||
)
|
||||
textarea#note-text-editor.editable(
|
||||
dir='auto',
|
||||
ng-attr-spellcheck='{{self.state.spellcheck}}',
|
||||
ng-change='self.contentChanged()',
|
||||
ng-click='self.clickedTextArea()',
|
||||
ng-focus='self.onContentFocus()',
|
||||
ng-if='!self.state.selectedEditor',
|
||||
ng-model='self.state.note.text',
|
||||
ng-model-options='{ debounce: self.state.editorDebounce}',
|
||||
ng-readonly='self.state.note.locked',
|
||||
ng-trim='false'
|
||||
)
|
||||
| {{self.onSystemEditorLoad()}}
|
||||
panel-resizer(
|
||||
control='self.rightResizeControl',
|
||||
hoverable='true', min-width='300',
|
||||
ng-if='self.state.marginResizersEnabled',
|
||||
on-resize-finish='self.onPanelResizeFinish',
|
||||
panel-id="'editor-content'",
|
||||
property="'right'"
|
||||
)
|
||||
.section(ng-show='self.state.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='self.state.note')
|
||||
#component-stack-menu-bar.sk-app-bar.no-edges(ng-if='self.state.componentStack.length')
|
||||
.left
|
||||
.sk-app-bar-item(
|
||||
ng-click='self.toggleStackComponentForCurrentItem(component)',
|
||||
ng-repeat='component in self.state.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 self.state.componentStack',
|
||||
ng-show='!component.hidden'
|
||||
)
|
||||
@@ -1,94 +0,0 @@
|
||||
.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',
|
||||
)
|
||||
.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}}
|
||||
.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,34 +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='ctrl.submitPasscodeForm($event)')
|
||||
.sk-panel-column.stretch
|
||||
input#passcode-input.center-text.sk-input.contrast(
|
||||
autocomplete='new-password',
|
||||
autofocus='true',
|
||||
ng-model='ctrl.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='ctrl.forgotPasscode()',
|
||||
ng-if='!ctrl.formData.showRecovery'
|
||||
) Forgot?
|
||||
div(ng-if='ctrl.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='ctrl.beginDeleteData()'
|
||||
) Delete Local Data
|
||||
@@ -1,150 +0,0 @@
|
||||
#notes-column.sn-component.section.notes(aria-label='Notes')
|
||||
.content
|
||||
#notes-title-bar.section-title-bar
|
||||
.padded
|
||||
.section-title-bar-header
|
||||
.title {{self.state.panelTitle}}
|
||||
.sk-button.contrast.wide(
|
||||
ng-click='self.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(
|
||||
ng-blur='self.onFilterEnter()',
|
||||
ng-change='self.filterTextChanged()',
|
||||
ng-keyup='$event.keyCode == 13 && self.onFilterEnter();',
|
||||
ng-model='self.state.noteFilter.text',
|
||||
placeholder='Search',
|
||||
select-on-click='true',
|
||||
title='Searches notes in the currently selected tag'
|
||||
)
|
||||
#search-clear-button(
|
||||
ng-click='self.clearFilterText();',
|
||||
ng-show='self.state.noteFilter.text'
|
||||
) ✕
|
||||
#notes-menu-bar.sn-component
|
||||
.sk-app-bar.no-edges
|
||||
.left
|
||||
.sk-app-bar-item(
|
||||
ng-class="{'selected' : self.state.mutable.showMenu}",
|
||||
ng-click='self.state.mutable.showMenu = !self.state.mutable.showMenu'
|
||||
)
|
||||
.sk-app-bar-item-column
|
||||
.sk-label
|
||||
| Options
|
||||
.sk-app-bar-item-column
|
||||
.sk-sublabel {{self.optionsSubtitle()}}
|
||||
#notes-options-menu.sk-menu-panel.dropdown-menu(
|
||||
ng-show='self.state.mutable.showMenu'
|
||||
)
|
||||
.sk-menu-panel-header
|
||||
.sk-menu-panel-header-title Sort By
|
||||
a.info.sk-h5(ng-click='self.toggleReverseSort()')
|
||||
| {{self.state.sortReverse === true ? 'Disable Reverse Sort' : 'Enable Reverse Sort'}}
|
||||
menu-row(
|
||||
action="self.selectedMenuItem(); self.selectedSortByCreated()"
|
||||
circle="self.state.sortBy == 'created_at' && 'success'"
|
||||
desc="'Sort notes by newest first'"
|
||||
label="'Date Added'"
|
||||
)
|
||||
menu-row(
|
||||
action="self.selectedMenuItem(); self.selectedSortByUpdated()"
|
||||
circle="self.state.sortBy == 'client_updated_at' && 'success'"
|
||||
desc="'Sort notes with the most recently updated first'"
|
||||
label="'Date Modified'"
|
||||
)
|
||||
menu-row(
|
||||
action="self.selectedMenuItem(); self.selectedSortByTitle()"
|
||||
circle="self.state.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="self.selectedMenuItem(); self.togglePrefKey('showArchived')"
|
||||
circle="self.state.showArchived ? 'success' : 'danger'"
|
||||
desc=`'Archived notes are usually hidden.
|
||||
You can explicitly show them with this option.'`
|
||||
faded="!self.state.showArchived"
|
||||
label="'Archived Notes'"
|
||||
)
|
||||
menu-row(
|
||||
action="self.selectedMenuItem(); self.togglePrefKey('hidePinned')"
|
||||
circle="self.state.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="self.state.hidePinned"
|
||||
label="'Pinned Notes'"
|
||||
)
|
||||
menu-row(
|
||||
action="self.selectedMenuItem(); self.togglePrefKey('hideNotePreview')"
|
||||
circle="self.state.hideNotePreview ? 'danger' : 'success'"
|
||||
desc="'Hide the note preview for a more condensed list of notes'"
|
||||
faded="self.state.hideNotePreview"
|
||||
label="'Note Preview'"
|
||||
)
|
||||
menu-row(
|
||||
action="self.selectedMenuItem(); self.togglePrefKey('hideDate')"
|
||||
circle="self.state.hideDate ? 'danger' : 'success'"
|
||||
desc="'Hide the date displayed in each row'"
|
||||
faded="self.state.hideDate"
|
||||
label="'Date'"
|
||||
)
|
||||
menu-row(
|
||||
action="self.selectedMenuItem(); self.togglePrefKey('hideTags')"
|
||||
circle="self.state.hideTags ? 'danger' : 'success'"
|
||||
desc="'Hide the list of tags associated with each note'"
|
||||
faded="self.state.hideTags"
|
||||
label="'Tags'"
|
||||
)
|
||||
.scrollable
|
||||
#notes-scrollable.infinite-scroll(
|
||||
can-load='true',
|
||||
infinite-scroll='self.paginate()',
|
||||
threshold='200'
|
||||
)
|
||||
.note(
|
||||
ng-class="{'selected' : self.state.selectedNote == note}",
|
||||
ng-click='self.selectNote(note, true)',
|
||||
ng-repeat='note in self.state.renderedNotes 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=`
|
||||
!self.state.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='!self.state.hideDate')
|
||||
span(ng-show="self.state.sortBy == 'client_updated_at'")
|
||||
| Modified {{note.cachedUpdatedAtString || 'Now'}}
|
||||
span(ng-show="self.state.sortBy != 'client_updated_at'")
|
||||
| {{note.cachedCreatedAtString || 'Now'}}
|
||||
.tags-string(ng-show='note.shouldShowTags')
|
||||
.faded {{note.savedTagsString || note.tagsString()}}
|
||||
panel-resizer(
|
||||
collapsable="true"
|
||||
control="self.panelController"
|
||||
default-width="300"
|
||||
hoverable="true"
|
||||
on-resize-finish="self.onPanelResize"
|
||||
panel-id="'notes-column'"
|
||||
)
|
||||
@@ -1,18 +0,0 @@
|
||||
.main-ui-view(
|
||||
ng-class='platform'
|
||||
)
|
||||
lock-screen(
|
||||
ng-if='needsUnlock',
|
||||
on-success='onSuccessfulUnlock'
|
||||
)
|
||||
#app.app(
|
||||
ng-class='appClass',
|
||||
ng-if='!needsUnlock'
|
||||
)
|
||||
tags-panel
|
||||
notes-panel
|
||||
editor-panel
|
||||
|
||||
footer(
|
||||
ng-if='!needsUnlock'
|
||||
)
|
||||
@@ -1,64 +0,0 @@
|
||||
#tags-column.sn-component.section.tags(aria-label='Tags')
|
||||
.component-view-container(ng-if='self.component.active')
|
||||
component-view.component-view(component='self.component')
|
||||
#tags-content.content(ng-if='!(self.component && self.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='self.clickedAddNewTag()',
|
||||
title='Create a new tag'
|
||||
)
|
||||
.sk-label
|
||||
i.icon.ion-plus.add-button
|
||||
.scrollable
|
||||
.infinite-scroll
|
||||
.tag(
|
||||
ng-class="{'selected' : self.state.selectedTag == tag, 'faded' : !tag.content.isAllTag}",
|
||||
ng-click='self.selectTag(tag)',
|
||||
ng-repeat='tag in self.state.smartTags'
|
||||
)
|
||||
.tag-info
|
||||
input.title(ng-disabled='true', ng-model='tag.title')
|
||||
.count(ng-show='tag.content.isAllTag') {{self.state.noteCounts[tag.uuid]}}
|
||||
.tags-title-section.section-title-bar
|
||||
.section-title-bar-header
|
||||
.sk-h3.title
|
||||
span.sk-bold Tags
|
||||
.tag(
|
||||
ng-class="{'selected' : self.state.selectedTag == tag}",
|
||||
ng-click='self.selectTag(tag)',
|
||||
ng-repeat='tag in self.state.tags track by tag.uuid'
|
||||
)
|
||||
.tag-info
|
||||
.tag-icon #
|
||||
input.title(
|
||||
ng-attr-id='tag-{{tag.uuid}}',
|
||||
ng-blur='self.saveTag($event, tag)',
|
||||
ng-change='self.tagTitleDidChange(tag)',
|
||||
ng-class="{'editing' : self.state.editingTag == tag}",
|
||||
ng-click='self.selectTag(tag)',
|
||||
ng-keyup='$event.keyCode == 13 && $event.target.blur()',
|
||||
ng-model='tag.title',
|
||||
should-focus='self.state.newTag || self.state.editingTag == tag',
|
||||
sn-autofocus='true',
|
||||
spellcheck='false'
|
||||
)
|
||||
.count {{self.state.noteCounts[tag.uuid]}}
|
||||
.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='self.state.selectedTag == tag')
|
||||
a.item(ng-click='self.selectedRenameTag($event, tag)', ng-show='!self.state.editingTag') Rename
|
||||
a.item(ng-click='self.saveTag($event, tag)', ng-show='self.state.editingTag') Save
|
||||
a.item(ng-click='self.selectedDeleteTag(tag)') Delete
|
||||
.no-tags-placeholder(ng-show='self.state.tags.length == 0')
|
||||
| No tags. Create one using the add button above.
|
||||
panel-resizer(
|
||||
collapsable='true',
|
||||
control='self.panelController',
|
||||
default-width='150',
|
||||
hoverable='true',
|
||||
on-resize-finish='self.onPanelResize',
|
||||
panel-id="'tags-column'"
|
||||
)
|
||||
Reference in New Issue
Block a user