gitea源码

DiffFileTree.vue 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <script lang="ts" setup>
  2. import DiffFileTreeItem from './DiffFileTreeItem.vue';
  3. import {toggleElem} from '../utils/dom.ts';
  4. import {diffTreeStore} from '../modules/diff-file.ts';
  5. import {setFileFolding} from '../features/file-fold.ts';
  6. import {onMounted, onUnmounted} from 'vue';
  7. const LOCAL_STORAGE_KEY = 'diff_file_tree_visible';
  8. const store = diffTreeStore();
  9. onMounted(() => {
  10. // Default to true if unset
  11. store.fileTreeIsVisible = localStorage.getItem(LOCAL_STORAGE_KEY) !== 'false';
  12. document.querySelector('.diff-toggle-file-tree-button').addEventListener('click', toggleVisibility);
  13. hashChangeListener();
  14. window.addEventListener('hashchange', hashChangeListener);
  15. });
  16. onUnmounted(() => {
  17. document.querySelector('.diff-toggle-file-tree-button').removeEventListener('click', toggleVisibility);
  18. window.removeEventListener('hashchange', hashChangeListener);
  19. });
  20. function hashChangeListener() {
  21. store.selectedItem = window.location.hash;
  22. expandSelectedFile();
  23. }
  24. function expandSelectedFile() {
  25. // expand file if the selected file is folded
  26. if (store.selectedItem) {
  27. const box = document.querySelector(store.selectedItem);
  28. const folded = box?.getAttribute('data-folded') === 'true';
  29. if (folded) setFileFolding(box, box.querySelector('.fold-file'), false);
  30. }
  31. }
  32. function toggleVisibility() {
  33. updateVisibility(!store.fileTreeIsVisible);
  34. }
  35. function updateVisibility(visible: boolean) {
  36. store.fileTreeIsVisible = visible;
  37. localStorage.setItem(LOCAL_STORAGE_KEY, store.fileTreeIsVisible.toString());
  38. updateState(store.fileTreeIsVisible);
  39. }
  40. function updateState(visible: boolean) {
  41. const btn = document.querySelector('.diff-toggle-file-tree-button');
  42. const [toShow, toHide] = btn.querySelectorAll('.icon');
  43. const tree = document.querySelector('#diff-file-tree');
  44. const newTooltip = btn.getAttribute(visible ? 'data-hide-text' : 'data-show-text');
  45. btn.setAttribute('data-tooltip-content', newTooltip);
  46. toggleElem(tree, visible);
  47. toggleElem(toShow, !visible);
  48. toggleElem(toHide, visible);
  49. }
  50. </script>
  51. <template>
  52. <!-- only render the tree if we're visible. in many cases this is something that doesn't change very often -->
  53. <div v-if="store.fileTreeIsVisible" class="diff-file-tree-items">
  54. <DiffFileTreeItem v-for="item in store.diffFileTree.TreeRoot.Children" :key="item.FullName" :item="item"/>
  55. </div>
  56. </template>
  57. <style scoped>
  58. .diff-file-tree-items {
  59. display: flex;
  60. flex-direction: column;
  61. gap: 1px;
  62. margin-right: .5rem;
  63. }
  64. </style>