diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx
index 29a7080f76c..614fc880d5d 100644
--- a/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx
+++ b/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/BatchEditMixTools.tsx
@@ -1,3 +1,192 @@
-export function BatchEditMixTools(): JSX.Element {
- return
Todo: wire this up
+import { useTranslation } from 'react-i18next'
+import { useState } from 'react'
+import {
+ DIRECTION_COLUMN,
+ Divider,
+ Flex,
+ SPACING,
+ StyledText,
+ Tabs,
+} from '@opentrons/components'
+import {
+ CheckboxExpandStepFormField,
+ InputStepFormField,
+} from '../../../../molecules'
+import {
+ BlowoutLocationField,
+ FlowRateField,
+ PositionField,
+ WellsOrderField,
+} from '../StepForm/PipetteFields'
+import {
+ getBlowoutLocationOptionsForForm,
+ getLabwareFieldForPositioningField,
+} from '../StepForm/utils'
+import type { WellOrderOption } from '../../../../form-types'
+import type { FieldPropsByName } from '../StepForm/types'
+
+interface BatchEditMixToolsProps {
+ propsForFields: FieldPropsByName
+}
+
+export function BatchEditMixTools(props: BatchEditMixToolsProps): JSX.Element {
+ const { propsForFields } = props
+ const { t, i18n } = useTranslation(['form', 'button', 'tooltip'])
+ const [tab, setTab] = useState<'aspirate' | 'dispense'>('aspirate')
+ const aspirateTab = {
+ text: i18n.format(t('aspirate'), 'capitalize'),
+ isActive: tab === 'aspirate',
+ onClick: () => {
+ setTab('aspirate')
+ },
+ }
+ const dispenseTab = {
+ text: i18n.format(t('dispense'), 'capitalize'),
+ isActive: tab === 'dispense',
+ onClick: () => {
+ setTab('dispense')
+ },
+ }
+
+ const getLabwareIdForPositioningField = (name: string): string | null => {
+ const labwareField = getLabwareFieldForPositioningField(name)
+ const labwareId = propsForFields[labwareField]?.value
+ return labwareId ? String(labwareId) : null
+ }
+
+ const getPipetteIdForForm = (): string | null => {
+ const pipetteId = propsForFields.pipette?.value
+ return pipetteId ? String(pipetteId) : null
+ }
+
+ const getWellOrderFieldValue = (
+ name: string
+ ): WellOrderOption | null | undefined => {
+ const val = propsForFields[name]?.value
+ if (val === 'l2r' || val === 'r2l' || val === 't2b' || val === 'b2t') {
+ return val
+ } else {
+ return null
+ }
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+ {tab === 'aspirate' ? (
+ <>
+
+
+
+
+ >
+ ) : null}
+
+
+ {t('protocol_steps:advanced_settings')}
+
+
+ {propsForFields[`${tab}_delay_checkbox`].value === true ? (
+
+ ) : null}
+
+ {tab === 'dispense' ? (
+ <>
+
+ {propsForFields.blowout_checkbox.value === true ? (
+
+ ) : null}
+
+
+ {propsForFields.mix_touchTip_checkbox.value === true ? (
+
+ ) : null}
+
+ >
+ ) : null}
+
+
+ )
}
diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/index.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/index.tsx
index a2fe674db2e..81a6f259c95 100644
--- a/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/index.tsx
+++ b/protocol-designer/src/pages/Designer/ProtocolSteps/BatchEditToolbox/index.tsx
@@ -91,7 +91,7 @@ export const BatchEditToolbox = (): JSX.Element | null => {
{stepType === 'moveLiquid' ? (
) : (
-
+
)}
)
diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx
index 720a273d1a2..5023dca0a3f 100644
--- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx
+++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/PipetteFields/PositionField.tsx
@@ -26,7 +26,7 @@ import type {
import type { FieldPropsByName } from '../types'
import type { PositionSpecs } from '../../../../../components/StepEditForm/fields/TipPositionField/TipPositionModal'
interface PositionFieldProps {
- prefix: 'aspirate' | 'dispense'
+ prefix: 'aspirate' | 'dispense' | 'mix'
propsForFields: FieldPropsByName
zField: TipZOffsetFields
xField?: TipXOffsetFields
diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MixTools/index.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MixTools/index.tsx
index d1e27f8d0ac..b9781a92118 100644
--- a/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MixTools/index.tsx
+++ b/protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MixTools/index.tsx
@@ -1,24 +1,44 @@
import { useSelector } from 'react-redux'
import { useTranslation } from 'react-i18next'
-import { DIRECTION_COLUMN, Divider, Flex } from '@opentrons/components'
-import { InputStepFormField } from '../../../../../../molecules'
+import { useState } from 'react'
+import {
+ DIRECTION_COLUMN,
+ Divider,
+ Flex,
+ SPACING,
+ StyledText,
+ Tabs,
+} from '@opentrons/components'
+import {
+ CheckboxExpandStepFormField,
+ InputStepFormField,
+} from '../../../../../../molecules'
import {
getLabwareEntities,
getPipetteEntities,
} from '../../../../../../step-forms/selectors'
import { getEnableReturnTip } from '../../../../../../feature-flags/selectors'
import {
+ BlowoutLocationField,
+ BlowoutOffsetField,
ChangeTipField,
DropTipField,
+ FlowRateField,
LabwareField,
PartialTipField,
PickUpTipField,
PipetteField,
+ PositionField,
TipWellSelectionField,
TiprackField,
VolumeField,
WellSelectionField,
+ WellsOrderField,
} from '../../PipetteFields'
+import {
+ getBlowoutLocationOptionsForForm,
+ getLabwareFieldForPositioningField,
+} from '../../utils'
import type { StepFormProps } from '../../types'
export function MixTools(props: StepFormProps): JSX.Element {
@@ -26,7 +46,23 @@ export function MixTools(props: StepFormProps): JSX.Element {
const pipettes = useSelector(getPipetteEntities)
const enableReturnTip = useSelector(getEnableReturnTip)
const labwares = useSelector(getLabwareEntities)
- const { t } = useTranslation(['application', 'form'])
+ const [tab, setTab] = useState<'aspirate' | 'dispense'>('aspirate')
+ const { t, i18n } = useTranslation(['application', 'form'])
+ const aspirateTab = {
+ text: i18n.format(t('aspirate'), 'capitalize'),
+ isActive: tab === 'aspirate',
+ onClick: () => {
+ setTab('aspirate')
+ },
+ }
+ const dispenseTab = {
+ text: i18n.format(t('dispense'), 'capitalize'),
+
+ isActive: tab === 'dispense',
+ onClick: () => {
+ setTab('dispense')
+ },
+ }
const is96Channel =
propsForFields.pipette.value != null &&
pipettes[String(propsForFields.pipette.value)].name === 'p1000_96'
@@ -102,6 +138,145 @@ export function MixTools(props: StepFormProps): JSX.Element {
) : null}
) : (
- wire this up
+
+
+
+
+
+
+
+
+
+ {tab === 'aspirate' ? (
+ <>
+
+
+
+
+ >
+ ) : null}
+
+
+ {t('protocol_steps:advanced_settings')}
+
+
+ {formData[`${tab}_delay_checkbox`] === true ? (
+
+ ) : null}
+
+ {tab === 'dispense' ? (
+ <>
+
+ {formData.blowout_checkbox === true ? (
+
+
+
+
+
+ ) : null}
+
+
+ {formData.mix_touchTip_checkbox === true ? (
+
+ ) : null}
+
+ >
+ ) : null}
+
+
)
}
diff --git a/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/TimelineToolbox.tsx b/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/TimelineToolbox.tsx
index d51c4b5a9e1..76c5afa9540 100644
--- a/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/TimelineToolbox.tsx
+++ b/protocol-designer/src/pages/Designer/ProtocolSteps/Timeline/TimelineToolbox.tsx
@@ -29,8 +29,6 @@ export const TimelineToolbox = (): JSX.Element => {
const { t } = useTranslation('protocol_steps')
const orderedStepIds = useSelector(stepFormSelectors.getOrderedStepIds)
const formData = useSelector(getUnsavedForm)
- // TODO: potentially add batch edit capabilities back in
- // const isMultiSelectMode = useSelector(getIsMultiSelectMode)
const dispatch = useDispatch>()
const handleKeyDown: (e: KeyboardEvent) => void = e => {
@@ -70,8 +68,6 @@ export const TimelineToolbox = (): JSX.Element => {
}
confirmButton={formData != null ? undefined : }
>
- {/* todo(ja): this is for batch edit which we will need to add back in */}
- {/* */}