mirror of
https://github.com/go-gitea/gitea.git
synced 2024-11-25 17:56:48 +08:00
aa4d1d94f7
- Avoid flash of wrong tree toggle icon on page load by setting icon based on sync state - Avoid "pop-in" of tree on page load by leaving space based on sync state - Use the same border/box-shadow combo used on comment `:target` also for file `:target`. - Refactor `DiffFileTree.vue` to use `toggleElem` instead of hardcoded class name. - Left-align inline comment boxes and make them fit the same amount of markup content on a line as GitHub. - Fix height of `diff-file-list` Fixes: https://github.com/go-gitea/gitea/issues/23593 <img width="1250" alt="Screenshot 2023-03-18 at 00 52 04" src="https://user-images.githubusercontent.com/115237/226071392-6789a644-aead-4756-a77e-aba3642150a0.png"> <img width="1246" alt="Screenshot 2023-03-18 at 00 59 43" src="https://user-images.githubusercontent.com/115237/226071443-8bcba924-458b-48bd-b2f0-0de59cb180ac.png"> <img width="1250" alt="Screenshot 2023-03-18 at 01 27 14" src="https://user-images.githubusercontent.com/115237/226073121-ccb99f9a-d3ac-40b7-9589-43580c4a01c9.png"> <img width="1231" alt="Screenshot 2023-03-19 at 21 44 16" src="https://user-images.githubusercontent.com/115237/226207951-81bcae1b-6b41-4e39-83a7-0f37951df6be.png"> (Yes I'm aware the border-radius in bottom corners is suboptimal, but this would be notorously hard to fix without relying on `overflow: hidden`).
132 lines
4.3 KiB
Vue
132 lines
4.3 KiB
Vue
<template>
|
|
<div
|
|
v-if="fileTreeIsVisible"
|
|
class="gt-mr-3 gt-mt-3 diff-detail-box"
|
|
>
|
|
<!-- only render the tree if we're visible. in many cases this is something that doesn't change very often -->
|
|
<div class="ui list">
|
|
<DiffFileTreeItem v-for="item in fileTree" :key="item.name" :item="item" />
|
|
</div>
|
|
<div v-if="isIncomplete" id="diff-too-many-files-stats" class="gt-pt-2">
|
|
<span class="gt-mr-2">{{ tooManyFilesMessage }}</span><a :class="['ui', 'basic', 'tiny', 'button', isLoadingNewData === true ? 'disabled' : '']" id="diff-show-more-files-stats" @click.stop="loadMoreData">{{ showMoreMessage }}</a>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import DiffFileTreeItem from './DiffFileTreeItem.vue';
|
|
import {doLoadMoreFiles} from '../features/repo-diff.js';
|
|
import {toggleElem} from '../utils/dom.js';
|
|
|
|
const {pageData} = window.config;
|
|
const LOCAL_STORAGE_KEY = 'diff_file_tree_visible';
|
|
|
|
export default {
|
|
components: {DiffFileTreeItem},
|
|
data: () => {
|
|
const fileTreeIsVisible = localStorage.getItem(LOCAL_STORAGE_KEY) === 'true';
|
|
pageData.diffFileInfo.fileTreeIsVisible = fileTreeIsVisible;
|
|
return pageData.diffFileInfo;
|
|
},
|
|
computed: {
|
|
fileTree() {
|
|
const result = [];
|
|
for (const file of this.files) {
|
|
// Split file into directories
|
|
const splits = file.Name.split('/');
|
|
let index = 0;
|
|
let parent = null;
|
|
let isFile = false;
|
|
for (const split of splits) {
|
|
index += 1;
|
|
// reached the end
|
|
if (index === splits.length) {
|
|
isFile = true;
|
|
}
|
|
let newParent = {
|
|
name: split,
|
|
children: [],
|
|
isFile
|
|
};
|
|
|
|
if (isFile === true) {
|
|
newParent.file = file;
|
|
}
|
|
|
|
if (parent) {
|
|
// check if the folder already exists
|
|
const existingFolder = parent.children.find(
|
|
(x) => x.name === split
|
|
);
|
|
if (existingFolder) {
|
|
newParent = existingFolder;
|
|
} else {
|
|
parent.children.push(newParent);
|
|
}
|
|
} else {
|
|
const existingFolder = result.find((x) => x.name === split);
|
|
if (existingFolder) {
|
|
newParent = existingFolder;
|
|
} else {
|
|
result.push(newParent);
|
|
}
|
|
}
|
|
parent = newParent;
|
|
}
|
|
}
|
|
const mergeChildIfOnlyOneDir = (entries) => {
|
|
for (const entry of entries) {
|
|
if (entry.children) {
|
|
mergeChildIfOnlyOneDir(entry.children);
|
|
}
|
|
if (entry.children.length === 1 && entry.children[0].isFile === false) {
|
|
// Merge it to the parent
|
|
entry.name = `${entry.name}/${entry.children[0].name}`;
|
|
entry.children = entry.children[0].children;
|
|
}
|
|
}
|
|
};
|
|
// Merge folders with just a folder as children in order to
|
|
// reduce the depth of our tree.
|
|
mergeChildIfOnlyOneDir(result);
|
|
return result;
|
|
}
|
|
},
|
|
mounted() {
|
|
// replace the pageData.diffFileInfo.files with our watched data so we get updates
|
|
pageData.diffFileInfo.files = this.files;
|
|
|
|
document.querySelector('.diff-toggle-file-tree-button').addEventListener('click', this.toggleVisibility);
|
|
},
|
|
unmounted() {
|
|
document.querySelector('.diff-toggle-file-tree-button').removeEventListener('click', this.toggleVisibility);
|
|
},
|
|
methods: {
|
|
toggleVisibility() {
|
|
this.updateVisibility(!this.fileTreeIsVisible);
|
|
},
|
|
updateVisibility(visible) {
|
|
this.fileTreeIsVisible = visible;
|
|
localStorage.setItem(LOCAL_STORAGE_KEY, this.fileTreeIsVisible);
|
|
this.updateState(this.fileTreeIsVisible);
|
|
},
|
|
updateState(visible) {
|
|
const btn = document.querySelector('.diff-toggle-file-tree-button');
|
|
const [toShow, toHide] = btn.querySelectorAll('.icon');
|
|
const tree = document.getElementById('diff-file-tree');
|
|
const newTooltip = btn.getAttribute(visible ? 'data-hide-text' : 'data-show-text');
|
|
btn.setAttribute('data-tooltip-content', newTooltip);
|
|
toggleElem(tree, visible);
|
|
toggleElem(toShow, !visible);
|
|
toggleElem(toHide, visible);
|
|
},
|
|
loadMoreData() {
|
|
this.isLoadingNewData = true;
|
|
doLoadMoreFiles(this.link, this.diffEnd, () => {
|
|
this.isLoadingNewData = false;
|
|
});
|
|
},
|
|
},
|
|
};
|
|
</script>
|