Fix event search filtering
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-01-20 12:41:14 +01:00
parent 3c2ebdbc0e
commit e28eb9a90b
2 changed files with 38 additions and 4 deletions

View File

@@ -204,10 +204,12 @@ function EventsList({
if (!query.trim()) return filteredByStatus; if (!query.trim()) return filteredByStatus;
const needle = query.toLowerCase(); const needle = query.toLowerCase();
return filteredByStatus.filter((event) => { return filteredByStatus.filter((event) => {
const hay = `${event.name ?? ''} ${event.location ?? ''}`.toLowerCase(); const name = resolveEventSearchName(event.name, t);
const location = resolveLocation(event, t);
const hay = `${name} ${location}`.toLowerCase();
return hay.includes(needle); return hay.includes(needle);
}); });
}, [filteredByStatus, query]); }, [filteredByStatus, query, t]);
const filters: Array<{ key: EventStatusKey; label: string; count: number }> = [ const filters: Array<{ key: EventStatusKey; label: string; count: number }> = [
{ key: 'all', label: t('events.list.filters.all'), count: statusCounts.all }, { key: 'all', label: t('events.list.filters.all'), count: statusCounts.all },
@@ -474,6 +476,17 @@ function renderName(name: TenantEvent['name'], t: (key: string) => string): stri
return t('events.placeholders.untitled'); return t('events.placeholders.untitled');
} }
function resolveEventSearchName(name: TenantEvent['name'], t: (key: string) => string): string {
if (typeof name === 'string') return name;
if (name && typeof name === 'object') {
const values = Object.values(name).filter((value) => typeof value === 'string');
if (values.length > 0) {
return values.join(' ');
}
}
return t('events.placeholders.untitled');
}
function resolveLocation(event: TenantEvent, t: (key: string) => string): string { function resolveLocation(event: TenantEvent, t: (key: string) => string): string {
const settings = (event.settings ?? {}) as Record<string, unknown>; const settings = (event.settings ?? {}) as Record<string, unknown>;
const candidate = const candidate =

View File

@@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { describe, expect, it, vi } from 'vitest'; import { describe, expect, it, vi } from 'vitest';
import { render, screen } from '@testing-library/react'; import { act, fireEvent, render, screen } from '@testing-library/react';
const navigateMock = vi.fn(); const navigateMock = vi.fn();
const authState = { const authState = {
@@ -54,6 +54,13 @@ vi.mock('../../api', () => ({
event_date: '2026-02-19', event_date: '2026-02-19',
settings: {}, settings: {},
}, },
{
id: 2,
name: { en: 'Summer Gala' },
slug: 'summer-gala',
event_date: '2026-06-01',
settings: {},
},
]), ]),
})); }));
@@ -96,7 +103,7 @@ vi.mock('../components/Primitives', () => ({
})); }));
vi.mock('../components/FormControls', () => ({ vi.mock('../components/FormControls', () => ({
MobileInput: (props: React.InputHTMLAttributes<HTMLInputElement>) => <input {...props} />, MobileInput: ({ compact: _compact, ...props }: React.InputHTMLAttributes<HTMLInputElement>) => <input {...props} />,
})); }));
vi.mock('@tamagui/card', () => ({ vi.mock('@tamagui/card', () => ({
@@ -171,4 +178,18 @@ describe('MobileEventsPage', () => {
authState.user = { role: 'tenant_admin' }; authState.user = { role: 'tenant_admin' };
}); });
it('filters events by search query', async () => {
render(<MobileEventsPage />);
expect(await screen.findByText('Demo Event')).toBeInTheDocument();
expect(screen.getByText('Summer Gala')).toBeInTheDocument();
await act(async () => {
fireEvent.change(screen.getByPlaceholderText('Select event'), { target: { value: 'Summer' } });
});
expect(screen.getByText('Summer Gala')).toBeInTheDocument();
expect(screen.queryByText('Demo Event')).not.toBeInTheDocument();
});
}); });