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') + } +})