feat: floor plan selection handles, dbl-click edit, bottom z-index
- Resize handles only render when the plan is selected (click to select, click outside to deselect); previously always shown when unlocked. - Double-clicking an unlocked plan opens the canvas edit modal (via a floorMapEditNonce signal the Sidebar watches). - Floor plan always sits at the bottom of the canvas (z-index -1), behind nodes and edges, locked or not. - Remount the edit modal on every open (key bump) so it re-seeds from the current floor plan; fixes Save clobbering a canvas-side resize/move with stale modal dimensions. - Drop the no-op history snapshot on floor-plan edits (floorMap isn't part of undo history).
This commit is contained in:
@@ -157,6 +157,43 @@ describe('DesignModal', () => {
|
||||
expect(screen.queryByAltText('Floor plan preview')).toBeNull()
|
||||
})
|
||||
|
||||
// Regression: reopening the edit modal after a canvas-side resize must not
|
||||
// save stale dimensions. Sidebar bumps the modal `key` on every open so it
|
||||
// remounts and re-seeds from the current floor plan.
|
||||
it('re-seeds width/height when remounted with a new key (reopen after resize)', () => {
|
||||
const onSubmit = vi.fn()
|
||||
const initial = { name: 'Home', icon: DEFAULT_DESIGN_ICON }
|
||||
const { rerender } = render(
|
||||
<DesignModal key="k1" open onClose={vi.fn()} onSubmit={onSubmit}
|
||||
showFloorMap initialFloorMap={fm} initial={initial} submitLabel="Save" />,
|
||||
)
|
||||
// Canvas-side resize happened; reopen with a fresh key + larger dims.
|
||||
const resized = { ...fm, width: 1200, height: 900 }
|
||||
rerender(
|
||||
<DesignModal key="k2" open onClose={vi.fn()} onSubmit={onSubmit}
|
||||
showFloorMap initialFloorMap={resized} initial={initial} submitLabel="Save" />,
|
||||
)
|
||||
fireEvent.click(screen.getByRole('button', { name: 'Save' }))
|
||||
expect(onSubmit.mock.calls[0][0].floorMap).toMatchObject({ width: 1200, height: 900 })
|
||||
})
|
||||
|
||||
it('keeps stale dimensions when reopened without remount (why the key bump matters)', () => {
|
||||
const onSubmit = vi.fn()
|
||||
const initial = { name: 'Home', icon: DEFAULT_DESIGN_ICON }
|
||||
const { rerender } = render(
|
||||
<DesignModal key="same" open onClose={vi.fn()} onSubmit={onSubmit}
|
||||
showFloorMap initialFloorMap={fm} initial={initial} submitLabel="Save" />,
|
||||
)
|
||||
const resized = { ...fm, width: 1200, height: 900 }
|
||||
rerender(
|
||||
<DesignModal key="same" open onClose={vi.fn()} onSubmit={onSubmit}
|
||||
showFloorMap initialFloorMap={resized} initial={initial} submitLabel="Save" />,
|
||||
)
|
||||
fireEvent.click(screen.getByRole('button', { name: 'Save' }))
|
||||
// Same key → no remount → local state still the original 800×600.
|
||||
expect(onSubmit.mock.calls[0][0].floorMap).toMatchObject({ width: 800, height: 600 })
|
||||
})
|
||||
|
||||
it('submits floorMap: null when shown but no image was chosen', () => {
|
||||
const { onSubmit } = renderModal({
|
||||
showFloorMap: true,
|
||||
|
||||
Reference in New Issue
Block a user