From ed0551be27fa8eff4ac59c8c0e8f0d12a9eac7aa Mon Sep 17 00:00:00 2001 From: hugo Date: Fri, 27 Feb 2026 14:08:41 +0100 Subject: [PATCH] fix: status bar overflow cut off dropdowns in status bar --- README.md | 8 --- .../components/StatusBar/StatusBar.css | 2 - .../components/ProjectSelector.test.tsx | 69 +++++++++++++++++++ 3 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 tests/renderer/components/ProjectSelector.test.tsx diff --git a/README.md b/README.md index 8cf5f14..eccc668 100644 --- a/README.md +++ b/README.md @@ -167,14 +167,6 @@ npm run dist:linux - `APPLE_APP_SPECIFIC_PASSWORD` - `APPLE_TEAM_ID` -### Database Utilities - -```bash -npm run db:generate -npm run db:migrate -npm run db:studio -``` - ## Further Documentation - [DOCUMENTATION.md](DOCUMENTATION.md) — end-user guide covering workflows, macros, scripting, AI assistant, and editorial best practices diff --git a/src/renderer/components/StatusBar/StatusBar.css b/src/renderer/components/StatusBar/StatusBar.css index 124498c..dd39275 100644 --- a/src/renderer/components/StatusBar/StatusBar.css +++ b/src/renderer/components/StatusBar/StatusBar.css @@ -8,7 +8,6 @@ font-size: 12px; padding: 0 8px; user-select: none; - overflow: hidden; flex-wrap: nowrap; } @@ -17,7 +16,6 @@ display: flex; align-items: center; gap: 4px; - overflow: hidden; flex-shrink: 0; } diff --git a/tests/renderer/components/ProjectSelector.test.tsx b/tests/renderer/components/ProjectSelector.test.tsx new file mode 100644 index 0000000..039bde5 --- /dev/null +++ b/tests/renderer/components/ProjectSelector.test.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { fireEvent, render, screen } from '@testing-library/react'; +import { ProjectSelector } from '../../../src/renderer/components/ProjectSelector/ProjectSelector'; +import { useAppStore } from '../../../src/renderer/store'; +import { I18nProvider } from '../../../src/renderer/i18n'; + +describe('ProjectSelector', () => { + beforeEach(() => { + vi.clearAllMocks(); + (window as any).electronAPI = { + ...(window as any).electronAPI, + projects: { + getAll: vi.fn().mockResolvedValue([ + { id: 'default', name: 'Default', slug: 'default', isActive: true, createdAt: '', updatedAt: '' }, + { id: 'p2', name: 'Blog Two', slug: 'blog-two', isActive: false, createdAt: '', updatedAt: '' }, + ]), + setActive: vi.fn().mockResolvedValue({ id: 'p2', name: 'Blog Two', slug: 'blog-two', isActive: true }), + create: vi.fn(), + deleteWithData: vi.fn(), + }, + posts: { getAll: vi.fn().mockResolvedValue({ items: [], hasMore: false, total: 0 }) }, + media: { getAll: vi.fn().mockResolvedValue([]) }, + app: { + getSystemLanguage: vi.fn().mockResolvedValue('en-US'), + }, + }; + + useAppStore.setState({ + projects: [ + { id: 'default', name: 'Default', slug: 'default', isActive: true, createdAt: '', updatedAt: '' }, + { id: 'p2', name: 'Blog Two', slug: 'blog-two', isActive: false, createdAt: '', updatedAt: '' }, + ], + activeProject: { id: 'default', name: 'Default', slug: 'default', isActive: true, createdAt: '', updatedAt: '' }, + } as any); + }); + + it('opens project dropdown when trigger is clicked', async () => { + render( + + + , + ); + + const trigger = screen.getByTitle('Switch project'); + fireEvent.click(trigger); + + // The dropdown should appear and list the projects + expect(screen.getByText('Projects')).toBeInTheDocument(); + expect(screen.getAllByText('Default').length).toBeGreaterThanOrEqual(2); // trigger + list item + expect(screen.getByText('Blog Two')).toBeInTheDocument(); + }); + + it('closes dropdown when clicking outside', async () => { + render( + + + , + ); + + const trigger = screen.getByTitle('Switch project'); + fireEvent.click(trigger); + expect(screen.getByText('Projects')).toBeInTheDocument(); + + // Click outside + fireEvent.mouseDown(document.body); + expect(screen.queryByText('Projects')).not.toBeInTheDocument(); + }); +});