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 */} - {/* */}