Skip to content

Commit 1717ed8

Browse files
authored
Merge pull request #139 from QusaiSabri/master
Added Go to Next Difference feature - vue3.
2 parents 871ae69 + 32390c7 commit 1717ed8

4 files changed

Lines changed: 92 additions & 0 deletions

File tree

src/CodeDiff.vue

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { computed, ref, watch } from 'vue-demi'
33
import { createSplitDiff, createUnifiedDiff } from './utils'
44
import UnifiedViewer from './unified/UnifiedViewer.vue'
55
import SplitViewer from './split/SplitViewer.vue'
6+
import DownArrowIcon from './icons/DownArrowIcon.vue'
7+
import UpArrowIcon from './icons/UpArrowIcon.vue'
68
79
import './style.scss'
810
@@ -78,6 +80,35 @@ const raw = computed(() =>
7880
const diffChange = ref(raw.value)
7981
const isNotChanged = computed(() => diffChange.value.stat.additionsNum === 0 && diffChange.value.stat.deletionsNum === 0)
8082
83+
const currentDiffIndex = ref(-1)
84+
85+
function goToNextDiff() {
86+
const diffs = document.querySelectorAll('.blob-code-addition')
87+
if (currentDiffIndex.value < diffs.length - 1) {
88+
currentDiffIndex.value++
89+
updateCurrentDiffHighlight(diffs)
90+
}
91+
}
92+
93+
function goToPrevDiff() {
94+
const diffs = document.querySelectorAll('.blob-code-addition')
95+
if (currentDiffIndex.value > 0) {
96+
currentDiffIndex.value--
97+
updateCurrentDiffHighlight(diffs)
98+
}
99+
}
100+
101+
function updateCurrentDiffHighlight(diffs: NodeListOf<Element>) {
102+
diffs.forEach((diff: { classList: { remove: (arg0: string) => any } }) => diff.classList.remove('current-diff'))
103+
104+
const currentDiff = diffs[currentDiffIndex.value]
105+
106+
if (currentDiff) {
107+
currentDiff.classList.add('current-diff')
108+
currentDiff.scrollIntoView({ behavior: 'smooth', block: 'center' })
109+
}
110+
}
111+
81112
watch(() => props, () => {
82113
diffChange.value = raw.value
83114
emits('diff', {
@@ -99,6 +130,14 @@ watch(() => props, () => {
99130
<div class="info-left">{{ filename }}</div>
100131
<div class="info-left">{{ newFilename }}</div>
101132
</span>
133+
<span class="diff-commandbar">
134+
<button class="command-item-button" title="Next Change" @click="goToNextDiff">
135+
<DownArrowIcon />
136+
</button>
137+
<button class="command-item-button" title="Previous Change" @click="goToPrevDiff">
138+
<UpArrowIcon />
139+
</button>
140+
</span>
102141
<span v-if="!hideStat" class="diff-stat">
103142
<slot name="stat" :stat="diffChange.stat">
104143
<span class="diff-stat-added">+{{ diffChange.stat.additionsNum }} additions</span>
@@ -111,6 +150,14 @@ watch(() => props, () => {
111150
<span class="info-left">{{ filename }}</span>
112151
<span class="info-right">
113152
<span style="margin-left: 20px;">{{ newFilename }}</span>
153+
<span class="diff-commandbar">
154+
<button class="command-item-button" title="Next Change" @click="goToNextDiff">
155+
<DownArrowIcon />
156+
</button>
157+
<button class="command-item-button" title="Previous Change" @click="goToPrevDiff">
158+
<UpArrowIcon />
159+
</button>
160+
</span>
114161
<span v-if="!hideStat" class="diff-stat">
115162
<slot name="stat" :stat="diffChange.stat">
116163
<span class="diff-stat-added">+{{ diffChange.stat.additionsNum }} additions</span>

src/icons/DownArrowIcon.vue

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script>
2+
export default {
3+
name: 'DownArrowIcon',
4+
}
5+
</script>
6+
7+
<template>
8+
<svg width="1rem" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
9+
<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" />
10+
</svg>
11+
</template>

src/icons/UpArrowIcon.vue

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script>
2+
export default {
3+
name: 'UpArrowIcon',
4+
}
5+
</script>
6+
7+
<template>
8+
<svg width="1rem" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
9+
<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" />
10+
</svg>
11+
</template>

src/style.scss

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

@@ -124,6 +143,10 @@
124143
background-color: var(--color-diff-blob-addition-word-bg);
125144
}
126145
}
146+
147+
.current-diff {
148+
border: 1px solid var(--color-border-muted);
149+
}
127150

128151
.blob-code-context,
129152
.blob-code-addition,

0 commit comments

Comments
 (0)