Skip to content

Commit 775769f

Browse files
authored
fix: communicate fixed listing filters on tree and hardware (#1924) (#1955)
* feat: remove checkout filtering in /trees (#1924) This filter was filtering very little in practice, and querying every lastest checkout is very cheap. Signed-off-by: Luiz Georg <luiz.georg@profusion.mobi> * feat: add an indicator for the time filtering in /hardware (#1924) Closes: #1924 Signed-off-by: Luiz Georg <luiz.georg@profusion.mobi> * fixup! feat: remove checkout filtering in /trees (#1924) this change was out of scope and requires further investigation Signed-off-by: Luiz Georg <luiz.georg@profusion.mobi> * amend! feat: add an indicator for the time filtering in /hardware (#1924) feat: add a label to indicate hidden filtering filtering (#1924) Closes: #1924 Signed-off-by: Luiz Georg <luiz.georg@profusion.mobi> * fixup! feat: add an indicator for the time filtering in /hardware (#1924) Signed-off-by: Luiz Georg <luiz.georg@profusion.mobi> --------- Signed-off-by: Luiz Georg <luiz.georg@profusion.mobi>
1 parent b253fb1 commit 775769f

6 files changed

Lines changed: 94 additions & 12 deletions

File tree

dashboard/e2e/e2e-selectors.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,5 @@ export const HARDWARE_LISTING_SELECTORS = {
4949
branchSelector: '[data-test-id="hardware-branch-selector"]',
5050
revisionSelector: '[data-test-id="hardware-revision-selector"]',
5151
clearSelection: '[data-test-id="hardware-selection-clear"]',
52+
filterLabel: '[data-test-id="listing-filter-label"]',
5253
} as const;

dashboard/e2e/hardware-listing.spec.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,49 @@ test.describe('Hardware Listing Page Tests', () => {
137137
).toContainText('Select tree');
138138
await expect(clearButton).toBeHidden();
139139
});
140+
141+
test('filter label updates with query params', async ({ page }) => {
142+
const filterLabel = page.locator(HARDWARE_LISTING_SELECTORS.filterLabel);
143+
await expect(filterLabel).toBeVisible();
144+
await expect(filterLabel).toContainText(
145+
/Showing latest checkout for trees updated in the last \d+ days/,
146+
);
147+
148+
const url = new URL(page.url());
149+
150+
url.searchParams.set('days', '2');
151+
await page.goto(url.toString());
152+
await expect(filterLabel).toContainText('last 2 days');
153+
154+
url.searchParams.set('days', '7');
155+
await page.goto(url.toString());
156+
await expect(filterLabel).toContainText('last 7 days');
157+
});
158+
159+
test('selecting a revision toggles filter label', async ({ page }) => {
160+
const filterLabel = page.locator(HARDWARE_LISTING_SELECTORS.filterLabel);
161+
await expect(filterLabel).toBeVisible();
162+
163+
await selectComboboxOption(page, HARDWARE_LISTING_SELECTORS.treeSelector);
164+
await expect(filterLabel).toBeHidden();
165+
166+
await page.locator(HARDWARE_LISTING_SELECTORS.clearSelection).click();
167+
await expect(filterLabel).toBeVisible();
168+
});
169+
170+
test('loading URL with revision does not show filter label', async ({
171+
page,
172+
}) => {
173+
await selectComboboxOption(page, HARDWARE_LISTING_SELECTORS.treeSelector);
174+
const urlWithRevision = page.url();
175+
await expect(urlWithRevision).toMatch(/[?&]ch=/);
176+
177+
await page.goto(urlWithRevision);
178+
179+
const filterLabel = page.locator(HARDWARE_LISTING_SELECTORS.filterLabel);
180+
await expect(filterLabel).toBeHidden();
181+
182+
await page.locator(HARDWARE_LISTING_SELECTORS.clearSelection).click();
183+
await expect(filterLabel).toBeVisible();
184+
});
140185
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import type { JSX } from 'react';
2+
import { FormattedMessage } from 'react-intl';
3+
4+
export function FilterLabel({ days }: { days: number }): JSX.Element {
5+
return (
6+
<p
7+
className="text-dim-gray text-left text-xs"
8+
data-test-id="listing-filter-label"
9+
>
10+
<FormattedMessage
11+
id="filter.latestCheckoutFilterLabel"
12+
values={{ days }}
13+
/>
14+
</p>
15+
);
16+
}

dashboard/src/components/TreeListingPage/TreeTable.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import { usePaginationState } from '@/hooks/usePaginationState';
3434
import BaseTable, { TableHead } from '@/components/Table/BaseTable';
3535
import { TableBody, TableCell, TableRow } from '@/components/ui/table';
3636
import { ConditionalTableCell } from '@/components/Table/ConditionalTableCell';
37+
import { FilterLabel } from '@/components/FilterLabel/FilterLabel';
3738

3839
import { BaseGroupedStatusWithLink } from '@/components/Status/Status';
3940
import { TableHeader } from '@/components/Table/TableHeader';
@@ -50,6 +51,7 @@ import QuerySwitcher from '@/components/QuerySwitcher/QuerySwitcher';
5051
import { MemoizedSectionError } from '@/components/DetailsPages/SectionError';
5152

5253
import type { TreeListingRoutesMap } from '@/utils/constants/treeListing';
54+
import { DEFAULT_TIME_SEARCH } from '@/utils/constants/general';
5355

5456
import {
5557
commonTreeTableColumns,
@@ -265,7 +267,7 @@ export function TreeTable({
265267
isLoading?: boolean;
266268
urlFromMap: TreeListingRoutesMap;
267269
}): JSX.Element {
268-
const { origin, listingSize } = useSearch({
270+
const { origin, listingSize, intervalInDays } = useSearch({
269271
from: urlFromMap.search,
270272
});
271273
const navigate = useNavigate({ from: urlFromMap.navigate });
@@ -395,11 +397,16 @@ export function TreeTable({
395397
<TableBody>{tableBody}</TableBody>
396398
</BaseTable>
397399
</QuerySwitcher>
398-
<PaginationInfo
399-
table={table}
400-
intlLabel="global.trees"
401-
onPaginationChange={navigateWithPageSize}
402-
/>
400+
<div className="flex flex-wrap items-start justify-between gap-4">
401+
<FilterLabel days={intervalInDays ?? DEFAULT_TIME_SEARCH} />
402+
<div className="ml-auto">
403+
<PaginationInfo
404+
table={table}
405+
intlLabel="global.trees"
406+
onPaginationChange={navigateWithPageSize}
407+
/>
408+
</div>
409+
</div>
403410
</div>
404411
);
405412
}

dashboard/src/locales/messages/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ export const messages = {
8383
'filter.issueSubtitle': 'Please select one or more issues:',
8484
'filter.labs': 'Labs',
8585
'filter.labsSubtitle': 'Please select one or more labs:',
86+
'filter.latestCheckoutFilterLabel':
87+
'Showing latest checkout for trees updated in the last {days} days',
8688
'filter.max': 'Max',
8789
'filter.min': 'Min',
8890
'filter.onlySpecificTab': 'Only affects a specific tab',

dashboard/src/pages/Hardware/HardwareTable.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ import type {
4646

4747
import { sumStatus } from '@/utils/status';
4848

49+
import { REDUCED_TIME_SEARCH } from '@/utils/constants/general';
50+
4951
import { usePaginationState } from '@/hooks/usePaginationState';
5052

5153
import { zPossibleTabValidator } from '@/types/tree/TreeDetails';
@@ -61,6 +63,8 @@ import QuerySwitcher from '@/components/QuerySwitcher/QuerySwitcher';
6163
import { MemoizedSectionError } from '@/components/DetailsPages/SectionError';
6264
import { LoadingCircle } from '@/components/ui/loading-circle';
6365

66+
import { FilterLabel } from '@/components/FilterLabel/FilterLabel';
67+
6468
import { buildHardwareDetailsSearch } from './hardwareTableUtils';
6569
import { HardwareRevisionSelectors } from './HardwareRevisionSelectors';
6670
import type { HardwareRevisionSelectorValue } from './hardwareSelection';
@@ -390,7 +394,7 @@ export function HardwareTable({
390394
onTreeChange = (): void => {},
391395
onClearSelection = (): void => {},
392396
}: IHardwareTable): JSX.Element {
393-
const { listingSize } = useSearch({ strict: false });
397+
const { listingSize, intervalInDays } = useSearch({ strict: false });
394398
const navigate = useNavigate({ from: navigateFrom });
395399

396400
const [sorting, setSorting] = useState<SortingState>([]);
@@ -546,11 +550,18 @@ export function HardwareTable({
546550
<TableBody>{tableBody}</TableBody>
547551
</BaseTable>
548552
</QuerySwitcher>
549-
<PaginationInfo
550-
table={table}
551-
intlLabel="global.hardware"
552-
onPaginationChange={navigateWithPageSize}
553-
/>
553+
<div className="flex flex-wrap items-start justify-between gap-4">
554+
{!selection && (
555+
<FilterLabel days={intervalInDays ?? REDUCED_TIME_SEARCH} />
556+
)}
557+
<div className="ml-auto">
558+
<PaginationInfo
559+
table={table}
560+
intlLabel="global.hardware"
561+
onPaginationChange={navigateWithPageSize}
562+
/>
563+
</div>
564+
</div>
554565
</div>
555566
);
556567
}

0 commit comments

Comments
 (0)