gitea源码

diff-file.ts 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import {reactive} from 'vue';
  2. import type {Reactive} from 'vue';
  3. const {pageData} = window.config;
  4. export type DiffStatus = '' | 'added' | 'modified' | 'deleted' | 'renamed' | 'copied' | 'typechange';
  5. export type DiffTreeEntry = {
  6. FullName: string,
  7. DisplayName: string,
  8. NameHash: string,
  9. DiffStatus: DiffStatus,
  10. EntryMode: string,
  11. IsViewed: boolean,
  12. Children: DiffTreeEntry[],
  13. FileIcon: string,
  14. ParentEntry?: DiffTreeEntry,
  15. };
  16. type DiffFileTreeData = {
  17. TreeRoot: DiffTreeEntry,
  18. };
  19. type DiffFileTree = {
  20. folderIcon: string;
  21. folderOpenIcon: string;
  22. diffFileTree: DiffFileTreeData;
  23. fullNameMap?: Record<string, DiffTreeEntry>
  24. fileTreeIsVisible: boolean;
  25. selectedItem: string;
  26. };
  27. let diffTreeStoreReactive: Reactive<DiffFileTree>;
  28. export function diffTreeStore() {
  29. if (!diffTreeStoreReactive) {
  30. diffTreeStoreReactive = reactiveDiffTreeStore(pageData.DiffFileTree, pageData.FolderIcon, pageData.FolderOpenIcon);
  31. }
  32. return diffTreeStoreReactive;
  33. }
  34. export function diffTreeStoreSetViewed(store: Reactive<DiffFileTree>, fullName: string, viewed: boolean) {
  35. const entry = store.fullNameMap[fullName];
  36. if (!entry) return;
  37. entry.IsViewed = viewed;
  38. for (let parent = entry.ParentEntry; parent; parent = parent.ParentEntry) {
  39. parent.IsViewed = isEntryViewed(parent);
  40. }
  41. }
  42. function fillFullNameMap(map: Record<string, DiffTreeEntry>, entry: DiffTreeEntry) {
  43. map[entry.FullName] = entry;
  44. if (!entry.Children) return;
  45. entry.IsViewed = isEntryViewed(entry);
  46. for (const child of entry.Children) {
  47. child.ParentEntry = entry;
  48. fillFullNameMap(map, child);
  49. }
  50. }
  51. export function reactiveDiffTreeStore(data: DiffFileTreeData, folderIcon: string, folderOpenIcon: string): Reactive<DiffFileTree> {
  52. const store = reactive({
  53. diffFileTree: data,
  54. folderIcon,
  55. folderOpenIcon,
  56. fileTreeIsVisible: false,
  57. selectedItem: '',
  58. fullNameMap: {},
  59. });
  60. fillFullNameMap(store.fullNameMap, data.TreeRoot);
  61. return store;
  62. }
  63. function isEntryViewed(entry: DiffTreeEntry): boolean {
  64. if (entry.Children) {
  65. let count = 0;
  66. for (const child of entry.Children) {
  67. if (child.IsViewed) count++;
  68. }
  69. return count === entry.Children.length;
  70. }
  71. return entry.IsViewed;
  72. }