Sfoglia il codice sorgente

fix(host): cancelling a superseded path edit falls back to the single-pane level

A draft edit can invalidate the selection's preview request; Escape then
left selected set with no child and nothing loading — a half-empty
two-pane view. Cancel now clears the selection when no preview exists
(ds-review-bot round 7).
creatixchu 2 mesi fa
parent
commit
b0d120efa8

+ 5 - 0
packages/host/directory-picker-browse/src/client/DirectoryBrowser.tsx

@@ -328,6 +328,11 @@ export function DirectoryBrowser({ open, listDirectory, createDirectory, onOpen,
                     event.stopPropagation()
                     setPathDraft(null)
                     setError(null)
+                    // Editing may have superseded the selection's preview
+                    // request; a selection with no preview and nothing in
+                    // flight would render a half-empty two-pane view, so
+                    // cancel falls back to the single-pane level.
+                    if (child === null && !loading) setSelected(null)
                   }
                 }}
               />

+ 17 - 0
packages/host/directory-picker-browse/tests/directory-browser.spec.tsx

@@ -355,6 +355,23 @@ describe('DirectoryBrowser', () => {
     expect(screen.queryByText('harness')).toBeNull()
   })
 
+  it('falls back to the single-pane level when a path edit superseded the preview and was cancelled', async () => {
+    const pending: ((listing: DirectoryListing) => void)[] = []
+    const b = mount()
+    await waitFor(() => { expect(screen.getByRole('listitem')).toBeTruthy() })
+    // Selection starts a preview that never lands (superseded below).
+    b.listDirectory.mockImplementation(() =>
+      new Promise<DirectoryListing>((settle) => { pending.push(settle) }))
+    fireEvent.click(rowButton(screen.getByRole('listitem')))
+    fireEvent.click(screen.getByRole('button', { name: 'browser.editPath' }))
+    const input = screen.getByLabelText('browser.editPath')
+    fireEvent.change(input, { target: { value: `${DOCS}/x` } })
+    fireEvent.keyDown(input, { key: 'Escape' })
+    // No half-empty two-pane residue: back to the single wide level.
+    expect(columns()).toHaveLength(1)
+    expect(screen.getByRole('button', { name: 'browser.editPath' })).toBeTruthy()
+  })
+
   it('ignores dismissal while adoption is busy', async () => {
     const b = mount({ busy: true })
     await waitFor(() => { expect(screen.getByRole('dialog')).toBeTruthy() })