Skip to content

Commit f21f4fa

Browse files
authored
Merge pull request #8 from hansu/6-add-collapseexpand-button-to-diff-view
add collapse/expand button to diff view
2 parents f0d27ea + 1fce571 commit f21f4fa

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

web/main.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2637,7 +2637,7 @@ class GitGraphView {
26372637
}
26382638
html += '</div><div id="cdvControls"><div id="cdvClose" class="cdvControlBtn" title="Close">' + SVG_ICONS.close + '</div>' +
26392639
(codeReviewPossible ? '<div id="cdvCodeReview" class="cdvControlBtn">' + SVG_ICONS.review + '</div>' : '') +
2640-
(!expandedCommit.loading ? '<div id="cdvFileViewTypeTree" class="cdvControlBtn cdvFileViewTypeBtn" title="File Tree View">' + SVG_ICONS.fileTree + '</div><div id="cdvFileViewTypeList" class="cdvControlBtn cdvFileViewTypeBtn" title="File List View">' + SVG_ICONS.fileList + '</div>' : '') +
2640+
(!expandedCommit.loading ? '<div id="cdvFileViewTypeList" class="cdvControlBtn cdvFileViewTypeBtn" title="File List View">' + SVG_ICONS.fileList + '</div><div id="cdvFileViewTypeTree" class="cdvControlBtn cdvFileViewTypeBtn" title="File Tree View">' + SVG_ICONS.fileTree + '</div><div id="cdvCollapse" class="cdvControlBtn cdvFolderBtn" title="Collapse/Expand Folders">' + SVG_ICONS.collapseAll + '</div><div id="cdvExpand" class="cdvControlBtn cdvFolderBtn" title="Expand Folders">' + SVG_ICONS.expandAll + '</div>' : '') +
26412641
(externalDiffPossible ? '<div id="cdvExternalDiff" class="cdvControlBtn">' + SVG_ICONS.linkExternal + '</div>' : '') +
26422642
'</div><div class="cdvHeightResize"></div>';
26432643

