Skip to content

Commit e94c0e9

Browse files
authored
fix(protocol-designer): bypass overflow menu when clicking on empty slot (#18502)
closes RQA-4232, RQA-4235
1 parent 0d9e835 commit e94c0e9

File tree

8 files changed

+11
-65
lines changed

8 files changed

+11
-65
lines changed

protocol-designer/cypress/e2e/modules.cy.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ describe('The Redesigned Create Protocol Landing Page', () => {
4545
steps.add(SetupSteps.Confirm())
4646
steps.add(SetupSteps.EditProtocolA())
4747
steps.add(SetupSteps.ChoseDeckSlot('C2'))
48-
steps.add(SetupSteps.EditHardwareLabwareOnDeck())
4948
steps.add(SetupSteps.OpenSelectLabwareModal())
5049
steps.add(SetupSteps.ClickWellPlatesSection())
5150
steps.add(SetupSteps.SelectLabwareByDisplayName('Bio-Rad 96 Well Plate'))
@@ -63,7 +62,6 @@ describe('The Redesigned Create Protocol Landing Page', () => {
6362
steps.add(SetupSteps.SetVolumeAndSaveForWells('150'))
6463
steps.add(SetupSteps.SelectDone())
6564
steps.add(SetupSteps.ChoseDeckSlot('C1'))
66-
steps.add(SetupSteps.EditHardwareLabwareOnDeck())
6765
steps.add(SetupSteps.OpenSelectLabwareModal())
6866
steps.add(SetupSteps.AddAdapters())
6967
steps.add(SetupSteps.DeepWellTempModAdapter())

protocol-designer/cypress/e2e/plateReaderTest.cy.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ describe('Plate Reader Happy Path Single-Wavelength', () => {
4444
steps.add(SetupSteps.Confirm())
4545
steps.add(SetupSteps.EditProtocolA())
4646
steps.add(SetupSteps.ChoseDeckSlotWithLabware('C3'))
47-
steps.add(SetupSteps.AddHardwareLabware())
4847
steps.add(SetupSteps.OpenSelectLabwareModal())
4948
steps.add(SetupSteps.ClickWellPlatesSection())
5049
steps.add(SetupSteps.SelectLabwareByDisplayName('Bio-Rad 96 Well Plate'))
@@ -64,7 +63,6 @@ describe('Plate Reader Happy Path Single-Wavelength', () => {
6463
// Add another labware
6564
steps.add(SetupSteps.ChoseDeckSlotWithLabware('D2'))
6665

67-
steps.add(SetupSteps.AddHardwareLabware())
6866
steps.add(SetupSteps.OpenSelectLabwareModal())
6967
steps.add(SetupSteps.ClickWellPlatesSection())
7068
steps.add(SetupSteps.SelectLabwareByDisplayName('Armadillo 96 Well Plate'))

protocol-designer/cypress/e2e/transferSettings.cy.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ describe('Transfer stepform testing Single Channel - Happy Path', () => {
4343
steps.add(SetupSteps.Confirm())
4444
steps.add(SetupSteps.EditProtocolA())
4545
steps.add(SetupSteps.ChoseDeckSlot('C2'))
46-
steps.add(SetupSteps.AddHardwareLabware())
4746
steps.add(SetupSteps.OpenSelectLabwareModal())
4847
steps.add(SetupSteps.ClickWellPlatesSection())
4948
steps.add(SetupSteps.SelectLabwareByDisplayName('Bio-Rad 96 Well Plate'))
@@ -61,7 +60,6 @@ describe('Transfer stepform testing Single Channel - Happy Path', () => {
6160
steps.add(SetupSteps.SetVolumeAndSaveForWells('150'))
6261
steps.add(SetupSteps.SelectDone())
6362
steps.add(SetupSteps.ChoseDeckSlot('C3'))
64-
steps.add(SetupSteps.AddHardwareLabware())
6563
steps.add(SetupSteps.OpenSelectLabwareModal())
6664
steps.add(SetupSteps.ClickWellPlatesSection())
6765
steps.add(SetupSteps.SelectLabwareByDisplayName('Bio-Rad 96 Well Plate'))

protocol-designer/cypress/support/SetupSteps.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export enum SetupLocators {
9292
}
9393

9494
export const RegexSetupContent = {
95-
slotText: /Edit (slot|labware)/i,
95+
slotText: /(Add|Edit) labware/i,
9696
}
9797

9898
/**
@@ -405,15 +405,6 @@ export const SetupSteps = {
405405
},
406406
}),
407407

408-
/**
409-
* Edits existing labware/hardware on a deck slot.
410-
*/
411-
EditHardwareLabwareOnDeck: (): StepThunk => ({
412-
call: () => {
413-
cy.get('button[data-testid="SlotOverflowMenu_openTools"]').click()
414-
},
415-
}),
416-
417408
/**
418409
* Clicks the "Labware" header.
419410
*/
@@ -1182,7 +1173,7 @@ export const CompositeSetupSteps = {
11821173
`Running AddLabwareToDeckSlot with slot ${deckSlot} and labware ${labwareName}`
11831174
)
11841175
SetupSteps.ChoseDeckSlotWithLabware(slotToUse).call()
1185-
SetupSteps.AddHardwareLabware().call()
1176+
// SetupSteps.AddHardwareLabware().call()
11861177
SetupSteps.OpenSelectLabwareModal().call()
11871178
SetupSteps.ClickWellPlatesSection().call()
11881179
SetupSteps.SelectLabwareByDisplayName(labwareToUse).call()

protocol-designer/src/pages/Designer/DeckSetup/DeckSetupDetails.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element {
349349
isSelected={selectedZoomInSlot != null}
350350
deckDef={deckDef}
351351
stagingAreaAddressableAreas={[]}
352+
addEquipment={addEquipment}
352353
/>
353354
) : null}
354355
</Module>
@@ -418,6 +419,7 @@ export function DeckSetupDetails(props: DeckSetupDetailsProps): JSX.Element {
418419
isSelected={selectedZoomInSlot != null}
419420
deckDef={deckDef}
420421
stagingAreaAddressableAreas={stagingAreaAddressableAreas}
422+
addEquipment={addEquipment}
421423
/>
422424
)
423425
})}

protocol-designer/src/pages/Designer/DeckSetup/Overlays/SlotControls.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import type {
3939
import type { DroppedItem, SharedControlsType } from '../types'
4040

4141
interface SlotControlsProps extends SharedControlsType {
42+
addEquipment: (slotId: string) => void
4243
stagingAreaAddressableAreas: AddressableAreaName[]
4344
deckDef: DeckDefinition
4445
slotBoundingBox: Dimensions
@@ -57,7 +58,7 @@ export const SlotControls = (props: SlotControlsProps): JSX.Element | null => {
5758
hover,
5859
handleDragHover,
5960
setHover,
60-
setShowMenuListForId,
61+
addEquipment,
6162
itemId,
6263
terminalItemId,
6364
isSelected,
@@ -177,7 +178,7 @@ export const SlotControls = (props: SlotControlsProps): JSX.Element | null => {
177178
},
178179
onClick: () => {
179180
if (!isOver) {
180-
setShowMenuListForId(itemId)
181+
addEquipment(itemId)
181182
}
182183
},
183184
}}
@@ -190,7 +191,7 @@ export const SlotControls = (props: SlotControlsProps): JSX.Element | null => {
190191
>
191192
<Link role="button">
192193
<StyledText desktopStyle="bodyLargeSemiBold">
193-
{t('starting_deck_state:edit_slot')}
194+
{t('starting_deck_state:add_labware')}
194195
</StyledText>
195196
</Link>
196197
</Flex>

protocol-designer/src/pages/Designer/DeckSetup/SlotOverflowMenu.tsx

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
StyledText,
1616
useOnClickOutside,
1717
} from '@opentrons/components'
18-
import { FLEX_STAGING_AREA_SLOT_ADDRESSABLE_AREAS } from '@opentrons/shared-data'
1918
import {
2019
getFullStackFromLabwares,
2120
getTopLocationInStack,
@@ -38,11 +37,7 @@ import { getDeckSetupForActiveItem } from '../../../top-selectors/labware-locati
3837
import { getIsLabwareOnSlotInUse } from './utils'
3938

4039
import type { MouseEvent, SetStateAction } from 'react'
41-
import type {
42-
AddressableAreaName,
43-
CoordinateTuple,
44-
DeckSlotId,
45-
} from '@opentrons/shared-data'
40+
import type { CoordinateTuple, DeckSlotId } from '@opentrons/shared-data'
4641
import type { ThunkDispatch } from '../../../types'
4742

4843
const ROBOT_BOTTOM_HALF_SLOTS = [
@@ -140,11 +135,6 @@ export function SlotOverflowMenu(
140135
const adapterOnSlot = Object.values(deckSetupLabware).find(
141136
lw => lw.id === labwareStackOnSlot[1]
142137
)
143-
const hasNoItem = labwareStackOnSlot.length === 0
144-
145-
const isStagingSlot = FLEX_STAGING_AREA_SLOT_ADDRESSABLE_AREAS.includes(
146-
location as AddressableAreaName
147-
)
148138

149139
const handleDuplicate = (): void => {
150140
if (!isSpace) {
@@ -262,7 +252,7 @@ export function SlotOverflowMenu(
262252
}}
263253
>
264254
<StyledText desktopStyle="bodyDefaultRegular">
265-
{hasNoItem ? t('add_labware') : t('edit_labware')}
255+
{t('edit_labware')}
266256
</StyledText>
267257
</MenuItem>
268258
{showDuplicateBtn ? (
@@ -274,7 +264,6 @@ export function SlotOverflowMenu(
274264
) : null}
275265
<Divider marginY="0" />
276266
<MenuItem
277-
disabled={hasNoItem && !isStagingSlot}
278267
onClick={(e: MouseEvent) => {
279268
handleClearLabware(e)
280269
}}

protocol-designer/src/pages/Designer/DeckSetup/__tests__/SlotOverflowMenu.test.tsx

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -133,45 +133,14 @@ describe('SlotOverflowMenu', () => {
133133
expect(vi.mocked(deleteContainer)).toHaveBeenCalledTimes(2)
134134
expect(props.setShowMenuList).toHaveBeenCalled()
135135
})
136-
it('renders 3 buttons when there is nothing on the slot', () => {
137-
props.location = 'A1'
138-
render(props)
139-
fireEvent.click(screen.getByRole('button', { name: 'Add labware' }))
140-
expect(props.addEquipment).toHaveBeenCalled()
141-
expect(props.setShowMenuList).toHaveBeenCalled()
142-
expect(screen.getAllByRole('button')).toHaveLength(2)
143-
expect(screen.getByRole('button', { name: 'Clear labware' })).toBeDisabled()
144-
screen.getByTestId('divider')
145-
})
146-
it('renders Edit liquid button when there is liquid on the labware', () => {
147-
vi.mocked(labwareIngredSelectors.getLiquidsByLabwareId).mockReturnValue({
148-
labId2: { well1: { '0': { volume: 10 } } },
149-
})
150-
render(props)
151-
screen.getByRole('button', { name: 'Edit labware' })
152-
})
153-
it('deletes the labware', () => {
154-
vi.mocked(labwareIngredSelectors.getLiquidsByLabwareId).mockReturnValue({
155-
labId2: { well1: { '0': { volume: 10 } } },
156-
})
157-
render(props)
158-
fireEvent.click(screen.getByRole('button', { name: 'Clear labware' }))
159-
160-
expect(vi.mocked(deleteContainer)).toHaveBeenCalledTimes(2)
161-
expect(vi.mocked(deleteContainer)).toHaveBeenNthCalledWith(1, {
162-
labwareId: 'labId2',
163-
})
164-
expect(vi.mocked(deleteContainer)).toHaveBeenNthCalledWith(2, {
165-
labwareId: 'labId',
166-
})
167-
})
168136

169137
it('renders snackbar if duplicate is clicked and the deck is full', () => {
170138
vi.mocked(getNextAvailableDeckSlot).mockReturnValue(null)
171139
render(props)
172140
fireEvent.click(screen.getByRole('button', { name: 'Duplicate labware' }))
173141
expect(MOCK_MAKE_SNACKBAR).toHaveBeenCalled()
174142
})
143+
175144
it('renders the ConfirmDeleteEntityInUseModal modal', () => {
176145
vi.mocked(getIsLabwareOnSlotInUse).mockReturnValue(true)
177146
render(props)

0 commit comments

Comments
 (0)