Fix date-range filter selections (Refs #104)

This commit is contained in:
2026-10-09 20:03:08 -04:00
parent ce6dba17e6
commit 61d4c25ce6
4 changed files with 45 additions and 3 deletions
+2 -2
View File
@@ -241,14 +241,14 @@
<label for={`activity-days${suffix}`} <label for={`activity-days${suffix}`}
>Date range<select >Date range<select
id={`activity-days${suffix}`} id={`activity-days${suffix}`}
value={filters.days ?? 0} value={String(filters.days ?? 0)}
onchange={(event) => update({ days: event.currentTarget.value })} onchange={(event) => update({ days: event.currentTarget.value })}
><option value="0">All retained history</option><option value="1" ><option value="0">All retained history</option><option value="1"
>Last 24 hours</option >Last 24 hours</option
><option value="7">Last 7 days</option><option value="30">Last 30 days</option ><option value="7">Last 7 days</option><option value="30">Last 30 days</option
><option value="90">Last 90 days</option ><option value="90">Last 90 days</option
>{#if filters.days && ![1, 7, 30, 90].includes(filters.days)}<option >{#if filters.days && ![1, 7, 30, 90].includes(filters.days)}<option
value={filters.days}>Last {filters.days} days</option value={String(filters.days)}>Last {filters.days} days</option
>{/if}</select >{/if}</select
></label ></label
> >
+1 -1
View File
@@ -176,7 +176,7 @@
<label for={`match-days${suffix}`} <label for={`match-days${suffix}`}
>Date range<select >Date range<select
id={`match-days${suffix}`} id={`match-days${suffix}`}
value={filters.days} value={String(filters.days)}
onchange={(event) => update({ days: event.currentTarget.value })} onchange={(event) => update({ days: event.currentTarget.value })}
><option value="0">All time</option><option value="7">Last 7 days</option ><option value="0">All time</option><option value="7">Last 7 days</option
><option value="30">Last 30 days</option><option value="90">Last 90 days</option ><option value="30">Last 30 days</option><option value="90">Last 90 days</option
+21
View File
@@ -53,6 +53,27 @@ beforeEach(() => {
}); });
afterEach(() => vi.useRealTimers()); afterEach(() => vi.useRealTimers());
it.each([
['', '0', 'All retained history'],
['0', '0', 'All retained history'],
['1', '1', 'Last 24 hours'],
['7', '7', 'Last 7 days'],
['30', '30', 'Last 30 days'],
['90', '90', 'Last 90 days'],
['14', '14', 'Last 14 days']
])('selects the current date range for days=%s on desktop and mobile', (days, value, label) => {
scope(days ? `/activity?days=${days}` : '/activity');
const body = render(ActivityLog, { props: { initial: report() } }).body;
for (const suffix of ['', '-mobile']) {
const select = body.match(
new RegExp(`<select\\b[^>]*id="activity-days${suffix}"[^>]*>([\\s\\S]*?)</select>`)
)?.[1];
expect(select).toBeDefined();
expect(select).toContain(`<option value="${value}" selected="">${label}</option>`);
expect(select?.match(/\bselected=""/g)).toHaveLength(1);
}
});
it('sends only supported normalized filters and enforces scoped identities', () => { it('sends only supported normalized filters and enforces scoped identities', () => {
const url = new URL( const url = new URL(
'https://example.test/servers/town?tab=history&server=wrong&source=host&state=failed&offset=50&returnTo=%2F' 'https://example.test/servers/town?tab=history&server=wrong&source=host&state=failed&offset=50&returnTo=%2F'
+21
View File
@@ -41,6 +41,27 @@ beforeEach(() => {
vi.setSystemTime(new Date('2026-10-06T20:00:00Z')); vi.setSystemTime(new Date('2026-10-06T20:00:00Z'));
}); });
afterEach(() => vi.useRealTimers()); afterEach(() => vi.useRealTimers());
it.each([
['', '0', 'All time'],
['0', '0', 'All time'],
['7', '7', 'Last 7 days'],
['30', '30', 'Last 30 days'],
['90', '90', 'Last 90 days']
])(
'selects the current date range for matchDays=%s on desktop and mobile',
(days, value, label) => {
scope(days ? `?matchDays=${days}` : '');
const body = render(MatchHistory, { props: { initial: report() } }).body;
for (const suffix of ['', '-mobile']) {
const select = body.match(
new RegExp(`<select\\b[^>]*id="match-days${suffix}"[^>]*>([\\s\\S]*?)</select>`)
)?.[1];
expect(select).toBeDefined();
expect(select).toContain(`<option value="${value}" selected="">${label}</option>`);
expect(select?.match(/\bselected=""/g)).toHaveLength(1);
}
}
);
it('renders one page heading, six columns, a combined identity, and compact dates', () => { it('renders one page heading, six columns, a combined identity, and compact dates', () => {
const body = render(MatchHistoryPage, { const body = render(MatchHistoryPage, {
props: { data: { history: report(), user: null, setupRequired: false } } props: { data: { history: report(), user: null, setupRequired: false } }