mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 02:46:04 +01:00 
			
		
		
		
	Mark parent directory as viewed when all files are viewed (#33958)
Fix #25644 --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		
							
								
								
									
										47
									
								
								web_src/js/modules/diff-file.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								web_src/js/modules/diff-file.test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| import {diffTreeStoreSetViewed, reactiveDiffTreeStore} from './diff-file.ts'; | ||||
|  | ||||
| test('diff-tree', () => { | ||||
|   const store = reactiveDiffTreeStore({ | ||||
|     'TreeRoot': { | ||||
|       'FullName': '', | ||||
|       'DisplayName': '', | ||||
|       'EntryMode': '', | ||||
|       'IsViewed': false, | ||||
|       'NameHash': '....', | ||||
|       'DiffStatus': '', | ||||
|       'Children': [ | ||||
|         { | ||||
|           'FullName': 'dir1', | ||||
|           'DisplayName': 'dir1', | ||||
|           'EntryMode': 'tree', | ||||
|           'IsViewed': false, | ||||
|           'NameHash': '....', | ||||
|           'DiffStatus': '', | ||||
|           'Children': [ | ||||
|             { | ||||
|               'FullName': 'dir1/test.txt', | ||||
|               'DisplayName': 'test.txt', | ||||
|               'DiffStatus': 'added', | ||||
|               'NameHash': '....', | ||||
|               'EntryMode': '', | ||||
|               'IsViewed': false, | ||||
|               'Children': null, | ||||
|             }, | ||||
|           ], | ||||
|         }, | ||||
|         { | ||||
|           'FullName': 'other.txt', | ||||
|           'DisplayName': 'other.txt', | ||||
|           'NameHash': '........', | ||||
|           'DiffStatus': 'added', | ||||
|           'EntryMode': '', | ||||
|           'IsViewed': false, | ||||
|           'Children': null, | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }); | ||||
|   diffTreeStoreSetViewed(store, 'dir1/test.txt', true); | ||||
|   expect(store.fullNameMap['dir1/test.txt'].IsViewed).toBe(true); | ||||
|   expect(store.fullNameMap['dir1'].IsViewed).toBe(true); | ||||
| }); | ||||
							
								
								
									
										78
									
								
								web_src/js/modules/diff-file.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								web_src/js/modules/diff-file.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -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; | ||||
| } | ||||
| @@ -1,16 +0,0 @@ | ||||
| import {reactive} from 'vue'; | ||||
| import type {Reactive} from 'vue'; | ||||
|  | ||||
| const {pageData} = window.config; | ||||
|  | ||||
| let diffTreeStoreReactive: Reactive<Record<string, any>>; | ||||
| export function diffTreeStore() { | ||||
|   if (!diffTreeStoreReactive) { | ||||
|     diffTreeStoreReactive = reactive({ | ||||
|       files: pageData.DiffFiles, | ||||
|       fileTreeIsVisible: false, | ||||
|       selectedItem: '', | ||||
|     }); | ||||
|   } | ||||
|   return diffTreeStoreReactive; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user