diff --git a/classifier/js/tree.js b/classifier/js/tree.js index 6fec115..c8497d6 100644 --- a/classifier/js/tree.js +++ b/classifier/js/tree.js @@ -153,7 +153,10 @@ toggle.className = 'folder-toggle'; const mightHaveChildren = (folder.children && folder.children.length > 0) || folder.scanState === 'pending' - || folder.scanState === 'zip-pending'; + || folder.scanState === 'zip-pending' + // Classify mode: a folder with files (even none of subfolders) is + // expandable so its files can be revealed and dragged. + || (classifyOn() && folder.files && folder.files.length > 0); if (mightHaveChildren) { toggle.textContent = folder.expanded ? '▼' : '▶'; toggle.addEventListener('click', (e) => { diff --git a/tests/classify.spec.js b/tests/classify.spec.js index 788f548..0398b3a 100644 --- a/tests/classify.spec.js +++ b/tests/classify.spec.js @@ -244,6 +244,21 @@ test('source file rows render with a state dot in classify mode', async ({ page await expect(page.locator('#folderTree .file-item .cl-dot--none')).toBeVisible(); }); +test('classify: a folder with files but no subfolders is expandable (drag source)', async ({ page }) => { + await page.click('#modeClassifyBtn'); + await page.evaluate(() => { + window.app.folderTree = [{ + name: 'Leaf', path: 'Leaf', expanded: false, scanState: 'done', + files: [{ originalFilename: 'x', extension: 'pdf', folderPath: 'Leaf' }], children: [], + }]; + window.app.modules.tree.render(); + }); + const toggle = page.locator('#folderTree .folder-item .folder-toggle').first(); + await expect(toggle).toHaveText('▶'); // file-only folder still gets an expand arrow + await toggle.click(); + await expect(page.locator('#folderTree .file-item .file-name', { hasText: 'x.pdf' })).toBeVisible(); +}); + test('placing a file turns its dot (and the folder aggregate) done', async ({ page }) => { await withSourceTree(page); await page.evaluate(() => {