diff --git a/protocol-designer/src/file-data/selectors/fileCreator.ts b/protocol-designer/src/file-data/selectors/fileCreator.ts index 8ae0e1b560a..0bd64980ae4 100644 --- a/protocol-designer/src/file-data/selectors/fileCreator.ts +++ b/protocol-designer/src/file-data/selectors/fileCreator.ts @@ -27,10 +27,12 @@ import { getFileMetadata, getRobotType } from './fileFields' import { getInitialRobotState, getRobotStateTimeline } from './commands' import { getLoadCommands } from './utils' +import type { SecondOrderCommandAnnotation } from '@opentrons/shared-data/commandAnnotation/types' import type { PipetteEntity, LabwareEntities, PipetteEntities, + LiquidEntities, } from '@opentrons/step-generation' import type { CommandAnnotationV1Mixin, @@ -43,10 +45,22 @@ import type { ProtocolBase, ProtocolFile, } from '@opentrons/shared-data' +import type { DismissedWarningState } from '../../dismiss/reducers' import type { LabwareDefByDefURI } from '../../labware-defs' import type { Selector } from '../../types' -import type { DesignerApplicationData } from '../../load-file/migration/utils/getLoadLiquidCommands' -import type { SecondOrderCommandAnnotation } from '@opentrons/shared-data/commandAnnotation/types' + +export interface DesignerApplicationDataV8 { + ingredients: LiquidEntities + ingredLocations: { + [labwareId: string]: { + [wellName: string]: { [liquidId: string]: { volume: number } } + } + } + savedStepForms: Record + orderedStepIds: string[] + pipetteTiprackAssignments: Record + dismissedWarnings: DismissedWarningState +} // TODO: BC: 2018-02-21 uncomment this assert, causes test failures // console.assert(!isEmpty(process.env.OT_PD_VERSION), 'Could not find application version!') @@ -92,7 +106,7 @@ export const createFile: Selector = createSelector( getRobotStateTimeline, getRobotType, dismissSelectors.getAllDismissedWarnings, - ingredSelectors.getLiquidGroupsById, + stepFormSelectors.getLiquidEntities, ingredSelectors.getLiquidsByLabwareId, stepFormSelectors.getSavedStepForms, stepFormSelectors.getOrderedStepIds, @@ -108,7 +122,7 @@ export const createFile: Selector = createSelector( robotStateTimeline, robotType, dismissedWarnings, - ingredients, + liquidEntities, ingredLocations, savedStepForms, orderedStepIds, @@ -127,7 +141,7 @@ export const createFile: Selector = createSelector( moduleEntities, labwareEntities, labwareNicknamesById, - ingredients, + liquidEntities, ingredLocations ) @@ -159,7 +173,7 @@ export const createFile: Selector = createSelector( p.tiprackDefURI ), dismissedWarnings, - ingredients, + ingredients: liquidEntities, ingredLocations, savedStepForms, orderedStepIds: savedOrderedStepIds, @@ -167,12 +181,12 @@ export const createFile: Selector = createSelector( } const liquids: ProtocolFile['liquids'] = reduce( - ingredients, + liquidEntities, (acc, liquidData, liquidId) => { return { ...acc, [liquidId]: { - displayName: liquidData.name, + displayName: liquidData.displayName, description: liquidData.description ?? '', displayColor: liquidData.displayColor ?? swatchColors(liquidId), }, @@ -253,7 +267,7 @@ export const createFile: Selector = createSelector( commandAnnotations, } - const protocolBase: ProtocolBase = { + const protocolBase: ProtocolBase = { $otSharedSchema: '#/protocol/schemas/8', schemaVersion: 8, metadata: { diff --git a/protocol-designer/src/file-data/selectors/utils.ts b/protocol-designer/src/file-data/selectors/utils.ts index 57a8ba89947..8d852731fad 100644 --- a/protocol-designer/src/file-data/selectors/utils.ts +++ b/protocol-designer/src/file-data/selectors/utils.ts @@ -20,8 +20,8 @@ import type { RobotState, ModuleEntities, TimelineFrame, + LiquidEntities, } from '@opentrons/step-generation' -import type { LiquidGroupsById } from '../../labware-ingred/types' interface Pipettes { [pipetteId: string]: { name: PipetteName } @@ -33,7 +33,7 @@ export const getLoadCommands = ( moduleEntities: ModuleEntities, labwareEntities: LabwareEntities, labwareNicknamesById: Record, - ingredients: LiquidGroupsById, + liquidEntities: LiquidEntities, ingredLocations: LabwareLiquidState ): CreateCommand[] => { const pipettes: Pipettes = mapValues( @@ -161,7 +161,10 @@ export const getLoadCommands = ( [] ) - const loadLiquidCommands = getLoadLiquidCommands(ingredients, ingredLocations) + const loadLiquidCommands = getLoadLiquidCommands( + liquidEntities, + ingredLocations + ) const loadModuleCommands = map( initialRobotState.modules, diff --git a/protocol-designer/src/labware-ingred/actions/actions.ts b/protocol-designer/src/labware-ingred/actions/actions.ts index 2064751568b..f4f855bba75 100644 --- a/protocol-designer/src/labware-ingred/actions/actions.ts +++ b/protocol-designer/src/labware-ingred/actions/actions.ts @@ -203,9 +203,7 @@ export interface EditLiquidGroupAction { } // NOTE: with no ID, a new one is assigned export const editLiquidGroup: ( - args: IngredInputs & { - liquidGroupId: string | null | undefined - } + args: IngredInputs ) => ThunkAction = args => (dispatch, getState) => { const { liquidGroupId, ...payloadArgs } = args // NOTE: separate liquidGroupId for flow to understand unpacking :/ diff --git a/protocol-designer/src/labware-ingred/reducers/index.ts b/protocol-designer/src/labware-ingred/reducers/index.ts index 30e6b7f8386..47cf1884284 100644 --- a/protocol-designer/src/labware-ingred/reducers/index.ts +++ b/protocol-designer/src/labware-ingred/reducers/index.ts @@ -296,7 +296,6 @@ export const ingredients: Reducer = handleActions( LOAD_FILE: ( state: IngredientsState, action: LoadFileAction - // TODO: get this info from loadLiquid ): IngredientsState => getPDMetadata(action.payload.file).ingredients, }, {} @@ -352,7 +351,6 @@ export const ingredLocations: Reducer = handleActions( LOAD_FILE: ( state: LocationsState, action: LoadFileAction - // TODO: get this info from loadLiquid ): LocationsState => getPDMetadata(action.payload.file).ingredLocations, }, {} diff --git a/protocol-designer/src/labware-ingred/selectors.ts b/protocol-designer/src/labware-ingred/selectors.ts index 25e7073fffa..a9c674a293b 100644 --- a/protocol-designer/src/labware-ingred/selectors.ts +++ b/protocol-designer/src/labware-ingred/selectors.ts @@ -5,7 +5,10 @@ import max from 'lodash/max' import reduce from 'lodash/reduce' import type { Selector } from 'reselect' import type { DropdownOption } from '@opentrons/components' -import type { LabwareLiquidState, LiquidEntity } from '@opentrons/step-generation' +import type { + LabwareLiquidState, + LiquidEntity, +} from '@opentrons/step-generation' import type { CutoutId } from '@opentrons/shared-data' import type { RootState, @@ -18,17 +21,16 @@ import type { import type { AllIngredGroupFields, IngredInputs, - OrderedLiquids, ZoomedIntoSlotInfoState, } from './types' import type { BaseState, DeckSlot } from './../types' + // TODO: Ian 2019-02-15 no RootSlice, use BaseState interface RootSlice { labwareIngred: RootState } const rootSelector = (state: RootSlice): RootState => state.labwareIngred - // NOTE: not intended for UI use! Use getLabwareNicknamesById for the string. const getLabwareNameInfo: Selector = createSelector( rootSelector, @@ -53,10 +55,10 @@ const getLiquidNamesById: Selector< > = createSelector( getLiquidGroupsById, ingredGroups => - mapValues(ingredGroups, (ingred: LiquidEntity) => ingred.displayName) as Record< - string, - string - > + mapValues( + ingredGroups, + (ingred: LiquidEntity) => ingred.displayName + ) as Record ) const getLiquidSelectionOptions: Selector< RootSlice, @@ -104,17 +106,7 @@ const allIngredientGroupFields: Selector< {} ) ) -const allIngredientNamesIds: Selector< - RootSlice, - OrderedLiquids -> = createSelector(getLiquidGroupsById, ingreds => { - return Object.keys(ingreds).map(ingredId => ({ - ingredientId: ingredId, - name: ingreds[ingredId].displayName, - displayColor: ingreds[ingredId].displayColor, - liquidClass: ingreds[ingredId].liquidClass, - })) -}) + const getLabwareSelectionMode: Selector = createSelector( rootSelector, rootState => { @@ -181,7 +173,6 @@ const getIsNewProtocol: Selector = createSelector( // TODO: prune selectors export const selectors = { rootSelector, - getLiquidGroupsById, getLiquidsByLabwareId, getLiquidNamesById, getLabwareSelectionMode, @@ -194,7 +185,6 @@ export const selectors = { getSelectedLiquidGroupState, getDrillDownLabwareId, allIngredientGroupFields, - allIngredientNamesIds, selectedAddLabwareSlot, getDeckHasLiquid, getLiquidDisplayColors, diff --git a/protocol-designer/src/labware-ingred/types.ts b/protocol-designer/src/labware-ingred/types.ts index b2b11f177a9..aaa86cf4b2f 100644 --- a/protocol-designer/src/labware-ingred/types.ts +++ b/protocol-designer/src/labware-ingred/types.ts @@ -1,5 +1,9 @@ import type { CutoutId, ModuleModel } from '@opentrons/shared-data' -import type { DeckSlot, LiquidEntity, LocationLiquidState } from '@opentrons/step-generation' +import type { + DeckSlot, + LiquidEntity, + LocationLiquidState, +} from '@opentrons/step-generation' // TODO Ian 2018-02-19 make these shared in component library, standardize with Run App // ===== LABWARE =========== export interface DisplayLabware { @@ -21,16 +25,6 @@ export interface WellContents { } export type ContentsByWell = Record | null export type WellContentsByLabware = Record -// ==== INGREDIENTS ==== -// TODO(ND: 12/17/2024): add migration for liquids in >8.3.0 -export type OrderedLiquids = Array<{ - ingredientId: string - displayName?: string | null - displayColor?: string | null - liquidClass?: string | null -}> -// TODO: Ian 2018-10-15 audit & rename these confusing types - export type IngredInputs = LiquidEntity & { volume?: number | null } diff --git a/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts b/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts index 2be01b2e4b9..5ff217f2a3e 100644 --- a/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts +++ b/protocol-designer/src/load-file/migration/utils/getLoadLiquidCommands.ts @@ -2,6 +2,8 @@ import reduce from 'lodash/reduce' import { uuid } from '../../../utils' import type { LoadLiquidCreateCommand } from '@opentrons/shared-data/protocol/types/schemaV6/command/setup' import type { DismissedWarningState } from '../../../dismiss/reducers' +import { DesignerApplicationDataV8 } from '../../../file-data/selectors' +import { LiquidEntities, LiquidEntity } from '@opentrons/step-generation' export interface DesignerApplicationData { ingredients: Record< @@ -24,7 +26,7 @@ export interface DesignerApplicationData { } export const getLoadLiquidCommands = ( - ingredients?: DesignerApplicationData['ingredients'], + ingredients?: DesignerApplicationData['ingredients'] | LiquidEntities, ingredLocations?: DesignerApplicationData['ingredLocations'] ): LoadLiquidCreateCommand[] => { let loadLiquidCommands: LoadLiquidCreateCommand[] = [] diff --git a/protocol-designer/src/organisms/AssignLiquidsModal/LiquidToolbox.tsx b/protocol-designer/src/organisms/AssignLiquidsModal/LiquidToolbox.tsx index 1606e7a25da..9c2fad99edc 100644 --- a/protocol-designer/src/organisms/AssignLiquidsModal/LiquidToolbox.tsx +++ b/protocol-designer/src/organisms/AssignLiquidsModal/LiquidToolbox.tsx @@ -19,6 +19,7 @@ import { Toolbox, TYPOGRAPHY, } from '@opentrons/components' +import { getLiquidEntities } from '../../step-forms/selectors' import { LINK_BUTTON_STYLE } from '../../atoms' import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' import * as wellContentsSelectors from '../../top-selectors/well-contents' @@ -64,7 +65,7 @@ export function LiquidToolbox(props: LiquidToolboxProps): JSX.Element { const dispatch = useDispatch() const [showDefineLiquidModal, setDefineLiquidModal] = useState(false) const [showBadFormState, setShowBadFormState] = useState(false) - const liquids = useSelector(labwareIngredSelectors.allIngredientNamesIds) + const liquids = useSelector(getLiquidEntities) const labwareId = useSelector(labwareIngredSelectors.getSelectedLabwareId) const selectedWellGroups = useSelector(getSelectedWells) const nickNames = useSelector(getLabwareNicknamesById) @@ -236,11 +237,11 @@ export function LiquidToolbox(props: LiquidToolboxProps): JSX.Element { const liquidInfo: LiquidInfo[] = uniqueLiquids .map(liquid => { const foundLiquid = Object.values(liquids).find( - id => id.ingredientId === liquid + id => id.liquidGroupId === liquid ) return { liquidIndex: liquid, - name: foundLiquid?.name ?? '', + name: foundLiquid?.displayName ?? '', color: foundLiquid?.displayColor ?? '', liquidClassDisplayName: getLiquidClassDisplayName( foundLiquid?.liquidClass ?? null @@ -347,8 +348,9 @@ export function LiquidToolbox(props: LiquidToolboxProps): JSX.Element { render={({ field }) => { const fullOptions: DropdownOption[] = liquidSelectionOptions.map( option => { - const liquid = liquids.find( - liquid => liquid.ingredientId === option.value + const liquid = Object.values(liquids).find( + liquid => + liquid.liquidGroupId === option.value ) return { diff --git a/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx b/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx index 33f98e7c412..e3af6328944 100644 --- a/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx +++ b/protocol-designer/src/organisms/DefineLiquidsModal/index.tsx @@ -40,23 +40,13 @@ import { swatchColors } from './swatchColors' import type { ColorResult, RGBColor } from 'react-color' import type { ThunkDispatch } from 'redux-thunk' import type { BaseState } from '../../types' -import type { LiquidGroup } from '../../labware-ingred/types' - -interface LiquidEditFormValues { - name: string - displayColor: string - description: string - liquidClass: string - serialize: boolean - [key: string]: unknown -} +import type { LiquidEntity } from '@opentrons/step-generation' const liquidEditFormSchema: any = Yup.object().shape({ - name: Yup.string().required('liquid name is required'), + displayName: Yup.string().required('liquid name is required'), displayColor: Yup.string(), description: Yup.string(), liquidClass: Yup.string(), - serialize: Yup.boolean(), }) interface DefineLiquidsModalProps { @@ -100,11 +90,10 @@ export function DefineLiquidsModal( onClose() } - const saveForm = (formData: LiquidGroup): void => { + const saveForm = (formData: LiquidEntity): void => { dispatch( labwareIngredActions.editLiquidGroup({ ...formData, - liquidGroupId, }) ) onClose() @@ -114,12 +103,13 @@ export function DefineLiquidsModal( liquidGroupId != null ? allIngredientGroupFields[liquidGroupId] : null const liquidId = selectedLiquid.liquidGroupId ?? nextGroupId - const initialValues: LiquidEditFormValues = { - name: selectedIngredFields?.name ?? '', + const initialValues: LiquidEntity = { + displayName: selectedIngredFields?.displayName ?? '', displayColor: selectedIngredFields?.displayColor ?? swatchColors(liquidId), liquidClass: selectedIngredFields?.liquidClass ?? '', description: selectedIngredFields?.description ?? '', - serialize: selectedIngredFields?.serialize ?? false, + pythonName: `liquid_${liquidGroupId ?? nextGroupId}`, + liquidGroupId: liquidGroupId ?? nextGroupId, } const { @@ -129,23 +119,25 @@ export function DefineLiquidsModal( watch, setValue, register, - } = useForm({ + } = useForm({ defaultValues: initialValues, // eslint-disable-next-line @typescript-eslint/no-unsafe-argument resolver: yupResolver(liquidEditFormSchema), }) - const name = watch('name') + const name = watch('displayName') const color = watch('displayColor') const liquidClass = watch('liquidClass') const { errors, touchedFields } = formState - const handleLiquidEdits = (values: LiquidEditFormValues): void => { + const handleLiquidEdits = (values: LiquidEntity): void => { saveForm({ - name: values.name, + displayName: values.displayName, displayColor: values.displayColor, - liquidClass: values.liquidClass !== '' ? values.liquidClass : null, + liquidClass: + values.liquidClass !== '' ? values.liquidClass ?? undefined : undefined, description: values.description !== '' ? values.description : null, - serialize: values.serialize ?? false, + pythonName: values.pythonName, + liquidGroupId: values.liquidGroupId, }) } @@ -183,7 +175,7 @@ export function DefineLiquidsModal( desktopStyle="bodyLargeSemiBold" css={LINE_CLAMP_TEXT_STYLE(1)} > - {initialValues.name} + {initialValues.displayName} ) : ( @@ -240,13 +232,13 @@ export function DefineLiquidsModal( ( - {/* NOTE: this is for serialization if we decide to add it back */} - {/* ( - ) => { - field.onChange(e) - }} - /> - )} - /> */} void } @@ -220,7 +222,7 @@ export function MaterialsListModal({ {t('liquids')} - {liquids.length > 0 ? ( + {Object.values(liquids).length > 0 ? ( ) : null} - {liquids.length > 0 ? ( - liquids.map((liquid, id) => { + {Object.values(liquids).length > 0 ? ( + Object.values(liquids).map((liquid, id) => { const volumePerWell = Object.values( allLabwareWellContents ).flatMap(labwareWithIngred => Object.values(labwareWithIngred).map( - ingred => ingred[liquid.ingredientId]?.volume ?? 0 + ingred => ingred[liquid.liquidGroupId]?.volume ?? 0 ) ) const totalVolume = sum(volumePerWell) @@ -273,7 +275,7 @@ export function MaterialsListModal({ desktopStyle="bodyDefaultRegular" css={LINE_CLAMP_TEXT_STYLE(3)} > - {liquid.name ?? t('n/a')} + {liquid.displayName ?? t('n/a')} } diff --git a/protocol-designer/src/organisms/SlotDetailsContainer/index.tsx b/protocol-designer/src/organisms/SlotDetailsContainer/index.tsx index 4a8403bdf90..2756f67fadd 100644 --- a/protocol-designer/src/organisms/SlotDetailsContainer/index.tsx +++ b/protocol-designer/src/organisms/SlotDetailsContainer/index.tsx @@ -2,7 +2,7 @@ import { useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { getModuleDisplayName } from '@opentrons/shared-data' import * as wellContentsSelectors from '../../top-selectors/well-contents' -import { selectors } from '../../labware-ingred/selectors' +import { getLiquidEntities } from '../../step-forms/selectors' import { selectors as uiLabwareSelectors } from '../../ui/labware' import { getDeckSetupForActiveItem } from '../../top-selectors/labware-locations' import { SlotInformation } from '../../organisms/SlotInformation' @@ -26,7 +26,7 @@ export function SlotDetailsContainer( wellContentsSelectors.getAllWellContentsForActiveItem ) const nickNames = useSelector(uiLabwareSelectors.getLabwareNicknamesById) - const allIngredNamesIds = useSelector(selectors.allIngredientNamesIds) + const liquidEntities = useSelector(getLiquidEntities) if (slot == null || (slot === 'offDeck' && offDeckLabwareId == null)) { return null @@ -78,10 +78,10 @@ export function SlotDetailsContainer( const liquidNamesOnLabware = uniqueLiquids .map(liquid => { - const foundLiquid = Object.values(allIngredNamesIds).find( - id => id.ingredientId === liquid + const foundLiquid = Object.values(liquidEntities).find( + id => id.liquidGroupId === liquid ) - return foundLiquid?.name ?? '' + return foundLiquid?.displayName ?? '' }) .filter(Boolean) diff --git a/protocol-designer/src/pages/Designer/LiquidsOverflowMenu.tsx b/protocol-designer/src/pages/Designer/LiquidsOverflowMenu.tsx index 38b5867b2cc..07a6fbdbc89 100644 --- a/protocol-designer/src/pages/Designer/LiquidsOverflowMenu.tsx +++ b/protocol-designer/src/pages/Designer/LiquidsOverflowMenu.tsx @@ -20,7 +20,7 @@ import { TYPOGRAPHY, } from '@opentrons/components' import { LINE_CLAMP_TEXT_STYLE } from '../../atoms' -import { selectors as labwareIngredSelectors } from '../../labware-ingred/selectors' +import { getLiquidEntities } from '../../step-forms/selectors' import * as labwareIngredActions from '../../labware-ingred/actions' import type { MouseEvent, RefObject } from 'react' @@ -40,7 +40,7 @@ export function LiquidsOverflowMenu( const { onClose, showLiquidsModal, overflowWrapperRef } = props const location = useLocation() const { t } = useTranslation(['starting_deck_state']) - const liquids = useSelector(labwareIngredSelectors.allIngredientNamesIds) + const liquids = useSelector(getLiquidEntities) const dispatch: ThunkDispatch = useDispatch() return ( @@ -62,36 +62,38 @@ export function LiquidsOverflowMenu( maxHeight="18.75rem" overflowY={OVERFLOW_AUTO} > - {liquids.map(({ name, displayColor, ingredientId }) => { - return ( - { - onClose() - showLiquidsModal() - dispatch(labwareIngredActions.selectLiquidGroup(ingredientId)) - }} - key={ingredientId} - css={css` - cursor: ${CURSOR_POINTER}; - `} - > - - - - {name} - - - - ) - })} - {liquids.length > 0 ? ( + {Object.values(liquids).map( + ({ displayName, displayColor, liquidGroupId }) => { + return ( + { + onClose() + showLiquidsModal() + dispatch(labwareIngredActions.selectLiquidGroup(liquidGroupId)) + }} + key={liquidGroupId} + css={css` + cursor: ${CURSOR_POINTER}; + `} + > + + + + {displayName} + + + + ) + } + )} + {Object.values(liquids).length > 0 ? ( ) : null} { const { description, liquidClass } = liquid - const liquidClassDisplayName = getLiquidClassDisplayName(liquidClass) + const liquidClassDisplayName = getLiquidClassDisplayName(liquidClass ?? null) const liquidClassInfo = !enableLiquidClasses || liquidClassDisplayName == null ? null : ( @@ -68,7 +68,7 @@ export function LiquidDefinitions({ return ( - {liquid.name} + {liquid.displayName} } diff --git a/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx b/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx index 52151876a61..fe09f7338f1 100644 --- a/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/ScrubberContainer.tsx @@ -11,6 +11,7 @@ import { uuid } from '../../utils' import { getInitialDeckSetup, getInvariantContext, + getLiquidEntities, } from '../../step-forms/selectors' import { getLabwareNicknamesById } from '../../ui/labware/selectors' import { selectors as ingredSelectors } from '../../labware-ingred/selectors' @@ -32,7 +33,7 @@ export function ScrubberContainer(): JSX.Element | null { const labwareNickNames = useSelector(getLabwareNicknamesById) const robotStateTimeline = useSelector(getRobotStateTimeline) const initialRobotState = useSelector(getInitialRobotState) - const ingredients = useSelector(ingredSelectors.getLiquidGroupsById) + const liquidEntities = useSelector(getLiquidEntities) const ingredientLocations = useSelector(ingredSelectors.getLiquidsByLabwareId) const invariantContext = useSelector(getInvariantContext) const initialDeckSetup = useSelector(getInitialDeckSetup) @@ -55,7 +56,7 @@ export function ScrubberContainer(): JSX.Element | null { moduleEntities, labwareEntities, labwareNickNames, - ingredients, + liquidEntities, ingredientLocations ) const nonLoadCommands = flatMap( @@ -147,10 +148,10 @@ export function ScrubberContainer(): JSX.Element | null { } }) - const liquids: Liquid[] = Object.entries(ingredients).map( + const liquids: Liquid[] = Object.entries(liquidEntities).map( ([liquidId, liquidData]) => ({ id: liquidId, - displayName: liquidData.name ?? 'undefined liquid name', + displayName: liquidData.displayName ?? 'undefined liquid name', description: liquidData.description ?? '', displayColor: liquidData.displayColor, }) diff --git a/protocol-designer/src/pages/ProtocolOverview/index.tsx b/protocol-designer/src/pages/ProtocolOverview/index.tsx index 48b302be234..bd1cbccf193 100644 --- a/protocol-designer/src/pages/ProtocolOverview/index.tsx +++ b/protocol-designer/src/pages/ProtocolOverview/index.tsx @@ -24,6 +24,7 @@ import { OT2_ROBOT_TYPE } from '@opentrons/shared-data' import { getAdditionalEquipmentEntities, getInitialDeckSetup, + getLiquidEntities, } from '../../step-forms/selectors' import { selectors as fileSelectors } from '../../file-data' import { selectors as stepFormSelectors } from '../../step-forms' @@ -101,9 +102,7 @@ export function ProtocolOverview(): JSX.Element { const fileData = useSelector(fileSelectors.createFile) const savedStepForms = useSelector(stepFormSelectors.getSavedStepForms) const additionalEquipment = useSelector(getAdditionalEquipmentEntities) - const liquidsOnDeck = useSelector( - labwareIngredSelectors.allIngredientNamesIds - ) + const liquids = useSelector(getLiquidEntities) useEffect(() => { if (formValues?.created == null) { @@ -241,7 +240,7 @@ export function ProtocolOverview(): JSX.Element { : [] } labware={Object.values(labwaresOnDeck)} - liquids={liquidsOnDeck} + liquids={liquids} setShowMaterialsListModal={setShowMaterialsListModal} /> ) : null} diff --git a/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts b/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts index 1319917a66b..7f7ee9cdfac 100644 --- a/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts +++ b/step-generation/src/__tests__/getIsSafePipetteMovement.test.ts @@ -58,6 +58,7 @@ describe('getIsSafePipetteMovement', () => { }, moduleEntities: {}, additionalEquipmentEntities: {}, + liquidEntities: {}, config: { OT_PD_DISABLE_MODULE_RESTRICTIONS: false, }, @@ -87,6 +88,7 @@ describe('getIsSafePipetteMovement', () => { labwareEntities: {}, pipetteEntities: {}, moduleEntities: {}, + liquidEntities: {}, additionalEquipmentEntities: { trashBin: { name: 'trashBin', location: 'A3', id: 'trashBin' }, }, diff --git a/step-generation/src/__tests__/glue.test.ts b/step-generation/src/__tests__/glue.test.ts index b5e651d3e16..c208fd9a09a 100644 --- a/step-generation/src/__tests__/glue.test.ts +++ b/step-generation/src/__tests__/glue.test.ts @@ -155,6 +155,7 @@ beforeEach(() => { moduleEntities: {}, pipetteEntities: {}, additionalEquipmentEntities: {}, + liquidEntities: {}, config: DEFAULT_CONFIG, } }) diff --git a/step-generation/src/__tests__/utils.test.ts b/step-generation/src/__tests__/utils.test.ts index 277370e09ec..9b4df262e93 100644 --- a/step-generation/src/__tests__/utils.test.ts +++ b/step-generation/src/__tests__/utils.test.ts @@ -318,6 +318,7 @@ describe('makeInitialRobotState', () => { }, }, additionalEquipmentEntities: {}, + liquidEntities: {}, }, labwareLocations: { somePlateId: { slot: '1' }, diff --git a/step-generation/src/commandCreators/compound/transfer.ts b/step-generation/src/commandCreators/compound/transfer.ts index adfb9c43887..b1553b16cf3 100644 --- a/step-generation/src/commandCreators/compound/transfer.ts +++ b/step-generation/src/commandCreators/compound/transfer.ts @@ -46,6 +46,7 @@ export const transfer: CommandCreator = ( invariantContext, prevRobotState ) => { + console.log('invariantcontext', invariantContext) /** Transfer will iterate through a set of 1 or more source and destination wells. For each pair, it will aspirate from the source well, then dispense into the destination well. diff --git a/step-generation/src/fixtures/robotStateFixtures.ts b/step-generation/src/fixtures/robotStateFixtures.ts index e7a6fd9bedb..298f5aa6636 100644 --- a/step-generation/src/fixtures/robotStateFixtures.ts +++ b/step-generation/src/fixtures/robotStateFixtures.ts @@ -192,6 +192,7 @@ export function makeContext(): InvariantContext { moduleEntities, pipetteEntities, additionalEquipmentEntities, + liquidEntities: {}, config: DEFAULT_CONFIG, } } diff --git a/step-generation/src/types.ts b/step-generation/src/types.ts index 673aa3d38e2..3167d8fdbbb 100644 --- a/step-generation/src/types.ts +++ b/step-generation/src/types.ts @@ -125,7 +125,7 @@ export interface LiquidEntity { displayColor: string description: string | null pythonName: string - liquidId: string + liquidGroupId: string liquidClass?: string } diff --git a/step-generation/src/utils/constructInvariantContextFromRunCommands.ts b/step-generation/src/utils/constructInvariantContextFromRunCommands.ts index 58f98794053..ea1899b5316 100644 --- a/step-generation/src/utils/constructInvariantContextFromRunCommands.ts +++ b/step-generation/src/utils/constructInvariantContextFromRunCommands.ts @@ -134,6 +134,9 @@ export function constructInvariantContextFromRunCommands( moduleEntities: {}, pipetteEntities: {}, additionalEquipmentEntities: {}, + // this util is used for the timeline scrubber. It grabs liquid info from analysis + // so this will not be wired up right now + liquidEntities: {}, config: { OT_PD_DISABLE_MODULE_RESTRICTIONS: true }, } )