From 01fce64b2c71f3a705678b69e61fd02013b94592 Mon Sep 17 00:00:00 2001 From: Pouzor Date: Wed, 3 Jun 2026 01:09:36 +0200 Subject: [PATCH] fix(ui): Enter restores hidden devices instead of approving them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the Hidden view the only bulk action is Restore, but the Enter shortcut in select mode always called handleBulkApprove — approving hidden devices. Dispatch on statusFilter: restore when hidden, approve when pending. Add regression tests for both views. ha-relevant: maybe --- .../components/modals/PendingDevicesModal.tsx | 8 ++++++- .../__tests__/PendingDevicesModal.test.tsx | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/modals/PendingDevicesModal.tsx b/frontend/src/components/modals/PendingDevicesModal.tsx index 39aa1fb..2cf8ffb 100644 --- a/frontend/src/components/modals/PendingDevicesModal.tsx +++ b/frontend/src/components/modals/PendingDevicesModal.tsx @@ -373,7 +373,13 @@ export function PendingDevicesModal({ open, onClose, highlightId, initialStatus if (e.key === '/') { e.preventDefault(); searchRef.current?.focus() } else if (e.key.toLowerCase() === 's') { e.preventDefault(); if (selectMode) exitSelectMode(); else enterSelectMode() } else if (e.key.toLowerCase() === 'a' && selectMode) { e.preventDefault(); selectAllVisible() } - else if (e.key === 'Enter' && selectMode && selectedIds.size > 0) { e.preventDefault(); handleBulkApprove() } + else if (e.key === 'Enter' && selectMode && selectedIds.size > 0) { + // Enter confirms the bulk action for the current view: approving + // hidden devices would be wrong — they restore. + e.preventDefault() + if (statusFilter === 'hidden') handleBulkRestore() + else handleBulkApprove() + } } window.addEventListener('keydown', handler) return () => window.removeEventListener('keydown', handler) diff --git a/frontend/src/components/modals/__tests__/PendingDevicesModal.test.tsx b/frontend/src/components/modals/__tests__/PendingDevicesModal.test.tsx index 8e99fd4..6470420 100644 --- a/frontend/src/components/modals/__tests__/PendingDevicesModal.test.tsx +++ b/frontend/src/components/modals/__tests__/PendingDevicesModal.test.tsx @@ -250,4 +250,25 @@ describe('PendingDevicesModal', () => { fireEvent.click(screen.getByRole('button', { name: /Restore \(1\)/ })) await waitFor(() => expect(mockBulkRestore).toHaveBeenCalledWith(['dev-a'])) }) + + it('Enter confirms approve in pending select mode', async () => { + render() + await waitFor(() => expect(screen.getByTestId('pending-card-dev-a')).toBeInTheDocument()) + fireEvent.click(screen.getByRole('button', { name: 'Select mode' })) + fireEvent.click(screen.getByTestId('pending-card-dev-a')) + fireEvent.keyDown(window, { key: 'Enter' }) + await waitFor(() => expect(mockBulkApprove).toHaveBeenCalledWith(['dev-a'])) + expect(mockBulkRestore).not.toHaveBeenCalled() + }) + + it('Enter restores (not approves) in hidden select mode', async () => { + mockHidden.mockResolvedValue({ data: [{ ...DEVICE_IP, status: 'hidden' }] }) + render() + await waitFor(() => expect(screen.getByTestId('pending-card-dev-a')).toBeInTheDocument()) + fireEvent.click(screen.getByRole('button', { name: 'Select mode' })) + fireEvent.click(screen.getByTestId('pending-card-dev-a')) + fireEvent.keyDown(window, { key: 'Enter' }) + await waitFor(() => expect(mockBulkRestore).toHaveBeenCalledWith(['dev-a'])) + expect(mockBulkApprove).not.toHaveBeenCalled() + }) })