Skip to content

Commit 1bcc5f2

Browse files
committed
Merge back 'chore_release-pd-8.5.0' into 'edge' (#18555)
2 parents 831b80e + 3817914 commit 1bcc5f2

File tree

17 files changed

+73
-475
lines changed

17 files changed

+73
-475
lines changed

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

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,8 @@ jobs:
8686
NODE_OPTIONS: '--max-old-space-size=5120'
8787
OT_PD_MIXPANEL_ID: ${{ secrets.OT_PD_MIXPANEL_ID }}
8888
OT_PD_MIXPANEL_DEV_ID: ${{ secrets.OT_PD_MIXPANEL_DEV_ID }}
89-
# ToDo(kk:04/23/2025) need to setup sentry org account and project
90-
# OT_PD_SENTRY_DSN: ${{ secrets.OT_PD_SENTRY_DNS }}
91-
# OT_PD_SENTRY_DEV_DSN: ${{ secrets.OT_PD_SENTRY_DEV_DSN }}
89+
OT_PD_SENTRY_DSN: ${{ secrets.OT_PD_SENTRY_DSN }}
90+
OT_PD_SENTRY_DEV_DSN: ${{ secrets.OT_PD_SENTRY_DEV_DSN }}
9291
run: |
9392
make -C protocol-designer NODE_ENV=development
9493
- name: 'upload github artifact'
@@ -97,22 +96,21 @@ jobs:
9796
name: 'pd-artifact'
9897
path: protocol-designer/dist
9998

100-
# ToDo(kk:04/23/2025) need to setup sentry org account and project
101-
# upload-sourcemaps-pd:
102-
# timeout-minutes: 10
103-
# name: 'upload protocol designer source maps'
104-
# needs: ['build-pd']
105-
# runs-on: 'ubuntu-24.04'
106-
# if: github.event_name != 'pull_request'
99+
upload-sourcemaps-pd:
100+
timeout-minutes: 10
101+
name: 'upload protocol designer source maps'
102+
needs: ['build-pd']
103+
runs-on: 'ubuntu-24.04'
104+
if: github.event_name != 'pull_request'
107105

108-
# uses: getsentry/action-release@v3
109-
# env:
110-
# SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
111-
# SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
112-
# SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
113-
# with:
114-
# name: pd-artifact
115-
# sourcemaps: ./dist
106+
uses: getsentry/action-release@v3
107+
env:
108+
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
109+
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
110+
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
111+
with:
112+
name: pd-artifact
113+
sourcemaps: ./dist
116114

117115
deploy-pd:
118116
timeout-minutes: 10

Makefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ teardown-py: $(PYTHON_TEARDOWN_TARGETS)
9999
%-py-teardown: %-py-clean
100100
$(MAKE) -C $* teardown
101101

102+
# Specialize the %-py-teardown pattern rule above to account for the Makefile duopoly in shared-data.
103+
$(SHARED_DATA_DIR)-py-teardown: $(SHARED_DATA_DIR)-py-clean
104+
$(MAKE) -C $(SHARED_DATA_DIR) teardown-py
105+
102106
# clean all project output
103107
.PHONY: clean
104108
clean: clean-js clean-py
@@ -117,6 +121,10 @@ clean-py: $(PYTHON_CLEAN_TARGETS)
117121
%-py-clean:
118122
$(MAKE) -C $* clean
119123

124+
# Specialize the %-py-clean pattern rule above to account for the Makefile duopoly in shared-data.
125+
$(SHARED_DATA_DIR)-py-clean:
126+
$(MAKE) -C $(SHARED_DATA_DIR) clean-py
127+
120128
.PHONY: deploy-py
121129
deploy-py: export twine_repository_url = $(twine_repository_url)
122130
deploy-py: export pypi_username = $(pypi_username)

app-shell/electron-builder.config.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,14 @@ module.exports = async () => ({
6767
target: ['nsis'],
6868
icon: project === 'robot-stack' ? 'build/icon.ico' : 'build/three.ico',
6969
forceCodeSigning: WINDOWS_SIGN,
70-
azureSignOptions: {
71-
publisherName: 'OPENTRONS LABWORKS INC.',
72-
codeSigningAccountName: 'desktop-app-signing',
73-
certificateProfileName: 'OpentronsDesktopApp',
74-
endpoint: 'https://eus.codesigning.azure.net',
75-
},
70+
azureSignOptions: WINDOWS_SIGN
71+
? {
72+
publisherName: 'OPENTRONS LABWORKS INC.',
73+
codeSigningAccountName: 'desktop-app-signing',
74+
certificateProfileName: 'OpentronsDesktopApp',
75+
endpoint: 'https://eus.codesigning.azure.net',
76+
}
77+
: undefined,
7678
},
7779
nsis: {
7880
oneClick: false,

protocol-designer/cypress/e2e/migrations.cy.ts

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,53 +13,46 @@ describe('Protocol fixtures migrate and match snapshots', () => {
1313
title: 'example_1_1_0 (schema 1, PD version 1.1.1) -> PD 8.5.x, schema 8',
1414
importTestFile: TestFilePath.Example_1_1_0,
1515
expectedTestFile: TestFilePath.Example_1_1_0V8,
16-
unusedHardware: true,
1716
migrationModal: 'newLabwareDefs',
1817
},
1918
{
2019
title: 'doItAllV3 (schema 3, PD version 4.0.0) -> PD 8.5.x, schema 8',
2120
importTestFile: TestFilePath.DoItAllV3V4,
2221
expectedTestFile: TestFilePath.DoItAllV3MigratedToV8,
23-
unusedHardware: false,
2422
migrationModal: 'v8.1',
2523
},
2624
{
2725
title: 'doItAllV4 (schema 4, PD version 4.0.0) -> PD 8.5.x, schema 8',
2826
importTestFile: TestFilePath.DoItAllV4V4,
2927
expectedTestFile: TestFilePath.DoItAllV4MigratedToV8,
30-
unusedHardware: false,
3128
migrationModal: 'v8.1',
3229
},
3330
{
3431
title:
3532
'doItAllv7MigratedToV8 (schema 7, PD version 8.0.0) -> should migrate to 8.5.x, schema 8',
3633
importTestFile: TestFilePath.DoItAllV7,
3734
expectedTestFile: TestFilePath.DoItAllV7MigratedToV8,
38-
unusedHardware: false,
3935
migrationModal: 'v8.1',
4036
},
4137
{
4238
title:
4339
'96-channel full and column schema 8 -> should migrate to 8.5.x, schema 8',
4440
importTestFile: TestFilePath.NinetySixChannelFullAndColumn,
4541
expectedTestFile: TestFilePath.NinetySixChannelFullAndColumn,
46-
unusedHardware: false,
4742
migrationModal: null,
4843
},
4944
{
5045
title:
5146
'doItAllV8 flex robot -> reimported, should migrate to 8.5.x, schema 8',
5247
importTestFile: TestFilePath.DoItAllV8,
5348
expectedTestFile: TestFilePath.DoItAllV8,
54-
unusedHardware: false,
5549
migrationModal: null,
5650
},
5751
{
5852
title:
5953
'new advanced settings with multi temp => reimported, should not migrate and stay at 8.5.x, schema 8',
6054
importTestFile: TestFilePath.NewAdvancedSettingsAndMultiTemp,
6155
expectedTestFile: TestFilePath.NewAdvancedSettingsAndMultiTemp,
62-
unusedHardware: false,
6356
migrationModal: null,
6457
},
6558
{
@@ -68,24 +61,16 @@ describe('Protocol fixtures migrate and match snapshots', () => {
6861
importTestFile: TestFilePath.ThermocyclerOnOt2V7,
6962
expectedTestFile: TestFilePath.ThermocyclerOnOt2V7MigratedToV8,
7063
migrationModal: 'v8.1',
71-
unusedHardware: true,
7264
},
7365
]
7466

7567
testCases.forEach(
76-
({
77-
title,
78-
importTestFile,
79-
expectedTestFile,
80-
unusedHardware,
81-
migrationModal,
82-
}) => {
68+
({ title, importTestFile, expectedTestFile, migrationModal }) => {
8369
it(title, () => {
8470
migrateAndMatchSnapshot({
8571
title,
8672
importTestFile,
8773
expectedTestFile,
88-
unusedHardware,
8974
migrationModal,
9075
})
9176
})

protocol-designer/cypress/support/Import.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ export interface MigrateTestCase {
1111
title: string
1212
importTestFile: TestFilePath
1313
expectedTestFile: TestFilePath
14-
unusedHardware: boolean
1514
migrationModal: 'newLabwareDefs' | 'v8.1' | 'noBehaviorChange' | null
1615
}
1716

@@ -20,7 +19,6 @@ export const ContentStrings = {
2019
v8_1: 'The default dispense height is now 1 mm from the bottom of the well',
2120
noBehaviorChange:
2221
'We have added new features since the last time this protocol was updated, but have not made any changes to existing protocol behavior',
23-
unusedHardwareWarning: 'Protocol has unused hardware',
2422
exportButton: 'Export',
2523
continueButton: 'continue',
2624
continueWithExport: 'Continue with export',
@@ -66,7 +64,6 @@ export const verifyImportProtocolPage = (protocol: TestFile): void => {
6664
export const migrateAndMatchSnapshot = ({
6765
importTestFile,
6866
expectedTestFile,
69-
unusedHardware,
7067
migrationModal,
7168
}: MigrateTestCase): void => {
7269
const uploadProtocol: TestFile = getTestFile(importTestFile)
@@ -87,10 +84,6 @@ export const migrateAndMatchSnapshot = ({
8784

8885
cy.get(LocatorStrings.exportProtocol).click({ force: true })
8986

90-
if (unusedHardware) {
91-
cy.get('div').contains(ContentStrings.unusedHardwareWarning).should('exist')
92-
cy.contains(ContentStrings.continueWithExport).click({ force: true })
93-
}
9487
const expectedProtocol: TestFile = getTestFile(expectedTestFile)
9588

9689
cy.readFile(expectedProtocol.path).then(expectedProtocolRead => {

protocol-designer/fixtures/protocol/8/thermocyclerOnOt2V7MigratedToV8.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
},
1515
"designerApplication": {
1616
"name": "opentrons/protocol-designer",
17-
"version": "8.4.3-alpha.0",
17+
"version": "8.5.0",
1818
"data": {
1919
"_internalAppBuildDate": "Mon, 10 Mar 2025 14:05:38 GMT",
2020
"pipetteTiprackAssignments": {

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@
2929
},
3030
"hint": {
3131
"dont_show_again": "Don't show me again",
32-
"unused_hardware": {
33-
"title": "Protocol has unused hardware"
34-
},
3532
"no_commands": {
3633
"title": "Protocol has no steps"
3734
},

protocol-designer/src/components/organisms/BlockingHintModal/index.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@ export function BlockingHintModal(props: HintProps): JSX.Element {
5151
}
5252

5353
const confirmButtonText =
54-
hintKey === 'no_commands' || hintKey === 'unused_hardware'
55-
? 'continue_with_export'
56-
: 'confirm'
54+
hintKey === 'no_commands' ? 'continue_with_export' : 'confirm'
5755

5856
return createPortal(
5957
<Modal

protocol-designer/src/pages/Designer/ProtocolSteps/index.tsx

Lines changed: 7 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,13 @@ import { useKitchen } from '../../../components/organisms/Kitchen/hooks'
3535
import { DECK_SETUP_TOOLS_WIDTH_REM } from '../../../constants'
3636
import { getEnableHotKeysDisplay } from '../../../feature-flags/selectors'
3737
import {
38-
createFile,
3938
getRobotStateTimeline,
4039
getRobotType,
4140
} from '../../../file-data/selectors'
4241
import { selectZoomedIntoSlot } from '../../../labware-ingred/actions'
4342
import { saveProtocolFile } from '../../../load-file/actions'
4443
import { useProtocolExportHandler } from '../../../resources/hooks'
4544
import {
46-
getAdditionalEquipmentEntities,
4745
getSavedStepForms,
4846
getUnsavedForm,
4947
} from '../../../step-forms/selectors'
@@ -58,12 +56,6 @@ import {
5856
getSelectedTerminalItemId,
5957
} from '../../../ui/steps/selectors'
6058
import { getHasTrash } from '../../../utils'
61-
import { LOAD_COMMANDS } from '../../ProtocolOverview'
62-
import {
63-
getUnusedEntities,
64-
getUnusedStagingAreas,
65-
getUnusedTrash,
66-
} from '../../ProtocolOverview/utils'
6759
import { DeckSetupContainer } from '../DeckSetup'
6860
import { zoomInOnCoordinate } from '../DeckSetup/utils'
6961
import { OffDeck } from '../OffDeck'
@@ -75,7 +67,6 @@ import { TimelineEditHardware } from './TimelineEditHardware'
7567

7668
import type { Dispatch, SetStateAction } from 'react'
7769
import type { DeckSlot, ThunkDispatch } from '../../../types'
78-
import type { Fixture } from '../../ProtocolOverview'
7970

8071
const CONTENT_MAX_WIDTH = '46.9375rem'
8172
const STEP_SUMMARY_HEIGHT = '18.2rem'
@@ -107,7 +98,7 @@ export function ProtocolSteps({
10798
const robotType = useSelector(getRobotType)
10899
const activeItem = useSelector(getActiveItem)
109100
const deckSetup = useSelector(getDeckSetupForActiveItem)
110-
const { pipettes, modules, labware, additionalEquipmentOnDeck } = deckSetup
101+
const { labware, additionalEquipmentOnDeck } = deckSetup
111102
const [hoverSlot, setHoverSlot] = useState<DeckSlot | null>(null)
112103
const savedStepForms = useSelector(getSavedStepForms)
113104
const deckDef = useMemo(() => getDeckDefFromRobotType(robotType), [robotType])
@@ -130,7 +121,11 @@ export function ProtocolSteps({
130121
const initialViewBox = `${viewBoxX} ${viewBoxY} ${viewBoxWidth} ${viewBoxHeight}`
131122
const [viewBox, setViewBox] = useState<string>(initialViewBox)
132123

133-
const { errors: timelineErrors } = useSelector(getRobotStateTimeline)
124+
const { errors: timelineErrors, timeline } = useSelector(
125+
getRobotStateTimeline
126+
)
127+
const hasCommands = timeline.length > 0
128+
134129
const leftString = t('onDeck')
135130
const rightString = t('offDeck')
136131
const [deckView, setDeckView] = useState<
@@ -139,61 +134,11 @@ export function ProtocolSteps({
139134
const isOffDeck = deckView === rightString
140135
const isZoomedIn = zoomedInSlot != null
141136

142-
const fileData = useSelector(createFile)
143-
const additionalEquipment = useSelector(getAdditionalEquipmentEntities)
144-
145-
const nonLoadCommands =
146-
fileData?.commands.filter(
147-
command => !LOAD_COMMANDS.includes(command.commandType)
148-
) ?? []
149-
const gripperInUse =
150-
fileData?.commands.find(
151-
command =>
152-
(command.commandType === 'moveLabware' &&
153-
command.params.strategy === 'usingGripper') ||
154-
command.commandType === 'absorbanceReader/closeLid' ||
155-
command.commandType === 'absorbanceReader/openLid'
156-
) != null
157-
const noCommands = fileData != null ? nonLoadCommands.length === 0 : true
158-
const modulesWithoutStep = getUnusedEntities(
159-
modules,
160-
savedStepForms,
161-
'moduleId',
162-
robotType
163-
)
164-
const pipettesWithoutStep = getUnusedEntities(
165-
pipettes,
166-
savedStepForms,
167-
'pipette',
168-
robotType
169-
)
170-
const isGripperAttached = Object.values(additionalEquipment).some(
171-
equipment => equipment?.name === 'gripper'
172-
)
173-
const gripperWithoutStep = isGripperAttached && !gripperInUse
174-
175-
const { trashBinUnused, wasteChuteUnused } = getUnusedTrash(
176-
additionalEquipmentOnDeck,
177-
fileData?.commands
178-
)
179-
const fixtureWithoutStep: Fixture = {
180-
trashBin: trashBinUnused,
181-
wasteChute: wasteChuteUnused,
182-
stagingAreaSlots: getUnusedStagingAreas(
183-
additionalEquipmentOnDeck,
184-
fileData?.commands
185-
),
186-
}
187-
188137
const {
189138
handleExportClick,
190139
exportWarningModalElement,
191140
} = useProtocolExportHandler({
192-
noCommands,
193-
modulesWithoutStep,
194-
pipettesWithoutStep,
195-
gripperWithoutStep,
196-
fixtureWithoutStep,
141+
hasCommands,
197142
onConfirmExport: () => {
198143
dispatch(saveProtocolFile())
199144
},

0 commit comments

Comments
 (0)