Skip to content

Commit a500210

Browse files
committed
Merge branch 'chore_mono-pd-8100-into-edge' into edge
2 parents d559584 + b006e0a commit a500210

File tree

40 files changed

+450
-95
lines changed

40 files changed

+450
-95
lines changed

.github/workflows/app-test-build-deploy.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ jobs:
354354
if: contains(fromJSON(needs.determine-build-type.outputs.variants), 'release') || contains(fromJSON(needs.determine-build-type.outputs.variants), 'internal-release')
355355
permissions:
356356
id-token: write
357-
contents: read
357+
contents: write
358358
steps:
359359
- name: 'download run app builds'
360360
uses: 'actions/download-artifact@v4'
@@ -373,7 +373,7 @@ jobs:
373373
- name: 'configure s3 deploy creds (GitHub OIDC)'
374374
uses: aws-actions/configure-aws-credentials@v4
375375
with:
376-
role-to-assume: ${{ secrets.OT_APP_OT3_DEPLOY_ROLE }}
376+
role-to-assume: ${{ vars.OT_APP_OT3_DEPLOY_ROLE }}
377377
aws-region: us-east-2
378378
- name: 'deploy release builds to s3'
379379
run: |

components/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export function StaticLabwareComponent(props: StaticLabwareProps): JSX.Element {
8282
selectedTipsByIndex,
8383
borderStroke,
8484
} = props
85+
8586
const { isTiprack } = definition.parameters
8687
return (
8788
<g onClick={onLabwareClick}>
@@ -143,6 +144,7 @@ export function StaticLabwareComponent(props: StaticLabwareProps): JSX.Element {
143144
{isTiprack ? (
144145
<TipStatus
145146
wellMap={definition.wells}
147+
wellName={wellName}
146148
type={statusByWellName[wellName] as TipType}
147149
text={
148150
selectedTipsByIndex != null &&
@@ -157,6 +159,7 @@ export function StaticLabwareComponent(props: StaticLabwareProps): JSX.Element {
157159
wellMap={definition.wells}
158160
type={statusByWellName[wellName] as WellType}
159161
parentType={LABWARE}
162+
wellName={wellName}
160163
/>
161164
)}
162165
</svg>

components/src/hardware-sim/Labware/labwareInternals/Tips/TipStatus.tsx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,36 @@ import type { TipType } from '../types'
1919
interface TipStatusProps {
2020
type: TipType
2121
wellMap: LabwareWellMap
22+
wellName: string
2223
size?: string
2324
text?: string
2425
}
2526

2627
export function TipStatus(props: TipStatusProps): JSX.Element {
27-
const { type, size, text, wellMap } = props
28+
const { type, size, text, wellMap, wellName } = props
2829
switch (type) {
2930
case NEW:
3031
return <NewTip size={size} />
3132
case USED:
3233
return <UsedTip size={size} />
3334
case SELECTED:
34-
return <SelectedWell size={size} textInsideTip={text} wellMap={wellMap} />
35+
return (
36+
<SelectedWell
37+
size={size}
38+
textInsideTip={text}
39+
wellMap={wellMap}
40+
wellName={wellName}
41+
/>
42+
)
3543
case NO:
36-
return <EmptyWell size={size} wellMap={wellMap} parentType={LABWARE} />
44+
return (
45+
<EmptyWell
46+
size={size}
47+
wellMap={wellMap}
48+
parentType={LABWARE}
49+
wellName={wellName}
50+
/>
51+
)
3752
case INACCESSIBLE:
3853
return <InaccessibleTip size={size} />
3954
case SELECTED_USED:
@@ -43,6 +58,7 @@ export function TipStatus(props: TipStatusProps): JSX.Element {
4358
textInsideTip={text}
4459
isUsed
4560
wellMap={wellMap}
61+
wellName={wellName}
4662
/>
4763
)
4864
case SELECTED_ERROR:
@@ -52,6 +68,7 @@ export function TipStatus(props: TipStatusProps): JSX.Element {
5268
textInsideTip={text}
5369
isError
5470
wellMap={wellMap}
71+
wellName={wellName}
5572
/>
5673
)
5774
}

components/src/hardware-sim/Labware/labwareInternals/Tips/__tests__/TipStatus.test.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ describe('TipStatus', () => {
3333
<TipStatus
3434
type="new"
3535
wellMap={fixtureTiprack1000ul.wells as LabwareWellMap}
36+
wellName="A1"
3637
/>
3738
)
3839
screen.getByText('New tip')
@@ -43,6 +44,7 @@ describe('TipStatus', () => {
4344
<TipStatus
4445
type="used"
4546
wellMap={fixtureTiprack1000ul.wells as LabwareWellMap}
47+
wellName="A1"
4648
/>
4749
)
4850
screen.getByText('Used tip')
@@ -53,6 +55,7 @@ describe('TipStatus', () => {
5355
<TipStatus
5456
type="selected"
5557
wellMap={fixtureTiprack1000ul.wells as LabwareWellMap}
58+
wellName="A1"
5659
/>
5760
)
5861
screen.getByText('Selected well')
@@ -63,6 +66,7 @@ describe('TipStatus', () => {
6366
<TipStatus
6467
type="no"
6568
wellMap={fixtureTiprack1000ul.wells as LabwareWellMap}
69+
wellName="A1"
6670
/>
6771
)
6872
screen.getByText('Empty well')
@@ -73,6 +77,7 @@ describe('TipStatus', () => {
7377
<TipStatus
7478
type="inaccessible"
7579
wellMap={fixtureTiprack1000ul.wells as LabwareWellMap}
80+
wellName="A1"
7681
/>
7782
)
7883
screen.getByText('Inaccessible tip')

components/src/hardware-sim/Labware/labwareInternals/Wells/EmptyWell.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { INTERACTIVE_WELL_DATA_ATTRIBUTE } from '@opentrons/shared-data'
2+
13
import { COLORS } from '../../../../helix-design-system'
24
import { LABWARE } from '../types'
35
import { getWidthAndHeightOfWellSVG } from './utils'
@@ -8,11 +10,15 @@ import type { ParentType } from '../types'
810
interface EmptyWellProps {
911
wellMap: LabwareWellMap
1012
parentType: ParentType
13+
wellName: string
1114
size?: string
1215
}
1316

1417
export function EmptyWell(props: EmptyWellProps): JSX.Element {
15-
const { size, wellMap, parentType } = props
18+
const { size, wellMap, wellName, parentType } = props
19+
const commonProps = {
20+
[INTERACTIVE_WELL_DATA_ATTRIBUTE]: wellName,
21+
}
1622
const firstWell = wellMap.A1
1723
const isCircular = firstWell.shape === 'circular'
1824
const [width, height] = getWidthAndHeightOfWellSVG(wellMap)
@@ -53,9 +59,16 @@ export function EmptyWell(props: EmptyWellProps): JSX.Element {
5359
height={isCircular ? circularDimension : height}
5460
>
5561
{isCircular ? (
56-
<circle cx="10" cy="10" r="9.5" fill="white" />
62+
<circle cx="10" cy="10" r="9.5" fill="white" {...commonProps} />
5763
) : (
58-
<rect x="0" y="0" width={width} height={height} fill="white" />
64+
<rect
65+
x="0"
66+
y="0"
67+
width={width}
68+
height={height}
69+
fill="white"
70+
{...commonProps}
71+
/>
5972
)}
6073
</mask>
6174

@@ -67,6 +80,7 @@ export function EmptyWell(props: EmptyWellProps): JSX.Element {
6780
r="9"
6881
fill="#CBCCCC"
6982
stroke={outlineColor}
83+
{...commonProps}
7084
strokeWidth="3"
7185
/>
7286
) : (
@@ -77,6 +91,7 @@ export function EmptyWell(props: EmptyWellProps): JSX.Element {
7791
height={height}
7892
fill="#CBCCCC"
7993
stroke={outlineColor}
94+
{...commonProps}
8095
strokeWidth="2"
8196
/>
8297
)}

components/src/hardware-sim/Labware/labwareInternals/Wells/SelectedWell.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { INTERACTIVE_WELL_DATA_ATTRIBUTE } from '@opentrons/shared-data'
2+
13
import { COLORS } from '../../../../helix-design-system'
24
import { getWidthAndHeightOfWellSVG } from './utils'
35
import styles from './wells.module.css'
@@ -6,6 +8,7 @@ import type { LabwareWellMap } from '@opentrons/shared-data'
68

79
interface SelectedWellProps {
810
wellMap: LabwareWellMap
11+
wellName: string
912
size?: string
1013
textInsideTip?: string
1114
isUsed?: boolean
@@ -16,6 +19,7 @@ interface SelectedWellProps {
1619
export function SelectedWell(props: SelectedWellProps): JSX.Element {
1720
const {
1821
wellMap,
22+
wellName,
1923
size,
2024
textInsideTip,
2125
isUsed = false,
@@ -48,6 +52,10 @@ export function SelectedWell(props: SelectedWellProps): JSX.Element {
4852
// TODO (nd: 10/16/25): create a "Nozzle" component wrapping SelectedTip to avoid this flakey logic
4953
const viewBox =
5054
size || isWellCircular ? '0 0 20 20' : `0 0 ${width} ${height}`
55+
const commonProps = {
56+
[INTERACTIVE_WELL_DATA_ATTRIBUTE]: wellName,
57+
}
58+
5159
return (
5260
<svg
5361
width={size ?? width}
@@ -60,6 +68,7 @@ export function SelectedWell(props: SelectedWellProps): JSX.Element {
6068
<circle
6169
cx="10"
6270
cy="10"
71+
{...commonProps}
6372
r={shouldShowStroke ? 9 : 10}
6473
fill={getFillColor(isSelected, isError, isUsed)}
6574
stroke={shouldShowStroke ? COLORS.black90 : undefined}
@@ -71,6 +80,7 @@ export function SelectedWell(props: SelectedWellProps): JSX.Element {
7180
y={shouldShowStroke ? 1 : 0}
7281
width={width}
7382
height={height}
83+
{...commonProps}
7484
fill={getFillColor(isSelected, isError, isUsed)}
7585
stroke={shouldShowStroke ? COLORS.black90 : undefined}
7686
strokeWidth={shouldShowStroke ? 2 : undefined}

components/src/hardware-sim/Labware/labwareInternals/Wells/WellStatus.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,22 @@ import type { ParentType, WellType } from '../types'
88

99
interface WellStatusProps {
1010
wellMap: LabwareWellMap
11+
wellName: string
1112
type: WellType
1213
parentType: ParentType
1314
showStroke?: boolean
1415
size?: string
1516
}
1617

1718
export function WellStatus(props: WellStatusProps): JSX.Element {
18-
const { type, size, wellMap, parentType, showStroke = false } = props
19+
const {
20+
type,
21+
size,
22+
wellMap,
23+
parentType,
24+
wellName,
25+
showStroke = false,
26+
} = props
1927
switch (type) {
2028
case SELECTED:
2129
return (
@@ -24,17 +32,26 @@ export function WellStatus(props: WellStatusProps): JSX.Element {
2432
wellMap={wellMap}
2533
isSelected={true}
2634
showStroke={showStroke}
35+
wellName={wellName}
2736
/>
2837
)
2938
case INACCESSIBLE:
30-
return <EmptyWell wellMap={wellMap} size={size} parentType={parentType} />
39+
return (
40+
<EmptyWell
41+
wellMap={wellMap}
42+
size={size}
43+
parentType={parentType}
44+
wellName={wellName}
45+
/>
46+
)
3147
case UNSELECTED:
3248
return (
3349
<SelectedWell
3450
size={size}
3551
wellMap={wellMap}
3652
isSelected={false}
3753
showStroke={showStroke}
54+
wellName={wellName}
3855
/>
3956
)
4057
case SELECTED_ERROR:
@@ -45,6 +62,7 @@ export function WellStatus(props: WellStatusProps): JSX.Element {
4562
isSelected={false}
4663
showStroke={showStroke}
4764
isError={true}
65+
wellName={wellName}
4866
/>
4967
)
5068
}

components/src/hardware-sim/Pipette/StrokedNozzles.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ export function StrokedNozzlesComponent(
4040

4141
return (
4242
<>
43-
{Object.entries(nozzleStatus).map(([key, wellType]) => {
43+
{Object.entries(nozzleStatus).map(([wellName, wellType]) => {
4444
return (
4545
<svg
46-
key={key}
47-
x={wells[key].x - NOZZLE_POSITION_IN_RENDER}
48-
y={wells[key].y - NOZZLE_POSITION_IN_RENDER}
46+
key={wellName}
47+
x={wells[wellName].x - NOZZLE_POSITION_IN_RENDER}
48+
y={wells[wellName].y - NOZZLE_POSITION_IN_RENDER}
4949
onClick={() => {
50-
handleClickNozzle(key)
50+
handleClickNozzle(wellName)
5151
}}
5252
>
5353
<WellStatus
@@ -56,6 +56,7 @@ export function StrokedNozzlesComponent(
5656
wellMap={wells}
5757
showStroke
5858
parentType={PIPETTE}
59+
wellName={wellName}
5960
/>
6061
</svg>
6162
)

e2e-testing/tests/pd/test_pd_mix_step.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def test_mix_step_configuration_workflow(page: Page, pd_base_url: str) -> None:
4949

5050
for label in [
5151
"Pipette nozzles and wells",
52-
"Volume per well",
52+
"Mix volume",
5353
"Mix repetitions",
5454
]:
5555
mix_form.expect_text(label)

protocol-designer/src/assets/localization/en/alert.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,10 @@
264264
"body": "This step uses labware that has previously been discarded into a trash.",
265265
"title": "Labware not available"
266266
},
267+
"MOVE_LOCATION_NOT_SPECIFIED": {
268+
"body": "This step is missing a move location.",
269+
"title": "Move location not defined."
270+
},
267271
"LABWARE_OFF_DECK": {
268272
"body": "The robot can only perform steps on labware that is on the deck. Add or change a Move Labware step to put it on the deck before this step.",
269273
"title": "Labware not on deck"

0 commit comments

Comments
 (0)