From abc1ba77b306af138c7e90518644bffd0d44ca41 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sat, 24 May 2025 06:05:52 +0200 Subject: [PATCH] auto-git: [change] main.js [change] preload.js [change] renderer.js --- main.js | 38 +++++++++++++++++++++++++++++++ preload.js | 1 + renderer.js | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) diff --git a/main.js b/main.js index 6e7786f..fe4592e 100644 --- a/main.js +++ b/main.js @@ -484,6 +484,44 @@ app.whenReady().then(() => { ipcMain.handle('set-skip-git-prompt', (_e,val) => store.set('skipGitPrompt', val)); + // Auto-Verzeichnisstruktur + const IGNORED_NAMES = [ + '.DS_Store', 'node_modules', '.git', 'dist', 'build', + '.cache', 'out', '.venv', '.mypy_cache', '__pycache__' + ]; + + // Hilfsfunktion: Dateinamen oder Ordner ignorieren? + function isIgnored(name) { + return IGNORED_NAMES.includes(name); + } + + function walkDir(base, rel = '.') { + const full = path.join(base, rel); + let list = []; + try { + fs.readdirSync(full, { withFileTypes: true }).forEach(dirent => { + if (isIgnored(dirent.name)) return; + const entry = path.join(rel, dirent.name); + if (dirent.isDirectory()) { + list.push({ name: dirent.name, type: 'dir', children: walkDir(base, entry) }); + } else { + list.push({ name: dirent.name, type: 'file' }); + } + }); + } catch (e) { + // Permissions o.ä. ignorieren + } + return list; + } + + ipcMain.handle('get-folder-tree', async (_e, folderPath) => { + try { + return walkDir(folderPath, '.'); + } catch { + return []; + } + }); + diff --git a/preload.js b/preload.js index 671aa3a..a592cbe 100644 --- a/preload.js +++ b/preload.js @@ -24,6 +24,7 @@ contextBridge.exposeInMainWorld('electronAPI', { commitCurrentFolder: (folderObj, message) => ipcRenderer.invoke('commit-current-folder', folderObj, message), showFolderContextMenu: folderPath => ipcRenderer.send('show-folder-context-menu', folderPath), setMonitoring: (folderObj, monitoring) => ipcRenderer.invoke('set-monitoring', folderObj.path, monitoring), + getFolderTree: (folderPath) => ipcRenderer.invoke('get-folder-tree', folderPath), }); ipcRenderer.on('repo-updated', (_e, folder) => { diff --git a/renderer.js b/renderer.js index 08c31a0..bc1ff39 100644 --- a/renderer.js +++ b/renderer.js @@ -410,4 +410,68 @@ folders.forEach(folderObj => { commitBtn.textContent = 'Commit'; }); + + const folderTitleDrop = document.getElementById('folderTitleDrop'); + const folderTitleArrow = document.getElementById('folderTitleArrow'); + const folderHierarchyDropdown = document.getElementById('folderHierarchyDropdown'); + const titleEl = document.getElementById('currentTitle'); + let isDropdownOpen = false; + + folderTitleDrop.addEventListener('click', async () => { + if (isDropdownOpen) { + closeDropdown(); + return; + } + const selected = await window.electronAPI.getSelected(); + if (!selected || !selected.path) return; + + // Lade die aktuelle Ordnerhierarchie + folderHierarchyDropdown.innerHTML = '
Lade Verzeichnis...
'; + folderHierarchyDropdown.classList.remove('hidden'); + folderHierarchyDropdown.classList.add('open'); + folderTitleArrow.classList.add('open'); + isDropdownOpen = true; + + const tree = await window.electronAPI.getFolderTree(selected.path); + folderHierarchyDropdown.innerHTML = renderFolderTree(tree); + }); + + function closeDropdown() { + folderHierarchyDropdown.classList.add('hidden'); + folderHierarchyDropdown.classList.remove('open'); + folderTitleArrow.classList.remove('open'); + isDropdownOpen = false; + } + + // KEIN automatisches Schließen beim Klick außerhalb! + + function renderFolderTree(tree, level = 0) { + if (!Array.isArray(tree)) return ''; + return `'; + } + }); \ No newline at end of file