From 4b95617d76f6b7c3f5fe4297377d270563eca4f2 Mon Sep 17 00:00:00 2001 From: careck Date: Tue, 12 May 2026 11:22:24 +1000 Subject: [PATCH 1/6] feat: add Cmd+N shortcut for sibling notes and improve edit focus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remap Cmd+N from New Workspace to Add Sibling Note — sibling creation is far more frequent. Cmd+Shift+N remains Add Child Note. New Workspace stays in the File menu without a shortcut. Additional UX improvements: - AddNoteDialog auto-focuses the type dropdown on open - Adding a sibling pre-selects the reference note's schema type - Edit mode focuses the first schema field when title is hidden - Tag input no longer traps Tab/Enter when empty, allowing natural keyboard navigation and quick save via Enter --- krillnotes-desktop/src-tauri/src/lib.rs | 3 ++- krillnotes-desktop/src-tauri/src/menu.rs | 13 ++++++++++--- .../src/components/AddNoteDialog.tsx | 16 +++++++++++----- krillnotes-desktop/src/components/InfoPanel.tsx | 4 +++- .../src/components/WorkspaceView.tsx | 5 ++++- krillnotes-desktop/src/hooks/useNoteForm.ts | 12 ++++++++++-- krillnotes-desktop/src/i18n/locales/de.json | 3 ++- krillnotes-desktop/src/i18n/locales/en.json | 3 ++- krillnotes-desktop/src/i18n/locales/es.json | 3 ++- krillnotes-desktop/src/i18n/locales/fr.json | 3 ++- krillnotes-desktop/src/i18n/locales/ja.json | 3 ++- krillnotes-desktop/src/i18n/locales/ko.json | 3 ++- krillnotes-desktop/src/i18n/locales/zh.json | 3 ++- 13 files changed, 54 insertions(+), 20 deletions(-) diff --git a/krillnotes-desktop/src-tauri/src/lib.rs b/krillnotes-desktop/src-tauri/src/lib.rs index a08e7c4d..3e9d47db 100644 --- a/krillnotes-desktop/src-tauri/src/lib.rs +++ b/krillnotes-desktop/src-tauri/src/lib.rs @@ -115,7 +115,8 @@ const MENU_MESSAGES: &[(&str, &str)] = &[ ("file_open", "File > Open Workspace clicked"), ("file_export", "File > Export Workspace clicked"), ("file_import", "File > Import Workspace clicked"), - ("edit_add_note", "Edit > Add Note clicked"), + ("edit_add_note", "Edit > Add Child Note clicked"), + ("edit_add_sibling", "Edit > Add Sibling Note clicked"), ("edit_delete_note", "Edit > Delete Note clicked"), ("view_refresh", "View > Refresh clicked"), ("help_about", "Help > About Krillnotes clicked"), diff --git a/krillnotes-desktop/src-tauri/src/menu.rs b/krillnotes-desktop/src-tauri/src/menu.rs index 83986ea4..c3b238de 100644 --- a/krillnotes-desktop/src-tauri/src/menu.rs +++ b/krillnotes-desktop/src-tauri/src/menu.rs @@ -189,7 +189,6 @@ fn build_file_menu( ) -> Result, tauri::Error> { let new_item = MenuItemBuilder::with_id("file_new", s(strings, "newWorkspace", "New Workspace")) - .accelerator("CmdOrCtrl+N") .build(app)?; let open_item = MenuItemBuilder::with_id( "file_open", @@ -262,10 +261,17 @@ fn build_edit_menu( app: &AppHandle, strings: &Value, ) -> Result, tauri::Error> { - let add_note = MenuItemBuilder::with_id("edit_add_note", s(strings, "addNote", "Add Note")) + let add_note = MenuItemBuilder::with_id("edit_add_note", s(strings, "addNote", "Add Child Note")) .accelerator("CmdOrCtrl+Shift+N") .enabled(false) .build(app)?; + let add_sibling = MenuItemBuilder::with_id( + "edit_add_sibling", + s(strings, "addSiblingNote", "Add Sibling Note"), + ) + .accelerator("CmdOrCtrl+N") + .enabled(false) + .build(app)?; let delete_note = MenuItemBuilder::with_id("edit_delete_note", s(strings, "deleteNote", "Delete Note")) .accelerator("CmdOrCtrl+Backspace") @@ -297,6 +303,7 @@ fn build_edit_menu( let builder = SubmenuBuilder::new(app, s(strings, "edit", "Edit")).items(&[ &add_note, + &add_sibling, &delete_note, &sep1, ©_note, @@ -322,7 +329,7 @@ fn build_edit_menu( submenu, paste_as_child: paste_child, paste_as_sibling: paste_sibling, - workspace_items: vec![add_note, delete_note, copy_note], + workspace_items: vec![add_note, add_sibling, delete_note, copy_note], }) } diff --git a/krillnotes-desktop/src/components/AddNoteDialog.tsx b/krillnotes-desktop/src/components/AddNoteDialog.tsx index ff8e2171..2235ae3b 100644 --- a/krillnotes-desktop/src/components/AddNoteDialog.tsx +++ b/krillnotes-desktop/src/components/AddNoteDialog.tsx @@ -4,7 +4,7 @@ // // Copyright (c) 2024-2026 TripleACS Pty Ltd t/a 2pi Software -import { useState, useEffect, useMemo } from 'react'; +import { useState, useEffect, useMemo, useRef } from 'react'; import { invoke } from '@tauri-apps/api/core'; import { useTranslation } from 'react-i18next'; import type { Note, SchemaInfo } from '../types'; @@ -25,6 +25,7 @@ function AddNoteDialog({ isOpen, onClose, onNoteCreated, referenceNoteId, positi const [noteSchema, setNoteSchema] = useState(''); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); + const selectRef = useRef(null); const availableTypes = useMemo( () => getAvailableTypes(position, referenceNoteId, notes, schemas), @@ -32,15 +33,19 @@ function AddNoteDialog({ isOpen, onClose, onNoteCreated, referenceNoteId, positi ); useEffect(() => { - if (availableTypes.length > 0 && !availableTypes.includes(noteSchema)) { - setNoteSchema(availableTypes[0]); - } - }, [availableTypes, noteSchema]); + if (availableTypes.length === 0) return; + const refNote = referenceNoteId ? notes.find(n => n.id === referenceNoteId) : null; + const preferred = position === 'sibling' && refNote && availableTypes.includes(refNote.schema) + ? refNote.schema + : availableTypes[0]; + setNoteSchema(preferred); + }, [availableTypes, referenceNoteId, position, notes]); useEffect(() => { if (isOpen) { setError(''); setLoading(false); + requestAnimationFrame(() => selectRef.current?.focus()); } }, [isOpen]); @@ -80,6 +85,7 @@ function AddNoteDialog({ isOpen, onClose, onNoteCreated, referenceNoteId, positi

{t('notes.noAllowedTypes')}

) : (