Skip to content

Commit 0bc8a19

Browse files
committed
Use initial load index instead of vlist array index for vlist key
This will allow passing a different (filtered) array to the vlist
1 parent 9a2fc3d commit 0bc8a19

File tree

3 files changed

+17
-19
lines changed

3 files changed

+17
-19
lines changed

web/src/routes/+page.svelte

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@
8383
<DiffSearch />
8484
</div>
8585
<div class="flex flex-1 grow flex-col border-t">
86-
<VList data={viewer.fileDetails} style="height: 100%;" getKey={(_, i) => i} bind:this={viewer.vlist}>
87-
{#snippet children(value, index)}
88-
<div id={`file-${index}`}>
89-
<FileHeader {index} {value} />
90-
<DiffWrapper {index} {value} />
86+
<VList data={viewer.fileDetails} style="height: 100%;" getKey={(value) => value.index} bind:this={viewer.vlist}>
87+
{#snippet children(value)}
88+
<div id={`file-${value.index}`}>
89+
<FileHeader {value} />
90+
<DiffWrapper {value} />
9191
</div>
9292
{/snippet}
9393
</VList>

web/src/routes/DiffWrapper.svelte

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,15 @@
77
import { GlobalOptions } from "$lib/global-options.svelte";
88
99
interface Props {
10-
index: number;
1110
value: FileDetails;
1211
}
1312
14-
let { index, value }: Props = $props();
13+
let { value }: Props = $props();
1514
1615
const viewer = MultiFileDiffViewerState.get();
1716
const globalOptions = GlobalOptions.get();
1817
19-
let collapsed = $derived(viewer.fileStates[index].collapsed);
18+
let collapsed = $derived(viewer.fileStates[value.index].collapsed);
2019
let emptyTextDiff = $derived(value.type === "text" && value.patchHeaderDiffOnly && globalOptions.omitPatchHeaderOnlyHunks);
2120
</script>
2221

web/src/routes/FileHeader.svelte

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,20 @@
88
import { tick } from "svelte";
99
1010
interface Props {
11-
index: number;
1211
value: FileDetails;
1312
}
1413
1514
const viewer = MultiFileDiffViewerState.get();
1615
const globalOptions = GlobalOptions.get();
17-
let { index, value }: Props = $props();
16+
let { value }: Props = $props();
1817
1918
let popoverOpen = $state(false);
2019
2120
async function showInFileTree() {
2221
viewer.layoutState.sidebarCollapsed = false;
2322
await tick();
2423
25-
const fileTreeElement = document.getElementById("file-tree-file-" + index);
24+
const fileTreeElement = document.getElementById("file-tree-file-" + value.index);
2625
if (fileTreeElement) {
2726
popoverOpen = false;
2827
viewer.tree?.expandParents((node) => node.type === "file" && node.file === value);
@@ -46,7 +45,7 @@
4645
});
4746
4847
function selectHeader() {
49-
viewer.scrollToFile(index, { autoExpand: false, smooth: true });
48+
viewer.scrollToFile(value.index, { autoExpand: false, smooth: true });
5049
viewer.setSelection(value, undefined);
5150
}
5251
@@ -70,15 +69,15 @@
7069

7170
{#snippet collapseToggle()}
7271
<button
73-
title={viewer.fileStates[index].collapsed ? "Expand file" : "Collapse file"}
72+
title={viewer.fileStates[value.index].collapsed ? "Expand file" : "Collapse file"}
7473
type="button"
7574
class="flex size-6 items-center justify-center rounded-sm btn-ghost p-0.5"
7675
onclick={(e) => {
77-
viewer.toggleCollapse(index);
76+
viewer.toggleCollapse(value.index);
7877
e.stopPropagation();
7978
}}
8079
>
81-
{#if viewer.fileStates[index].collapsed}
80+
{#if viewer.fileStates[value.index].collapsed}
8281
<span aria-label="expand file" class="iconify size-4 shrink-0 text-em-med octicon--chevron-right-16" aria-hidden="true"></span>
8382
{:else}
8483
<span aria-label="collapse file" class="iconify size-4 shrink-0 text-em-med octicon--chevron-down-16" aria-hidden="true"></span>
@@ -101,9 +100,9 @@
101100
<LabeledCheckbox
102101
labelText="File viewed"
103102
bind:checked={
104-
() => viewer.fileStates[index].checked,
103+
() => viewer.fileStates[value.index].checked,
105104
() => {
106-
viewer.toggleChecked(index);
105+
viewer.toggleChecked(value.index);
107106
popoverOpen = false;
108107
}
109108
}
@@ -121,7 +120,7 @@
121120
{/snippet}
122121

123122
<div
124-
id="file-header-{index}"
123+
id="file-header-{value.index}"
125124
class={[
126125
"sticky top-0 z-10 flex flex-row items-center gap-2 border-b bg-neutral px-2 py-1 text-sm shadow-sm",
127126
"focus-and-selected-styles focus:outline-none",
@@ -133,7 +132,7 @@
133132
data-selected={boolAttr(selected)}
134133
>
135134
{#if value.type === "text"}
136-
<DiffStats brief add={viewer.stats.fileAddedLines[index]} remove={viewer.stats.fileRemovedLines[index]} />
135+
<DiffStats brief add={viewer.stats.fileAddedLines[value.index]} remove={viewer.stats.fileRemovedLines[value.index]} />
137136
{/if}
138137
{@render fileName()}
139138
<div class="ms-0.5 ml-auto flex items-center gap-1">

0 commit comments

Comments
 (0)