feat(app): folder tree in the Changes view (#1918)
Group changed files in the Changes view into a collapsible directory tree instead of a flat list, on every form factor — consistent with the Files explorer, which already renders a directory tree on mobile. Folders are collapsible and expanded by default, single-child directory chains are compressed into one row (packages/app/src), and folder rows show aggregate +/- stats. Client-only, built entirely from the existing ParsedDiffFile paths: - diff-tree.ts: pure build/compress/flatten of the directory hierarchy, keyed by full uncompressed dir path so collapse state survives compression changes as the diff mutates. - diff-flat-items.ts: pure buildDiffFlatItems + sumHeightsBefore. The function retains a flat mode (showTree=false) as a tested seam for a possible future flat/tree toggle; sticky header indices are file-headers-only, derived from the post-collapse list. - panel-store: diffCollapsedFoldersByWorkspace slice (collapsed-set, so folders default to expanded), persisted via version 12. The set is reconciled against the current diff so folders that leave and reappear default to expanded and the stored set stays bounded. Presentation primitives (chevron, indent guides, indent constant) are extracted into components/tree-primitives and shared with the Files explorer, which drops its private copies (and a banned useUnistyles call site). The two trees now render identical rows; only the tree-building stays separate (server listings vs. diff paths). The toolbar's expand-all stays file-diffs-only (renamed allFileDiffsExpanded); a separate control collapses/expands all folders. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
cab0e4b3f8
commit
3259a69466
@@ -712,6 +712,8 @@ export const ar: TranslationResources = {
|
||||
wrapLongLines: "لف الخطوط الطويلة",
|
||||
collapseAll: "طي كافة الملفات",
|
||||
expandAll: "قم بتوسيع كافة الملفات",
|
||||
collapseAllFolders: "طي كافة المجلدات",
|
||||
expandAllFolders: "توسيع كافة المجلدات",
|
||||
refreshing: "منعش",
|
||||
refresh: "ينعش",
|
||||
refreshState: "تحديث بوابة وحالة GitHub",
|
||||
|
||||
@@ -719,6 +719,8 @@ export const en = {
|
||||
wrapLongLines: "Wrap long lines",
|
||||
collapseAll: "Collapse all files",
|
||||
expandAll: "Expand all files",
|
||||
collapseAllFolders: "Collapse all folders",
|
||||
expandAllFolders: "Expand all folders",
|
||||
refreshing: "Refreshing",
|
||||
refresh: "Refresh",
|
||||
refreshState: "Refresh git and GitHub state",
|
||||
|
||||
@@ -739,6 +739,8 @@ export const es: TranslationResources = {
|
||||
wrapLongLines: "Envolver largas filas",
|
||||
collapseAll: "Contraer todos los archivos",
|
||||
expandAll: "Expandir todos los archivos",
|
||||
collapseAllFolders: "Contraer todas las carpetas",
|
||||
expandAllFolders: "Expandir todas las carpetas",
|
||||
refreshing: "Refrescante",
|
||||
refresh: "Refrescar",
|
||||
refreshState: "Actualizar el estado de git yGitHub",
|
||||
|
||||
@@ -738,6 +738,8 @@ export const fr: TranslationResources = {
|
||||
wrapLongLines: "Enroulez les longues lignes",
|
||||
collapseAll: "Réduire tous les fichiers",
|
||||
expandAll: "Développer tous les fichiers",
|
||||
collapseAllFolders: "Réduire tous les dossiers",
|
||||
expandAllFolders: "Développer tous les dossiers",
|
||||
refreshing: "Rafraîchissant",
|
||||
refresh: "Rafraîchir",
|
||||
refreshState: "Actualiser l'état de git etGitHub",
|
||||
|
||||
@@ -724,6 +724,8 @@ export const ja: TranslationResources = {
|
||||
wrapLongLines: "長い行を折り返す",
|
||||
collapseAll: "すべて折りたたむ",
|
||||
expandAll: "すべて展開",
|
||||
collapseAllFolders: "すべてのフォルダを折りたたむ",
|
||||
expandAllFolders: "すべてのフォルダを展開",
|
||||
refreshing: "更新中",
|
||||
refresh: "更新",
|
||||
refreshState: "gitとGitHubの状態を更新",
|
||||
|
||||
@@ -730,6 +730,8 @@ export const ptBR: TranslationResources = {
|
||||
wrapLongLines: "Quebrar linhas longas",
|
||||
collapseAll: "Recolher todos os arquivos",
|
||||
expandAll: "Expandir todos os arquivos",
|
||||
collapseAllFolders: "Recolher todas as pastas",
|
||||
expandAllFolders: "Expandir todas as pastas",
|
||||
refreshing: "Atualizando",
|
||||
refresh: "Atualizar",
|
||||
refreshState: "Atualizar estado do git e do GitHub",
|
||||
|
||||
@@ -731,6 +731,8 @@ export const ru: TranslationResources = {
|
||||
wrapLongLines: "Перенос длинных строк",
|
||||
collapseAll: "Свернуть все файлы",
|
||||
expandAll: "Развернуть все файлы",
|
||||
collapseAllFolders: "Свернуть все папки",
|
||||
expandAllFolders: "Развернуть все папки",
|
||||
refreshing: "Освежающий",
|
||||
refresh: "Обновить",
|
||||
refreshState: "Обновить состояние git и GitHub.",
|
||||
|
||||
@@ -706,6 +706,8 @@ export const zhCN: TranslationResources = {
|
||||
wrapLongLines: "自动换行长行",
|
||||
collapseAll: "折叠所有文件",
|
||||
expandAll: "展开所有文件",
|
||||
collapseAllFolders: "折叠所有文件夹",
|
||||
expandAllFolders: "展开所有文件夹",
|
||||
refreshing: "正在刷新",
|
||||
refresh: "刷新",
|
||||
refreshState: "刷新 git 和 GitHub 状态",
|
||||
|
||||
Reference in New Issue
Block a user