Skip to content

Commit d0746fb

Browse files
committed
Indexing UI: Fix dir size display during indexing
- Show "Scanning..." (not `<dir>`) while aggregation is running, not just during the scan phase — sizes aren't ready until aggregation finishes - Refresh both panes on `index-aggregation-complete` instead of `index-scan-complete` so sizes auto-appear the moment they're in the DB - `FullList` and `BriefList` now derive `indexing = isScanning() || isAggregating()`
1 parent a5b5beb commit d0746fb

4 files changed

Lines changed: 24 additions & 22 deletions

File tree

apps/desktop/src/lib/file-explorer/pane/DualPaneExplorer.svelte

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@
166166
let unlistenDragImageSize: UnlistenFn | undefined
167167
let unlistenDragModifiers: UnlistenFn | undefined
168168
let unlistenIndexEvents: UnlistenFn | undefined
169-
let unlistenIndexScanComplete: UnlistenFn | undefined
169+
let unlistenIndexAggregationComplete: UnlistenFn | undefined
170170
let unlistenMcpActivateTab: UnlistenFn | undefined
171171
let unlistenMcpPinTab: UnlistenFn | undefined
172172
@@ -1130,8 +1130,8 @@
11301130
// Listen for index directory updates to refresh panes when sizes change
11311131
unlistenIndexEvents = await initIndexEvents(handleIndexDirUpdated)
11321132
1133-
// Refresh both panes when scan completes (aggregation just finished, all sizes available)
1134-
unlistenIndexScanComplete = await listen('index-scan-complete', () => {
1133+
// Refresh both panes when aggregation completes (all dir_stats are now in the DB)
1134+
unlistenIndexAggregationComplete = await listen('index-aggregation-complete', () => {
11351135
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
11361136
getPaneRef('left')?.refreshIndexSizes?.()
11371137
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
@@ -1283,7 +1283,7 @@
12831283
unlistenDragModifiers?.()
12841284
unlistenDragDrop?.()
12851285
unlistenIndexEvents?.()
1286-
unlistenIndexScanComplete?.()
1286+
unlistenIndexAggregationComplete?.()
12871287
unlistenMcpActivateTab?.()
12881288
unlistenMcpPinTab?.()
12891289
if (tabSyncTimer) clearTimeout(tabSyncTimer)

apps/desktop/src/lib/file-explorer/views/BriefList.svelte

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import { getRowHeight, formatFileSize } from '$lib/settings/reactive-settings.svelte'
2222
import { getSetting } from '$lib/settings/settings-store'
2323
import { formatNumber, pluralize } from '../selection/selection-info-utils'
24-
import { isScanning } from '$lib/indexing/index-state.svelte'
24+
import { isScanning, isAggregating } from '$lib/indexing/index-state.svelte'
2525
import { iconCacheCleared } from '$lib/icon-cache'
2626
import { tooltip } from '$lib/tooltip/tooltip'
2727
import type { RenameState } from '../rename/rename-state.svelte'
@@ -93,8 +93,8 @@
9393
let cachedRange = $state({ start: 0, end: 0 })
9494
let isFetching = $state(false)
9595
96-
// Drive index scanning state — used for directory size tooltips
97-
const scanning = $derived(isScanning())
96+
// Drive index state — show spinner while scanning OR aggregating (sizes aren't ready until aggregation finishes)
97+
const indexing = $derived(isScanning() || isAggregating())
9898
9999
// ==== Layout constants ====
100100
// Row height is reactive based on UI density setting
@@ -436,9 +436,9 @@
436436
if (!file.isDirectory) return undefined
437437
if (file.recursiveSize !== undefined) {
438438
const sizeInfo = `${formatFileSize(file.recursiveSize)} · ${formatNumber(file.recursiveFileCount ?? 0)} ${pluralize(file.recursiveFileCount ?? 0, 'file', 'files')} · ${formatNumber(file.recursiveDirCount ?? 0)} ${pluralize(file.recursiveDirCount ?? 0, 'folder', 'folders')}`
439-
return scanning ? `${sizeInfo} — Might be outdated` : sizeInfo
439+
return indexing ? `${sizeInfo} — Might be outdated` : sizeInfo
440440
}
441-
if (scanning) return 'Scanning...'
441+
if (indexing) return 'Scanning...'
442442
return undefined
443443
}
444444

apps/desktop/src/lib/file-explorer/views/FullList.svelte

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
updateIndexSizesInPlace,
1919
} from './file-list-utils'
2020
import { formatSizeTriads, formatNumber, pluralize } from '../selection/selection-info-utils'
21-
import { isScanning } from '$lib/indexing/index-state.svelte'
21+
import { isScanning, isAggregating } from '$lib/indexing/index-state.svelte'
2222
import {
2323
getVisibleItemsCount as getVisibleItemsCountUtil,
2424
getVirtualizationBufferRows,
@@ -112,8 +112,8 @@
112112
// Measures multiple sample dates to find the maximum width needed.
113113
const dateColumnWidth = $derived(measureDateColumnWidth(formatDateTime))
114114
115-
// Drive index scanning state — used to show spinner in dir size column
116-
const scanning = $derived(isScanning())
115+
// Drive index state — show spinner while scanning OR aggregating (sizes aren't ready until aggregation finishes)
116+
const indexing = $derived(isScanning() || isAggregating())
117117
118118
// ==== Virtual scrolling state ====
119119
let scrollContainer: HTMLDivElement | undefined = $state()
@@ -445,7 +445,7 @@
445445
file.recursiveSize,
446446
file.recursiveFileCount ?? 0,
447447
file.recursiveDirCount ?? 0,
448-
scanning,
448+
indexing,
449449
formatFileSize,
450450
formatNumber,
451451
pluralize,
@@ -459,13 +459,13 @@
459459
{#each formatSizeTriads(file.recursiveSize) as triad, i (i)}
460460
<span class={triad.tierClass}>{triad.value}</span>
461461
{/each}
462-
{#if scanning}
462+
{#if indexing}
463463
<span
464464
class="size-stale"
465465
use:tooltip={'Might be outdated. Currently scanning...'}>⚠️</span
466466
>
467467
{/if}
468-
{:else if scanning}
468+
{:else if indexing}
469469
<span class="size-scanning">Scanning...</span>
470470
{:else}
471471
<span class="size-dir">&lt;dir&gt;</span>

apps/desktop/src/lib/file-explorer/views/full-list-utils.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -144,16 +144,18 @@ export type DirSizeDisplayState = 'dir' | 'scanning' | 'size' | 'size-stale'
144144
* Determine the display state for a directory's size column.
145145
*
146146
* Rules:
147-
* - Has recursiveSize + scanning active -> 'size-stale' (show size with stale warning)
148-
* - Has recursiveSize + not scanning -> 'size' (show formatted size)
149-
* - No recursiveSize + scanning active -> 'scanning' (show spinner)
150-
* - No recursiveSize + not scanning -> 'dir' (show <dir> placeholder)
147+
* - Has recursiveSize + indexing active -> 'size-stale' (show size with stale warning)
148+
* - Has recursiveSize + not indexing -> 'size' (show formatted size)
149+
* - No recursiveSize + indexing active -> 'scanning' (show spinner)
150+
* - No recursiveSize + not indexing -> 'dir' (show <dir> placeholder)
151+
*
152+
* "Indexing active" means scanning OR aggregating — sizes aren't ready until aggregation finishes.
151153
*/
152-
export function getDirSizeDisplayState(recursiveSize: number | undefined, scanning: boolean): DirSizeDisplayState {
154+
export function getDirSizeDisplayState(recursiveSize: number | undefined, indexing: boolean): DirSizeDisplayState {
153155
if (recursiveSize !== undefined) {
154-
return scanning ? 'size-stale' : 'size'
156+
return indexing ? 'size-stale' : 'size'
155157
}
156-
return scanning ? 'scanning' : 'dir'
158+
return indexing ? 'scanning' : 'dir'
157159
}
158160

159161
/**

0 commit comments

Comments
 (0)