Skip to content

Commit 7ad281b

Browse files
committed
feat: Use stable key for the selected trees on hardware details page.
* Use a hash key from git_url, tree_name and branch to be sure we can select trees, without need of compatible ordering between frontend and backend. Closes #1909 Signed-off-by: Alan Peixinho <alan.peixinho@profusion.mobi>
1 parent 8ec16d3 commit 7ad281b

3 files changed

Lines changed: 51 additions & 9 deletions

File tree

dashboard/src/pages/hardwareDetails/HardwareDetails.tsx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,38 @@ function HardwareDetails(): JSX.Element {
184184
treeIndexesLength: treeIndexesLength,
185185
});
186186

187+
const hasLegacyNumericTreeKeys =
188+
treeIndexes?.some(k => /^\d+$/.test(k)) ||
189+
Object.keys(treeCommits).some(k => /^\d+$/.test(k));
190+
191+
useEffect(() => {
192+
const trees = summaryResponse.data?.common.trees;
193+
if (!trees || !hasLegacyNumericTreeKeys) {
194+
return;
195+
}
196+
197+
const mapKey = (k: string): string =>
198+
/^\d+$/.test(k) ? trees[Number(k)]?.index ?? k : k;
199+
200+
navigate({
201+
replace: true,
202+
search: prev => ({
203+
...prev,
204+
treeIndexes: treeIndexes ? [...new Set(treeIndexes.map(mapKey))] : null,
205+
treeCommits: Object.fromEntries(
206+
Object.entries(treeCommits).map(([k, v]) => [mapKey(k), v]),
207+
),
208+
}),
209+
state: s => s,
210+
});
211+
}, [
212+
navigate,
213+
summaryResponse.data,
214+
treeCommits,
215+
treeIndexes,
216+
hasLegacyNumericTreeKeys,
217+
]);
218+
187219
const hardwareStatusHistoryState = useRouterState({
188220
select: s => s.location.state.hardwareStatusCount,
189221
});
@@ -474,7 +506,7 @@ function HardwareDetails(): JSX.Element {
474506
</p>
475507
</div>
476508
<div className="mt-5">
477-
{!!treeData && (
509+
{!!treeData && !hasLegacyNumericTreeKeys && (
478510
<>
479511
<HardwareHeader
480512
treeItems={treeData}

dashboard/src/pages/hardwareDetails/HardwareDetailsHeaderTable.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -329,19 +329,19 @@ const getColumns = (
329329

330330
const getInitialRowSelection = (
331331
selectedIndexes: string[] | null,
332-
treeItems: PreparedTrees[],
332+
treeItemIndexes: string[],
333333
): Record<string, boolean> => {
334334
if (selectedIndexes === null) {
335-
return Object.fromEntries(treeItems.map(item => [item.index, true]));
335+
return Object.fromEntries(treeItemIndexes.map(index => [index, true]));
336336
}
337337

338338
if (selectedIndexes.length === 0) {
339-
return Object.fromEntries(treeItems.map(item => [item.index, false]));
339+
return Object.fromEntries(treeItemIndexes.map(index => [index, false]));
340340
}
341341

342342
const selectedSet = new Set(selectedIndexes);
343343
return Object.fromEntries(
344-
treeItems.map(item => [item.index, selectedSet.has(item.index)]),
344+
treeItemIndexes.map(index => [index, selectedSet.has(index)]),
345345
);
346346
};
347347

@@ -368,8 +368,14 @@ export function HardwareHeader({
368368
'hardwareDetailsTrees',
369369
);
370370

371+
const treeItemIds = treeItems.map(item => item.index).join('|');
372+
const treeItemIndexes = useMemo(
373+
() => (treeItemIds ? treeItemIds.split('|') : []),
374+
[treeItemIds],
375+
);
376+
371377
const [rowSelection, setRowSelection] = useState(() =>
372-
getInitialRowSelection(selectedIndexes, treeItems),
378+
getInitialRowSelection(selectedIndexes, treeItemIndexes),
373379
);
374380

375381
const rowSelectionDebounced = useDebounce(rowSelection, DEBOUNCE_INTERVAL);
@@ -380,8 +386,8 @@ export function HardwareHeader({
380386
}, [rowSelectionDebounced, updateTreeFilters, treeItems.length]);
381387

382388
useEffect(() => {
383-
setRowSelection(getInitialRowSelection(selectedIndexes, treeItems));
384-
}, [selectedIndexes, treeItems]);
389+
setRowSelection(getInitialRowSelection(selectedIndexes, treeItemIndexes));
390+
}, [selectedIndexes, treeItemIndexes]);
385391

386392
const columns = useMemo(
387393
() => getColumns(setTreeIndexesLength),

dashboard/src/routes/_main/hardware/$hardwareId/route.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@ const defaultValues = {
2929
const hardwareDetailsSearchSchema = z.object({
3030
origin: zOrigin,
3131
currentPageTab: zPossibleTabValidator,
32-
treeIndexes: z.array(z.string()).nullable().default(null),
32+
treeIndexes: z
33+
.array(z.union([z.string(), z.number()]))
34+
.transform(values => values.map(String))
35+
.nullable()
36+
.default(null),
3337
treeCommits: zTreeCommits,
3438
tableFilter: zTableFilterInfoValidator,
3539
diffFilter: zDiffFilter,

0 commit comments

Comments
 (0)