diff --git a/src/sidebar/explorer-panel.js b/src/sidebar/explorer-panel.js new file mode 100644 index 0000000..6ac0713 --- /dev/null +++ b/src/sidebar/explorer-panel.js @@ -0,0 +1,70 @@ +const path = require('path'); + +function renderExplorerPanel(container, { listDirectory, onFileOpen, currentDir }) { + container.innerHTML = ` +
+
+ + +
+
+
+ `; + + document.getElementById('explorer-browse')?.addEventListener('click', async () => { + const dir = await listDirectory(null); // null means open folder dialog + if (dir) { + document.getElementById('explorer-path').value = dir.path; + renderTree(document.getElementById('explorer-tree'), dir.entries, listDirectory, onFileOpen, dir.path); + } + }); + + if (currentDir) { + listDirectory(currentDir).then(dir => { + if (dir) renderTree(document.getElementById('explorer-tree'), dir.entries, listDirectory, onFileOpen, currentDir); + }); + } +} + +function renderTree(container, entries, listDirectory, onFileOpen, basePath) { + container.innerHTML = entries.map(entry => { + if (entry.isDirectory) { + return ``; + } + return `
+ ${getFileIcon(entry.name)} + ${entry.name} +
`; + }).join(''); + + container.querySelectorAll('.tree-folder').forEach(el => { + el.querySelector('.tree-name').addEventListener('click', async () => { + const isCollapsed = el.classList.contains('collapsed'); + if (isCollapsed) { + const dir = await listDirectory(el.dataset.path); + if (dir) { + const childContainer = el.querySelector('.tree-children'); + renderTree(childContainer, dir.entries, listDirectory, onFileOpen, el.dataset.path); + } + } + el.classList.toggle('collapsed'); + el.querySelector('.tree-icon').textContent = el.classList.contains('collapsed') ? '\u25B6' : '\u25BC'; + }); + }); + + container.querySelectorAll('.tree-file').forEach(el => { + el.addEventListener('click', () => onFileOpen(el.dataset.path)); + }); +} + +function getFileIcon(filename) { + const ext = filename.split('.').pop().toLowerCase(); + const icons = { md: '\u{1F4DD}', js: '\u{1F4DC}', json: '{}', html: '\u{1F310}', css: '\u{1F3A8}', py: '\u{1F40D}', pdf: '\u{1F4D5}', txt: '\u{1F4C4}' }; + return icons[ext] || '\u{1F4C4}'; +} + +module.exports = { renderExplorerPanel };