Skip to content

Commit 2dea602

Browse files
committed
[web-console] Avoid re-loading logs every time when switching between the tabs
Signed-off-by: Karakatiza666 <bulakh.96@gmail.com>
1 parent 3556d6e commit 2dea602

File tree

4 files changed

+27
-11
lines changed

4 files changed

+27
-11
lines changed

js-packages/web-console/src/lib/components/pipelines/editor/MonitoringPanel.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
true
5353
),
5454
tuple('Samply' as const, TabSamplyProfile.Label, TabSamplyProfile.default, false),
55-
tuple('Logs' as const, TabLogs, PanelLogs, false)
55+
tuple('Logs' as const, TabLogs, PanelLogs, true)
5656
].filter((tab) => tab[0] !== currentInteractionTab)
5757
)
5858
let currentTab = $derived(

js-packages/web-console/src/lib/components/pipelines/editor/TabLogs.svelte

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
5252
let pipelineStatusName = $derived(unionName(pipeline.current.status))
5353
54-
$effect.pre(() => {
54+
let pipelineLogs = $derived.by(() => {
5555
if (!streams[pipelineName]) {
5656
streams[pipelineName] = {
5757
firstRowIndex: 0,
@@ -61,6 +61,7 @@
6161
totalSkippedBytes: 0
6262
}
6363
}
64+
return getStreams.current[pipelineName]
6465
})
6566
6667
$effect(() => {
@@ -204,11 +205,6 @@
204205
}
205206
}
206207
207-
// Trigger update to display the latest rows when switching to another pipeline
208-
$effect(() => {
209-
pipelineName
210-
getStreams.current = streams
211-
})
212208
$effect(() => {
213209
const interval = setInterval(() => {
214210
getStreams.current = streams
@@ -221,7 +217,7 @@
221217
pipelineActionCallbacks.remove('', 'delete', dropLogHistory)
222218
}
223219
})
224-
let stream = $derived(getStreams.current[pipelineName].stream)
220+
let stream = $derived(pipelineLogs.stream)
225221
const now = useInterval(() => new Date(), 1000, 1000 - (Date.now() % 1000))
226222
</script>
227223

@@ -240,7 +236,7 @@
240236
{/if}
241237
</WarningBanner>
242238
{:else if !areLogsExpected(pipelineStatusName)}
243-
{#if getStreams.current[pipelineName].rows.length}
239+
{#if pipelineLogs.rows.length}
244240
<WarningBanner variant="info">
245241
Displaying log history from the last pipeline run. When the pipeline is started again this
246242
history will be cleared.
@@ -255,6 +251,6 @@
255251
<WarningBanner>Connecting to logs stream...</WarningBanner>
256252
{/if}
257253
{#key pipelineName}
258-
<LogsStreamList logs={getStreams.current[pipelineName]}></LogsStreamList>
254+
<LogsStreamList logs={pipelineLogs}></LogsStreamList>
259255
{/key}
260256
</div>

js-packages/web-console/src/lib/components/pipelines/editor/TabsPanel.svelte

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts" generics="T extends Record<string, unknown> ">
22
import type { Component } from 'svelte'
33
import type { Snippet } from '$lib/types/svelte'
4+
import { SvelteSet } from 'svelte/reactivity'
45
56
import { Tabs } from '@skeletonlabs/skeleton-svelte'
67
@@ -17,6 +18,11 @@
1718
tabProps: T
1819
currentTab: string
1920
} = $props()
21+
22+
let visited = $state(new SvelteSet<string>())
23+
$effect.pre(() => {
24+
visited.add(currentTab)
25+
})
2026
</script>
2127

2228
{#snippet defaultTabContainer(tab: Snippet, hidden: boolean)}
@@ -49,7 +55,7 @@
4955
{#snippet tab()}
5056
<TabComponent {...tabProps}></TabComponent>
5157
{/snippet}
52-
{#if keepAlive}
58+
{#if keepAlive && visited.has(tabName)}
5359
{@render tabContainer(tab, currentTab !== tabName)}
5460
{:else if currentTab === tabName}
5561
{@render tabContainer(tab, false)}

js-packages/web-console/src/lib/compositions/common/useReverseScrollContainer.svelte.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,25 @@ export const useReverseScrollContainer = (
9191
})
9292
}
9393

94+
// When the container becomes visible after being hidden (e.g. tab switch with keepAlive),
95+
// the ResizeObserver fires but the virtualizer may need extra time to lay out content.
96+
// Schedule scrollToBottom attempt to catch up.
97+
let wasHidden = false
98+
const visibilityObserver = new IntersectionObserver((entries) => {
99+
const isVisible = entries[0]?.isIntersecting ?? false
100+
if (isVisible && wasHidden && stickToBottom) {
101+
scrollToBottom()
102+
}
103+
wasHidden = !isVisible
104+
})
105+
visibilityObserver.observe(ref)
106+
94107
ref.addEventListener('scroll', onscroll)
95108
scrollToBottom()
96109
return {
97110
destroy: () => {
98111
resizeObserver?.disconnect()
112+
visibilityObserver.disconnect()
99113
ref.removeEventListener('scroll', onscroll)
100114
}
101115
}

0 commit comments

Comments
 (0)