Skip to content

Commit

Permalink
fix(shared-data): Allow mag block in the app (#12684)
Browse files Browse the repository at this point in the history
  • Loading branch information
TamarZanzouri authored May 11, 2023
1 parent b0ff887 commit 6dafde3
Show file tree
Hide file tree
Showing 21 changed files with 131 additions and 10 deletions.
2 changes: 2 additions & 0 deletions components/src/icons/ModuleIcon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import {
TEMPERATURE_MODULE_TYPE,
MAGNETIC_MODULE_TYPE,
THERMOCYCLER_MODULE_TYPE,
MAGNETIC_BLOCK_TYPE,
} from '@opentrons/shared-data'

import type { ModuleType } from '@opentrons/shared-data'
import type { StyleProps } from '../primitives/types'

const MODULE_ICON_NAME_BY_TYPE: { [type in ModuleType]: IconName } = {
[MAGNETIC_BLOCK_TYPE]: 'ot-magnet-v2',
[HEATERSHAKER_MODULE_TYPE]: 'ot-heater-shaker',
[TEMPERATURE_MODULE_TYPE]: 'ot-temperature-v2',
[MAGNETIC_MODULE_TYPE]: 'ot-magnet-v2',
Expand Down
1 change: 0 additions & 1 deletion protocol-designer/src/components/DeckSetup/ModuleTag.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,6 @@ export const ModuleStatus = ({
)
default:
console.warn(
// @ts-expect-error (ce, 2021-07-21) doesn't think `type` exists on type never (clever TS)
`ModuleStatus doesn't support module type ${moduleState.type}`
)
return null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
MAGNETIC_MODULE_TYPE,
THERMOCYCLER_MODULE_TYPE,
HEATERSHAKER_MODULE_TYPE,
MAGNETIC_BLOCK_TYPE,
MAX_LABWARE_HEIGHT_EAST_WEST_HEATER_SHAKER_MM,
LabwareDefinition2,
ModuleType,
Expand Down Expand Up @@ -81,6 +82,10 @@ const RECOMMENDED_LABWARE_BY_MODULE: { [K in ModuleType]: string[] } = {
'opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt',
'opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat',
],
[MAGNETIC_BLOCK_TYPE]: [
'armadillo_96_wellplate_200ul_pcr_full_skirt',
'nest_96_wellplate_100ul_pcr_full_skirt',
],
}

export const getLabwareIsRecommended = (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
import { FormModulesByType } from '../../../step-forms'
import { ModuleDiagram } from '../../modules'
import styles from './FilePipettesModal.css'
import type { ModuleType } from '@opentrons/shared-data'
import { MAGNETIC_BLOCK_TYPE, ModuleType } from '@opentrons/shared-data'

export interface ModuleFieldsProps {
// TODO 2020-3-20 use formik typing here after we update the def in flow-typed
Expand All @@ -32,6 +32,9 @@ export interface ModuleFieldsProps {
heaterShakerModuleType?: {
model: string
}
magneticBlockType?: {
model: string
}
}
touched:
| null
Expand All @@ -49,6 +52,9 @@ export interface ModuleFieldsProps {
heaterShakerModuleType?: {
model: boolean
}
magneticBlockType?: {
model: boolean
}
}
values: FormModulesByType
onFieldChange: (event: React.ChangeEvent) => unknown
Expand All @@ -68,8 +74,11 @@ export function ModuleFields(props: ModuleFieldsProps): JSX.Element {
touched,
} = props

// TODO(BC, 2023-05-11): REMOVE THIS MAG BLOCK FILTER BEFORE LAUNCH TO INCLUDE IT AMONG MODULE OPTIONS
// @ts-expect-error(sa, 2021-6-21): Object.keys not smart enough to take the keys of FormModulesByType
const modules: ModuleType[] = Object.keys(values)
const modules: ModuleType[] = Object.keys(values).filter(
k => k !== MAGNETIC_BLOCK_TYPE
)
const handleOnDeckChange = (type: ModuleType) => (e: React.ChangeEvent) => {
const targetToClear = `modulesByType.${type}.model`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
MAGNETIC_MODULE_TYPE,
HEATERSHAKER_MODULE_TYPE,
THERMOCYCLER_MODULE_V2,
MAGNETIC_BLOCK_TYPE,
} from '@opentrons/shared-data'
import { DeprecatedCheckboxField } from '@opentrons/components'
import { DEFAULT_MODEL_FOR_MODULE_TYPE } from '../../../../constants'
Expand All @@ -18,7 +19,8 @@ describe('ModuleFields', () => {
let magnetModuleOnDeck,
temperatureModuleNotOnDeck,
thermocyclerModuleNotOnDeck,
heaterShakerModuleNotOnDeck
heaterShakerModuleNotOnDeck,
magneticBlockNotOnDeck
let props: ModuleFieldsProps
let store: any
beforeEach(() => {
Expand Down Expand Up @@ -48,13 +50,19 @@ describe('ModuleFields', () => {
slot: '6',
model: null,
}
magneticBlockNotOnDeck = {
onDeck: false,
slot: '6',
model: null,
}

props = {
values: {
[MAGNETIC_MODULE_TYPE]: magnetModuleOnDeck,
[TEMPERATURE_MODULE_TYPE]: temperatureModuleNotOnDeck,
[THERMOCYCLER_MODULE_TYPE]: thermocyclerModuleNotOnDeck,
[HEATERSHAKER_MODULE_TYPE]: heaterShakerModuleNotOnDeck,
[MAGNETIC_BLOCK_TYPE]: magneticBlockNotOnDeck,
},
onFieldChange: jest.fn(),
onSetFieldValue: jest.fn(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import {
MAGNETIC_MODULE_V1,
MAGNETIC_MODULE_V2,
HEATERSHAKER_MODULE_V1,
MAGNETIC_BLOCK_TYPE,
MAGNETIC_BLOCK_V1,
} from '@opentrons/shared-data'
import { Modal, InputField, OutlineButton } from '@opentrons/components'
import { i18n } from '../../../../localization'
Expand Down Expand Up @@ -58,6 +60,11 @@ describe('FilePipettesModal', () => {
slot: '',
model: HEATERSHAKER_MODULE_V1,
},
[MAGNETIC_BLOCK_TYPE]: {
onDeck: false,
slot: '',
model: MAGNETIC_BLOCK_V1,
},
}

props = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import {
ModuleModel,
getPipetteNameSpecs,
PipetteName,
MAGNETIC_BLOCK_V1,
MAGNETIC_BLOCK_TYPE,
} from '@opentrons/shared-data'
import { i18n } from '../../../localization'
import { SPAN7_8_10_11_SLOT } from '../../../constants'
Expand Down Expand Up @@ -76,14 +78,18 @@ export interface Props {
}) => unknown
moduleRestrictionsDisabled?: boolean | null
}

const initialFormState: FormState = {
fields: { name: '' },
pipettesByMount: {
left: { pipetteName: '', tiprackDefURI: null },
right: { pipetteName: '', tiprackDefURI: null },
},
modulesByType: {
[MAGNETIC_BLOCK_TYPE]: {
onDeck: false,
model: MAGNETIC_BLOCK_V1,
slot: '1',
},
[HEATERSHAKER_MODULE_TYPE]: {
onDeck: false,
model: HEATERSHAKER_MODULE_V1,
Expand Down Expand Up @@ -171,7 +177,7 @@ export class FilePipettesModal extends React.Component<Props, State> {
) => boolean = (modules, moduleType) => {
const formModule = modules[moduleType]
const crashableModuleOnDeck =
formModule.onDeck && formModule.model
formModule?.onDeck && formModule?.model
? isModuleWithCollisionIssue(formModule.model)
: false

Expand Down
5 changes: 5 additions & 0 deletions protocol-designer/src/components/modules/ModuleDiagram.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import {
HEATERSHAKER_MODULE_TYPE,
HEATERSHAKER_MODULE_V1,
THERMOCYCLER_MODULE_V2,
MAGNETIC_BLOCK_TYPE,
MAGNETIC_BLOCK_V1,
} from '@opentrons/shared-data'

interface Props {
Expand Down Expand Up @@ -43,6 +45,9 @@ const MODULE_IMG_BY_TYPE: ModuleImg = {
[HEATERSHAKER_MODULE_TYPE]: {
[HEATERSHAKER_MODULE_V1]: require('../../images/modules/heatershaker.png'),
},
[MAGNETIC_BLOCK_TYPE]: {
[MAGNETIC_BLOCK_V1]: require('../../images/modules/mag_block.png'),
},
}

export function ModuleDiagram(props: Props): JSX.Element {
Expand Down
9 changes: 9 additions & 0 deletions protocol-designer/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import {
LabwareDefinition2,
DeckSlot as DeckDefSlot,
THERMOCYCLER_MODULE_V2,
MAGNETIC_BLOCK_TYPE,
MAGNETIC_BLOCK_V1,
} from '@opentrons/shared-data'
import { i18n } from './localization'
import type { DeckSlot, WellVolumes } from './types'
Expand Down Expand Up @@ -128,13 +130,20 @@ export const MODELS_FOR_MODULE_TYPE: Record<
value: HEATERSHAKER_MODULE_V1,
},
],
[MAGNETIC_BLOCK_TYPE]: [
{
name: i18n.t(`modules.model_display_name.${MAGNETIC_BLOCK_V1}`),
value: MAGNETIC_BLOCK_V1,
},
],
}

export const DEFAULT_MODEL_FOR_MODULE_TYPE: Record<ModuleType, ModuleModel> = {
[MAGNETIC_MODULE_TYPE]: MAGNETIC_MODULE_V1,
[TEMPERATURE_MODULE_TYPE]: TEMPERATURE_MODULE_V1,
[THERMOCYCLER_MODULE_TYPE]: THERMOCYCLER_MODULE_V1,
[HEATERSHAKER_MODULE_TYPE]: HEATERSHAKER_MODULE_V1,
[MAGNETIC_BLOCK_TYPE]: MAGNETIC_BLOCK_V1,
}
// Values for pauseAction field
export const PAUSE_UNTIL_RESUME: 'untilResume' = 'untilResume'
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion protocol-designer/src/localization/en/form.json
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,8 @@
"magneticModuleType": "MAG",
"temperatureModuleType": "TEMP",
"thermocyclerModuleType": "THERMO",
"heaterShakerModuleType": "HS"
"heaterShakerModuleType": "HS",
"magneticBlockType": "MAG"
},
"magnetAction": {
"label": "Magnet action",
Expand Down
9 changes: 6 additions & 3 deletions protocol-designer/src/localization/en/modules.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
"temperatureModuleType": "Temperature",
"magneticModuleType": "Magnetic",
"thermocyclerModuleType": "Thermocycler",
"heaterShakerModuleType": "Heater-Shaker"
"heaterShakerModuleType": "Heater-Shaker",
"magneticBlockType": "Magnetic Block"
},
"module_long_names": {
"temperatureModuleType": "Temperature module",
"magneticModuleType": "Magnetic module",
"thermocyclerModuleType": "Thermocycler module",
"heaterShakerModuleType": "Heater-Shaker module"
"heaterShakerModuleType": "Heater-Shaker module",
"magneticBlockType": "Magnetic Block"
},
"model_display_name": {
"temperatureModuleV1": "GEN1",
Expand All @@ -18,7 +20,8 @@
"magneticModuleV2": "GEN2",
"thermocyclerModuleV1": "GEN1",
"thermocyclerModuleV2": "GEN2",
"heaterShakerModuleV1": "GEN1"
"heaterShakerModuleV1": "GEN1",
"magneticBlockV1": "GEN1"
},
"status": {
"engaged": "engaged",
Expand Down
8 changes: 8 additions & 0 deletions protocol-designer/src/modules/moduleData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ import {
THERMOCYCLER_MODULE_TYPE,
HEATERSHAKER_MODULE_TYPE,
ModuleType,
MAGNETIC_BLOCK_TYPE,
} from '@opentrons/shared-data'
import { DropdownOption } from '@opentrons/components'
export const SUPPORTED_MODULE_TYPES: ModuleType[] = [
HEATERSHAKER_MODULE_TYPE,
MAGNETIC_MODULE_TYPE,
TEMPERATURE_MODULE_TYPE,
THERMOCYCLER_MODULE_TYPE,
// MAGNETIC_BLOCK_TYPE,
]
type SupportedSlotMap = Record<ModuleType, DropdownOption[]>
export const SUPPORTED_MODULE_SLOTS: SupportedSlotMap = {
Expand Down Expand Up @@ -39,6 +41,12 @@ export const SUPPORTED_MODULE_SLOTS: SupportedSlotMap = {
value: '1',
},
],
[MAGNETIC_BLOCK_TYPE]: [
{
name: 'Slot 1 (supported)',
value: '1',
},
],
}
const ALL_MODULE_SLOTS: DropdownOption[] = [
{
Expand Down
13 changes: 13 additions & 0 deletions protocol-designer/src/step-forms/selectors/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
THERMOCYCLER_MODULE_TYPE,
HEATERSHAKER_MODULE_TYPE,
PipetteName,
MAGNETIC_BLOCK_TYPE,
} from '@opentrons/shared-data'
import { TEMPERATURE_DEACTIVATED } from '@opentrons/step-generation'
import { INITIAL_DECK_SETUP_STEP_ID } from '../../constants'
Expand Down Expand Up @@ -65,6 +66,7 @@ import {
TemperatureModuleState,
ThermocyclerModuleState,
HeaterShakerModuleState,
MagneticBlockState,
} from '../types'
import {
PresavedStepFormState,
Expand Down Expand Up @@ -179,6 +181,9 @@ const HEATERSHAKER_MODULE_INITIAL_STATE: HeaterShakerModuleState = {
targetSpeed: null,
latchOpen: null,
}
const MAGNETIC_BLOCK_INITIAL_STATE: MagneticBlockState = {
type: MAGNETIC_BLOCK_TYPE,
}

const _getInitialDeckSetup = (
initialSetupStep: FormData,
Expand Down Expand Up @@ -244,6 +249,14 @@ const _getInitialDeckSetup = (
slot,
moduleState: HEATERSHAKER_MODULE_INITIAL_STATE,
}
case MAGNETIC_BLOCK_TYPE:
return {
id: moduleEntity.id,
model: moduleEntity.model,
type: MAGNETIC_BLOCK_TYPE,
slot,
moduleState: MAGNETIC_BLOCK_INITIAL_STATE,
}
}
}
),
Expand Down
6 changes: 6 additions & 0 deletions protocol-designer/src/step-forms/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
TEMPERATURE_MODULE_TYPE,
THERMOCYCLER_MODULE_TYPE,
HEATERSHAKER_MODULE_TYPE,
MAGNETIC_BLOCK_TYPE,
} from '@opentrons/shared-data'
import { DeckSlot } from '../types'

Expand Down Expand Up @@ -34,6 +35,7 @@ export interface FormModulesByType {
temperatureModuleType: FormModule
thermocyclerModuleType: FormModule
heaterShakerModuleType: FormModule
magneticBlockType: FormModule
}
export type ModuleEntities = Record<string, ModuleEntity>
// NOTE: semi-redundant 'type' key in FooModuleState types is required for Flow to disambiguate 'moduleState'
Expand All @@ -60,13 +62,17 @@ export interface HeaterShakerModuleState {
targetSpeed: number | null
latchOpen: boolean | null
}
export interface MagneticBlockState {
type: typeof MAGNETIC_BLOCK_TYPE
}
export interface ModuleTemporalProperties {
slot: DeckSlot
moduleState:
| MagneticModuleState
| TemperatureModuleState
| ThermocyclerModuleState
| HeaterShakerModuleState
| MagneticBlockState
}
export type ModuleOnDeck = ModuleEntity & ModuleTemporalProperties
export type ModulesForEditModulesCard = Partial<
Expand Down
5 changes: 5 additions & 0 deletions protocol-designer/src/utils/labwareModuleCompatibility.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
LabwareDefinition2,
ModuleType,
HEATERSHAKER_MODULE_TYPE,
MAGNETIC_BLOCK_TYPE,
} from '@opentrons/shared-data'
import { LabwareDefByDefURI } from '../labware-defs'
import { LabwareOnDeck } from '../step-forms'
Expand Down Expand Up @@ -57,6 +58,10 @@ const COMPATIBLE_LABWARE_ALLOWLIST_BY_MODULE_TYPE: Record<
'opentrons_96_pcr_adapter_nest_wellplate_100ul_pcr_full_skirt',
'opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat',
],
[MAGNETIC_BLOCK_TYPE]: [
'armadillo_96_wellplate_200ul_pcr_full_skirt',
'nest_96_wellplate_100ul_pcr_full_skirt',
],
}
export const getLabwareIsCompatible = (
def: LabwareDefinition2,
Expand Down
Loading

0 comments on commit 6dafde3

Please sign in to comment.