Skip to content

Commit 3398db4

Browse files
committed
refactor(events): remove querySelectors for duplicates toggling
Avoid using querySelectors in EventsTab for better maintainability.
1 parent 3255e5d commit 3398db4

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

frontend/TestRun/EventsTab.svelte

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@
2727
let isLoading = $state(true);
2828
let eventContainer: HTMLDivElement;
2929
30+
// Registry of event DOM elements keyed by `event-<SEVERITY>-<INDEX>` for scrolling after toggling duplicates
31+
let eventElements: Map<string, HTMLElement> = new Map();
32+
33+
// register anchors for scrolling back to parent event after toggling duplicates
34+
const registerEventAnchor = (node: HTMLElement, key: string) => {
35+
eventElements.set(key, node);
36+
return {
37+
destroy() {
38+
eventElements.delete(key);
39+
}
40+
};
41+
};
42+
3043
const displayCategories = $state({
3144
CRITICAL: {
3245
show: true,
@@ -286,7 +299,7 @@
286299
let relativeOffset: number | null = null;
287300
288301
if (eventContainer) {
289-
const target = eventContainer.querySelector<HTMLElement>(`[data-event-key="${anchorKey}"]`);
302+
const target = eventElements.get(anchorKey);
290303
if (target) {
291304
const containerScrollTop = eventContainer.scrollTop;
292305
relativeOffset = target.offsetTop - containerScrollTop;
@@ -324,7 +337,7 @@
324337
325338
if (relativeOffset !== null && eventContainer) {
326339
await tick();
327-
const updatedTarget = eventContainer.querySelector<HTMLElement>(`[data-event-key="${anchorKey}"]`);
340+
const updatedTarget = eventElements.get(anchorKey);
328341
if (updatedTarget) {
329342
eventContainer.scrollTop = Math.max(updatedTarget.offsetTop - relativeOffset, 0);
330343
}
@@ -371,7 +384,7 @@
371384
return;
372385
}
373386
const anchorKey = `event-${target.severity}-${target.index}`;
374-
const targetElement = eventContainer.querySelector<HTMLElement>(`[data-event-key="${anchorKey}"]`);
387+
const targetElement = eventElements.get(anchorKey);
375388
if (targetElement) {
376389
targetElement.scrollIntoView({ behavior: "smooth", block: "center" });
377390
}
@@ -543,6 +556,7 @@
543556
duplicateParent={event.duplicateParent}
544557
{toggleDuplicates}
545558
{scrollToEvent}
559+
registerAnchor={registerEventAnchor}
546560
on:issueAttach
547561
/>
548562
{:else}

frontend/TestRun/StructuredEvent.svelte

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
display?: boolean;
1919
filterString?: string;
2020
scrollToEvent?: (target: { severity: string; index: number }) => void;
21+
registerAnchor?: (node: HTMLElement, key: string) => { destroy?: () => void } | void;
2122
}
2223
2324
let {
@@ -29,7 +30,8 @@
2930
duplicateParent = null,
3031
display = true,
3132
filterString = "",
32-
scrollToEvent = () => {}
33+
scrollToEvent = () => {},
34+
registerAnchor = (node: HTMLElement, _key: string) => ({ destroy() {} })
3335
}: Props = $props();
3436
3537
const dispatch = createEventDispatcher();
@@ -89,6 +91,7 @@
8991
</script>
9092

9193
<div
94+
use:registerAnchor={`event-${event.severity}-${event.index}`}
9295
data-event-key={`event-${event.severity}-${event.index}`}
9396
class:d-none={!display || shouldFilter(filterString)}
9497
class="mb-2 p-2 shadow rounded font-monospace"

0 commit comments

Comments
 (0)