Skip to content

Commit a60acd2

Browse files
authored
feat(app): Remove labware logic from deck conflict resolution checker (#18676)
fix EXEC-1470
1 parent 06955fd commit a60acd2

File tree

16 files changed

+91
-423
lines changed

16 files changed

+91
-423
lines changed

app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/SetupFixtureList.tsx

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ import {
1919
} from '@opentrons/components'
2020
import {
2121
FLEX_ROBOT_TYPE,
22+
FLEX_STACKER_ADDRESSABLE_AREAS,
2223
FLEX_USB_MODULE_ADDRESSABLE_AREAS,
2324
getCutoutDisplayName,
2425
getDeckDefFromRobotType,
2526
getFixtureDisplayName,
2627
SINGLE_SLOT_FIXTURES,
27-
TC_MODULE_LOCATION_OT3,
2828
THERMOCYCLER_V2_FRONT_FIXTURE,
2929
THERMOCYCLER_V2_REAR_FIXTURE,
3030
} from '@opentrons/shared-data'
@@ -54,16 +54,22 @@ export const SetupFixtureList = (props: SetupFixtureListProps): JSX.Element => {
5454
const { deckConfigCompatibility, robotName } = props
5555
const deckDef = getDeckDefFromRobotType(FLEX_ROBOT_TYPE)
5656

57+
// if both A1 and B1 need to be empty but the thermocycler is attached, only
58+
// show a conflict for A1 to avoid redundancy
5759
const hasTwoLabwareThermocyclerConflicts =
5860
deckConfigCompatibility.some(
59-
({ cutoutFixtureId, missingLabwareDisplayName }) =>
61+
({ cutoutFixtureId, compatibleCutoutFixtureIds }) =>
6062
cutoutFixtureId === THERMOCYCLER_V2_FRONT_FIXTURE &&
61-
missingLabwareDisplayName != null
63+
compatibleCutoutFixtureIds.some(fixtureId =>
64+
SINGLE_SLOT_FIXTURES.includes(fixtureId)
65+
)
6266
) &&
6367
deckConfigCompatibility.some(
64-
({ cutoutFixtureId, missingLabwareDisplayName }) =>
68+
({ cutoutFixtureId, compatibleCutoutFixtureIds }) =>
6569
cutoutFixtureId === THERMOCYCLER_V2_REAR_FIXTURE &&
66-
missingLabwareDisplayName != null
70+
compatibleCutoutFixtureIds.some(fixtureId =>
71+
SINGLE_SLOT_FIXTURES.includes(fixtureId)
72+
)
6773
)
6874

6975
// if there are two labware conflicts with the thermocycler, don't show the conflict with the thermocycler rear fixture
@@ -84,7 +90,10 @@ export const SetupFixtureList = (props: SetupFixtureListProps): JSX.Element => {
8490
// as they're handled in the Modules Table
8591
return cutoutConfigAndCompatibility.requiredAddressableAreas.every(
8692
raa => FLEX_USB_MODULE_ADDRESSABLE_AREAS.includes(raa)
87-
) ? null : (
93+
) ||
94+
cutoutConfigAndCompatibility.requiredAddressableAreas.some(raa =>
95+
FLEX_STACKER_ADDRESSABLE_AREAS.includes(raa)
96+
) ? null : (
8897
<FixtureListItem
8998
key={cutoutConfigAndCompatibility.cutoutId}
9099
deckDef={deckDef}
@@ -106,7 +115,6 @@ export function FixtureListItem({
106115
cutoutId,
107116
cutoutFixtureId,
108117
compatibleCutoutFixtureIds,
109-
missingLabwareDisplayName,
110118
deckDef,
111119
robotName,
112120
}: FixtureListItemProps): JSX.Element {
@@ -115,14 +123,10 @@ export function FixtureListItem({
115123
const isCurrentFixtureCompatible =
116124
cutoutFixtureId != null &&
117125
compatibleCutoutFixtureIds.includes(cutoutFixtureId)
118-
const isRequiredSingleSlotMissing = missingLabwareDisplayName != null
126+
119127
const isConflictingFixtureConfigured =
120128
cutoutFixtureId != null && !SINGLE_SLOT_FIXTURES.includes(cutoutFixtureId)
121129

122-
const isThermocyclerCurrentFixture =
123-
cutoutFixtureId === THERMOCYCLER_V2_FRONT_FIXTURE ||
124-
cutoutFixtureId === THERMOCYCLER_V2_REAR_FIXTURE
125-
126130
let statusLabel
127131
if (!isCurrentFixtureCompatible) {
128132
statusLabel = (
@@ -179,7 +183,6 @@ export function FixtureListItem({
179183
}}
180184
cutoutId={cutoutId}
181185
deckDef={deckDef}
182-
missingLabwareDisplayName={missingLabwareDisplayName}
183186
requiredFixtureId={compatibleCutoutFixtureIds[0]}
184187
robotName={robotName}
185188
/>
@@ -208,8 +211,7 @@ export function FixtureListItem({
208211
width="60px"
209212
height="54px"
210213
src={
211-
// show the current fixture for a missing single slot
212-
isCurrentFixtureCompatible || isRequiredSingleSlotMissing
214+
isCurrentFixtureCompatible
213215
? getFixtureImage(cutoutFixtureId)
214216
: getFixtureImage(compatibleCutoutFixtureIds?.[0])
215217
}
@@ -223,7 +225,7 @@ export function FixtureListItem({
223225
css={TYPOGRAPHY.pSemiBold}
224226
marginLeft={SPACING.spacing20}
225227
>
226-
{isCurrentFixtureCompatible || isRequiredSingleSlotMissing
228+
{isCurrentFixtureCompatible
227229
? getFixtureDisplayName(cutoutFixtureId)
228230
: getFixtureDisplayName(compatibleCutoutFixtureIds?.[0])}
229231
</LegacyStyledText>
@@ -248,9 +250,7 @@ export function FixtureListItem({
248250
</Flex>
249251
</Flex>
250252
<LegacyStyledText as="p" width="15%">
251-
{isThermocyclerCurrentFixture && isRequiredSingleSlotMissing
252-
? TC_MODULE_LOCATION_OT3
253-
: getCutoutDisplayName(cutoutId)}
253+
{getCutoutDisplayName(cutoutId)}
254254
</LegacyStyledText>
255255
<Flex
256256
width="15%"

app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupFixtureList.test.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ const mockDeckConfigCompatibility: CutoutConfigAndCompatibility[] = [
3636
compatibleCutoutFixtureIds: [
3737
STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE,
3838
],
39-
missingLabwareDisplayName: null,
4039
},
4140
]
4241

@@ -48,7 +47,6 @@ const mockNotConfiguredDeckConfigCompatibility: CutoutConfigAndCompatibility[] =
4847
compatibleCutoutFixtureIds: [
4948
STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE,
5049
],
51-
missingLabwareDisplayName: null,
5250
},
5351
]
5452

@@ -60,7 +58,6 @@ const mockConflictDeckConfigCompatibility: CutoutConfigAndCompatibility[] = [
6058
compatibleCutoutFixtureIds: [
6159
STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE,
6260
],
63-
missingLabwareDisplayName: null,
6461
},
6562
]
6663

@@ -135,7 +132,6 @@ describe('SetupFixtureList', () => {
135132
compatibleCutoutFixtureIds: [
136133
STAGING_AREA_SLOT_WITH_MAGNETIC_BLOCK_V1_FIXTURE,
137134
],
138-
missingLabwareDisplayName: null,
139135
},
140136
],
141137
robotName: 'otie',

app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/__tests__/SetupModulesAndDeck.test.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ describe('SetupModuleAndDeck', () => {
128128
cutoutFixtureId: 'trashBinAdapter',
129129
requiredAddressableAreas: ['movableTrashA1'],
130130
compatibleCutoutFixtureIds: ['trashBinAdapter'],
131-
missingLabwareDisplayName: null,
132131
},
133132
])
134133
render(props)

app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ export const SetupModuleAndDeck = ({
6767
robotType,
6868
protocolAnalysis
6969
)
70-
7170
const isFixtureMismatch = getIsFixtureMismatch(deckConfigCompatibility)
7271

7372
const requiredDeckConfigCompatibility = getRequiredDeckConfig(

app/src/organisms/Desktop/Devices/ProtocolRun/SetupModuleAndDeck/utils.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
HEATERSHAKER_MODULE_V1_FIXTURE,
33
MAGNETIC_BLOCK_V1_FIXTURE,
4+
SINGLE_SLOT_FIXTURES,
45
STAGING_AREA_RIGHT_SLOT_FIXTURE,
56
STAGING_AREA_SLOT_WITH_MAGNETIC_BLOCK_V1_FIXTURE,
67
TEMPERATURE_MODULE_V2_FIXTURE,
@@ -24,7 +25,10 @@ import wasteChute from '/app/assets/images/waste_chute.png'
2425
import type { CutoutFixtureId } from '@opentrons/shared-data'
2526

2627
export function getFixtureImage(cutoutFixtureId: CutoutFixtureId): string {
27-
if (cutoutFixtureId === STAGING_AREA_RIGHT_SLOT_FIXTURE) {
28+
if (SINGLE_SLOT_FIXTURES.includes(cutoutFixtureId)) {
29+
// TODO: replace with image for single slot fixtures once we get final renders
30+
return stagingArea
31+
} else if (cutoutFixtureId === STAGING_AREA_RIGHT_SLOT_FIXTURE) {
2832
return stagingArea
2933
} else if (WASTE_CHUTE_ONLY_FIXTURES.includes(cutoutFixtureId)) {
3034
return wasteChute

app/src/organisms/Desktop/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,6 @@ describe('ProtocolRunSetup', () => {
376376
compatibleCutoutFixtureIds: [
377377
STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE,
378378
],
379-
missingLabwareDisplayName: null,
380379
},
381380
])
382381
vi.mocked(getRequiredDeckConfig).mockReturnValue([

app/src/organisms/LocationConflictModal/LocationConflictModal.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ interface LocationConflictModalProps {
5353
cutoutId: CutoutId
5454
deckDef: DeckDefinition
5555
robotName: string
56-
missingLabwareDisplayName?: string | null
5756
requiredFixtureId?: CutoutFixtureId
5857
requiredModule?: ModuleModel
5958
isOnDevice?: boolean
@@ -66,7 +65,6 @@ export const LocationConflictModal = (
6665
onCloseClick,
6766
cutoutId,
6867
robotName,
69-
missingLabwareDisplayName,
7068
requiredFixtureId,
7169
requiredModule,
7270
deckDef,
@@ -185,9 +183,7 @@ export const LocationConflictModal = (
185183
}
186184

187185
let protocolSpecifiesDisplayName = ''
188-
if (missingLabwareDisplayName != null) {
189-
protocolSpecifiesDisplayName = missingLabwareDisplayName
190-
} else if (requiredFixtureId != null) {
186+
if (requiredFixtureId != null) {
191187
protocolSpecifiesDisplayName = getFixtureDisplayName(requiredFixtureId)
192188
} else if (requiredModule != null) {
193189
protocolSpecifiesDisplayName = getModuleDisplayName(requiredModule)

app/src/organisms/LocationConflictModal/__tests__/LocationConflictModal.test.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
} from '@opentrons/react-api-client'
1212
import {
1313
ot3StandardDeckV5,
14-
SINGLE_RIGHT_SLOT_FIXTURE,
14+
SINGLE_LEFT_SLOT_FIXTURE,
1515
STAGING_AREA_RIGHT_SLOT_FIXTURE,
1616
TRASH_BIN_ADAPTER_FIXTURE,
1717
} from '@opentrons/shared-data'
@@ -119,8 +119,7 @@ describe('LocationConflictModal', () => {
119119
props = {
120120
onCloseClick: vi.fn(),
121121
cutoutId: 'cutoutB1',
122-
requiredFixtureId: SINGLE_RIGHT_SLOT_FIXTURE,
123-
missingLabwareDisplayName: 'a tiprack',
122+
requiredFixtureId: SINGLE_LEFT_SLOT_FIXTURE,
124123
deckDef: ot3StandardDeckV5 as any,
125124
robotName: 'otie',
126125
}
@@ -130,7 +129,7 @@ describe('LocationConflictModal', () => {
130129
screen.getByText('Protocol specifies')
131130
screen.getByText('Currently configured')
132131
screen.getAllByText('Trash bin')
133-
screen.getByText('a tiprack')
132+
screen.getByText('Left slot')
134133
fireEvent.click(screen.getByRole('button', { name: 'Cancel' }))
135134
expect(props.onCloseClick).toHaveBeenCalled()
136135
fireEvent.click(screen.getByRole('button', { name: 'Update deck' }))

app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/FixtureTable.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
TYPOGRAPHY,
1717
} from '@opentrons/components'
1818
import {
19+
FLEX_STACKER_ADDRESSABLE_AREAS,
1920
FLEX_USB_MODULE_ADDRESSABLE_AREAS,
2021
getCutoutDisplayName,
2122
getDeckDefFromRobotType,
@@ -81,14 +82,14 @@ export function FixtureTable({
8182

8283
const hasTwoLabwareThermocyclerConflicts =
8384
requiredDeckConfigCompatibility.some(
84-
({ cutoutFixtureId, missingLabwareDisplayName }) =>
85+
({ cutoutFixtureId, requiredAddressableAreas }) =>
8586
cutoutFixtureId === THERMOCYCLER_V2_FRONT_FIXTURE &&
86-
missingLabwareDisplayName != null
87+
requiredAddressableAreas.includes('B1')
8788
) &&
8889
requiredDeckConfigCompatibility.some(
89-
({ cutoutFixtureId, missingLabwareDisplayName }) =>
90+
({ cutoutFixtureId, requiredAddressableAreas }) =>
9091
cutoutFixtureId === THERMOCYCLER_V2_REAR_FIXTURE &&
91-
missingLabwareDisplayName != null
92+
requiredAddressableAreas.includes('A1')
9293
)
9394

9495
// if there are two labware conflicts with the thermocycler, don't show the conflict with the thermocycler rear fixture
@@ -117,7 +118,10 @@ export function FixtureTable({
117118
// as they're handled in the Modules Table
118119
return fixtureCompatibility.requiredAddressableAreas.every(raa =>
119120
FLEX_USB_MODULE_ADDRESSABLE_AREAS.includes(raa)
120-
) ? null : (
121+
) ||
122+
fixtureCompatibility.requiredAddressableAreas.some(raa =>
123+
FLEX_STACKER_ADDRESSABLE_AREAS.includes(raa)
124+
) ? null : (
121125
<FixtureTableItem
122126
key={`FixtureTableItem_${index}`}
123127
{...fixtureCompatibility}
@@ -147,7 +151,6 @@ function FixtureTableItem({
147151
cutoutId,
148152
cutoutFixtureId,
149153
compatibleCutoutFixtureIds,
150-
missingLabwareDisplayName,
151154
lastItem,
152155
setSetupScreen,
153156
setCutoutId,
@@ -165,7 +168,9 @@ function FixtureTableItem({
165168
const isCurrentFixtureCompatible =
166169
cutoutFixtureId != null &&
167170
compatibleCutoutFixtureIds.includes(cutoutFixtureId)
168-
const isRequiredSingleSlotMissing = missingLabwareDisplayName != null
171+
const isRequiredSingleSlotMissing = compatibleCutoutFixtureIds.some(
172+
fixtureId => SINGLE_SLOT_FIXTURES.includes(fixtureId)
173+
)
169174

170175
const isThermocyclerCurrentFixture =
171176
cutoutFixtureId === THERMOCYCLER_V2_FRONT_FIXTURE ||
@@ -226,7 +231,6 @@ function FixtureTableItem({
226231
cutoutId={cutoutId}
227232
requiredFixtureId={compatibleCutoutFixtureIds[0]}
228233
isOnDevice={true}
229-
missingLabwareDisplayName={missingLabwareDisplayName}
230234
deckDef={deckDef}
231235
robotName={robotName}
232236
/>

app/src/organisms/ODD/ProtocolSetup/ProtocolSetupModulesAndDeck/__tests__/FixtureTable.test.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ describe('FixtureTable', () => {
5656
compatibleCutoutFixtureIds: [
5757
STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE,
5858
],
59-
missingLabwareDisplayName: null,
6059
},
6160
])
6261
})
@@ -76,7 +75,6 @@ describe('FixtureTable', () => {
7675
cutoutFixtureId: SINGLE_RIGHT_SLOT_FIXTURE,
7776
requiredAddressableAreas: [MOVABLE_TRASH_D3_ADDRESSABLE_AREA],
7877
compatibleCutoutFixtureIds: [TRASH_BIN_ADAPTER_FIXTURE],
79-
missingLabwareDisplayName: null,
8078
},
8179
])
8280

@@ -98,7 +96,6 @@ describe('FixtureTable', () => {
9896
cutoutFixtureId: STAGING_AREA_SLOT_WITH_WASTE_CHUTE_RIGHT_ADAPTER_NO_COVER_FIXTURE,
9997
requiredAddressableAreas: [MOVABLE_TRASH_D3_ADDRESSABLE_AREA],
10098
compatibleCutoutFixtureIds: [TRASH_BIN_ADAPTER_FIXTURE],
101-
missingLabwareDisplayName: null,
10299
},
103100
])
104101

0 commit comments

Comments
 (0)