From e03e827dcb27a4cd34dd4f9da96ec8d15aaa5c5a Mon Sep 17 00:00:00 2001
From: sillyguodong <33891828+sillyguodong@users.noreply.github.com>
Date: Wed, 12 Apr 2023 15:06:39 +0800
Subject: [PATCH] Expand selected file when clicking file tree (#24041)

Auto expand the selected file when clicking the file item of the file
tree.
This is consistent with Github's behavior.

https://user-images.githubusercontent.com/33891828/231048124-61f180af-adba-42d7-9ffa-626e1de04aed.mov
---
 web_src/js/components/DiffFileTree.vue | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/web_src/js/components/DiffFileTree.vue b/web_src/js/components/DiffFileTree.vue
index 9fc08af1fc..c5a62dd4cc 100644
--- a/web_src/js/components/DiffFileTree.vue
+++ b/web_src/js/components/DiffFileTree.vue
@@ -18,6 +18,7 @@ import DiffFileTreeItem from './DiffFileTreeItem.vue';
 import {doLoadMoreFiles} from '../features/repo-diff.js';
 import {toggleElem} from '../utils/dom.js';
 import {DiffTreeStore} from '../modules/stores.js';
+import {setFileFolding} from '../features/file-fold.js';
 
 const {pageData} = window.config;
 const LOCAL_STORAGE_KEY = 'diff_file_tree_visible';
@@ -104,6 +105,7 @@ export default {
 
     this.hashChangeListener = () => {
       this.store.selectedItem = window.location.hash;
+      this.expandSelectedFile();
     };
     this.hashChangeListener();
     window.addEventListener('hashchange', this.hashChangeListener);
@@ -113,6 +115,14 @@ export default {
     window.removeEventListener('hashchange', this.hashChangeListener);
   },
   methods: {
+    expandSelectedFile() {
+      // expand file if the selected file is folded
+      if (this.store.selectedItem) {
+        const box = document.querySelector(this.store.selectedItem);
+        const folded = box?.getAttribute('data-folded') === 'true';
+        if (folded) setFileFolding(box, box.querySelector('.fold-file'), false);
+      }
+    },
     toggleVisibility() {
       this.updateVisibility(!this.fileTreeIsVisible);
     },