Fix event search filtering
This commit is contained in:
@@ -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 =
|
||||||
|
|||||||
@@ -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();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user