diff --git a/app/assets/javascripts/components/AutocompleteTagHint.tsx b/app/assets/javascripts/components/AutocompleteTagHint.tsx
index d4bfd6c6c..00cc04af7 100644
--- a/app/assets/javascripts/components/AutocompleteTagHint.tsx
+++ b/app/assets/javascripts/components/AutocompleteTagHint.tsx
@@ -19,6 +19,7 @@ export const AutocompleteTagHint = observer(
const onTagHintClick = async () => {
await appState.noteTags.createAndAddNewTag();
+ appState.noteTags.setAutocompleteInputFocused(true);
};
const onFocus = () => {
diff --git a/app/assets/javascripts/components/AutocompleteTagInput.tsx b/app/assets/javascripts/components/AutocompleteTagInput.tsx
index 41b77280d..2dddf3077 100644
--- a/app/assets/javascripts/components/AutocompleteTagInput.tsx
+++ b/app/assets/javascripts/components/AutocompleteTagInput.tsx
@@ -5,6 +5,7 @@ import { AppState } from '@/ui_models/app_state';
import { AutocompleteTagResult } from './AutocompleteTagResult';
import { AutocompleteTagHint } from './AutocompleteTagHint';
import { observer } from 'mobx-react-lite';
+import { SNTag } from '@standardnotes/snjs';
type Props = {
appState: AppState;
@@ -41,8 +42,13 @@ export const AutocompleteTagInput = observer(({ appState }: Props) => {
const onSearchQueryChange = (event: Event) => {
const query = (event.target as HTMLInputElement).value;
- appState.noteTags.setAutocompleteSearchQuery(query);
- appState.noteTags.searchActiveNoteAutocompleteTags();
+
+ if (query === '') {
+ appState.noteTags.clearAutocompleteSearch();
+ } else {
+ appState.noteTags.setAutocompleteSearchQuery(query);
+ appState.noteTags.searchActiveNoteAutocompleteTags();
+ }
};
const onFormSubmit = async (event: Event) => {
@@ -83,10 +89,6 @@ export const AutocompleteTagInput = observer(({ appState }: Props) => {
appState.noteTags.setAutocompleteInputFocused(false);
};
- useEffect(() => {
- appState.noteTags.searchActiveNoteAutocompleteTags();
- }, [appState.noteTags]);
-
useEffect(() => {
if (autocompleteInputFocused) {
inputRef.current.focus();
@@ -120,7 +122,7 @@ export const AutocompleteTagInput = observer(({ appState }: Props) => {
onBlur={closeOnBlur}
>
- {autocompleteTagResults.map((tagResult) => (
+ {autocompleteTagResults.map((tagResult: SNTag) => (
{
@@ -198,15 +198,9 @@ export class NoteTagsState {
async removeTagFromActiveNote(tag: SNTag): Promise {
const { activeNote } = this;
if (activeNote) {
- const descendantTags = this.application.getTagDescendants(tag);
- const tagsToRemove = [...descendantTags, tag];
- await Promise.all(
- tagsToRemove.map(async (tag) => {
- await this.application.changeItem(tag.uuid, (mutator) => {
- mutator.removeItemAsRelationship(activeNote);
- });
- })
- );
+ await this.application.changeItem(tag.uuid, (mutator) => {
+ mutator.removeItemAsRelationship(activeNote);
+ });
this.application.sync();
this.reloadTags();
}
diff --git a/app/assets/javascripts/ui_models/app_state/notes_state.ts b/app/assets/javascripts/ui_models/app_state/notes_state.ts
index daa9881aa..66d1ad024 100644
--- a/app/assets/javascripts/ui_models/app_state/notes_state.ts
+++ b/app/assets/javascripts/ui_models/app_state/notes_state.ts
@@ -346,17 +346,11 @@ export class NotesState {
async removeTagFromSelectedNotes(tag: SNTag): Promise {
const selectedNotes = Object.values(this.selectedNotes);
- const descendantTags = this.application.getTagDescendants(tag);
- const tagsToRemove = [...descendantTags, tag];
- await Promise.all(
- tagsToRemove.map(async (tag) => {
- await this.application.changeItem(tag.uuid, (mutator) => {
- for (const note of selectedNotes) {
- mutator.removeItemAsRelationship(note);
- }
- });
- })
- );
+ await this.application.changeItem(tag.uuid, (mutator) => {
+ for (const note of selectedNotes) {
+ mutator.removeItemAsRelationship(note);
+ }
+ });
this.application.sync();
}
diff --git a/app/assets/javascripts/views/editor/editor-view.pug b/app/assets/javascripts/views/editor/editor-view.pug
index bf37859cb..c9df7eb77 100644
--- a/app/assets/javascripts/views/editor/editor-view.pug
+++ b/app/assets/javascripts/views/editor/editor-view.pug
@@ -92,7 +92,6 @@
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(
diff --git a/app/assets/javascripts/views/editor/editor_view.ts b/app/assets/javascripts/views/editor/editor_view.ts
index 16cc59035..8cb4c3559 100644
--- a/app/assets/javascripts/views/editor/editor_view.ts
+++ b/app/assets/javascripts/views/editor/editor_view.ts
@@ -285,9 +285,6 @@ class EditorViewCtrl extends PureViewCtrl {
if (note.dirty) {
this.showSavingStatus();
}
- if (note.safeText().length === 0 && !showProtectedWarning) {
- this.focusTitle();
- }
}
async dismissProtectedWarning() {
diff --git a/app/assets/javascripts/views/notes/notes_view.ts b/app/assets/javascripts/views/notes/notes_view.ts
index c5bcb03ee..e59300f28 100644
--- a/app/assets/javascripts/views/notes/notes_view.ts
+++ b/app/assets/javascripts/views/notes/notes_view.ts
@@ -411,6 +411,8 @@ class NotesViewCtrl extends PureViewCtrl {
await this.flushUI();
await this.reloadNotes();
await this.appState.noteTags.reloadTags();
+ const noteTitleEditorElement = document.getElementById('note-title-editor');
+ noteTitleEditorElement?.focus();
}
async handleTagChange(tag: SNTag) {
@@ -789,7 +791,10 @@ class NotesViewCtrl extends PureViewCtrl {
return candidate.uuid === this.activeEditorNote?.uuid;
});
if (currentIndex + 1 < displayableNotes.length) {
- this.selectNote(displayableNotes[currentIndex + 1]);
+ const nextNote = displayableNotes[currentIndex + 1];
+ this.selectNote(nextNote);
+ const nextNoteElement = document.getElementById(`note-${nextNote.uuid}`);
+ nextNoteElement?.focus();
}
}
@@ -806,7 +811,10 @@ class NotesViewCtrl extends PureViewCtrl {
const displayableNotes = this.state.notes;
const currentIndex = displayableNotes.indexOf(this.activeEditorNote!);
if (currentIndex - 1 >= 0) {
- this.selectNote(displayableNotes[currentIndex - 1]);
+ const previousNote = displayableNotes[currentIndex - 1];
+ this.selectNote(previousNote);
+ const previousNoteElement = document.getElementById(`note-${previousNote.uuid}`);
+ previousNoteElement?.focus();
return true;
} else {
return false;
diff --git a/app/assets/stylesheets/_main.scss b/app/assets/stylesheets/_main.scss
index 734dd916b..6ab0cf0bb 100644
--- a/app/assets/stylesheets/_main.scss
+++ b/app/assets/stylesheets/_main.scss
@@ -136,7 +136,7 @@ $footer-height: 32px;
top: 0;
right: 0;
z-index: $z-index-panel-resizer;
- width: 8px;
+ width: 2px;
height: 100%;
position: absolute;
cursor: col-resize;
diff --git a/package.json b/package.json
index d76cefddc..c480173e4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "standard-notes-web",
- "version": "3.8.2",
+ "version": "3.8.3",
"license": "AGPL-3.0-or-later",
"repository": {
"type": "git",
@@ -14,7 +14,7 @@
"bundle": "webpack --config webpack.prod.js && yarn tsc",
"bundle:desktop": "webpack --config webpack.prod.js --env.platform='desktop'",
"bundle:desktop:beta": "webpack --config webpack.prod.js --env.platform='desktop' --env.public_beta='true'",
- "build": "bundle install && yarn install --pure-lockfile && bundle exec rails assets:precompile && yarn bundle",
+ "build": "bundle install && yarn install --frozen-lockfile && bundle exec rails assets:precompile && yarn bundle",
"submodules": "git submodule update --init --force",
"lint": "eslint --fix app/assets/javascripts",
"tsc": "tsc --project app/assets/javascripts/tsconfig.json"