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).
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}}
|
||||
/>
|
||||
|
||||
@@ -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() })
|
||||
|
||||
Reference in New Issue
Block a user