feat: customize all-notes note list columns

This commit is contained in:
lucaronin
2026-04-16 02:18:43 +02:00
parent f3ee593dee
commit bbf98d6112
11 changed files with 629 additions and 167 deletions

View File

@@ -13,15 +13,17 @@ interface ViewCommandsConfig {
onZoomIn: () => void
onZoomOut: () => void
onZoomReset: () => void
onCustomizeInboxColumns?: () => void
canCustomizeInboxColumns?: boolean
onCustomizeNoteListColumns?: () => void
canCustomizeNoteListColumns?: boolean
noteListColumnsLabel: string
}
export function buildViewCommands(config: ViewCommandsConfig): CommandAction[] {
const {
hasActiveNote, activeNoteModified,
onSetViewMode, onToggleInspector, onToggleDiff, onToggleRawEditor, onToggleAIChat,
zoomLevel, onZoomIn, onZoomOut, onZoomReset, onCustomizeInboxColumns, canCustomizeInboxColumns,
zoomLevel, onZoomIn, onZoomOut, onZoomReset,
onCustomizeNoteListColumns, canCustomizeNoteListColumns, noteListColumnsLabel,
} = config
return [
@@ -33,7 +35,7 @@ export function buildViewCommands(config: ViewCommandsConfig): CommandAction[] {
{ id: 'toggle-raw-editor', label: 'Toggle Raw Editor', group: 'View', keywords: ['raw', 'source', 'markdown', 'frontmatter', 'code', 'textarea'], enabled: hasActiveNote, execute: () => onToggleRawEditor?.() },
{ id: 'toggle-ai-panel', label: 'Toggle AI Panel', group: 'View', shortcut: '⇧⌘L', keywords: ['ai', 'agent', 'chat', 'assistant', 'contextual'], enabled: true, execute: () => onToggleAIChat?.() },
{ id: 'toggle-backlinks', label: 'Toggle Backlinks', group: 'View', keywords: ['backlinks', 'references', 'links', 'mentions', 'incoming'], enabled: hasActiveNote, execute: onToggleInspector },
{ id: 'customize-inbox-columns', label: 'Customize Inbox columns', group: 'View', keywords: ['inbox', 'columns', 'chips', 'properties', 'note list'], enabled: !!(canCustomizeInboxColumns && onCustomizeInboxColumns), execute: () => onCustomizeInboxColumns?.() },
{ id: 'customize-note-list-columns', label: noteListColumnsLabel, group: 'View', keywords: ['all notes', 'inbox', 'columns', 'chips', 'properties', 'note list'], enabled: !!(canCustomizeNoteListColumns && onCustomizeNoteListColumns), execute: () => onCustomizeNoteListColumns?.() },
{ id: 'zoom-in', label: `Zoom In (${zoomLevel}%)`, group: 'View', shortcut: '⌘=', keywords: ['zoom', 'bigger', 'larger', 'scale'], enabled: zoomLevel < 150, execute: onZoomIn },
{ id: 'zoom-out', label: `Zoom Out (${zoomLevel}%)`, group: 'View', shortcut: '⌘-', keywords: ['zoom', 'smaller', 'scale'], enabled: zoomLevel > 80, execute: onZoomOut },
{ id: 'zoom-reset', label: 'Reset Zoom', group: 'View', shortcut: '⌘0', keywords: ['zoom', 'actual', 'default', '100'], enabled: zoomLevel !== 100, execute: onZoomReset },

View File

@@ -80,8 +80,8 @@ interface AppCommandsConfig {
onOpenInNewWindow?: () => void
onToggleFavorite?: (path: string) => void
onToggleOrganized?: (path: string) => void
onCustomizeInboxColumns?: () => void
canCustomizeInboxColumns?: boolean
onCustomizeNoteListColumns?: () => void
canCustomizeNoteListColumns?: boolean
onRestoreDeletedNote?: () => void
canRestoreDeletedNote?: boolean
}
@@ -222,8 +222,8 @@ function createCommandRegistryConfig(config: AppCommandsConfig): Parameters<type
onOpenInNewWindow: config.onOpenInNewWindow,
onToggleFavorite: config.onToggleFavorite,
onToggleOrganized: config.onToggleOrganized,
onCustomizeInboxColumns: config.onCustomizeInboxColumns,
canCustomizeInboxColumns: config.canCustomizeInboxColumns,
onCustomizeNoteListColumns: config.onCustomizeNoteListColumns,
canCustomizeNoteListColumns: config.canCustomizeNoteListColumns,
onRestoreDeletedNote: config.onRestoreDeletedNote,
canRestoreDeletedNote: config.canRestoreDeletedNote,
}

View File

@@ -167,29 +167,43 @@ describe('useCommandRegistry', () => {
})
it('includes Customize Inbox columns when the Inbox action is available', () => {
const onCustomizeInboxColumns = vi.fn()
const onCustomizeNoteListColumns = vi.fn()
const config = makeConfig({
selection: { kind: 'filter', filter: 'inbox' },
onCustomizeInboxColumns,
canCustomizeInboxColumns: true,
onCustomizeNoteListColumns,
canCustomizeNoteListColumns: true,
})
const { result } = renderHook(() => useCommandRegistry(config))
const cmd = findCommand(result.current, 'customize-inbox-columns')
const cmd = findCommand(result.current, 'customize-note-list-columns')
expect(cmd).toBeDefined()
expect(cmd!.enabled).toBe(true)
expect(cmd!.label).toBe('Customize Inbox columns')
cmd!.execute()
expect(onCustomizeInboxColumns).toHaveBeenCalled()
expect(onCustomizeNoteListColumns).toHaveBeenCalled()
})
it('disables Customize Inbox columns outside the Inbox view', () => {
it('includes Customize All Notes columns in the all-notes view', () => {
const config = makeConfig({
selection: { kind: 'filter', filter: 'all' },
onCustomizeInboxColumns: vi.fn(),
canCustomizeInboxColumns: false,
onCustomizeNoteListColumns: vi.fn(),
canCustomizeNoteListColumns: true,
})
const { result } = renderHook(() => useCommandRegistry(config))
const cmd = findCommand(result.current, 'customize-inbox-columns')
const cmd = findCommand(result.current, 'customize-note-list-columns')
expect(cmd).toBeDefined()
expect(cmd!.enabled).toBe(true)
expect(cmd!.label).toBe('Customize All Notes columns')
})
it('disables note-list column customization outside supported views', () => {
const config = makeConfig({
selection: { kind: 'sectionGroup', type: 'Book' },
onCustomizeNoteListColumns: vi.fn(),
canCustomizeNoteListColumns: false,
})
const { result } = renderHook(() => useCommandRegistry(config))
const cmd = findCommand(result.current, 'customize-note-list-columns')
expect(cmd!.enabled).toBe(false)
})

View File

@@ -43,8 +43,8 @@ interface CommandRegistryConfig {
onOpenInNewWindow?: () => void
onToggleFavorite?: (path: string) => void
onToggleOrganized?: (path: string) => void
onCustomizeInboxColumns?: () => void
canCustomizeInboxColumns?: boolean
onCustomizeNoteListColumns?: () => void
canCustomizeNoteListColumns?: boolean
onRestoreDeletedNote?: () => void
canRestoreDeletedNote?: boolean
onQuickOpen: () => void
@@ -105,7 +105,7 @@ export function useCommandRegistry(config: CommandRegistryConfig): import('./com
onReloadVault, onRepairVault,
onSetNoteIcon, onRemoveNoteIcon, activeNoteHasIcon,
onOpenInNewWindow, onToggleFavorite, onToggleOrganized,
onCustomizeInboxColumns, canCustomizeInboxColumns,
onCustomizeNoteListColumns, canCustomizeNoteListColumns,
onRestoreDeletedNote, canRestoreDeletedNote,
selection, noteListFilter, onSetNoteListFilter,
} = config
@@ -119,6 +119,9 @@ export function useCommandRegistry(config: CommandRegistryConfig): import('./com
const isArchived = activeEntry?.archived ?? false
const isFavorite = activeEntry?.favorite ?? false
const isSectionGroup = selection?.kind === 'sectionGroup'
const noteListColumnsLabel = selection?.kind === 'filter' && selection.filter === 'all'
? 'Customize All Notes columns'
: 'Customize Inbox columns'
const vaultTypes = useMemo(() => extractVaultTypes(entries), [entries])
@@ -136,7 +139,7 @@ export function useCommandRegistry(config: CommandRegistryConfig): import('./com
...buildViewCommands({
hasActiveNote, activeNoteModified, onSetViewMode, onToggleInspector,
onToggleDiff, onToggleRawEditor, onToggleAIChat, zoomLevel, onZoomIn, onZoomOut, onZoomReset,
onCustomizeInboxColumns, canCustomizeInboxColumns,
onCustomizeNoteListColumns, canCustomizeNoteListColumns, noteListColumnsLabel,
}),
...buildSettingsCommands({
mcpStatus, vaultCount, isGettingStartedHidden,
@@ -173,7 +176,7 @@ export function useCommandRegistry(config: CommandRegistryConfig): import('./com
onSetNoteIcon, onRemoveNoteIcon, activeNoteHasIcon,
isSectionGroup, noteListFilter, onSetNoteListFilter,
onOpenInNewWindow, onToggleFavorite, isFavorite,
onToggleOrganized, onCustomizeInboxColumns, canCustomizeInboxColumns,
onToggleOrganized, onCustomizeNoteListColumns, canCustomizeNoteListColumns, noteListColumnsLabel,
onRestoreDeletedNote, canRestoreDeletedNote, activeEntry,
])
}