diff --git a/frontend/e2e/files-plugin.spec.js b/frontend/e2e/files-plugin.spec.js index 629f4f9..1de15c2 100644 --- a/frontend/e2e/files-plugin.spec.js +++ b/frontend/e2e/files-plugin.spec.js @@ -199,6 +199,25 @@ test.describe('G: Files Plugin', () => { await expect(page.locator('.files-empty')).toHaveCount(0); }); + test('files explorer shows no-match feedback while filtering', async ({ page }) => { + await page.locator('.wt-label').filter({ hasText: 'Project' }).click(); + await openFilesTool(page); + await expect(page.locator('.files-breadcrumb')).toContainText('Project', { timeout: 10000 }); + + await page.locator('[data-files-filter]').fill('zzzz-no-matches'); + + const emptyState = page.locator('.files-empty'); + await expect(emptyState).toBeVisible(); + await expect(emptyState).toContainText('No matches'); + await expect(emptyState.locator('[data-files-empty-action="clear-filter"]')).toBeVisible(); + await expect(page.locator('[data-file-name="project-only.txt"]')).toHaveCount(0); + + await emptyState.locator('[data-files-empty-action="clear-filter"]').click(); + await expect(page.locator('[data-files-filter]')).toHaveValue(''); + await expect(page.locator('.files-empty')).toHaveCount(0); + await expect(page.locator('[data-file-name="project-only.txt"]')).toBeVisible(); + }); + test('files explorer restores an item from trash metadata', async ({ page }) => { await page.locator('.wt-label').filter({ hasText: 'Project' }).click(); await openFilesTool(page); diff --git a/frontend/src/lib/test/wails-mock.js b/frontend/src/lib/test/wails-mock.js index 75e03d9..cf20485 100644 --- a/frontend/src/lib/test/wails-mock.js +++ b/frontend/src/lib/test/wails-mock.js @@ -823,6 +823,27 @@ ]) ]); } + function noMatchesState() { + return e('div', { className: 'files-empty' }, [ + e('div', {}, ['No matches']), + e('div', { className: 'files-empty-actions' }, [ + e('button', { + className: 'files-empty-btn', + 'data-files-empty-action': 'clear-filter', + 'data-files-icon': 'refresh', + title: 'Clear filter', + 'aria-label': 'Clear filter', + innerHTML: actionSvg('refresh') + 'Clear filter', + onClick: function () { + filter = ''; + filterInput.value = ''; + render(); + list.focus(); + } + }, []) + ]) + ]); + } var backButton = btn('Back', 'back', goBack, 'back'); var forwardButton = btn('Forward', 'forward', goForward, 'forward'); var upButton = btn('Up', 'up', function () { if (current) nav(parent(current)); }, 'up'); @@ -923,7 +944,7 @@ list.appendChild(e('div', { className: 'files-header' }, [e('span', {}, ['Name']), e('span', {}, ['Type']), e('span', {}, ['Size']), e('span', {}, ['Modified']), e('span', {}, ['Actions'])])); var shown = visible(); if (!shown.length) { - list.appendChild(filter ? e('div', { className: 'files-empty' }, ['No matches']) : emptyFolderState()); + list.appendChild(filter ? noMatchesState() : emptyFolderState()); return; } shown.forEach(function (item) {