diff --git a/src/components/NoteList.test.tsx b/src/components/NoteList.test.tsx
index 6c9ce3e0..1f5df90c 100644
--- a/src/components/NoteList.test.tsx
+++ b/src/components/NoteList.test.tsx
@@ -208,6 +208,20 @@ describe('NoteList', () => {
expect(screen.queryByText('Matteo Cellini')).not.toBeInTheDocument()
})
+ it('passes selected type when creating note from type section', () => {
+ const onCreate = vi.fn()
+ render()
+ fireEvent.click(screen.getByTitle('Create new note'))
+ expect(onCreate).toHaveBeenCalledWith('Project')
+ })
+
+ it('passes undefined type when creating note from All Notes', () => {
+ const onCreate = vi.fn()
+ render()
+ fireEvent.click(screen.getByTitle('Create new note'))
+ expect(onCreate).toHaveBeenCalledWith(undefined)
+ })
+
it('shows entity pinned at top with grouped children', () => {
render(
diff --git a/src/components/NoteList.tsx b/src/components/NoteList.tsx
index c84ca409..9a72f27a 100644
--- a/src/components/NoteList.tsx
+++ b/src/components/NoteList.tsx
@@ -32,7 +32,7 @@ interface NoteListProps {
sidebarCollapsed?: boolean
onSelectNote: (entry: VaultEntry) => void
onReplaceActiveTab: (entry: VaultEntry) => void
- onCreateNote: () => void
+ onCreateNote: (type?: string) => void
onBulkArchive?: (paths: string[]) => void
onBulkTrash?: (paths: string[]) => void
onBulkRestore?: (paths: string[]) => void
@@ -97,12 +97,15 @@ function NoteListInner({ entries, selection, selectedNote, noteListFilter, onNot
), [selectedNote?.path, handleClickNote, typeEntryMap, resolvedGetNoteStatus, multiSelect.selectedPaths, noteListKeyboard.highlightedPath])
+ const handleCreateNote = useCallback(() => {
+ onCreateNote(selection.kind === 'sectionGroup' ? selection.type : undefined)
+ }, [onCreateNote, selection])
const toggleGroup = useCallback((label: string) => { setCollapsedGroups((prev) => toggleSetMember(prev, label)) }, [])
const title = resolveHeaderTitle(selection, typeDocument)
return (
-
+
{entitySelection ? (
diff --git a/tests/smoke/type-create-note.spec.ts b/tests/smoke/type-create-note.spec.ts
new file mode 100644
index 00000000..ed0f97aa
--- /dev/null
+++ b/tests/smoke/type-create-note.spec.ts
@@ -0,0 +1,56 @@
+import { test, expect } from '@playwright/test'
+
+test('clicking + in type section creates note with that type', async ({ page }) => {
+ await page.goto('/')
+ await page.waitForTimeout(2000)
+
+ // Click on "Projects" in the sidebar to select that type section
+ const projectsItem = page.locator('[data-testid="sidebar-section-Projects"]').or(page.locator('.app__sidebar').locator('text=Projects').first())
+ await projectsItem.click()
+ await page.waitForTimeout(1000)
+
+ // Click the "+" button to create a new note
+ await page.click('[title="Create new note"]')
+ await page.waitForTimeout(1000)
+
+ // The new note should have type-based naming (e.g., "Untitled project N")
+ const titleInput = page.locator('[data-testid="title-field-input"]')
+ if (await titleInput.count() > 0) {
+ const value = await titleInput.inputValue()
+ console.log('New note title:', value)
+ expect(value.toLowerCase()).toContain('project')
+ }
+
+ // Toggle raw editor to see frontmatter
+ await page.keyboard.press('Meta+Shift+m')
+ await page.waitForTimeout(500)
+
+ const rawEditor = page.locator('.cm-content')
+ if (await rawEditor.count() > 0) {
+ const content = await rawEditor.textContent()
+ console.log('Raw content:', content?.substring(0, 200))
+ expect(content).toContain('type: Project')
+ }
+})
+
+test('clicking + in All Notes creates generic note', async ({ page }) => {
+ await page.goto('/')
+ await page.waitForTimeout(2000)
+
+ // Click on "All Notes" in sidebar
+ await page.locator('text=All Notes').first().click()
+ await page.waitForTimeout(500)
+
+ // Click the "+" button
+ await page.click('[title="Create new note"]')
+ await page.waitForTimeout(1000)
+
+ // The new note should be a generic "Note" type
+ const titleInput = page.locator('[data-testid="title-field-input"]')
+ if (await titleInput.count() > 0) {
+ const value = await titleInput.inputValue()
+ console.log('New note title:', value)
+ expect(value.toLowerCase()).toContain('note')
+ expect(value.toLowerCase()).not.toContain('project')
+ }
+})