feat: warning for protected note without protection
- Use `.sn-button` everywhere - Delete permissions modal - Capitalize "Clear session data"
This commit is contained in:
@@ -43,7 +43,6 @@ import {
|
|||||||
MenuRow,
|
MenuRow,
|
||||||
PanelResizer,
|
PanelResizer,
|
||||||
PasswordWizard,
|
PasswordWizard,
|
||||||
PermissionsModal,
|
|
||||||
RevisionPreviewModal,
|
RevisionPreviewModal,
|
||||||
HistoryMenu,
|
HistoryMenu,
|
||||||
SyncResolutionMenu,
|
SyncResolutionMenu,
|
||||||
@@ -57,6 +56,7 @@ import { StartApplication } from './startApplication';
|
|||||||
import { Bridge } from './services/bridge';
|
import { Bridge } from './services/bridge';
|
||||||
import { SessionsModalDirective } from './components/SessionsModal';
|
import { SessionsModalDirective } from './components/SessionsModal';
|
||||||
import { NoAccountWarningDirective } from './components/NoAccountWarning';
|
import { NoAccountWarningDirective } from './components/NoAccountWarning';
|
||||||
|
import { NoProtectionsdNoteWarningDirective } from './components/NoProtectionsNoteWarning';
|
||||||
|
|
||||||
|
|
||||||
function reloadHiddenFirefoxTab(): boolean {
|
function reloadHiddenFirefoxTab(): boolean {
|
||||||
@@ -138,12 +138,12 @@ const startApplication: StartApplication = async function startApplication(
|
|||||||
.directive('menuRow', () => new MenuRow())
|
.directive('menuRow', () => new MenuRow())
|
||||||
.directive('panelResizer', () => new PanelResizer())
|
.directive('panelResizer', () => new PanelResizer())
|
||||||
.directive('passwordWizard', () => new PasswordWizard())
|
.directive('passwordWizard', () => new PasswordWizard())
|
||||||
.directive('permissionsModal', () => new PermissionsModal())
|
|
||||||
.directive('revisionPreviewModal', () => new RevisionPreviewModal())
|
.directive('revisionPreviewModal', () => new RevisionPreviewModal())
|
||||||
.directive('historyMenu', () => new HistoryMenu())
|
.directive('historyMenu', () => new HistoryMenu())
|
||||||
.directive('syncResolutionMenu', () => new SyncResolutionMenu())
|
.directive('syncResolutionMenu', () => new SyncResolutionMenu())
|
||||||
.directive('sessionsModal', SessionsModalDirective)
|
.directive('sessionsModal', SessionsModalDirective)
|
||||||
.directive('noAccountWarning', NoAccountWarningDirective);
|
.directive('noAccountWarning', NoAccountWarningDirective)
|
||||||
|
.directive('protectedNotePanel', NoProtectionsdNoteWarningDirective);
|
||||||
|
|
||||||
// Filters
|
// Filters
|
||||||
angular.module('app').filter('trusted', ['$sce', trusted]);
|
angular.module('app').filter('trusted', ['$sce', trusted]);
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ import { toDirective, useAutorunValue } from './utils';
|
|||||||
import Close from '../../icons/ic_close.svg';
|
import Close from '../../icons/ic_close.svg';
|
||||||
import { AppState } from '@/ui_models/app_state';
|
import { AppState } from '@/ui_models/app_state';
|
||||||
|
|
||||||
function NoAccountWarning({ appState }: { appState: AppState }) {
|
type Props = { appState: AppState };
|
||||||
|
|
||||||
|
function NoAccountWarning({ appState }: Props) {
|
||||||
const canShow = useAutorunValue(() => appState.noAccountWarning.show);
|
const canShow = useAutorunValue(() => appState.noAccountWarning.show);
|
||||||
if (!canShow) {
|
if (!canShow) {
|
||||||
return null;
|
return null;
|
||||||
@@ -14,7 +16,7 @@ function NoAccountWarning({ appState }: { appState: AppState }) {
|
|||||||
Sign in or register to back up your notes.
|
Sign in or register to back up your notes.
|
||||||
</p>
|
</p>
|
||||||
<button
|
<button
|
||||||
className="sn-btn mt-3 col-start-1 col-end-3 justify-self-start"
|
className="sn-button info mt-3 col-start-1 col-end-3 justify-self-start"
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
appState.accountMenu.setShow(true);
|
appState.accountMenu.setShow(true);
|
||||||
@@ -28,12 +30,13 @@ function NoAccountWarning({ appState }: { appState: AppState }) {
|
|||||||
}}
|
}}
|
||||||
title="Ignore"
|
title="Ignore"
|
||||||
label="Ignore"
|
label="Ignore"
|
||||||
|
style="height: 20px"
|
||||||
className="border-0 m-0 p-0 bg-transparent cursor-pointer rounded-md col-start-2 row-start-1 color-neutral hover:color-info"
|
className="border-0 m-0 p-0 bg-transparent cursor-pointer rounded-md col-start-2 row-start-1 color-neutral hover:color-info"
|
||||||
>
|
>
|
||||||
<Close className="fill-current" />
|
<Close className="fill-current block" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const NoAccountWarningDirective = toDirective(NoAccountWarning);
|
export const NoAccountWarningDirective = toDirective<Props>(NoAccountWarning);
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import { AppState } from '@/ui_models/app_state';
|
||||||
|
import { toDirective } from './utils';
|
||||||
|
|
||||||
|
type Props = { appState: AppState; onViewNote: () => void };
|
||||||
|
|
||||||
|
function NoProtectionsNoteWarning({ appState, onViewNote }: Props) {
|
||||||
|
console.log("🚀 ~ file: NoProtectionsNoteWarning.tsx ~ line 7 ~ NoProtectionsNoteWarning ~ onViewNote", onViewNote)
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col items-center justify-center text-center max-w-md">
|
||||||
|
<h1 className="text-2xl m-0 w-full">This note is protected</h1>
|
||||||
|
<p className="text-lg mt-2 w-full">
|
||||||
|
Add a passcode or create an account to require authentication to view
|
||||||
|
this note.
|
||||||
|
</p>
|
||||||
|
<div className="mt-4 flex gap-3">
|
||||||
|
<button
|
||||||
|
className="sn-button info"
|
||||||
|
onClick={() => {
|
||||||
|
appState.accountMenu.setShow(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Open account menu
|
||||||
|
</button>
|
||||||
|
<button className="sn-button outlined" onClick={onViewNote}>
|
||||||
|
View note
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export const NoProtectionsdNoteWarningDirective = toDirective<Props>(
|
||||||
|
NoProtectionsNoteWarning,
|
||||||
|
{
|
||||||
|
onViewNote: '&',
|
||||||
|
}
|
||||||
|
);
|
||||||
@@ -171,7 +171,7 @@ const SessionsModal: FunctionComponent<{
|
|||||||
{formatter.format(session.updated_at)}
|
{formatter.format(session.updated_at)}
|
||||||
</p>
|
</p>
|
||||||
<button
|
<button
|
||||||
className="sk-button danger sk-label"
|
className="sn-button danger sk-label"
|
||||||
disabled={session.revoking}
|
disabled={session.revoking}
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
setRevokingSessionUuid(session.uuid)
|
setRevokingSessionUuid(session.uuid)
|
||||||
@@ -210,17 +210,16 @@ const SessionsModal: FunctionComponent<{
|
|||||||
<AlertDialogDescription className="sk-panel-row">
|
<AlertDialogDescription className="sk-panel-row">
|
||||||
<p>{SessionStrings.RevokeText}</p>
|
<p>{SessionStrings.RevokeText}</p>
|
||||||
</AlertDialogDescription>
|
</AlertDialogDescription>
|
||||||
<div className="sk-panel-row">
|
<div className="flex my-1 gap-2">
|
||||||
<div className="sk-button-group">
|
|
||||||
<button
|
<button
|
||||||
className="sk-button neutral sk-label"
|
className="sn-button neutral sk-label"
|
||||||
ref={cancelRevokeRef}
|
ref={cancelRevokeRef}
|
||||||
onClick={closeRevokeSessionAlert}
|
onClick={closeRevokeSessionAlert}
|
||||||
>
|
>
|
||||||
<span>{SessionStrings.RevokeCancelButton}</span>
|
<span>{SessionStrings.RevokeCancelButton}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
className="sk-button danger sk-label"
|
className="sn-button danger sk-label"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
closeRevokeSessionAlert();
|
closeRevokeSessionAlert();
|
||||||
revokeSession(confirmRevokingSessionUuid);
|
revokeSession(confirmRevokingSessionUuid);
|
||||||
@@ -228,7 +227,6 @@ const SessionsModal: FunctionComponent<{
|
|||||||
>
|
>
|
||||||
<span>{SessionStrings.RevokeConfirmButton}</span>
|
<span>{SessionStrings.RevokeConfirmButton}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -20,11 +20,9 @@ export function useAutorun(
|
|||||||
useEffect(() => autorun(view, opts), [view, opts]);
|
useEffect(() => autorun(view, opts), [view, opts]);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function toDirective(
|
export function toDirective<Props>(
|
||||||
component: FunctionComponent<{
|
component: FunctionComponent<Props>,
|
||||||
application: WebApplication;
|
scope: Record<string, '=' | '&'> = {}
|
||||||
appState: AppState;
|
|
||||||
}>
|
|
||||||
) {
|
) {
|
||||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||||
return function () {
|
return function () {
|
||||||
@@ -37,10 +35,7 @@ export function toDirective(
|
|||||||
return {
|
return {
|
||||||
$onChanges() {
|
$onChanges() {
|
||||||
render(
|
render(
|
||||||
h(component, {
|
h(component, $scope),
|
||||||
application: $scope.application,
|
|
||||||
appState: $scope.appState,
|
|
||||||
}),
|
|
||||||
$element[0]
|
$element[0]
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@@ -50,6 +45,7 @@ export function toDirective(
|
|||||||
scope: {
|
scope: {
|
||||||
application: '=',
|
application: '=',
|
||||||
appState: '=',
|
appState: '=',
|
||||||
|
...scope,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ export { InputModal } from './inputModal';
|
|||||||
export { MenuRow } from './menuRow';
|
export { MenuRow } from './menuRow';
|
||||||
export { PanelResizer } from './panelResizer';
|
export { PanelResizer } from './panelResizer';
|
||||||
export { PasswordWizard } from './passwordWizard';
|
export { PasswordWizard } from './passwordWizard';
|
||||||
export { PermissionsModal } from './permissionsModal';
|
|
||||||
export { RevisionPreviewModal } from './revisionPreviewModal';
|
export { RevisionPreviewModal } from './revisionPreviewModal';
|
||||||
export { HistoryMenu } from './historyMenu';
|
export { HistoryMenu } from './historyMenu';
|
||||||
export { SyncResolutionMenu } from './syncResolutionMenu';
|
export { SyncResolutionMenu } from './syncResolutionMenu';
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
import { WebDirective } from './../../types';
|
|
||||||
import template from '%/directives/permissions-modal.pug';
|
|
||||||
|
|
||||||
class PermissionsModalCtrl {
|
|
||||||
|
|
||||||
$element: JQLite
|
|
||||||
callback!: (success: boolean) => void
|
|
||||||
|
|
||||||
/* @ngInject */
|
|
||||||
constructor($element: JQLite) {
|
|
||||||
this.$element = $element;
|
|
||||||
}
|
|
||||||
|
|
||||||
dismiss() {
|
|
||||||
const elem = this.$element;
|
|
||||||
const scope = elem.scope();
|
|
||||||
scope.$destroy();
|
|
||||||
elem.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
accept() {
|
|
||||||
this.callback(true);
|
|
||||||
this.dismiss();
|
|
||||||
}
|
|
||||||
|
|
||||||
deny() {
|
|
||||||
this.callback(false);
|
|
||||||
this.dismiss();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class PermissionsModal extends WebDirective {
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
this.restrict = 'E';
|
|
||||||
this.template = template;
|
|
||||||
this.controller = PermissionsModalCtrl;
|
|
||||||
this.controllerAs = 'ctrl';
|
|
||||||
this.bindToController = true;
|
|
||||||
this.scope = {
|
|
||||||
show: '=',
|
|
||||||
component: '=',
|
|
||||||
permissionsString: '=',
|
|
||||||
callback: '='
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,6 @@
|
|||||||
import '@reach/dialog/styles.css';
|
import '@reach/dialog/styles.css';
|
||||||
import 'sn-stylekit/dist/stylekit.css';
|
import 'sn-stylekit/dist/stylekit.css';
|
||||||
import '../stylesheets/index.css.scss';
|
import '../stylesheets/index.css.scss';
|
||||||
// import '../stylesheets/_reach-sub.scss';
|
|
||||||
|
|
||||||
// Vendor
|
// Vendor
|
||||||
import 'angular';
|
import 'angular';
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
.sk-sublabel(ng-if='descriptor.identifier == ctrl.activeApplication.identifier')
|
.sk-sublabel(ng-if='descriptor.identifier == ctrl.activeApplication.identifier')
|
||||||
| Current Application
|
| Current Application
|
||||||
.sk-menu-panel-column(ng-if='descriptor.identifier == ctrl.activeApplication.identifier')
|
.sk-menu-panel-column(ng-if='descriptor.identifier == ctrl.activeApplication.identifier')
|
||||||
.sk-button.success(
|
button.sn-button.success(
|
||||||
ng-click='ctrl.renameDescriptor($event, descriptor)'
|
ng-click='ctrl.renameDescriptor($event, descriptor)'
|
||||||
)
|
) Rename
|
||||||
.sk-label Rename
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
.main-ui-view(
|
.main-ui-view.sn-component(
|
||||||
ng-class='self.platformString'
|
ng-class='self.platformString'
|
||||||
)
|
)
|
||||||
#app.app(
|
#app.app(
|
||||||
|
|||||||
@@ -279,18 +279,16 @@ function ChallengeModalView({ ctrl }: { ctrl: ChallengeModalCtrl }) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="sk-panel-footer extra-padding">
|
<div className="sk-panel-footer extra-padding">
|
||||||
<div
|
<button
|
||||||
className={
|
className={
|
||||||
'sk-button big block bold ' +
|
'sn-button w-full py-3 text-base ' +
|
||||||
(ctrl.state.processing ? 'neutral' : 'info')
|
(ctrl.state.processing ? 'neutral' : 'info')
|
||||||
}
|
}
|
||||||
disabled={ctrl.state.processing}
|
disabled={ctrl.state.processing}
|
||||||
onClick={() => ctrl.submit()}
|
onClick={() => ctrl.submit()}
|
||||||
>
|
>
|
||||||
<div className="sk-label">
|
{ctrl.state.processing ? 'Generating Keys…' : 'Submit'}
|
||||||
{ctrl.state.processing ? 'Generating Keys…' : 'Submit'}
|
</button>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{ctrl.challenge.cancelable && (
|
{ctrl.challenge.cancelable && (
|
||||||
<>
|
<>
|
||||||
<div className="sk-panel-row"></div>
|
<div className="sk-panel-row"></div>
|
||||||
|
|||||||
@@ -1,267 +1,275 @@
|
|||||||
#editor-column.section.editor.sn-component(aria-label='Note')
|
#editor-column.section.editor.sn-component(aria-label='Note')
|
||||||
.sn-component
|
protected-note-panel.h-full.flex.justify-center.items-center(
|
||||||
.sk-app-bar.no-edges(
|
ng-if='self.note.protected && !self.state.showEditor'
|
||||||
ng-if='self.noteLocked',
|
app-state='self.appState'
|
||||||
ng-init="self.lockText = 'Note Locked'",
|
on-view-note='self.dismissProtectedWarning()'
|
||||||
ng-mouseleave="self.lockText = 'Note Locked'",
|
)
|
||||||
ng-mouseover="self.lockText = 'Unlock'"
|
div(
|
||||||
)
|
ng-if='self.state.showEditor'
|
||||||
.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.noteLocked}",
|
|
||||||
ng-show='self.note && !self.note.errorDecrypting'
|
|
||||||
)
|
|
||||||
.title
|
|
||||||
input#note-title-editor.input(
|
|
||||||
ng-blur='self.onTitleBlur()',
|
|
||||||
ng-change='self.onTitleChange()',
|
|
||||||
ng-disabled='self.noteLocked',
|
|
||||||
ng-focus='self.onTitleFocus()',
|
|
||||||
ng-keyup='$event.keyCode == 13 && self.onTitleEnter($event)',
|
|
||||||
ng-model='self.editorValues.title',
|
|
||||||
select-on-focus='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 && !self.note.errorDecrypting')
|
|
||||||
component-view.component-view(
|
|
||||||
component-uuid='self.state.tagsComponent.uuid',
|
|
||||||
ng-class="{'locked' : self.noteLocked}",
|
|
||||||
ng-style="self.noteLocked && {'pointer-events' : 'none'}",
|
|
||||||
application='self.application'
|
|
||||||
)
|
|
||||||
input.tags-input(
|
|
||||||
ng-blur='self.onTagsInputBlur()',
|
|
||||||
ng-disabled='self.noteLocked',
|
|
||||||
ng-if='!self.state.tagsComponent',
|
|
||||||
ng-keyup='$event.keyCode == 13 && $event.target.blur();',
|
|
||||||
ng-model='self.editorValues.tagsInputValue',
|
|
||||||
placeholder='#tags',
|
|
||||||
spellcheck='false',
|
|
||||||
type='text'
|
|
||||||
)
|
|
||||||
.sn-component(ng-if='self.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.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.note.archived ? 'Unarchive' : 'Archive'"
|
|
||||||
)
|
|
||||||
menu-row(
|
|
||||||
action='self.selectedMenuItem(true); self.toggleLockNote()'
|
|
||||||
desc="'Locking notes prevents unintentional editing'",
|
|
||||||
label="self.noteLocked ? 'Unlock' : 'Lock'"
|
|
||||||
)
|
|
||||||
menu-row(
|
|
||||||
action='self.selectedMenuItem(true); self.toggleProtectNote()'
|
|
||||||
desc=`'Protecting a note will require credentials to view it'`,
|
|
||||||
label="self.note.protected ? 'Unprotect' : 'Protect'"
|
|
||||||
)
|
|
||||||
menu-row(
|
|
||||||
action='self.selectedMenuItem(true); self.toggleNotePreview()'
|
|
||||||
circle="self.note.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.note.trashed && !self.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.note.trashed && self.note.errorDecrypting',
|
|
||||||
stylekit-class="'danger'"
|
|
||||||
)
|
|
||||||
div(ng-if='self.note.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.note.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.note.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.toggleWebPrefKey(self.prefKeyMonospace)"
|
|
||||||
circle="self.state.monospaceFont ? 'success' : 'neutral'",
|
|
||||||
desc="'Toggles the font style for the default editor'",
|
|
||||||
disabled='self.state.editorComponent',
|
|
||||||
label="'Monospace Font'",
|
|
||||||
subtitle="self.state.editorComponent ? 'Not available with editor extensions' : null"
|
|
||||||
)
|
|
||||||
menu-row(
|
|
||||||
action="self.selectedMenuItem(true); self.toggleWebPrefKey(self.prefKeySpellcheck)"
|
|
||||||
circle="self.state.spellcheck ? 'success' : 'neutral'",
|
|
||||||
desc="'Toggles spellcheck for the default editor'",
|
|
||||||
disabled='self.state.editorComponent',
|
|
||||||
label="'Spellcheck'",
|
|
||||||
subtitle=`
|
|
||||||
self.state.editorComponent
|
|
||||||
? 'Not available with editor extensions'
|
|
||||||
: (self.state.isDesktop ? 'May degrade editor performance' : null)
|
|
||||||
`)
|
|
||||||
menu-row(
|
|
||||||
action="self.selectedMenuItem(true); self.toggleWebPrefKey(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.note',
|
|
||||||
ng-if='self.state.showEditorMenu',
|
|
||||||
selected-editor-uuid='self.state.editorComponent && self.state.editorComponent.uuid',
|
|
||||||
application='self.application'
|
|
||||||
)
|
|
||||||
.sk-app-bar-item(
|
|
||||||
click-outside=`self.setMenuState('showActionsMenu', false)`,
|
|
||||||
is-open='self.state.showActionsMenu',
|
|
||||||
ng-class="{'selected' : self.state.showActionsMenu}",
|
|
||||||
ng-click="self.toggleMenu('showActionsMenu')"
|
|
||||||
)
|
|
||||||
.sk-label Actions
|
|
||||||
actions-menu(
|
|
||||||
item='self.note',
|
|
||||||
ng-if='self.state.showActionsMenu',
|
|
||||||
application='self.application'
|
|
||||||
)
|
|
||||||
.sk-app-bar-item(
|
|
||||||
click-outside=`self.setMenuState('showHistoryMenu', false)`,
|
|
||||||
is-open='self.state.showHistoryMenu',
|
|
||||||
ng-class="{'selected' : self.state.showHistoryMenu}",
|
|
||||||
ng-click="self.toggleMenu('showHistoryMenu')"
|
|
||||||
)
|
|
||||||
.sk-label History
|
|
||||||
history-menu(
|
|
||||||
item='self.note',
|
|
||||||
ng-if='self.state.showHistoryMenu',
|
|
||||||
application='self.application'
|
|
||||||
)
|
|
||||||
#editor-content.editor-content(ng-if='!self.note.errorDecrypting')
|
|
||||||
panel-resizer.left(
|
|
||||||
control='self.leftPanelPuppet',
|
|
||||||
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-uuid='self.state.editorComponent.uuid',
|
|
||||||
ng-if='self.state.editorComponent && !self.state.editorUnloading',
|
|
||||||
on-load='self.onEditorLoad',
|
|
||||||
application='self.application'
|
|
||||||
)
|
|
||||||
textarea#note-text-editor.editable.font-editor(
|
|
||||||
dir='auto',
|
|
||||||
ng-attr-spellcheck='{{self.state.spellcheck}}',
|
|
||||||
ng-change='self.contentChanged()',
|
|
||||||
ng-click='self.clickedTextArea()',
|
|
||||||
ng-focus='self.onContentFocus()',
|
|
||||||
ng-if='!self.state.editorComponent && !self.state.textareaUnloading',
|
|
||||||
ng-model='self.editorValues.text',
|
|
||||||
ng-model-options='{ debounce: self.state.editorDebounce}',
|
|
||||||
ng-readonly='self.noteLocked',
|
|
||||||
ng-trim='false'
|
|
||||||
autocomplete='off'
|
|
||||||
)
|
|
||||||
| {{self.onSystemEditorLoad()}}
|
|
||||||
panel-resizer(
|
|
||||||
control='self.rightPanelPuppet',
|
|
||||||
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.note.errorDecrypting')
|
|
||||||
.sn-component#error-decrypting-container
|
|
||||||
.sk-panel#error-decrypting-panel
|
|
||||||
.sk-panel-header
|
|
||||||
.sk-panel-header-title {{self.note.waitingForKey ? 'Waiting for Key' : 'Unable to Decrypt'}}
|
|
||||||
.sk-panel-content
|
|
||||||
.sk-panel-section
|
|
||||||
p.sk-p(ng-if='self.note.waitingForKey')
|
|
||||||
| This note is awaiting its encryption key to be ready. Please wait for syncing to complete
|
|
||||||
| for this note to be decrypted.
|
|
||||||
p.sk-p(ng-if='!self.note.waitingForKey')
|
|
||||||
| 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-if='!self.note.errorDecrypting' ng-show='self.note')
|
|
||||||
#component-stack-menu-bar.sk-app-bar.no-edges(ng-if='self.state.stackComponents.length')
|
|
||||||
.left
|
|
||||||
.sk-app-bar-item(
|
|
||||||
ng-repeat='component in self.state.stackComponents track by component.uuid'
|
|
||||||
ng-click='self.toggleStackComponentForCurrentItem(component)',
|
|
||||||
)
|
|
||||||
.sk-app-bar-item-column
|
|
||||||
.sk-circle.small(
|
|
||||||
ng-class="{'info' : !self.stackComponentHidden(component) && component.active, 'neutral' : self.stackComponentHidden(component) || !component.active}"
|
|
||||||
)
|
|
||||||
.sk-app-bar-item-column
|
|
||||||
.sk-label {{component.name}}
|
|
||||||
.sn-component
|
.sn-component
|
||||||
component-view.component-view.component-stack-item(
|
.sk-app-bar.no-edges(
|
||||||
ng-repeat='component in self.state.stackComponents track by component.uuid',
|
ng-if='self.noteLocked',
|
||||||
component-uuid='component.uuid',
|
ng-init="self.lockText = 'Note Locked'",
|
||||||
manual-dealloc='true',
|
ng-mouseleave="self.lockText = 'Note Locked'",
|
||||||
ng-show='!self.stackComponentHidden(component)',
|
ng-mouseover="self.lockText = 'Unlock'"
|
||||||
application='self.application'
|
)
|
||||||
|
.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.noteLocked}",
|
||||||
|
ng-show='self.note && !self.note.errorDecrypting'
|
||||||
)
|
)
|
||||||
|
.title
|
||||||
|
input#note-title-editor.input(
|
||||||
|
ng-blur='self.onTitleBlur()',
|
||||||
|
ng-change='self.onTitleChange()',
|
||||||
|
ng-disabled='self.noteLocked',
|
||||||
|
ng-focus='self.onTitleFocus()',
|
||||||
|
ng-keyup='$event.keyCode == 13 && self.onTitleEnter($event)',
|
||||||
|
ng-model='self.editorValues.title',
|
||||||
|
select-on-focus='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 && !self.note.errorDecrypting')
|
||||||
|
component-view.component-view(
|
||||||
|
component-uuid='self.state.tagsComponent.uuid',
|
||||||
|
ng-class="{'locked' : self.noteLocked}",
|
||||||
|
ng-style="self.noteLocked && {'pointer-events' : 'none'}",
|
||||||
|
application='self.application'
|
||||||
|
)
|
||||||
|
input.tags-input(
|
||||||
|
ng-blur='self.onTagsInputBlur()',
|
||||||
|
ng-disabled='self.noteLocked',
|
||||||
|
ng-if='!self.state.tagsComponent',
|
||||||
|
ng-keyup='$event.keyCode == 13 && $event.target.blur();',
|
||||||
|
ng-model='self.editorValues.tagsInputValue',
|
||||||
|
placeholder='#tags',
|
||||||
|
spellcheck='false',
|
||||||
|
type='text'
|
||||||
|
)
|
||||||
|
.sn-component(ng-if='self.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.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.note.archived ? 'Unarchive' : 'Archive'"
|
||||||
|
)
|
||||||
|
menu-row(
|
||||||
|
action='self.selectedMenuItem(true); self.toggleLockNote()'
|
||||||
|
desc="'Locking notes prevents unintentional editing'",
|
||||||
|
label="self.noteLocked ? 'Unlock' : 'Lock'"
|
||||||
|
)
|
||||||
|
menu-row(
|
||||||
|
action='self.selectedMenuItem(true); self.toggleProtectNote()'
|
||||||
|
desc=`'Protecting a note will require credentials to view it'`,
|
||||||
|
label="self.note.protected ? 'Unprotect' : 'Protect'"
|
||||||
|
)
|
||||||
|
menu-row(
|
||||||
|
action='self.selectedMenuItem(true); self.toggleNotePreview()'
|
||||||
|
circle="self.note.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.note.trashed && !self.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.note.trashed && self.note.errorDecrypting',
|
||||||
|
stylekit-class="'danger'"
|
||||||
|
)
|
||||||
|
div(ng-if='self.note.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.note.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.note.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.toggleWebPrefKey(self.prefKeyMonospace)"
|
||||||
|
circle="self.state.monospaceFont ? 'success' : 'neutral'",
|
||||||
|
desc="'Toggles the font style for the default editor'",
|
||||||
|
disabled='self.state.editorComponent',
|
||||||
|
label="'Monospace Font'",
|
||||||
|
subtitle="self.state.editorComponent ? 'Not available with editor extensions' : null"
|
||||||
|
)
|
||||||
|
menu-row(
|
||||||
|
action="self.selectedMenuItem(true); self.toggleWebPrefKey(self.prefKeySpellcheck)"
|
||||||
|
circle="self.state.spellcheck ? 'success' : 'neutral'",
|
||||||
|
desc="'Toggles spellcheck for the default editor'",
|
||||||
|
disabled='self.state.editorComponent',
|
||||||
|
label="'Spellcheck'",
|
||||||
|
subtitle=`
|
||||||
|
self.state.editorComponent
|
||||||
|
? 'Not available with editor extensions'
|
||||||
|
: (self.state.isDesktop ? 'May degrade editor performance' : null)
|
||||||
|
`)
|
||||||
|
menu-row(
|
||||||
|
action="self.selectedMenuItem(true); self.toggleWebPrefKey(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.note',
|
||||||
|
ng-if='self.state.showEditorMenu',
|
||||||
|
selected-editor-uuid='self.state.editorComponent && self.state.editorComponent.uuid',
|
||||||
|
application='self.application'
|
||||||
|
)
|
||||||
|
.sk-app-bar-item(
|
||||||
|
click-outside=`self.setMenuState('showActionsMenu', false)`,
|
||||||
|
is-open='self.state.showActionsMenu',
|
||||||
|
ng-class="{'selected' : self.state.showActionsMenu}",
|
||||||
|
ng-click="self.toggleMenu('showActionsMenu')"
|
||||||
|
)
|
||||||
|
.sk-label Actions
|
||||||
|
actions-menu(
|
||||||
|
item='self.note',
|
||||||
|
ng-if='self.state.showActionsMenu',
|
||||||
|
application='self.application'
|
||||||
|
)
|
||||||
|
.sk-app-bar-item(
|
||||||
|
click-outside=`self.setMenuState('showHistoryMenu', false)`,
|
||||||
|
is-open='self.state.showHistoryMenu',
|
||||||
|
ng-class="{'selected' : self.state.showHistoryMenu}",
|
||||||
|
ng-click="self.toggleMenu('showHistoryMenu')"
|
||||||
|
)
|
||||||
|
.sk-label History
|
||||||
|
history-menu(
|
||||||
|
item='self.note',
|
||||||
|
ng-if='self.state.showHistoryMenu',
|
||||||
|
application='self.application'
|
||||||
|
)
|
||||||
|
#editor-content.editor-content(ng-if='!self.note.errorDecrypting')
|
||||||
|
panel-resizer.left(
|
||||||
|
control='self.leftPanelPuppet',
|
||||||
|
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-uuid='self.state.editorComponent.uuid',
|
||||||
|
ng-if='self.state.editorComponent && !self.state.editorUnloading',
|
||||||
|
on-load='self.onEditorLoad',
|
||||||
|
application='self.application'
|
||||||
|
)
|
||||||
|
textarea#note-text-editor.editable.font-editor(
|
||||||
|
dir='auto',
|
||||||
|
ng-attr-spellcheck='{{self.state.spellcheck}}',
|
||||||
|
ng-change='self.contentChanged()',
|
||||||
|
ng-click='self.clickedTextArea()',
|
||||||
|
ng-focus='self.onContentFocus()',
|
||||||
|
ng-if='!self.state.editorComponent && !self.state.textareaUnloading',
|
||||||
|
ng-model='self.editorValues.text',
|
||||||
|
ng-model-options='{ debounce: self.state.editorDebounce}',
|
||||||
|
ng-readonly='self.noteLocked',
|
||||||
|
ng-trim='false'
|
||||||
|
autocomplete='off'
|
||||||
|
)
|
||||||
|
| {{self.onSystemEditorLoad()}}
|
||||||
|
panel-resizer(
|
||||||
|
control='self.rightPanelPuppet',
|
||||||
|
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.note.errorDecrypting')
|
||||||
|
.sn-component#error-decrypting-container
|
||||||
|
.sk-panel#error-decrypting-panel
|
||||||
|
.sk-panel-header
|
||||||
|
.sk-panel-header-title {{self.note.waitingForKey ? 'Waiting for Key' : 'Unable to Decrypt'}}
|
||||||
|
.sk-panel-content
|
||||||
|
.sk-panel-section
|
||||||
|
p.sk-p(ng-if='self.note.waitingForKey')
|
||||||
|
| This note is awaiting its encryption key to be ready. Please wait for syncing to complete
|
||||||
|
| for this note to be decrypted.
|
||||||
|
p.sk-p(ng-if='!self.note.waitingForKey')
|
||||||
|
| 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-if='!self.note.errorDecrypting' ng-show='self.note')
|
||||||
|
#component-stack-menu-bar.sk-app-bar.no-edges(ng-if='self.state.stackComponents.length')
|
||||||
|
.left
|
||||||
|
.sk-app-bar-item(
|
||||||
|
ng-repeat='component in self.state.stackComponents track by component.uuid'
|
||||||
|
ng-click='self.toggleStackComponentForCurrentItem(component)',
|
||||||
|
)
|
||||||
|
.sk-app-bar-item-column
|
||||||
|
.sk-circle.small(
|
||||||
|
ng-class="{'info' : !self.stackComponentHidden(component) && component.active, 'neutral' : self.stackComponentHidden(component) || !component.active}"
|
||||||
|
)
|
||||||
|
.sk-app-bar-item-column
|
||||||
|
.sk-label {{component.name}}
|
||||||
|
.sn-component
|
||||||
|
component-view.component-view.component-stack-item(
|
||||||
|
ng-repeat='component in self.state.stackComponents track by component.uuid',
|
||||||
|
component-uuid='component.uuid',
|
||||||
|
manual-dealloc='true',
|
||||||
|
ng-show='!self.stackComponentHidden(component)',
|
||||||
|
application='self.application'
|
||||||
|
)
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ type EditorState = {
|
|||||||
textareaUnloading: boolean
|
textareaUnloading: boolean
|
||||||
/** Fields that can be directly mutated by the template */
|
/** Fields that can be directly mutated by the template */
|
||||||
mutable: any
|
mutable: any
|
||||||
|
showEditor: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
type EditorValues = {
|
type EditorValues = {
|
||||||
@@ -223,7 +224,8 @@ class EditorViewCtrl extends PureViewCtrl<unknown, EditorState> {
|
|||||||
textareaUnloading: false,
|
textareaUnloading: false,
|
||||||
mutable: {
|
mutable: {
|
||||||
tagsString: ''
|
tagsString: ''
|
||||||
}
|
},
|
||||||
|
showEditor: false,
|
||||||
} as EditorState;
|
} as EditorState;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,15 +274,17 @@ class EditorViewCtrl extends PureViewCtrl<unknown, EditorState> {
|
|||||||
|
|
||||||
async handleEditorNoteChange() {
|
async handleEditorNoteChange() {
|
||||||
this.cancelPendingSetStatus();
|
this.cancelPendingSetStatus();
|
||||||
|
const note = this.editor.note;
|
||||||
|
const showEditor = !note.protected;
|
||||||
await this.setState({
|
await this.setState({
|
||||||
showActionsMenu: false,
|
showActionsMenu: false,
|
||||||
showOptionsMenu: false,
|
showOptionsMenu: false,
|
||||||
showEditorMenu: false,
|
showEditorMenu: false,
|
||||||
showHistoryMenu: false,
|
showHistoryMenu: false,
|
||||||
altKeyDown: false,
|
altKeyDown: false,
|
||||||
noteStatus: undefined
|
noteStatus: undefined,
|
||||||
|
showEditor,
|
||||||
});
|
});
|
||||||
const note = this.editor.note;
|
|
||||||
this.editorValues.title = note.title;
|
this.editorValues.title = note.title;
|
||||||
this.editorValues.text = note.text;
|
this.editorValues.text = note.text;
|
||||||
this.reloadEditor();
|
this.reloadEditor();
|
||||||
@@ -288,11 +292,18 @@ class EditorViewCtrl extends PureViewCtrl<unknown, EditorState> {
|
|||||||
this.reloadPreferences();
|
this.reloadPreferences();
|
||||||
this.reloadStackComponents();
|
this.reloadStackComponents();
|
||||||
this.reloadNoteTagsComponent();
|
this.reloadNoteTagsComponent();
|
||||||
if (note.safeText().length === 0) {
|
if (note.safeText().length === 0 && showEditor) {
|
||||||
this.focusTitle();
|
this.focusTitle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async dismissProtectedWarning() {
|
||||||
|
await this.setState({
|
||||||
|
showEditor: true
|
||||||
|
});
|
||||||
|
this.focusTitle();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Because note.locked accesses note.content.appData,
|
* Because note.locked accesses note.content.appData,
|
||||||
* we do not want to expose the template to direct access to note.locked,
|
* we do not want to expose the template to direct access to note.locked,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
editor-view(
|
.flex-grow(
|
||||||
ng-repeat='editor in self.editors'
|
ng-repeat='editor in self.editors'
|
||||||
application='self.application'
|
)
|
||||||
editor='editor'
|
editor-view(
|
||||||
|
application='self.application'
|
||||||
|
editor='editor'
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
/* Generic UI controls that have yet to be extracted into Stylekit */
|
|
||||||
|
|
||||||
.sn-btn {
|
|
||||||
@extend .border-0;
|
|
||||||
@extend .bg-main;
|
|
||||||
@extend .cursor-pointer;
|
|
||||||
@extend .capitalize;
|
|
||||||
@extend .font-bold;
|
|
||||||
@extend .py-2;
|
|
||||||
@extend .px-3;
|
|
||||||
@extend .rounded;
|
|
||||||
@extend .text-info-contrast;
|
|
||||||
@extend .text-sm;
|
|
||||||
|
|
||||||
@extend .hover\:brightness-130;
|
|
||||||
}
|
|
||||||
@@ -81,14 +81,6 @@ $screen-md-max: ($screen-lg-min - 1) !default;
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.flex {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.flex-column {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.self-start {
|
.self-start {
|
||||||
align-self: flex-start;
|
align-self: flex-start;
|
||||||
}
|
}
|
||||||
@@ -226,6 +218,12 @@ $screen-md-max: ($screen-lg-min - 1) !default;
|
|||||||
.grid-template-cols-1fr {
|
.grid-template-cols-1fr {
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
|
.col-span-all {
|
||||||
|
grid-column: 1 / -1;
|
||||||
|
}
|
||||||
|
.grid-col-2 {
|
||||||
|
grid-column: 2;
|
||||||
|
}
|
||||||
|
|
||||||
.relative {
|
.relative {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|||||||
@@ -11,4 +11,3 @@
|
|||||||
@import "ionicons";
|
@import "ionicons";
|
||||||
@import "reach-sub";
|
@import "reach-sub";
|
||||||
@import "sessions-modal";
|
@import "sessions-modal";
|
||||||
@import "sn";
|
|
||||||
|
|||||||
@@ -12,12 +12,11 @@
|
|||||||
)
|
)
|
||||||
.sk-panel-row
|
.sk-panel-row
|
||||||
.sk-h1 Sign in or register to enable sync and end-to-end encryption.
|
.sk-h1 Sign in or register to enable sync and end-to-end encryption.
|
||||||
.sk-panel-row
|
.flex.gap-3.my-1
|
||||||
.sk-button-group.stretch
|
button.sn-button.info.flex-grow.text-base.py-3(ng-click='self.state.formData.showLogin = true')
|
||||||
.sk-button.info.featured(ng-click='self.state.formData.showLogin = true')
|
| Sign In
|
||||||
.sk-label Sign In
|
button.sn-button.info.flex-grow.text-base.py-3(ng-click='self.showRegister()')
|
||||||
.sk-button.info.featured(ng-click='self.showRegister()')
|
| Register
|
||||||
.sk-label Register
|
|
||||||
.sk-panel-row.sk-p
|
.sk-panel-row.sk-p
|
||||||
| Standard Notes is free on every platform, and comes
|
| Standard Notes is free on every platform, and comes
|
||||||
| standard with sync and encryption.
|
| standard with sync and encryption.
|
||||||
@@ -95,12 +94,10 @@
|
|||||||
target='_blank'
|
target='_blank'
|
||||||
) (Learn more)
|
) (Learn more)
|
||||||
.sk-panel-section.form-submit(ng-if='!self.state.formData.authenticating')
|
.sk-panel-section.form-submit(ng-if='!self.state.formData.authenticating')
|
||||||
.sk-button-group.stretch
|
button.sn-button.info.text-base.py-3.text-center(
|
||||||
.sk-button.info.featured(
|
ng-click='self.submitAuthForm()',
|
||||||
ng-click='self.submitAuthForm()',
|
ng-disabled='self.state.formData.authenticating'
|
||||||
ng-disabled='self.state.formData.authenticating'
|
) {{self.state.formData.showLogin ? "Sign In" : "Register"}}
|
||||||
)
|
|
||||||
.sk-label {{self.state.formData.showLogin ? "Sign In" : "Register"}}
|
|
||||||
.sk-notification.neutral(ng-if='self.state.formData.showRegister')
|
.sk-notification.neutral(ng-if='self.state.formData.showRegister')
|
||||||
.sk-notification-title No Password Reset.
|
.sk-notification-title No Password Reset.
|
||||||
.sk-notification-text
|
.sk-notification-text
|
||||||
@@ -174,17 +171,16 @@
|
|||||||
| or revoking an active session, require additional authentication
|
| or revoking an active session, require additional authentication
|
||||||
| like entering your account password or application passcode.
|
| like entering your account password or application passcode.
|
||||||
.sk-panel-row(ng-if="self.state.protectionsDisabledUntil")
|
.sk-panel-row(ng-if="self.state.protectionsDisabledUntil")
|
||||||
button.sk-button.info(ng-click="self.enableProtections()")
|
button.sn-button.info(ng-click="self.enableProtections()")
|
||||||
span.sk-label.capitalize Enable protections
|
| Enable protections
|
||||||
.sk-panel-section
|
.sk-panel-section
|
||||||
.sk-panel-section-title Passcode Lock
|
.sk-panel-section-title Passcode Lock
|
||||||
div(ng-if='!self.state.hasPasscode')
|
div(ng-if='!self.state.hasPasscode')
|
||||||
div(ng-if='self.state.canAddPasscode')
|
div(ng-if='self.state.canAddPasscode')
|
||||||
.sk-panel-row(ng-if='!self.state.formData.showPasscodeForm')
|
.sk-panel-row(ng-if='!self.state.formData.showPasscodeForm')
|
||||||
.sk-button.info(
|
button.sn-button.info(
|
||||||
ng-click='self.addPasscodeClicked(); $event.stopPropagation();'
|
ng-click='self.addPasscodeClicked(); $event.stopPropagation();'
|
||||||
)
|
) Add Passcode
|
||||||
.sk-label Add Passcode
|
|
||||||
p.sk-p
|
p.sk-p
|
||||||
| Add a passcode to lock the application and
|
| Add a passcode to lock the application and
|
||||||
| encrypt on-device key storage.
|
| encrypt on-device key storage.
|
||||||
@@ -211,12 +207,10 @@
|
|||||||
placeholder='Confirm Passcode',
|
placeholder='Confirm Passcode',
|
||||||
type='password'
|
type='password'
|
||||||
)
|
)
|
||||||
.sk-button-group.stretch.sk-panel-row.form-submit
|
button.sn-button.info.mt-2(type='submit') Set Passcode
|
||||||
button.sk-button.info(type='submit')
|
button.sn-button.outlined.ml-2(
|
||||||
.sk-label Set Passcode
|
|
||||||
a.neutral.sk-a.sk-panel-row(
|
|
||||||
ng-click='self.state.formData.showPasscodeForm = false'
|
ng-click='self.state.formData.showPasscodeForm = false'
|
||||||
) Cancel
|
) Cancel
|
||||||
div(ng-if='self.state.hasPasscode && !self.state.formData.showPasscodeForm')
|
div(ng-if='self.state.hasPasscode && !self.state.formData.showPasscodeForm')
|
||||||
.sk-panel-section-subtitle.info Passcode lock is enabled
|
.sk-panel-section-subtitle.info Passcode lock is enabled
|
||||||
.sk-notification.contrast
|
.sk-notification.contrast
|
||||||
@@ -245,7 +239,6 @@
|
|||||||
.sk-panel-section-title Data Backups
|
.sk-panel-section-title Data Backups
|
||||||
.sk-p
|
.sk-p
|
||||||
| Download a backup of all your data.
|
| Download a backup of all your data.
|
||||||
.sk-panel-row
|
|
||||||
form.sk-panel-form.sk-panel-row(ng-if='self.state.encryptionEnabled')
|
form.sk-panel-form.sk-panel-row(ng-if='self.state.encryptionEnabled')
|
||||||
.sk-input-group
|
.sk-input-group
|
||||||
label.sk-horizontal-group.tight
|
label.sk-horizontal-group.tight
|
||||||
@@ -265,17 +258,17 @@
|
|||||||
)
|
)
|
||||||
p.sk-p Decrypted
|
p.sk-p Decrypted
|
||||||
.sk-panel-row
|
.sk-panel-row
|
||||||
.sk-button-group.sk-panel-row.justify-left
|
.flex
|
||||||
.sk-button.info(ng-click='self.downloadDataArchive()')
|
button.sn-button.info(ng-click='self.downloadDataArchive()')
|
||||||
.sk-label Download Backup
|
| Download Backup
|
||||||
label.sk-button.info
|
label.sn-button.info.ml-2
|
||||||
input(
|
input(
|
||||||
file-change='->',
|
file-change='->',
|
||||||
handler='self.importFileSelected(files)',
|
handler='self.importFileSelected(files)',
|
||||||
style='display: none;',
|
style='display: none;',
|
||||||
type='file'
|
type='file'
|
||||||
)
|
)
|
||||||
.sk-label Import Backup
|
| Import Backup
|
||||||
span(ng-if='self.isDesktopApplication()')
|
span(ng-if='self.isDesktopApplication()')
|
||||||
| Backups are automatically created on desktop and can be managed
|
| Backups are automatically created on desktop and can be managed
|
||||||
| via the "Backups" top-level menu.
|
| via the "Backups" top-level menu.
|
||||||
@@ -296,8 +289,8 @@
|
|||||||
| local storage, and a new identifier will be created should you
|
| local storage, and a new identifier will be created should you
|
||||||
| decide to enable error reporting again in the future.
|
| decide to enable error reporting again in the future.
|
||||||
.sk-panel-row
|
.sk-panel-row
|
||||||
button(ng-click="self.toggleErrorReportingEnabled()").sk-button.info
|
button(ng-click="self.toggleErrorReportingEnabled()").sn-button.info
|
||||||
span.sk-label {{ self.state.errorReportingEnabled ? 'Disable' : 'Enable'}} Error Reporting
|
| {{ self.state.errorReportingEnabled ? 'Disable' : 'Enable'}} Error Reporting
|
||||||
.sk-panel-row
|
.sk-panel-row
|
||||||
a(ng-click="self.openErrorReportingDialog()").sk-a What data is being sent?
|
a(ng-click="self.openErrorReportingDialog()").sk-a What data is being sent?
|
||||||
.sk-panel-footer
|
.sk-panel-footer
|
||||||
@@ -313,7 +306,7 @@
|
|||||||
ng-if='self.state.formData.showLogin || self.state.formData.showRegister'
|
ng-if='self.state.formData.showLogin || self.state.formData.showRegister'
|
||||||
)
|
)
|
||||||
| Cancel
|
| Cancel
|
||||||
a.sk-a.right.danger(
|
a.sk-a.right.danger.capitalize(
|
||||||
ng-click='self.destroyLocalData()',
|
ng-click='self.destroyLocalData()',
|
||||||
ng-if=`
|
ng-if=`
|
||||||
!self.state.formData.showLogin &&
|
!self.state.formData.showLogin &&
|
||||||
|
|||||||
@@ -5,8 +5,7 @@
|
|||||||
.sk-label.warning There was an issue loading {{ctrl.component.name}}.
|
.sk-label.warning There was an issue loading {{ctrl.component.name}}.
|
||||||
.right
|
.right
|
||||||
.sk-app-bar-item(ng-click='ctrl.reloadIframe()')
|
.sk-app-bar-item(ng-click='ctrl.reloadIframe()')
|
||||||
.sk-button.info
|
button.sn-button.info Reload
|
||||||
.sk-label Reload
|
|
||||||
.sn-component(ng-if='ctrl.expired')
|
.sn-component(ng-if='ctrl.expired')
|
||||||
.sk-app-bar.no-edges.no-top-edge.dynamic-height
|
.sk-app-bar.no-edges.no-top-edge.dynamic-height
|
||||||
.left
|
.left
|
||||||
@@ -26,16 +25,14 @@
|
|||||||
| Extensions are in a read-only state.
|
| Extensions are in a read-only state.
|
||||||
.right
|
.right
|
||||||
.sk-app-bar-item(ng-click='ctrl.reloadStatus(true)')
|
.sk-app-bar-item(ng-click='ctrl.reloadStatus(true)')
|
||||||
.sk-button.info
|
button.sn-button.info Reload
|
||||||
.sk-label Reload
|
|
||||||
.sk-app-bar-item
|
.sk-app-bar-item
|
||||||
.sk-app-bar-item-column
|
.sk-app-bar-item-column
|
||||||
.sk-button.warning
|
a.sn-button.warning(
|
||||||
a.sk-label(
|
href='https://standardnotes.org/help/41/expired',
|
||||||
href='https://standardnotes.org/help/41/expired',
|
rel='noopener',
|
||||||
rel='noopener',
|
target='_blank'
|
||||||
target='_blank'
|
) Help
|
||||||
) Help
|
|
||||||
|
|
||||||
.sn-component(ng-if="ctrl.error == 'offline-restricted'")
|
.sn-component(ng-if="ctrl.error == 'offline-restricted'")
|
||||||
.sk-panel.static
|
.sk-panel.static
|
||||||
@@ -57,11 +54,10 @@
|
|||||||
li.sk-p
|
li.sk-p
|
||||||
strong Use the Desktop application.
|
strong Use the Desktop application.
|
||||||
.sk-panel-row
|
.sk-panel-row
|
||||||
.sk-button.info(
|
button.sn-button.info(
|
||||||
ng-click='ctrl.reloadStatus()',
|
ng-click='ctrl.reloadStatus()',
|
||||||
ng-if='!ctrl.reloading'
|
ng-if='!ctrl.reloading'
|
||||||
)
|
) Reload
|
||||||
.sk-label Reload
|
|
||||||
.sk-spinner.info.small(ng-if='ctrl.reloading')
|
.sk-spinner.info.small(ng-if='ctrl.reloading')
|
||||||
.sn-component(ng-if="ctrl.error == 'url-missing'")
|
.sn-component(ng-if="ctrl.error == 'url-missing'")
|
||||||
.sk-panel.static
|
.sk-panel.static
|
||||||
|
|||||||
@@ -30,10 +30,9 @@
|
|||||||
.sk-menu-panel-column(ng-if="ctrl.circle && ctrl.circleAlign == 'right'")
|
.sk-menu-panel-column(ng-if="ctrl.circle && ctrl.circleAlign == 'right'")
|
||||||
.sk-circle.small(ng-class='ctrl.circle')
|
.sk-circle.small(ng-class='ctrl.circle')
|
||||||
.sk-menu-panel-column(ng-if='ctrl.hasButton')
|
.sk-menu-panel-column(ng-if='ctrl.hasButton')
|
||||||
.sk-button(
|
button.sn-button.small(
|
||||||
ng-class='ctrl.buttonClass',
|
ng-class='ctrl.buttonClass',
|
||||||
ng-click='ctrl.clickAccessoryButton($event)'
|
ng-click='ctrl.clickAccessoryButton($event)'
|
||||||
)
|
) {{ctrl.buttonText}}
|
||||||
.sk-label {{ctrl.buttonText}}
|
|
||||||
.sk-menu-panel-column(ng-if='ctrl.spinnerClass')
|
.sk-menu-panel-column(ng-if='ctrl.spinnerClass')
|
||||||
.sk-spinner.small(ng-class='ctrl.spinnerClass')
|
.sk-spinner.small(ng-class='ctrl.spinnerClass')
|
||||||
|
|||||||
@@ -41,8 +41,7 @@
|
|||||||
| Please ensure you are running the latest version of Standard Notes
|
| Please ensure you are running the latest version of Standard Notes
|
||||||
| on all platforms to ensure maximum compatibility.
|
| on all platforms to ensure maximum compatibility.
|
||||||
.sk-panel-footer
|
.sk-panel-footer
|
||||||
.sk-button.info(
|
button.sn-button.info(
|
||||||
ng-click='ctrl.nextStep()',
|
ng-click='ctrl.nextStep()',
|
||||||
ng-disabled='ctrl.state.lockContinue'
|
ng-disabled='ctrl.state.lockContinue'
|
||||||
)
|
) {{ctrl.state.continueTitle}}
|
||||||
.sk-label {{ctrl.state.continueTitle}}
|
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
.sk-modal-background(ng-click='ctrl.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='ctrl.deny()') Cancel
|
|
||||||
.sk-panel-content
|
|
||||||
.sk-panel-section
|
|
||||||
.sk-panel-row
|
|
||||||
.sk-h2
|
|
||||||
strong {{ctrl.component.name}}
|
|
||||||
| would like to interact with your
|
|
||||||
| {{ctrl.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.font-bold(ng-click='ctrl.accept()')
|
|
||||||
.sk-label Continue
|
|
||||||
@@ -33,17 +33,14 @@
|
|||||||
| Please download a backup before we attempt to
|
| Please download a backup before we attempt to
|
||||||
| perform a full account sync resolution.
|
| perform a full account sync resolution.
|
||||||
.sk-panel-row
|
.sk-panel-row
|
||||||
.sk-button-group
|
.flex.gap-2
|
||||||
.sk-button.info(ng-click='ctrl.downloadBackup(true)')
|
button.sn-button.info(ng-click='ctrl.downloadBackup(true)') Encrypted
|
||||||
.sk-label Encrypted
|
button.sn-button.info(ng-click='ctrl.downloadBackup(false)') Decrypted
|
||||||
.sk-button.info(ng-click='ctrl.downloadBackup(false)')
|
button.sn-button.danger(ng-click='ctrl.skipBackup()') Skip
|
||||||
.sk-label Decrypted
|
|
||||||
.sk-button.danger(ng-click='ctrl.skipBackup()')
|
|
||||||
.sk-label Skip
|
|
||||||
div(ng-if='ctrl.status.backupFinished')
|
div(ng-if='ctrl.status.backupFinished')
|
||||||
.sk-panel-row(ng-if='!ctrl.status.resolving && !ctrl.status.attemptedResolution')
|
.sk-panel-row(ng-if='!ctrl.status.resolving && !ctrl.status.attemptedResolution')
|
||||||
.sk-button.info(ng-click='ctrl.performSyncResolution()')
|
button.sn-button.info(ng-click='ctrl.performSyncResolution()')
|
||||||
.sk-label Perform Sync Resolution
|
| Perform Sync Resolution
|
||||||
.sk-panel-row.justify-left(ng-if='ctrl.status.resolving')
|
.sk-panel-row.justify-left(ng-if='ctrl.status.resolving')
|
||||||
.sk-horizontal-group
|
.sk-horizontal-group
|
||||||
.sk-spinner.small.info
|
.sk-spinner.small.info
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
"pug-loader": "^2.4.0",
|
"pug-loader": "^2.4.0",
|
||||||
"sass-loader": "^8.0.2",
|
"sass-loader": "^8.0.2",
|
||||||
"serve-static": "^1.14.1",
|
"serve-static": "^1.14.1",
|
||||||
"sn-stylekit": "^2.2.1",
|
"sn-stylekit": "github:standardnotes/StyleKit#e3bfad37d29168bcc15e96399734ffaae1e618ba",
|
||||||
"ts-loader": "^8.0.17",
|
"ts-loader": "^8.0.17",
|
||||||
"typescript": "^4.1.5",
|
"typescript": "^4.1.5",
|
||||||
"typescript-eslint": "0.0.1-alpha.0",
|
"typescript-eslint": "0.0.1-alpha.0",
|
||||||
|
|||||||
@@ -7808,10 +7808,9 @@ slice-ansi@^4.0.0:
|
|||||||
astral-regex "^2.0.0"
|
astral-regex "^2.0.0"
|
||||||
is-fullwidth-code-point "^3.0.0"
|
is-fullwidth-code-point "^3.0.0"
|
||||||
|
|
||||||
sn-stylekit@^2.2.1:
|
"sn-stylekit@github:standardnotes/StyleKit#e3bfad37d29168bcc15e96399734ffaae1e618ba":
|
||||||
version "2.2.1"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/sn-stylekit/-/sn-stylekit-2.2.1.tgz#4a81a05b2b2d67a11af9d06f3964ac1ece3aa84a"
|
resolved "https://codeload.github.com/standardnotes/StyleKit/tar.gz/e3bfad37d29168bcc15e96399734ffaae1e618ba"
|
||||||
integrity sha512-mrvUbf2HbWOfxbNglo7RXa5JBe9UV9rurupeGoX/Kh4/lVlB2n/56ZT103xk/4tp0/mVCpxjD7Dt1stKFxsvFA==
|
|
||||||
|
|
||||||
snapdragon-node@^2.0.1:
|
snapdragon-node@^2.0.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
|
|||||||
Reference in New Issue
Block a user