fix(search): tagQ alone now triggers search mode; selecting chip clears tagQ
Some checks failed
CI / Unit & Component Tests (push) Has been cancelled
CI / Backend Unit Tests (push) Has been cancelled
CI / Unit & Component Tests (pull_request) Has been cancelled
CI / Backend Unit Tests (pull_request) Has been cancelled

- isDashboard was ignoring tagQ so typing in tag filter showed dashboard
- addTag now calls onTextInput('') to clear tagQ when a chip is selected

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-04-06 15:46:54 +02:00
parent bc397048b7
commit 023b6ddb49
4 changed files with 35 additions and 1 deletions

View File

@@ -44,6 +44,7 @@ function addTag(tag: string) {
suggestions = [];
showSuggestions = false;
activeIndex = -1;
onTextInput?.('');
}
function removeTag(index: number) {

View File

@@ -228,4 +228,16 @@ describe('TagInput onTextInput callback', () => {
const input = page.getByRole('textbox');
await expect(input.fill('fa')).resolves.not.toThrow();
});
it('calls onTextInput with empty string when a tag chip is added', async () => {
mockFetchWithTags(['Kaufvertrag']);
const onTextInput = vi.fn();
render(TagInput, { tags: [], allowCreation: false, onTextInput });
const input = page.getByRole('textbox');
await input.fill('Ka');
await waitForDebounce();
const option = page.getByRole('option', { name: 'Kaufvertrag' });
await option.click();
await expect.poll(() => onTextInput.mock.calls.at(-1)).toEqual(['']);
});
});

View File

@@ -17,7 +17,7 @@ export async function load({ url, fetch }) {
const dir = url.searchParams.get('dir') || 'desc';
const tagQ = url.searchParams.get('tagQ') || '';
const isDashboard = !q && !from && !to && !senderId && !receiverId && !tags.length;
const isDashboard = !q && !from && !to && !senderId && !receiverId && !tags.length && !tagQ;
const api = createApiClient(fetch);

View File

@@ -167,6 +167,27 @@ describe('home page load — search mode', () => {
expect(firstCall[1].params.query.q).toBe('Urlaub');
expect(firstCall[1].params.query.from).toBe('2020-01-01');
});
it('sets isDashboard false when only tagQ is set', async () => {
const mockGet = vi
.fn()
.mockResolvedValueOnce({
response: { ok: true, status: 200 },
data: { documents: [{ id: 'd1' }], total: 1 }
}) // search docs
.mockResolvedValueOnce({ response: { ok: true, status: 200 }, data: [] }); // persons
vi.mocked(createApiClient).mockReturnValue({ GET: mockGet } as ReturnType<
typeof createApiClient
>);
const result = await load({
url: makeUrl({ tagQ: 'fam' }),
fetch: vi.fn() as unknown as typeof fetch
});
expect(result.isDashboard).toBe(false);
expect(result.documents).toHaveLength(1);
});
});
it('passes sort, dir, and tagQ params to the documents API', async () => {