Skip to content

Commit 31ca57c

Browse files
committed
Add Go to Next Difference feature - vue3.
1 parent cc2f05f commit 31ca57c

2 files changed

Lines changed: 66 additions & 2 deletions

File tree

src/CodeDiff.vue

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,35 @@ const raw = computed(() =>
7878
const diffChange = ref(raw.value)
7979
const isNotChanged = computed(() => diffChange.value.stat.additionsNum === 0 && diffChange.value.stat.deletionsNum === 0)
8080
81+
const currentDiffIndex = ref(-1);
82+
83+
const goToNextDiff = () => {
84+
const diffs = document.querySelectorAll('.split-side-right.blob-code-addition');
85+
if (currentDiffIndex.value < diffs.length - 1) {
86+
currentDiffIndex.value++;
87+
updateCurrentDiffHighlight(diffs);
88+
}
89+
}
90+
91+
const goToPrevDiff = () => {
92+
const diffs = document.querySelectorAll('.split-side-right.blob-code-addition');
93+
if (currentDiffIndex.value > 0) {
94+
currentDiffIndex.value--;
95+
updateCurrentDiffHighlight(diffs);
96+
}
97+
}
98+
99+
const updateCurrentDiffHighlight = (diffs: NodeListOf<Element>) => {
100+
diffs.forEach((diff: { classList: { remove: (arg0: string) => any } }) => diff.classList.remove('current-diff'));
101+
102+
const currentDiff = diffs[currentDiffIndex.value];
103+
104+
if (currentDiff) {
105+
currentDiff.classList.add('current-diff');
106+
currentDiff.scrollIntoView({ behavior: 'smooth', block: 'center' });
107+
}
108+
}
109+
81110
watch(() => props, () => {
82111
diffChange.value = raw.value
83112
emits('diff', {
@@ -111,8 +140,20 @@ watch(() => props, () => {
111140
<span class="info-left">{{ filename }}</span>
112141
<span class="info-right">
113142
<span style="margin-left: 20px;">{{ newFilename }}</span>
114-
<span v-if="!hideStat" class="diff-stat">
115-
<slot name="stat" :stat="diffChange.stat">
143+
<span class="diff-commandbar">
144+
<button class="command-item-button" title="Next Change" @click="goToNextDiff">
145+
<svg width="1rem" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
146+
<path d="M383.6,322.7L278.6,423c-5.8,6-13.7,9-22.4,9c-8.7,0-16.5-3-22.4-9L128.4,322.7c-12.5-11.9-12.5-31.3,0-43.2 c12.5-11.9,32.7-11.9,45.2,0l50.4,48.2v-217c0-16.9,14.3-30.6,32-30.6c17.7,0,32,13.7,32,30.6v217l50.4-48.2 c12.5-11.9,32.7-11.9,45.2,0C396.1,291.4,396.1,310.7,383.6,322.7z"/>
147+
</svg>
148+
</button>
149+
<button class="command-item-button" title="Previous Change" @click="goToPrevDiff">
150+
<svg width="1rem" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
151+
<path d="M128.4,189.3L233.4,89c5.8-6,13.7-9,22.4-9c8.7,0,16.5,3,22.4,9l105.4,100.3c12.5,11.9,12.5,31.3,0,43.2 c-12.5,11.9-32.7,11.9-45.2,0L288,184.4v217c0,16.9-14.3,30.6-32,30.6c-17.7,0-32-13.7-32-30.6v-217l-50.4,48.2 c-12.5,11.9-32.7,11.9-45.2,0C115.9,220.6,115.9,201.3,128.4,189.3z"/>
152+
</svg>
153+
</button>
154+
</span>
155+
<span v-if="!hideStat" class="diff-stat">
156+
<slot name="stat" :stat="diffChange.stat">
116157
<span class="diff-stat-added">+{{ diffChange.stat.additionsNum }} additions</span>
117158
<span class="diff-stat-deleted">-{{ diffChange.stat.deletionsNum }} deletions</span>
118159
</slot>

src/style.scss

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,25 @@
5151
color: var(--color-fg-subtle);
5252
}
5353
}
54+
55+
.diff-commandbar {
56+
margin-left: auto;
57+
margin-right: 1rem;
58+
59+
.command-item-button {
60+
background-color: transparent;
61+
color: var(--color-fg-subtle);
62+
border: none;
63+
64+
svg {
65+
fill: var(--color-fg-subtle);
66+
}
67+
}
68+
69+
.command-item-button:hover {
70+
background-color: var(--color-btn-outline-hover-border);
71+
}
72+
}
5473
}
5574
}
5675

@@ -122,6 +141,10 @@
122141
background-color: var(--color-diff-blob-addition-word-bg);
123142
}
124143
}
144+
145+
.current-diff {
146+
border: 1px solid var(--color-border-muted);
147+
}
125148

126149
.blob-code-context,
127150
.blob-code-addition,

0 commit comments

Comments
 (0)