/
uzer_007
/
Rixea
Обзор
Документация
Войти
/
uzer_007
/
Rixea
Код
Запросы
0
Задачи
Вики
Пакеты
5
Релизы
2
CI/CD
Аналитика
Безопасность
master
web_src/js/modules/diff-file.ts
91 строка
3 KB
uzer_007
feat: первая версия Rixea
02 авг 2026, 22:16
02 авг 2026, 22:16
d4f7504
Код
Авторство
О чём код?
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[] | null, FileIcon: string, ParentEntry?: DiffTreeEntry, }; export type DiffFileTreeData = { TreeRoot: DiffTreeEntry, }; type DiffFileTree = { folderIcon: string; folderOpenIcon: string; diffFileTree: DiffFileTreeData; fullNameMap: Record<string, DiffTreeEntry> fileTreeIsVisible: boolean; selectedItem: string; }; let diffTreeStoreReactive: Reactive<DiffFileTree>; export function diffTreeStore() { if (!diffTreeStoreReactive) { diffTreeStoreReactive = reactiveDiffTreeStore(pageData.DiffFileTree!, pageData.FolderIcon!, pageData.FolderOpenIcon!); } 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); } } export function updateDiffFileTreeButtonState(button: HTMLElement, visible: boolean) { const accessibleName = button.getAttribute(visible ? 'data-hide-text' : 'data-show-text'); if (accessibleName) { button.setAttribute('aria-label', accessibleName); button.setAttribute('data-tooltip-content', accessibleName); } button.setAttribute('aria-expanded', String(visible)); } 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, folderIcon: string, folderOpenIcon: string): Reactive<DiffFileTree> { const store = reactive({ diffFileTree: data, folderIcon, folderOpenIcon, 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; }