Skip to content

Commit 972c970

Browse files
authored
refactor(protocol-designer): tweak when module cards are disabled in … (#14995)
…createFileWizard closes AUTH-369
1 parent 5683b33 commit 972c970

File tree

3 files changed

+48
-24
lines changed

3 files changed

+48
-24
lines changed

protocol-designer/src/components/modals/CreateFileWizard/ModulesAndOtherTile.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
getModuleType,
3232
FLEX_ROBOT_TYPE,
3333
MAGNETIC_BLOCK_TYPE,
34+
THERMOCYCLER_MODULE_TYPE,
3435
} from '@opentrons/shared-data'
3536
import { getIsCrashablePipetteSelected } from '../../../step-forms'
3637
import gripperImage from '../../../images/flex_gripper.png'
@@ -44,7 +45,7 @@ import { ModuleFields } from '../FilePipettesModal/ModuleFields'
4445
import { GoBack } from './GoBack'
4546
import {
4647
getCrashableModuleSelected,
47-
getIsSlotAvailable,
48+
getNumSlotsAvailable,
4849
getTrashOptionDisabled,
4950
} from './utils'
5051
import { EquipmentOption } from './EquipmentOption'
@@ -221,7 +222,12 @@ function FlexModuleFields(props: WizardTileProps): JSX.Element {
221222
const moduleType = getModuleType(moduleModel)
222223
const isModuleOnDeck = moduleTypesOnDeck.includes(moduleType)
223224

224-
const isDisabled = !getIsSlotAvailable(modules, additionalEquipment)
225+
let isDisabled =
226+
getNumSlotsAvailable(modules, additionalEquipment) === 0
227+
// special-casing TC since it takes up 2 slots
228+
if (moduleType === THERMOCYCLER_MODULE_TYPE) {
229+
isDisabled = getNumSlotsAvailable(modules, additionalEquipment) === 1
230+
}
225231

226232
const handleMultiplesClick = (num: number): void => {
227233
const temperatureModules =

protocol-designer/src/components/modals/CreateFileWizard/__tests__/utils.test.tsx

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
getUnoccupiedStagingAreaSlots,
99
getTrashSlot,
1010
getTrashOptionDisabled,
11-
getIsSlotAvailable,
11+
getNumSlotsAvailable,
1212
} from '../utils'
1313
import { STANDARD_EMPTY_SLOTS } from '../StagingAreaTile'
1414
import type { FormPipettesByMount } from '../../../../step-forms'
@@ -53,12 +53,12 @@ describe('getUnoccupiedStagingAreaSlots', () => {
5353
])
5454
})
5555
})
56-
describe('getIsSlotAvailable', () => {
57-
it('should return true when there are no modules or additional equipment', () => {
58-
const result = getIsSlotAvailable(null, [])
59-
expect(result).toBe(true)
56+
describe('getNumSlotsAvailable', () => {
57+
it('should return 8 when there are no modules or additional equipment', () => {
58+
const result = getNumSlotsAvailable(null, [])
59+
expect(result).toBe(8)
6060
})
61-
it('should return false when there is a TC and 7 modules', () => {
61+
it('should return 0 when there is a TC and 7 modules', () => {
6262
const mockModules = {
6363
0: {
6464
model: 'heaterShakerModuleV1',
@@ -96,10 +96,10 @@ describe('getIsSlotAvailable', () => {
9696
slot: 'C3',
9797
},
9898
} as any
99-
const result = getIsSlotAvailable(mockModules, [])
100-
expect(result).toBe(false)
99+
const result = getNumSlotsAvailable(mockModules, [])
100+
expect(result).toBe(0)
101101
})
102-
it('should return true when there are 9 additional equipment and 1 is a waste chute on the staging area and one is a gripper', () => {
102+
it('should return 1 when there are 9 additional equipment and 1 is a waste chute on the staging area and one is a gripper', () => {
103103
const mockAdditionalEquipment: AdditionalEquipment[] = [
104104
'trashBin',
105105
'stagingArea_cutoutA3',
@@ -111,8 +111,19 @@ describe('getIsSlotAvailable', () => {
111111
'gripper',
112112
'trashBin',
113113
]
114-
const result = getIsSlotAvailable(null, mockAdditionalEquipment)
115-
expect(result).toBe(true)
114+
const result = getNumSlotsAvailable(null, mockAdditionalEquipment)
115+
expect(result).toBe(1)
116+
})
117+
it('should return 8 even when there is a magnetic block', () => {
118+
const mockModules = {
119+
0: {
120+
model: 'magneticBlockV1',
121+
type: 'magneticBlockType',
122+
slot: 'B2',
123+
},
124+
} as any
125+
const result = getNumSlotsAvailable(mockModules, [])
126+
expect(result).toBe(8)
116127
})
117128
})
118129
describe('getTrashSlot', () => {

protocol-designer/src/components/modals/CreateFileWizard/utils.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
MAGNETIC_BLOCK_TYPE,
23
THERMOCYCLER_MODULE_TYPE,
34
WASTE_CHUTE_CUTOUT,
45
} from '@opentrons/shared-data'
@@ -85,17 +86,25 @@ export const getUnoccupiedStagingAreaSlots = (
8586

8687
const TOTAL_MODULE_SLOTS = 8
8788

88-
export const getIsSlotAvailable = (
89+
export const getNumSlotsAvailable = (
8990
modules: FormState['modules'],
9091
additionalEquipment: FormState['additionalEquipment']
91-
): boolean => {
92-
const moduleLength = modules != null ? Object.keys(modules).length : 0
92+
): number => {
9393
const additionalEquipmentLength = additionalEquipment.length
9494
const hasTC = Object.values(modules || {}).some(
9595
module => module.type === THERMOCYCLER_MODULE_TYPE
9696
)
97+
const hasMagneticBlock = Object.values(modules || {}).some(
98+
module => module.type === MAGNETIC_BLOCK_TYPE
99+
)
100+
let filteredModuleLength = modules != null ? Object.keys(modules).length : 0
101+
if (hasTC) {
102+
filteredModuleLength = filteredModuleLength + 1
103+
}
104+
if (hasMagneticBlock) {
105+
filteredModuleLength = filteredModuleLength - 1
106+
}
97107

98-
const filteredModuleLength = hasTC ? moduleLength + 1 : moduleLength
99108
const hasWasteChute = additionalEquipment.some(equipment =>
100109
equipment.includes('wasteChute')
101110
)
@@ -113,10 +122,9 @@ export const getIsSlotAvailable = (
113122
if (hasGripper) {
114123
filteredAdditionalEquipmentLength = filteredAdditionalEquipmentLength - 1
115124
}
116-
117125
return (
118-
filteredModuleLength + filteredAdditionalEquipmentLength <
119-
TOTAL_MODULE_SLOTS
126+
TOTAL_MODULE_SLOTS -
127+
(filteredModuleLength + filteredAdditionalEquipmentLength)
120128
)
121129
}
122130

@@ -130,10 +138,9 @@ export const getTrashOptionDisabled = (
130138
props: TrashOptionDisabledProps
131139
): boolean => {
132140
const { additionalEquipment, modules, trashType } = props
133-
return (
134-
!getIsSlotAvailable(modules, additionalEquipment) &&
135-
!additionalEquipment.includes(trashType)
136-
)
141+
const hasNoSlotsAvailable =
142+
getNumSlotsAvailable(modules, additionalEquipment) === 0
143+
return hasNoSlotsAvailable && !additionalEquipment.includes(trashType)
137144
}
138145

139146
export const getTrashSlot = (values: FormState): string => {

0 commit comments

Comments
 (0)