Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chore release [email protected] stable missed merge #15305

Merged
merged 925 commits into from
May 31, 2024
Merged
Changes from 1 commit
Commits
Show all changes
925 commits
Select commit Hold shift + click to select a range
1ff87e8
feat(app): add small size to Chip component for ODD (#14717)
koji Mar 25, 2024
ede85ef
feat(app): sort robot lists alphabetically (#14722)
mjhuff Mar 25, 2024
97e6f0d
refactor(app-shell-odd): Utilize robot-server unsubscribe flags (#14724)
mjhuff Mar 25, 2024
de14354
refactor(app): create utils to format value for rtp (#14720)
koji Mar 25, 2024
40236b5
feat(app): populate ChooseRobotSlideout with runtime parameters (#14706)
ncdiehl11 Mar 25, 2024
c3f1bf0
feat(protocol-designer): create MoaM feature flag (#14728)
jerader Mar 25, 2024
5b6a55d
refactor(components, app): move StyledText from app to components (#1…
koji Mar 25, 2024
b9cac4f
refactor(modules): return has update for unexpected module fw filenam…
caila-marashaj Mar 25, 2024
36de306
refactor(hardware): give options for sensor data output during probe …
caila-marashaj Mar 25, 2024
3094f5e
feat(hardware): handle motor driver errors (#13867)
pmoegenburg Mar 25, 2024
29414e2
Revert "refactor(modules): return has update for unexpected module fw…
caila-marashaj Mar 25, 2024
244a80e
fix(robot-server): Update tests to properly check new bad run records…
SyntaxColoring Mar 25, 2024
03f1149
fix(app): fix chip storybook (#14733)
koji Mar 26, 2024
a7e33bc
fix(robot-server): ensure robot-server starts after mosquitto (#14729)
mjhuff Mar 26, 2024
fa38226
fix(app): refactor Flex pipette card to reference /instruments (#14702)
smb2268 Mar 26, 2024
f583aea
feat(protocol-designer, step-generation, shared-data): migrate to usi…
jerader Mar 26, 2024
1b28bab
refactor(app, components): parametersTable moved to Components dir fo…
jerader Mar 26, 2024
4454df6
feat(app): Display bad runs on the ODD (#14736)
sfoster1 Mar 26, 2024
8653b07
refactor(shared-data): add filter tipracks to pipette defaultTipracks…
jerader Mar 27, 2024
d83fa72
feat(api): add oem mode setting (#14730)
brenthagen Mar 27, 2024
d0d17d7
refactor(api): Split UpdateCommandAction (#14726)
SyntaxColoring Mar 27, 2024
b82b030
feat(app): add tooltips to ChooseRobotToRunProtocolSlideout RTPs, upd…
ncdiehl11 Mar 27, 2024
2353759
fix(app): update chip component style and Storybook (#14739)
koji Mar 28, 2024
51a15c4
fix(app-testing): snapshot failure capture (#14743)
github-actions[bot] Mar 28, 2024
bae275d
feat(protocol-designer, step-generation): support for selecting multi…
jerader Mar 28, 2024
71ae62e
chore(shared-data): Add definition for 96ch v3.6 with 3.0mm backlash …
andySigler Mar 28, 2024
4d3b566
chore(release): 7.2.2 release notes (#14747)
ecormany Mar 28, 2024
b4808ac
chore(monorepo): remove old squad code owners (#14751)
shlokamin Mar 28, 2024
691e372
feat(api, robot-server): set sent runtime values and report parameter…
jbleon95 Mar 28, 2024
0e4222d
added google drive upload capabilities, removed unneeded functions (#…
rclarke0 Mar 28, 2024
a019b41
feat(app): add feature flag for quick transfer (#14752)
smb2268 Mar 28, 2024
c981105
feat(hardware): add new hepa uv current field to HepaUVStateResponse …
vegano1 Mar 28, 2024
b983853
fix(app-testing): snapshot failure capture (#14756)
github-actions[bot] Mar 29, 2024
75d8795
refactor(api): Split CommandStore (#14746)
mjhuff Mar 29, 2024
0fbb4c7
chore(api): fix typing of task_queue workers (#14755)
sfoster1 Mar 29, 2024
2e1a0b5
refactor(protocol-designer): account for multiples of a module in For…
jerader Mar 29, 2024
02b07d1
feat(step-generation): blowOut emits before touchTip (#14727)
jerader Mar 29, 2024
0128834
feat(components, app): update Chip component for unification (#14708)
koji Mar 29, 2024
8f88728
fix(app): Align software keyboard with latest design (#14700)
koji Mar 29, 2024
53ecdbb
fix(app-testing): snapshot failure capture (#14761)
github-actions[bot] Apr 1, 2024
45b6fa9
feat(app, api-client): implement runTimeParametersValues in run creat…
ncdiehl11 Apr 1, 2024
bb33f7c
fix(modules): use parse from packaging module (#14732)
caila-marashaj Apr 1, 2024
4bf9073
chore(release): add release note for speaker and camera (#14768)
ecormany Apr 1, 2024
ad5650d
ABR JIRA TICKET CREATION. (#14767)
rclarke0 Apr 1, 2024
c864a99
feat(app): mark protocol anlayses as stale if they lack RTP (#14763)
ncdiehl11 Apr 1, 2024
34cdcb6
feat(app, components): ProtocolRun RTPs (#14745)
ncdiehl11 Apr 1, 2024
62f6db9
feat(app): range error handling for number RTPs (#14765)
ncdiehl11 Apr 1, 2024
18e4dfd
feat(protocol-designer): tuberack form warnings & warnings now dismis…
jerader Apr 1, 2024
2ec93cd
fix(robot-server): Update status bar to account for `awaiting-recover…
SyntaxColoring Apr 2, 2024
cf93d9c
refactor(robot-server, api): Wire up protocol engine event bubbling t…
mjhuff Apr 2, 2024
bb680e2
feat(app): button to launch quick transfer flow when FF is on (#14772)
smb2268 Apr 2, 2024
2dbb1d9
feat(app): add support for toggling boolean RTPs and restoring defaul…
ncdiehl11 Apr 2, 2024
6933c61
fix(app): fix capitalization of ML to uL in instrument cards (#14779)
smb2268 Apr 2, 2024
f38e962
fix(app,shared-data): change type name from boolean to bool (#14778)
koji Apr 2, 2024
8ee0268
fix(app): fix storybook build error (#14780)
koji Apr 2, 2024
5efb48d
feat(app, shared-data): create odd boolean and choice selection scree…
jerader Apr 2, 2024
fc62016
feat(app): add runtime parameters to ChooseProtocolSlideout (#14781)
ncdiehl11 Apr 2, 2024
a845ad0
fix(app): fix excessive /runs network requests (#14783)
mjhuff Apr 3, 2024
d803d78
fix(api): set instrument cal tolerance to 4mm (#14769)
sfoster1 Apr 3, 2024
2397044
fix(app-testing): snapshot failure capture (#14786)
github-actions[bot] Apr 3, 2024
6ccb243
feat(app, api-client): add optional runTimeParameterValues when cloni…
ncdiehl11 Apr 3, 2024
80abd2e
Automated ABR Calibration Data Uploading (#14782)
rclarke0 Apr 3, 2024
8f2c5e3
fix(api): Change the camera device to /dev/camera2 (#14790)
vegano1 Apr 3, 2024
3b3c8e4
feat(protocol-designer, step-generation): x/Y tip positioning for asp…
jerader Apr 3, 2024
6bf0579
feat(robot-server): update run creation endpoint to accept runtime pa…
jbleon95 Apr 3, 2024
0f7d1ff
chore(app, api-client): remove mock RTP datafrom ProtocolDetails (#14…
ncdiehl11 Apr 3, 2024
3d34031
fix(robot-server): maintain correct order of protocol analyses (#14762)
sanni-t Apr 3, 2024
5c3f08b
fix(app,components): fix module controls no module connected case (#1…
koji Apr 3, 2024
048a533
feat(protocol-designer, step-generation): custom z offset for blowout…
jerader Apr 4, 2024
c0700c8
added functions to count module commands per run (#14797)
rclarke0 Apr 4, 2024
78507d8
docs(app): webpack to vite (#14799)
koji Apr 4, 2024
136e1ec
refactor(app, robot-server): Rename refetchUsingHTTP -> refetch (#14800)
mjhuff Apr 4, 2024
6145da1
feat(hardware): add new hepa fan rpm field to HepaFanStateResponse (#…
vegano1 Apr 4, 2024
6a6720e
feat(app): disable confirm values button if error in RTP (#14794)
ncdiehl11 Apr 4, 2024
eecf117
refactor(api): Rename opentrons.commands to opentrons.legacy_commands…
SyntaxColoring Apr 4, 2024
f95af4f
refactor(protocol-engine): Keep track of failed commands' error recov…
SyntaxColoring Apr 4, 2024
3c5d160
feat(hardware-testing): collected work for upgrading scripts to PE (#…
ryanthecoder Apr 4, 2024
f3c6b0d
test: Fix 2.17 smoke test (#14801)
DerekMaggio Apr 4, 2024
e353a06
feat(app, components): fix ProtocolDetails ParametersTable (#14803)
ncdiehl11 Apr 4, 2024
75e798d
fix(app): modify software keyboard styling (#14804)
koji Apr 4, 2024
65885b2
feat(api): Do not enqueue json commands on protocol load (#14759)
TamarZanzouri Apr 4, 2024
e4797d2
feat(protocol-designer): add alert if x/y position is too close to ed…
jerader Apr 4, 2024
af5eb1f
refactor(app): update storybook of small button (#14812)
koji Apr 5, 2024
059c9e7
refactor(robot-server): Remove engine polling from RunsPublisher (#14…
mjhuff Apr 5, 2024
66b1a3b
fix(app, components): fix parameter table styling (#14809)
ncdiehl11 Apr 5, 2024
d759c8a
fix(app-shell): Fix isConnectingToBroker nullish coalescence (#14816)
mjhuff Apr 5, 2024
b22e631
feat(app, api-client, react-api-client): add optional RTP tp /protoco…
ncdiehl11 Apr 5, 2024
f3f9c28
refactor(app): update Divider stories (#14831)
koji Apr 8, 2024
754295d
refactor(components): update Flex stories (#14830)
koji Apr 8, 2024
4675171
chore: update storybook addon (#14829)
koji Apr 8, 2024
80a834e
refactor(app): update large button stories (#14823)
koji Apr 8, 2024
6bb0f30
refactor(components): update Link stories (#14825)
koji Apr 8, 2024
45725a5
refactor(app): update Line stories (#14826)
koji Apr 8, 2024
0669849
fix(app): software keyboard unresponsive issue (#14819)
koji Apr 8, 2024
1175b4f
refactor(api): be more permissive with accepting int literals for flo…
jbleon95 Apr 8, 2024
49ab661
feat(protocol-designer): createFileWizard now accommodates MoaM for F…
jerader Apr 8, 2024
f69c2cb
fix(app-testing): snapshot failure capture (#14813)
github-actions[bot] Apr 8, 2024
68e250c
refactor(app): update storybook of medium button (#14760)
koji Apr 8, 2024
22959a6
chore(shared-data): Adds new functions for v36 96ch (#14792)
andySigler Apr 8, 2024
3382ae3
chore: create performance metrics project (#14806)
DerekMaggio Apr 8, 2024
d8defe5
fix(shared-data, components, app): fix runtime parameter min-max rang…
koji Apr 8, 2024
3385bf1
refactor(components): update parameter table stories (#14815)
koji Apr 8, 2024
88c3f2c
refactor(components): update Box stories (#14827)
koji Apr 8, 2024
1a5052c
Exec 372 hide performance metrics project behind ff (#14811)
DerekMaggio Apr 8, 2024
e620a8c
refactor(app): remove RTP feature flag (#14837)
koji Apr 8, 2024
2a717d7
feat(protocol-designer): update unused module alert to account for Mo…
jerader Apr 8, 2024
75acb05
feat(robot server): add a POST method on the analyses endpoint (#14828)
sanni-t Apr 8, 2024
3643bc7
feat(protocol-designer): temperature form multiple module support (#1…
jerader Apr 9, 2024
cc084a4
fix(shared-data): format rtp float and int choices to include suffix …
jerader Apr 9, 2024
19d88ce
fix(protocol-designer): magnetic form correct engage height ranges (#…
jerader Apr 9, 2024
1819b8c
feat(api): Pause when `pick_up_tip()` errors in a Python protocol (#1…
SyntaxColoring Apr 9, 2024
2cff9d2
feat(hardware-testing): liquid sense testing script (#14807)
ryanthecoder Apr 9, 2024
0c799fe
Add errored runs to abr tracking sheet (#14845)
rclarke0 Apr 9, 2024
f039897
App style 96 ch exit text (#14843)
y3rsh Apr 9, 2024
e345d32
fix(shared-data, app): fix runtime parameters range display (#14847)
koji Apr 9, 2024
2a82fef
style(app): Adjust desktop app "moveToWell" command text font size (#…
mjhuff Apr 9, 2024
3012568
refactor(app): switch ODD update modal progress bar with spinner (#14…
ncdiehl11 Apr 9, 2024
61b1371
fix(app): display app version again (#14844)
sfoster1 Apr 9, 2024
476149e
feat(protocol-designer): create container for all tipracks (#14848)
jerader Apr 9, 2024
57a8152
refactor(protocol-designer, components): infoItem to nicely accommoda…
jerader Apr 9, 2024
f81da99
fix(shared-data, app): fix small issues in app (#14851)
koji Apr 10, 2024
309b6c1
chore(release): merge changes from v7.2.2 into edge
y3rsh Apr 10, 2024
7544175
fix(discovery-client): fix import statement (#14856)
koji Apr 10, 2024
e423319
feat(opentrons-ai-client, opentrons-ai-server): add folders for opent…
koji Apr 10, 2024
8f50b08
fix(api): ensure the right mount is enabled for initial homing (#14822)
caila-marashaj Apr 10, 2024
a4bc700
fix(app-testing): snapshot failure capture (#14852)
github-actions[bot] Apr 10, 2024
a2c5a02
fix(app): fix rtp slideout issue (#14855)
koji Apr 11, 2024
4c83fc1
fix(app-shell-odd): fix typo in vite-config (#14864)
koji Apr 11, 2024
8bb14f4
feat(app): add input screen for ODD numerical runtime parameters (#14…
ncdiehl11 Apr 11, 2024
a81cc18
fix(shared-data): adapt 96 3.6 to new schema (#14869)
sfoster1 Apr 11, 2024
ee6ff25
chore(api,shared-data): Require Python >=3.10, not >=3.8 (#14867)
SyntaxColoring Apr 11, 2024
332355e
fix(protocol-designer): auto-generate trashBin for flex if no pipetti…
jerader Apr 11, 2024
9b45ea1
Module ramp rate to google sheet (#14868)
rclarke0 Apr 11, 2024
fa6066f
feat(protocol-designer): export and announcement modal for PD 8.1 (#1…
jerader Apr 11, 2024
9be2f8f
fix(app): remove unnecessary console.log (#14880)
koji Apr 11, 2024
044b37f
fix(protocol-designer, components): discarding vs delete step form bu…
jerader Apr 12, 2024
b358ebe
feat(robot-server): add runtime parameter definitions to run summary …
jbleon95 Apr 12, 2024
80222d9
feat(app): add generic run paused splash screen (#14873)
mjhuff Apr 12, 2024
fd6a5b2
fix(app): fix hepa/uv firmware copy (#14881)
mjhuff Apr 12, 2024
15782ad
refactor(protocol-engine): Rename stop() and pause() -> request_stop(…
SyntaxColoring Apr 12, 2024
aba93f1
feat(opentron-ai-client): add Side Panel component (#14886)
koji Apr 12, 2024
b0fb14f
fix(app): update software keyboard ref type (#14860)
koji Apr 12, 2024
485bf0e
feat(app, api-client, react-api-client): add api-client method for pr…
ncdiehl11 Apr 12, 2024
437e074
feat(system-server,robot-server,api): add ability to enable OEM Mode …
vegano1 Apr 12, 2024
f206b14
feat(api-client,app,react-api-client): implement ODD anonymous locali…
brenthagen Apr 12, 2024
efc6bd6
fix(api): raise an error if protocol's defined parameters have duplic…
jbleon95 Apr 12, 2024
f695e74
feat(robot-server): limit the maximum number of analyses stored per p…
sanni-t Apr 12, 2024
5c4c9fe
feat(system-server): add /system/oem_mode/upload_splash endpoint to c…
vegano1 Apr 12, 2024
f8621b8
refactor(protocol-designer): export modal to require app 7.3.0 or hig…
jerader Apr 12, 2024
40637dc
refactor(app): update Flex drop-tip modal copy (#14889)
mjhuff Apr 12, 2024
3142bc2
refactor(app): anonymize all app strings (#14884)
ecormany Apr 12, 2024
fa13e30
feat(performance-metrics): add RobotContextTracker (#14862)
DerekMaggio Apr 15, 2024
f0f3401
fix(app-testing): snapshot failure capture (#14897)
github-actions[bot] Apr 15, 2024
b8c08aa
refactor(robot-server): consolidate DB transactions, fix a max analys…
sanni-t Apr 15, 2024
9cae291
refactor(components): refactor StyledText stories (#14899)
koji Apr 15, 2024
6f35979
refactor(components): refactor location icon stories (#14896)
koji Apr 15, 2024
e5080a6
refactor(app): refactor externallink stories (#14895)
koji Apr 15, 2024
dc093fb
refactor(app): refactor banner component stories (#14894)
koji Apr 15, 2024
e6769f3
fix(shared-data): correctly apply loadname regex (#14887)
sfoster1 Apr 15, 2024
26e063b
feat(opentrons-ai-client): add prompt guide component (#14892)
koji Apr 15, 2024
611978c
refactor(robot-server): Delete unused models for maintenance runs, an…
SyntaxColoring Apr 15, 2024
5b84b34
feat(app): orchestration component for new quick transfer flow (#14808)
smb2268 Apr 15, 2024
bf69ad8
feat(app): push recent RTP run card click to protocol details (#14906)
ncdiehl11 Apr 15, 2024
4e895d4
feat(app, api, shared-data, robot-server): Add module fixtures to dec…
CaseyBatten Apr 15, 2024
55f798a
refactor(api): more clear error messages for type validation when cre…
jbleon95 Apr 15, 2024
8cc2fc7
fix(app): properly disable proceed button if no available robots (#14…
ncdiehl11 Apr 15, 2024
dfb572c
feat(app): factory mode desktop toggle (#14911)
brenthagen Apr 16, 2024
4687e0a
fix(app-testing): snapshot failure capture (#14913)
github-actions[bot] Apr 16, 2024
f7dd2fa
chore(internal release): notes (#14914)
y3rsh Apr 16, 2024
829aa79
refactor(protocol-designer): increased test coverage for ConnectedSte…
jerader Apr 16, 2024
df1d203
fix(app): disable 'Run a protocol' robot overflow menu item if robot …
ncdiehl11 Apr 16, 2024
59d4cc6
fix(protocol-designer): moveLabware newLocation error accounts for cu…
jerader Apr 16, 2024
9152f22
fix(app): Handle Unsafe Move to Plunger during Drop-Tip (#14910)
mjhuff Apr 16, 2024
1fb2e85
fix(app): set max height for desktop modal shell (#14915)
ncdiehl11 Apr 16, 2024
55d25bb
fix(protocol-designer): filter out module addressable areas from newL…
jerader Apr 16, 2024
071cc97
refactor(api,app): remove internal_only flag from enableOEMMode setti…
brenthagen Apr 16, 2024
d77bbb7
fix: fix timing function cross-platform bug (#14919)
DerekMaggio Apr 16, 2024
385d123
feat(app): add pipette selection screen to quick transfer flow (#14912)
smb2268 Apr 16, 2024
4abe652
fix(app): set default selected robot on slideout to first valid robot…
ncdiehl11 Apr 16, 2024
35e9fe7
refactor(api): only ignore stalls for downward portion of force picku…
caila-marashaj Apr 16, 2024
717993b
fix(app): fix various install and version issues (#14926)
sfoster1 Apr 16, 2024
2fadbf1
chore(release): [email protected] release notes (#14930)
y3rsh Apr 17, 2024
3f9cae7
feat(opentrons-ai-client): add ChatDisplay component (#14927)
koji Apr 17, 2024
e20c8e5
chore: add test workflow for opentrons-ai-client (#14923)
koji Apr 17, 2024
0fcbfb4
fix(robot-server): revert test-flex.json back to two pipettes (#14931)
smb2268 Apr 17, 2024
d4bc2da
fix(hardware): remove message ignored by filter spammy log (#14932)
vegano1 Apr 17, 2024
86e1d47
ci(components): fix github deploy action (#14935)
shlokamin Apr 17, 2024
aae8a10
feat(shared-data, api): add uiMaxFlowRate key to pipette definitions …
jerader Apr 17, 2024
0940e7c
chore(api): handle performance-metrics package not existing (#14922)
DerekMaggio Apr 17, 2024
4931d03
fix(opentrons-ai-client): apply GlobalStyle to the application (#14936)
koji Apr 17, 2024
105e8bb
fix(app): add optional description icon to dropdownMenu (#14934)
jerader Apr 17, 2024
f3e966a
fix(app): reset robot and protocol slideout states on close (#14939)
ncdiehl11 Apr 17, 2024
68aa208
ci(components): install udev before calling setup (#14937)
shlokamin Apr 17, 2024
c096931
fix(app): replace remark with react-markdown (#14942)
mjhuff Apr 17, 2024
0e79a40
feat(opentrons-ai-client): add ChatContainer component (#14921)
koji Apr 18, 2024
7d6100d
fix(hardware): remove can messenger `motor_enabled` listener (#14943)
ahiuchingau Apr 18, 2024
58973c6
fix(api): retract function should acquire motion lock (#14944)
ahiuchingau Apr 18, 2024
585f69e
feat(protocol-designer): edit multiple modules modal + row (#14933)
jerader Apr 18, 2024
1a4492b
fix(api): better error message for non-string variable names and min/…
jbleon95 Apr 18, 2024
6d91a56
fix(app): ensure ApplyHistoricOffsets renders on non-RTP protocols (#…
ncdiehl11 Apr 18, 2024
e877f3a
refactor(api): Delete unused action_dispatcher argument (#14954)
SyntaxColoring Apr 19, 2024
8fa37b3
docs(api): fix or remove broken links on Welcome page (#14957)
ecormany Apr 19, 2024
4418128
fix(api): Various E-stop fixes (#14929)
SyntaxColoring Apr 19, 2024
8e1794f
chore: remove downgrade npm (#14898)
koji Apr 19, 2024
15bfd98
refactor(api): Relocate module location validation to engine (#14960)
CaseyBatten Apr 19, 2024
b5a9115
chore: create test-data-generation project in monorepo (#14961)
DerekMaggio Apr 19, 2024
165956d
fix(api): add case correction to module_context.load_labware (#14964)
sanni-t Apr 19, 2024
229573f
fix(api): engage axis to enable the motor before attempting to move t…
vegano1 Apr 19, 2024
4cc69eb
fix(app): configure modules during calibration, shorten heater shaker…
b-cooper Apr 19, 2024
de2b1eb
feat(opentrons-ai-client): introduce react-markdown to chat display c…
koji Apr 22, 2024
0f07f97
fix(components): fix icon stories (#14969)
koji Apr 22, 2024
8776ed9
ci(shared-data): install dependencies in workflow (#14958)
shlokamin Apr 22, 2024
b42927a
feat(app): add tiprack selection step to quick transfer flow (#14950)
smb2268 Apr 22, 2024
58a1fc0
refactor(protocol-designer): tip position modal max values round down…
jerader Apr 22, 2024
26d55ec
fix(app, api-client): fix choose protocol slideout issue (#14949)
koji Apr 22, 2024
838e356
refactor(protocol-designer): assign module slot in createFileWizard i…
jerader Apr 22, 2024
ec73d82
refactor(components): refactor roundtab stories (#14956)
koji Apr 22, 2024
2532997
fix(app): prevent "run again" banner from rendering after navigating …
mjhuff Apr 22, 2024
d4f7f17
feat(hardware-testing): enable multi sensor processing in liquid prob…
ryanthecoder Apr 22, 2024
2d57126
feature(api, robot-server): Allow fixit commands to recover from an e…
TamarZanzouri Apr 22, 2024
737c58c
fix(robot-server): notify /runs when a non-current run is deleted (#1…
mjhuff Apr 22, 2024
433ef44
feat(api-client,app,react-api-client): upload splash logo from deskto…
brenthagen Apr 22, 2024
ff5e0c0
fix(api): remove homing patch fix for right mount when a 96-channel i…
ahiuchingau Apr 22, 2024
3b7058e
fix(app): add robotSerialNumber to proceedToRun event (#14976)
koji Apr 23, 2024
4794f55
feat(opentrons-ai-client) add input textbox to container (#14968)
koji Apr 23, 2024
cfefcbc
feat(api): add option to ignore different tip presence states (#14980)
caila-marashaj Apr 23, 2024
ce97b91
fix(app): fix infinitely re-rendering/never rendering firmware succes…
mjhuff Apr 23, 2024
daa51dd
fix(api): Filter out `air_gap()` calls as higher-order commands (#14985)
SyntaxColoring Apr 23, 2024
26929a2
fix(app): clone run with RTPs from HistoricalProtocolRun (#14959)
ncdiehl11 Apr 23, 2024
4c89730
feat(opentrons-ai-client): add prompt button (#14970)
koji Apr 23, 2024
446da56
feat(app): Only follow rear tip sensor during calibration setup (#14984)
caila-marashaj Apr 23, 2024
a9dcb20
chore(release): [email protected] release notes (#14988)
y3rsh Apr 23, 2024
5415917
fix(app): resolve module location conflicts through deck config durin…
b-cooper Apr 23, 2024
40db9c5
fix(opentrons-shared-data): fix performance module not being recogniz…
DerekMaggio Apr 24, 2024
f7a2f56
chore(release): [email protected] release notes (#14991)
y3rsh Apr 24, 2024
9b6fb78
fix(build): add workaround to fix github actions due to microsoft sig…
vegano1 Apr 24, 2024
1b1ec1b
feat(opentrons-ai-client): add style to container of Textarea (#14987)
koji Apr 24, 2024
aa3569b
fix(app-testing): snapshot failure capture (#14992)
github-actions[bot] Apr 24, 2024
9d75e1f
feat(shared-data, protocol-designer): return latest pipette model def…
jerader Apr 24, 2024
5683b33
fix(shared-data): remove sort from choices (#14996)
koji Apr 24, 2024
972c970
refactor(protocol-designer): tweak when module cards are disabled in …
jerader Apr 24, 2024
0493c5c
fix(app): specify component for markdown uls (#14997)
sfoster1 Apr 24, 2024
5f85719
chore(shared-data): Add pipette definition for P50S v3.6 (#14863)
andySigler Apr 24, 2024
77bc720
refactor(app): add RTP properties to protocol run event analytics (#1…
ncdiehl11 Apr 24, 2024
c7bd4bb
feat(api): add a reload-labware command (#14963)
sfoster1 Apr 24, 2024
04e00ad
refactor(protocol-designer): minimize and extend position and tuberac…
jerader Apr 25, 2024
bd1f8da
feat(step-generation, shared-data): pipette collision warnings (#14989)
jerader Apr 25, 2024
25f6011
fix(api): command intent and test (#15022)
y3rsh Apr 26, 2024
617c2f9
chore(release): [email protected] release notes (#15015)
y3rsh Apr 26, 2024
001b1fa
fix(docs): fix release notes (#15023)
y3rsh Apr 26, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat(app): add pipette selection screen to quick transfer flow (#14912)
smb2268 authored Apr 16, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 385d123ac06063a7861185227b8eb433755ce97c
3 changes: 3 additions & 0 deletions app/src/assets/localization/en/quick_transfer.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"create_new_transfer": "Create new quick transfer",
"left_mount": "Left Mount",
"both_mounts": "Left + Right Mount",
"right_mount": "Right Mount",
"select_attached_pipette": "Select attached pipette",
"select_dest_labware": "Select destination labware",
"select_dest_wells": "Select destination wells",
13 changes: 13 additions & 0 deletions app/src/atoms/buttons/LargeButton.stories.tsx
Original file line number Diff line number Diff line change
@@ -45,3 +45,16 @@ export const Alert: Story = {
iconName: 'reset',
},
}
export const PrimaryNoIcon: Story = {
args: {
buttonText: 'Button text',
disabled: false,
},
}
export const PrimaryWithSubtext: Story = {
args: {
buttonText: 'Button text',
disabled: false,
subtext: 'Button subtext',
},
}
44 changes: 26 additions & 18 deletions app/src/atoms/buttons/LargeButton.tsx
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ import {
DIRECTION_COLUMN,
DISPLAY_FLEX,
Icon,
Flex,
JUSTIFY_SPACE_BETWEEN,
SPACING,
StyledText,
@@ -20,7 +21,8 @@ interface LargeButtonProps extends StyleProps {
onClick: () => void
buttonType?: LargeButtonTypes
buttonText: React.ReactNode
iconName: IconName
iconName?: IconName
subtext?: string
disabled?: boolean
}

@@ -29,6 +31,7 @@ export function LargeButton(props: LargeButtonProps): JSX.Element {
buttonType = 'primary',
buttonText,
iconName,
subtext,
disabled = false,
...buttonProps
} = props
@@ -110,23 +113,28 @@ export function LargeButton(props: LargeButtonProps): JSX.Element {
disabled={disabled}
{...buttonProps}
>
<StyledText
fontSize="2rem"
fontWeight={TYPOGRAPHY.fontWeightSemiBold}
lineHeight="2.625rem"
>
{buttonText}
</StyledText>
<Icon
name={iconName}
aria-label={`${iconName} icon`}
color={
disabled
? COLORS.grey50
: LARGE_BUTTON_PROPS_BY_TYPE[buttonType].iconColor
}
size="5rem"
/>
<Flex flexDirection={DIRECTION_COLUMN}>
<StyledText css={TYPOGRAPHY.level3HeaderSemiBold}>
{buttonText}
</StyledText>
{subtext ? (
<StyledText css={TYPOGRAPHY.level3HeaderRegular}>
{subtext}
</StyledText>
) : null}
</Flex>
{iconName ? (
<Icon
name={iconName}
aria-label={`${iconName} icon`}
color={
disabled
? COLORS.grey50
: LARGE_BUTTON_PROPS_BY_TYPE[buttonType].iconColor
}
size="5rem"
/>
) : null}
</Btn>
)
}
114 changes: 114 additions & 0 deletions app/src/organisms/QuickTransferFlow/SelectPipette.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import * as React from 'react'
import { useTranslation } from 'react-i18next'
import {
Flex,
SPACING,
StyledText,
TYPOGRAPHY,
DIRECTION_COLUMN,
} from '@opentrons/components'
import { useInstrumentsQuery } from '@opentrons/react-api-client'
import { getPipetteSpecsV2, RIGHT, LEFT } from '@opentrons/shared-data'
import { SmallButton, LargeButton } from '../../atoms/buttons'
import { ChildNavigation } from '../ChildNavigation'

import type { PipetteData, Mount } from '@opentrons/api-client'
import type {
QuickTransferSetupState,
QuickTransferWizardAction,
} from './types'

interface SelectPipetteProps {
onNext: () => void
onBack: () => void
exitButtonProps: React.ComponentProps<typeof SmallButton>
state: QuickTransferSetupState
dispatch: React.Dispatch<QuickTransferWizardAction>
}

export function SelectPipette(props: SelectPipetteProps): JSX.Element {
const { onNext, onBack, exitButtonProps, state, dispatch } = props
const { i18n, t } = useTranslation(['quick_transfer', 'shared'])
const { data: attachedInstruments } = useInstrumentsQuery()

const leftPipette = attachedInstruments?.data.find(
(i): i is PipetteData => i.ok && i.mount === LEFT
)
const leftPipetteSpecs =
leftPipette != null ? getPipetteSpecsV2(leftPipette.instrumentModel) : null

const rightPipette = attachedInstruments?.data.find(
(i): i is PipetteData => i.ok && i.mount === RIGHT
)
const rightPipetteSpecs =
rightPipette != null
? getPipetteSpecsV2(rightPipette.instrumentModel)
: null

// automatically select 96 channel if it is attached
const [selectedPipette, setSelectedPipette] = React.useState<
Mount | undefined
>(leftPipetteSpecs?.channels === 96 ? LEFT : state.mount)

const handleClickNext = (): void => {
const selectedPipetteSpecs =
selectedPipette === LEFT ? leftPipetteSpecs : rightPipetteSpecs

// the button will be disabled if these values are null
if (selectedPipette != null && selectedPipetteSpecs != null) {
dispatch({
type: 'SELECT_PIPETTE',
pipette: selectedPipetteSpecs,
mount: selectedPipette,
})
onNext()
}
}
return (
<Flex>
<ChildNavigation
header={t('select_attached_pipette')}
buttonText={i18n.format(t('shared:continue'), 'capitalize')}
onClickBack={onBack}
onClickButton={handleClickNext}
secondaryButtonProps={exitButtonProps}
top={SPACING.spacing8}
buttonIsDisabled={selectedPipette == null}
/>
<Flex
marginTop={SPACING.spacing120}
flexDirection={DIRECTION_COLUMN}
padding={`${SPACING.spacing16} ${SPACING.spacing60} ${SPACING.spacing40} ${SPACING.spacing60}`}
gridGap={SPACING.spacing16}
>
<StyledText css={TYPOGRAPHY.level4HeaderRegular}>
{t('pipette_currently_attached')}
</StyledText>
{leftPipetteSpecs != null ? (
<LargeButton
buttonType={selectedPipette === LEFT ? 'primary' : 'secondary'}
onClick={() => {
setSelectedPipette(LEFT)
}}
buttonText={
leftPipetteSpecs.channels === 96
? t('both_mounts')
: t('left_mount')
}
subtext={leftPipetteSpecs.displayName}
/>
) : null}
{rightPipetteSpecs != null ? (
<LargeButton
buttonType={selectedPipette === RIGHT ? 'primary' : 'secondary'}
onClick={() => {
setSelectedPipette(RIGHT)
}}
buttonText={t('right_mount')}
subtext={rightPipetteSpecs.displayName}
/>
) : null}
</Flex>
</Flex>
)
}
126 changes: 126 additions & 0 deletions app/src/organisms/QuickTransferFlow/__tests__/SelectPipette.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import * as React from 'react'
import { fireEvent, screen } from '@testing-library/react'
import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest'
import { useInstrumentsQuery } from '@opentrons/react-api-client'

import { renderWithProviders } from '../../../__testing-utils__'
import { i18n } from '../../../i18n'
import { SelectPipette } from '../SelectPipette'

vi.mock('@opentrons/react-api-client')
const render = (props: React.ComponentProps<typeof SelectPipette>) => {
return renderWithProviders(<SelectPipette {...props} />, {
i18nInstance: i18n,
})
}

describe('SelectPipette', () => {
let props: React.ComponentProps<typeof SelectPipette>

beforeEach(() => {
props = {
onNext: vi.fn(),
onBack: vi.fn(),
exitButtonProps: {
buttonType: 'tertiaryLowLight',
buttonText: 'Exit',
onClick: vi.fn(),
},
state: {},
dispatch: vi.fn(),
}
vi.mocked(useInstrumentsQuery).mockReturnValue({
data: {
data: [
{
instrumentType: 'pipette',
mount: 'left',
ok: true,
firmwareVersion: 12,
instrumentName: 'p10_single',
instrumentModel: 'p1000_multi_v3.4',
data: {},
} as any,
{
instrumentType: 'pipette',
mount: 'right',
ok: true,
firmwareVersion: 12,
instrumentName: 'p10_single',
instrumentModel: 'p1000_multi_v3.4',
data: {},
} as any,
],
},
} as any)
})
afterEach(() => {
vi.resetAllMocks()
})

it('renders the select pipette screen, header, and exit button', () => {
render(props)
screen.getByText('Select attached pipette')
screen.getByText(
'Quick transfer options depend on the pipettes currently attached to your robot.'
)
const exitBtn = screen.getByText('Exit')
fireEvent.click(exitBtn)
expect(props.exitButtonProps.onClick).toHaveBeenCalled()
})

it('renders continue button and it is disabled if no pipette is selected', () => {
render(props)
screen.getByText('Continue')
const continueBtn = screen.getByTestId('ChildNavigation_Primary_Button')
expect(continueBtn).toBeDisabled()
})

it('renders both pipette buttons if there are two attached', () => {
render(props)
screen.getByText('Left Mount')
screen.getByText('Right Mount')
})

it('selects pipette by default if there is one in state, button will be enabled', () => {
render({ ...props, state: { mount: 'left' } })
const continueBtn = screen.getByTestId('ChildNavigation_Primary_Button')
expect(continueBtn).toBeEnabled()
fireEvent.click(continueBtn)
expect(props.onNext).toHaveBeenCalled()
})

it('enables continue button if you click a pipette', () => {
render(props)
const continueBtn = screen.getByTestId('ChildNavigation_Primary_Button')
expect(continueBtn).toBeDisabled()
const leftButton = screen.getByText('Left Mount')
fireEvent.click(leftButton)
expect(continueBtn).toBeEnabled()
fireEvent.click(continueBtn)
expect(props.dispatch).toHaveBeenCalled()
expect(props.onNext).toHaveBeenCalled()
})

it('renders left and right button if 96 is attached and automatically selects the pipette', () => {
vi.mocked(useInstrumentsQuery).mockReturnValue({
data: {
data: [
{
instrumentType: 'pipette',
mount: 'left',
ok: true,
firmwareVersion: 12,
instrumentName: 'p1000_96',
instrumentModel: 'p1000_96_v1',
data: {},
} as any,
],
},
} as any)
render(props)
screen.getByText('Left + Right Mount')
const continueBtn = screen.getByTestId('ChildNavigation_Primary_Button')
expect(continueBtn).toBeEnabled()
})
})
91 changes: 20 additions & 71 deletions app/src/organisms/QuickTransferFlow/index.tsx
Original file line number Diff line number Diff line change
@@ -5,83 +5,21 @@ import { Flex, StepMeter, SPACING } from '@opentrons/components'
import { SmallButton } from '../../atoms/buttons'
import { ChildNavigation } from '../ChildNavigation'
import { CreateNewTransfer } from './CreateNewTransfer'
import { SelectPipette } from './SelectPipette'
import { quickTransferReducer } from './utils'

import type {
QuickTransferSetupState,
QuickTransferWizardAction,
} from './types'
import type { QuickTransferSetupState } from './types'

const QUICK_TRANSFER_WIZARD_STEPS = 8

// const initialQuickTransferState: QuickTransferSetupState = {}
export function reducer(
state: QuickTransferSetupState,
action: QuickTransferWizardAction
): QuickTransferSetupState {
switch (action.type) {
case 'SELECT_PIPETTE': {
return {
pipette: action.pipette,
}
}
case 'SELECT_TIP_RACK': {
return {
pipette: state.pipette,
tipRack: action.tipRack,
}
}
case 'SET_SOURCE_LABWARE': {
return {
pipette: state.pipette,
tipRack: state.tipRack,
source: action.labware,
}
}
case 'SET_SOURCE_WELLS': {
return {
pipette: state.pipette,
tipRack: state.tipRack,
source: state.source,
sourceWells: action.wells,
}
}
case 'SET_DEST_LABWARE': {
return {
pipette: state.pipette,
tipRack: state.tipRack,
source: state.source,
sourceWells: state.sourceWells,
destination: action.labware,
}
}
case 'SET_DEST_WELLS': {
return {
pipette: state.pipette,
tipRack: state.tipRack,
source: state.source,
sourceWells: state.sourceWells,
destination: state.destination,
destinationWells: action.wells,
}
}
case 'SET_VOLUME': {
return {
pipette: state.pipette,
tipRack: state.tipRack,
source: state.source,
sourceWells: state.sourceWells,
destination: state.destination,
destinationWells: state.destinationWells,
volume: action.volume,
}
}
}
}
const initialQuickTransferState: QuickTransferSetupState = {}

export const QuickTransferFlow = (): JSX.Element => {
const history = useHistory()
const { i18n, t } = useTranslation(['quick_transfer', 'shared'])
// const [state, dispatch] = React.useReducer(reducer, initialQuickTransferState)
const [state, dispatch] = React.useReducer(
quickTransferReducer,
initialQuickTransferState
)
const [currentStep, setCurrentStep] = React.useState(1)
const [continueIsDisabled] = React.useState<boolean>(false)

@@ -96,6 +34,8 @@ export const QuickTransferFlow = (): JSX.Element => {
history.push('protocols')
},
}

// these will be moved to the child components once they all exist
const ORDERED_STEP_HEADERS: string[] = [
t('create_new_transfer'),
t('select_attached_pipette'),
@@ -116,12 +56,21 @@ export const QuickTransferFlow = (): JSX.Element => {
exitButtonProps={exitButtonProps}
/>
)
} else if (currentStep === 2) {
modalContent = (
<SelectPipette
state={state}
dispatch={dispatch}
onBack={() => setCurrentStep(prevStep => prevStep - 1)}
onNext={() => setCurrentStep(prevStep => prevStep + 1)}
exitButtonProps={exitButtonProps}
/>
)
} else {
modalContent = null
}

// until each page is wired up, show header title with empty screen

return (
<>
<StepMeter
10 changes: 6 additions & 4 deletions app/src/organisms/QuickTransferFlow/types.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { ACTIONS } from './constants'
import type { PipetteData } from '@opentrons/api-client'
import type { LabwareDefinition1 } from '@opentrons/shared-data'
import type { Mount } from '@opentrons/api-client'
import type { LabwareDefinition1, PipetteV2Specs } from '@opentrons/shared-data'

export interface QuickTransferSetupState {
pipette?: PipetteData
pipette?: PipetteV2Specs
mount?: Mount
tipRack?: LabwareDefinition1
source?: LabwareDefinition1
sourceWells?: string[]
@@ -23,7 +24,8 @@ export type QuickTransferWizardAction =

interface SelectPipetteAction {
type: typeof ACTIONS.SELECT_PIPETTE
pipette: PipetteData
mount: Mount
pipette: PipetteV2Specs
}
interface SelectTipRackAction {
type: typeof ACTIONS.SELECT_TIP_RACK
75 changes: 75 additions & 0 deletions app/src/organisms/QuickTransferFlow/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import type {
QuickTransferSetupState,
QuickTransferWizardAction,
} from './types'

export function quickTransferReducer(
state: QuickTransferSetupState,
action: QuickTransferWizardAction
): QuickTransferSetupState {
switch (action.type) {
case 'SELECT_PIPETTE': {
return {
pipette: action.pipette,
mount: action.mount,
}
}
case 'SELECT_TIP_RACK': {
return {
pipette: state.pipette,
mount: state.mount,
tipRack: action.tipRack,
}
}
case 'SET_SOURCE_LABWARE': {
return {
pipette: state.pipette,
mount: state.mount,
tipRack: state.tipRack,
source: action.labware,
}
}
case 'SET_SOURCE_WELLS': {
return {
pipette: state.pipette,
mount: state.mount,
tipRack: state.tipRack,
source: state.source,
sourceWells: action.wells,
}
}
case 'SET_DEST_LABWARE': {
return {
pipette: state.pipette,
mount: state.mount,
tipRack: state.tipRack,
source: state.source,
sourceWells: state.sourceWells,
destination: action.labware,
}
}
case 'SET_DEST_WELLS': {
return {
pipette: state.pipette,
mount: state.mount,
tipRack: state.tipRack,
source: state.source,
sourceWells: state.sourceWells,
destination: state.destination,
destinationWells: action.wells,
}
}
case 'SET_VOLUME': {
return {
pipette: state.pipette,
mount: state.mount,
tipRack: state.tipRack,
source: state.source,
sourceWells: state.sourceWells,
destination: state.destination,
destinationWells: state.destinationWells,
volume: action.volume,
}
}
}
}
8 changes: 2 additions & 6 deletions robot-server/simulators/test-flex.json
Original file line number Diff line number Diff line change
@@ -2,12 +2,8 @@
"machine": "OT-3 Standard",
"strict_attached_instruments": false,
"attached_instruments": {
"right": {
"model": "p1000_single_3.4",
"id": "321"
},
"left": {
"model": "p50_single_3.4",
"model": "p1000_96_v1",
"id": "123"
}
},
@@ -91,4 +87,4 @@
}
]
}
}
}

Unchanged files with check annotations Beta

import { Mount } from '../pipettes'

Check warning on line 1 in api-client/src/calibration/types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`
export interface PipOffsetDeletionParams {
calType: 'pipetteOffset'
import { ModuleType } from '@opentrons/shared-data'

Check warning on line 1 in api-client/src/modules/api-types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`
import type { Coordinates, ModuleModel } from '@opentrons/shared-data'
HeaterShakerModuleModel,
} from '@opentrons/shared-data'
import {

Check warning on line 8 in api-client/src/modules/types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`
TEMPERATURE_MODULE_TYPE,
MAGNETIC_MODULE_TYPE,
THERMOCYCLER_MODULE_TYPE,
HEATERSHAKER_MODULE_TYPE,
} from '@opentrons/shared-data'
import * as ApiTypes from './api-types'

Check warning on line 15 in api-client/src/modules/types.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`
export * from './api-types'
// common types
units?: string
type?: string
}
interface PipetteQuirksField {

Check warning on line 62 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature
[quirkId: string]: boolean
}
interface QuirksField {
quirks?: PipetteQuirksField
}
export type PipetteSettingsFieldsMap = QuirksField & {

Check warning on line 69 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature
[fieldId: string]: PipetteSettingsField
}
export interface IndividualPipetteSettings {
fields: PipetteSettingsFieldsMap
}
type PipetteSettingsById = Partial<{ [id: string]: IndividualPipetteSettings }>

Check warning on line 77 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature
export type PipetteSettings = PipetteSettingsById
export interface PipetteSettingsUpdateFieldsMap {

Check warning on line 81 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature
[fieldId: string]: PipetteSettingsUpdateField
}
} | null
export interface UpdatePipetteSettingsData {
fields: { [fieldId: string]: PipetteSettingsUpdateField }

Check warning on line 90 in api-client/src/pipettes/types.ts

GitHub Actions / js checks

A record is preferred over an index signature
}
} from '../utils'
import { simpleAnalysisFileFixture } from '../__fixtures__'
import { RunTimeCommand } from '@opentrons/shared-data'

Check warning on line 17 in api-client/src/protocols/__tests__/utils.test.ts

GitHub Actions / js checks

All imports in the declaration are only used as types. Use `import type`
const mockRunTimeCommands: RunTimeCommand[] = simpleAnalysisFileFixture.commands as any
const mockLoadLiquidRunTimeCommands = [