@@ -2709,6 +2709,12 @@ class GitGraphView {
27092709
document.getElementById('cdvFileViewTypeList')!.addEventListener('click', () => {
27102710
this.changeFileViewType(GG.FileViewType.List);
27112711
});
2712+
document.getElementById('cdvCollapse')!.addEventListener('click', () => {
2713+
this.openFolders(false);
2714+
});
2715+
document.getElementById('cdvExpand')!.addEventListener('click', () => {
2716+
this.openFolders(true);
2717+
});
27122718

27132719
if (codeReviewPossible) {
27142720
this.renderCodeReviewBtn();
@@ -2930,6 +2936,29 @@ class GitGraphView {
29302936
this.renderCdvFileViewTypeBtns();
29312937
}
29322938

2939+
private openFolders(open:boolean) {
2940+
let expandedCommit = this.expandedCommit;
2941+
if (expandedCommit === null || expandedCommit.fileTree === null) return;
2942+
let folders = document.getElementsByClassName('fileTreeFolder');
2943+
for (let i = 0; i < folders.length; i++) {
2944+
let sourceElem = <HTMLElement>(folders[i]);
2945+
let parent = sourceElem.parentElement!;
2946+
if(open) {
2947+
parent.classList.remove('closed');
2948+
sourceElem.children[0].children[0].innerHTML = SVG_ICONS.openFolder;
2949+
parent.children[1].classList.remove('hidden');
2950+
alterFileTreeFolderOpen(expandedCommit.fileTree, decodeURIComponent(sourceElem.dataset.folderpath!), true);
2951+
2952+
} else{
2953+
parent.classList.add('closed');
2954+
sourceElem.children[0].children[0].innerHTML = SVG_ICONS.closedFolder;
2955+
parent.children[1].classList.add('hidden');
2956+
alterFileTreeFolderOpen(expandedCommit.fileTree, decodeURIComponent(sourceElem.dataset.folderpath!), false);
2957+
}
2958+
}
2959+
this.saveState();
2960+
}
2961+
29332962
private makeCdvFileViewInteractive() {
29342963
const getFileElemOfEventTarget = (target: EventTarget) => <HTMLElement>(<Element>target).closest('.fileTreeFileRecord');
29352964
const getFileOfFileElem = (fileChanges: ReadonlyArray<GG.GitFileChange>, fileElem: HTMLElement) => fileChanges[parseInt(fileElem.dataset.index!)];
@@ -3171,6 +3200,16 @@ class GitGraphView {
31713200
let listView = this.getFileViewType() === GG.FileViewType.List;
31723201
alterClass(treeBtnElem, CLASS_ACTIVE, !listView);
31733202
alterClass(listBtnElem, CLASS_ACTIVE, listView);
3203+
setFolderBtns();
3204+
function setFolderBtns() {
3205+
let btns = document.getElementsByClassName('cdvFolderBtn');
3206+
for (let i = 0; i < btns.length; i++) {
3207+
if(listView)
3208+
btns[i].classList.add('hidden');
3209+
else
3210+
btns[i].classList.remove('hidden');
3211+
}
3212+
}
31743213
}
31753214

31763215
private renderCdvExternalDiffBtn() {

web/styles/main.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,9 @@ table { border-collapse: collapse; }
349349
.cdvControlBtn.active:hover{
350350
background-color:rgba(128,128,128,0.35);
351351
}
352+
.cdvFolderBtn.hidden{
353+
display:none;
354+
}
352355

353356
#cdvCodeReview{
354357
border-radius:4px;

web/utils.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ const SVG_ICONS = {
4040
linkExternal: '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M3,3L3,17L17,17L17,13L15.5,13L15.5,15.5L4.5,15.5L4.5,4.5L7,4.5L7,3L3,3z M10,3L10,4.5L14.4,4.5L9.3,9.7L10.3,10.7L15.5,5.6L15.5,10L17,10L17,3L10,3z"/></svg>',
4141
passed: '<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13"><path fill-rule="evenodd" d="M 6.5,0 A 6.5,6.5 0 0 0 0,6.5 6.5,6.5 0 0 0 6.5,13 6.5,6.5 0 0 0 13,6.5 6.5,6.5 0 0 0 6.5,0 Z M 9.64,2.95 11.2,4.5 5.02,10.68 C 3.92,9.57 2.81,8.46 1.7,7.35 L 3.26,5.8 5.02,7.57 Z"/></svg>',
4242
plus: '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14"><path fill-rule="evenodd" d="M6,2V6H2v2h4v4H8V8h4V6H8V2Z"/></svg>',
43-
review: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill-rule="evenodd" d="m4,4.7 -4,7.3 4,7.3 2.5,0 -4,-7.3 4,-7.3zM11.5,6C9,5.5 6.6,7.1 6.1,9.6c-0.5,2.6 1.1,5 3.6,5.5 1,0.2 1.8,0.1 2.7,-0.3l2.5,3.3c0.1,0.1 0.3,0.2 0.5,0.3 0.2,0 0.4,0 0.6,-0.1 0.3,-0.2 0.4,-0.4 0.4,-0.6 0,-0.2 0,-0.4 -0.1,-0.6 0,-0.2 -2.4,-3.3 -2.4,-3.3 0.7,-0.6 1,-1.5 1.3,-2.4C15.7,8.9 14,6.5 11.5,6zm8.5,-1.3 -2.5,0 4,7.3 -4.2,7.3 2.5,0L24,12zm-8.8,3c1.6,0.3 2.6,1.8 2.3,3.4 -0.3,1.6 -1.8,2.6 -3.4,2.3C8.5,13 7.4,11.6 7.8,10 8,8.4 9.6,7.3 11.2,7.7z"/></svg>'
43+
review: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill-rule="evenodd" d="m4,4.7 -4,7.3 4,7.3 2.5,0 -4,-7.3 4,-7.3zM11.5,6C9,5.5 6.6,7.1 6.1,9.6c-0.5,2.6 1.1,5 3.6,5.5 1,0.2 1.8,0.1 2.7,-0.3l2.5,3.3c0.1,0.1 0.3,0.2 0.5,0.3 0.2,0 0.4,0 0.6,-0.1 0.3,-0.2 0.4,-0.4 0.4,-0.6 0,-0.2 0,-0.4 -0.1,-0.6 0,-0.2 -2.4,-3.3 -2.4,-3.3 0.7,-0.6 1,-1.5 1.3,-2.4C15.7,8.9 14,6.5 11.5,6zm8.5,-1.3 -2.5,0 4,7.3 -4.2,7.3 2.5,0L24,12zm-8.8,3c1.6,0.3 2.6,1.8 2.3,3.4 -0.3,1.6 -1.8,2.6 -3.4,2.3C8.5,13 7.4,11.6 7.8,10 8,8.4 9.6,7.3 11.2,7.7z"/></svg>',
44+
45+
// The SVG icons below are from https://github.com/microsoft/vscode-icons
46+
collapseAll: '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 9H4V10H9V9Z" fill="#C5C5C5"/><path fill-rule="evenodd" clip-rule="evenodd" d="M5 3L6 2H13L14 3V10L13 11H11V13L10 14H3L2 13V6L3 5H5V3ZM6 5H10L11 6V10H13V3H6V5ZM10 6H3V13H10V6Z" fill="#C5C5C5"/></svg>',
47+
expandAll: '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 9H4V10H9V9Z" fill="#C5C5C5"/><path d="M7 12L7 7L6 7L6 12L7 12Z" fill="#C5C5C5"/><path fill-rule="evenodd" clip-rule="evenodd" d="M5 3L6 2H13L14 3V10L13 11H11V13L10 14H3L2 13V6L3 5H5V3ZM6 5H10L11 6V10H13V3H6V5ZM10 6H3V13H10V6Z" fill="#C5C5C5"/></svg>'
4448
};
4549

4650
const GIT_FILE_CHANGE_TYPES = { 'A': 'Added', 'M': 'Modified', 'D': 'Deleted', 'R': 'Renamed', 'U': 'Untracked' };

0 commit comments

Comments
 (0)