diff options
author | Kerwin Bryant <kerwin612@qq.com> | 2025-04-15 22:35:22 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-15 22:35:22 +0800 |
commit | 2b99a58f540a15a04b48cba507ace8abf3c52014 (patch) | |
tree | aa14c105285455352ba37ed386f3cfab83b4eccf /web_src/js/modules/diff-file.ts | |
parent | 18a673bad1d036502baca4491a16679692c42320 (diff) | |
download | gitea-2b99a58f540a15a04b48cba507ace8abf3c52014.tar.gz gitea-2b99a58f540a15a04b48cba507ace8abf3c52014.zip |
Mark parent directory as viewed when all files are viewed (#33958)
Fix #25644
---------
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'web_src/js/modules/diff-file.ts')
-rw-r--r-- | web_src/js/modules/diff-file.ts | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/web_src/js/modules/diff-file.ts b/web_src/js/modules/diff-file.ts new file mode 100644 index 0000000000..5d06f8a333 --- /dev/null +++ b/web_src/js/modules/diff-file.ts @@ -0,0 +1,78 @@ +import {reactive} from 'vue'; +import type {Reactive} from 'vue'; + +const {pageData} = window.config; + +export type DiffStatus = '' | 'added' | 'modified' | 'deleted' | 'renamed' | 'copied' | 'typechange'; + +export type DiffTreeEntry = { + FullName: string, + DisplayName: string, + NameHash: string, + DiffStatus: DiffStatus, + EntryMode: string, + IsViewed: boolean, + Children: DiffTreeEntry[], + + ParentEntry?: DiffTreeEntry, +} + +type DiffFileTreeData = { + TreeRoot: DiffTreeEntry, +}; + +type DiffFileTree = { + diffFileTree: DiffFileTreeData; + fullNameMap?: Record<string, DiffTreeEntry> + fileTreeIsVisible: boolean; + selectedItem: string; +} + +let diffTreeStoreReactive: Reactive<DiffFileTree>; +export function diffTreeStore() { + if (!diffTreeStoreReactive) { + diffTreeStoreReactive = reactiveDiffTreeStore(pageData.DiffFileTree); + } + return diffTreeStoreReactive; +} + +export function diffTreeStoreSetViewed(store: Reactive<DiffFileTree>, fullName: string, viewed: boolean) { + const entry = store.fullNameMap[fullName]; + if (!entry) return; + entry.IsViewed = viewed; + for (let parent = entry.ParentEntry; parent; parent = parent.ParentEntry) { + parent.IsViewed = isEntryViewed(parent); + } +} + +function fillFullNameMap(map: Record<string, DiffTreeEntry>, entry: DiffTreeEntry) { + map[entry.FullName] = entry; + if (!entry.Children) return; + entry.IsViewed = isEntryViewed(entry); + for (const child of entry.Children) { + child.ParentEntry = entry; + fillFullNameMap(map, child); + } +} + +export function reactiveDiffTreeStore(data: DiffFileTreeData): Reactive<DiffFileTree> { + const store = reactive({ + diffFileTree: data, + fileTreeIsVisible: false, + selectedItem: '', + fullNameMap: {}, + }); + fillFullNameMap(store.fullNameMap, data.TreeRoot); + return store; +} + +function isEntryViewed(entry: DiffTreeEntry): boolean { + if (entry.Children) { + let count = 0; + for (const child of entry.Children) { + if (child.IsViewed) count++; + } + return count === entry.Children.length; + } + return entry.IsViewed; +} |