1
1
import { useTranslation } from 'react-i18next'
2
- import { css } from 'styled-components'
3
2
4
3
import {
5
- ALIGN_CENTER ,
6
- BORDERS ,
7
4
Box ,
8
5
COLORS ,
9
- DeckInfoLabel ,
10
6
DIRECTION_COLUMN ,
11
- DISPLAY_NONE ,
12
7
Flex ,
13
8
getLabwareDisplayLocation ,
14
9
getLoadedLabware ,
15
- getLoadedModule ,
16
- Icon ,
17
10
LabwareRender ,
18
- LegacyStyledText ,
19
11
Module ,
20
12
MoveLabwareOnDeck ,
21
- RESPONSIVENESS ,
22
13
SPACING ,
23
- TEXT_TRANSFORM_UPPERCASE ,
24
- TYPOGRAPHY ,
25
14
} from '@opentrons/components'
26
15
import {
27
16
getDeckDefFromRobotType ,
28
17
getLoadedLabwareDefinitionsByUri ,
29
- getModuleType ,
30
- GRIPPER_WASTE_CHUTE_ADDRESSABLE_AREA ,
31
18
inferModuleOrientationFromXCoordinate ,
32
- OT2_ROBOT_TYPE ,
33
- TC_MODULE_LOCATION_OT2 ,
34
- TC_MODULE_LOCATION_OT3 ,
35
- THERMOCYCLER_MODULE_TYPE ,
36
19
} from '@opentrons/shared-data'
37
20
38
- import { Divider } from '/app/atoms/structure '
21
+ import { InterventionInfo } from '/app/molecules/InterventionModal/InterventionContent '
39
22
import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration'
40
23
41
24
import {
42
25
getLabwareNameFromRunData ,
43
- getModuleModelFromRunData ,
44
26
getRunLabwareRenderInfo ,
45
27
getRunModuleRenderInfo ,
46
28
} from './utils'
47
29
48
30
import type { RunData } from '@opentrons/api-client'
49
31
import type {
50
32
CompletedProtocolAnalysis ,
51
- LabwareDefinitionsByUri ,
52
- LabwareLocation ,
53
33
MoveLabwareRunTimeCommand ,
54
34
RobotType ,
55
35
} from '@opentrons/shared-data'
56
36
57
- const LABWARE_DESCRIPTION_STYLE = css `
58
- flex-direction : ${ DIRECTION_COLUMN } ;
59
- grid-gap : ${ SPACING . spacing8 } ;
60
- padding : ${ SPACING . spacing16 } ;
61
- background-color : ${ COLORS . grey20 } ;
62
- border-radius : ${ BORDERS . borderRadius4 } ;
63
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
64
- background-color : ${ COLORS . grey35 } ;
65
- border-radius : ${ BORDERS . borderRadius8 } ;
66
- }
67
- `
68
-
69
- const LABWARE_NAME_TITLE_STYLE = css `
70
- font-weight : ${ TYPOGRAPHY . fontWeightSemiBold } ;
71
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
72
- display : ${ DISPLAY_NONE } ;
73
- }
74
- `
75
-
76
- const LABWARE_NAME_STYLE = css `
77
- color : ${ COLORS . grey60 } ;
78
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
79
- ${ TYPOGRAPHY . bodyTextBold }
80
- color : ${ COLORS . black90 } ;
81
- }
82
- `
83
-
84
- const DIVIDER_STYLE = css `
85
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
86
- display : ${ DISPLAY_NONE } ;
87
- }
88
- `
89
-
90
- const LABWARE_DIRECTION_STYLE = css `
91
- align-items : ${ ALIGN_CENTER } ;
92
- grid-gap : ${ SPACING . spacing4 } ;
93
- text-transform : ${ TEXT_TRANSFORM_UPPERCASE } ;
94
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
95
- grid-gap : ${ SPACING . spacing8 } ;
96
- }
97
- `
98
-
99
- const ICON_STYLE = css `
100
- height : 1.5rem ;
101
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
102
- height : 2.5rem ;
103
- }
104
- `
105
-
106
37
export interface MoveLabwareInterventionProps {
107
38
command : MoveLabwareRunTimeCommand
108
39
analysis : CompletedProtocolAnalysis | null
@@ -118,7 +49,7 @@ export function MoveLabwareInterventionContent({
118
49
robotType,
119
50
isOnDevice,
120
51
} : MoveLabwareInterventionProps ) : JSX . Element | null {
121
- const { t } = useTranslation ( [ 'protocol_setup' , ' protocol_command_text'] )
52
+ const { i18n , t } = useTranslation ( ' protocol_command_text')
122
53
123
54
const analysisCommands = analysis ?. commands ?? [ ]
124
55
const labwareDefsByUri = getLoadedLabwareDefinitionsByUri ( analysisCommands )
@@ -151,6 +82,24 @@ export function MoveLabwareInterventionContent({
151
82
? labwareDefsByUri ?. [ movedLabwareDefUri ] ?? null
152
83
: null
153
84
if ( oldLabwareLocation == null || movedLabwareDef == null ) return null
85
+ const oldDisplayLabwareLocation = getLabwareDisplayLocation ( {
86
+ location : oldLabwareLocation ,
87
+ loadedModules : run . modules ,
88
+ loadedLabwares : run . labware ,
89
+ robotType : 'OT-3 Standard' ,
90
+ detailLevel : 'slot-only' ,
91
+ includeSlotText : false ,
92
+ t,
93
+ } )
94
+ const newDisplayLabwareLocation = getLabwareDisplayLocation ( {
95
+ location : command . params . newLocation ,
96
+ loadedModules : run . modules ,
97
+ loadedLabwares : run . labware ,
98
+ robotType : 'OT-3 Standard' ,
99
+ detailLevel : 'slot-only' ,
100
+ includeSlotText : false ,
101
+ t,
102
+ } )
154
103
return (
155
104
< Flex
156
105
flexDirection = { DIRECTION_COLUMN }
@@ -163,41 +112,17 @@ export function MoveLabwareInterventionContent({
163
112
gridGap = { SPACING . spacing12 }
164
113
width = "50%"
165
114
>
166
- < Flex css = { LABWARE_DESCRIPTION_STYLE } >
167
- < Flex flexDirection = { DIRECTION_COLUMN } >
168
- < LegacyStyledText as = "h2" css = { LABWARE_NAME_TITLE_STYLE } >
169
- { t ( 'labware_name' ) }
170
- </ LegacyStyledText >
171
- < LegacyStyledText as = "p" css = { LABWARE_NAME_STYLE } >
172
- { labwareName }
173
- </ LegacyStyledText >
174
- </ Flex >
175
- < Divider css = { DIVIDER_STYLE } />
176
- < Flex css = { LABWARE_DIRECTION_STYLE } >
177
- < DeckInfoLabel
178
- deckLabel = { getLabwareDisplayLocation ( {
179
- location : oldLabwareLocation ,
180
- loadedModules : run . modules ,
181
- loadedLabwares : run . labware ,
182
- robotType : 'OT-3 Standard' ,
183
- detailLevel : 'slot-only' ,
184
- t,
185
- } ) }
186
- />
187
-
188
- < Icon name = "arrow-right" css = { ICON_STYLE } />
189
- < DeckInfoLabel
190
- deckLabel = { getLabwareDisplayLocation ( {
191
- location : command . params . newLocation ,
192
- loadedModules : run . modules ,
193
- loadedLabwares : run . labware ,
194
- robotType : 'OT-3 Standard' ,
195
- detailLevel : 'slot-only' ,
196
- t,
197
- } ) }
198
- />
199
- </ Flex >
200
- </ Flex >
115
+ < InterventionInfo
116
+ layout = "default"
117
+ type = "location-arrow-location"
118
+ labwareName = { labwareName }
119
+ currentLocationProps = { {
120
+ deckLabel : oldDisplayLabwareLocation ,
121
+ } }
122
+ newLocationProps = { {
123
+ deckLabel : newDisplayLabwareLocation ,
124
+ } }
125
+ />
201
126
</ Flex >
202
127
< Flex width = "50%" >
203
128
< Box margin = "0 auto" width = "100%" >
@@ -235,7 +160,7 @@ export function MoveLabwareInterventionContent({
235
160
childrenPositioningMode = "offsetToSlot"
236
161
>
237
162
{ nestedLabwareDef != null &&
238
- nestedLabwareId !== command . params . labwareId ? (
163
+ nestedLabwareId !== command . params . labwareId ? (
239
164
< LabwareRender
240
165
definition = { nestedLabwareDef }
241
166
positioningMode = "offsetInSlot"
@@ -266,92 +191,3 @@ export function MoveLabwareInterventionContent({
266
191
</ Flex >
267
192
)
268
193
}
269
-
270
- interface LabwareDisplayLocationProps {
271
- protocolData : RunData
272
- location : LabwareLocation
273
- robotType : RobotType
274
- labwareDefsByUri : LabwareDefinitionsByUri
275
- }
276
- function LabwareDisplayLocation (
277
- props : LabwareDisplayLocationProps
278
- ) : JSX . Element {
279
- const { t } = useTranslation ( 'protocol_command_text' )
280
- const { protocolData, location, robotType } = props
281
- let displayLocation : string = ''
282
- if ( location === 'offDeck' || location === 'systemLocation' ) {
283
- // TODO(BC, 08/28/23): remove this string cast after update i18next to >23 (see https://www.i18next.com/overview/typescript#argument-of-type-defaulttfuncreturn-is-not-assignable-to-parameter-of-type-xyz)
284
- displayLocation = String ( t ( 'offdeck' ) )
285
- } else if ( 'slotName' in location ) {
286
- displayLocation = location . slotName
287
- } else if ( 'addressableAreaName' in location ) {
288
- const aaLocation = location . addressableAreaName
289
- displayLocation =
290
- aaLocation === GRIPPER_WASTE_CHUTE_ADDRESSABLE_AREA
291
- ? t ( 'waste_chute' )
292
- : aaLocation
293
- } else if ( 'moduleId' in location ) {
294
- const moduleModel = getModuleModelFromRunData (
295
- protocolData ,
296
- location . moduleId
297
- )
298
- if ( moduleModel == null ) {
299
- console . warn ( 'labware is located on an unknown module model' )
300
- } else {
301
- const slotName =
302
- getLoadedModule ( protocolData . modules , location . moduleId ) ?. location
303
- ?. slotName ?? ''
304
- const isModuleUnderAdapterThermocycler =
305
- getModuleType ( moduleModel ) === THERMOCYCLER_MODULE_TYPE
306
- if ( isModuleUnderAdapterThermocycler ) {
307
- displayLocation =
308
- robotType === OT2_ROBOT_TYPE
309
- ? TC_MODULE_LOCATION_OT2
310
- : TC_MODULE_LOCATION_OT3
311
- } else {
312
- displayLocation = slotName
313
- }
314
- }
315
- } else if ( 'labwareId' in location ) {
316
- const adapter = protocolData . labware . find (
317
- lw => lw . id === location . labwareId
318
- )
319
- if ( adapter == null ) {
320
- console . warn ( 'labware is located on an unknown adapter' )
321
- } else if (
322
- adapter . location === 'offDeck' ||
323
- adapter . location === 'systemLocation'
324
- ) {
325
- displayLocation = t ( 'off_deck' )
326
- } else if ( 'slotName' in adapter . location ) {
327
- displayLocation = adapter . location . slotName
328
- } else if ( 'addressableAreaName' in adapter . location ) {
329
- displayLocation = adapter . location . addressableAreaName
330
- } else if ( 'moduleId' in adapter . location ) {
331
- const moduleIdUnderAdapter = adapter . location . moduleId
332
- const moduleModel = protocolData . modules . find (
333
- module => module . id === moduleIdUnderAdapter
334
- ) ?. model
335
- if ( moduleModel == null ) {
336
- console . warn ( 'labware is located on an adapter on an unknown module' )
337
- } else {
338
- const slotName =
339
- getLoadedModule ( protocolData . modules , adapter . location . moduleId )
340
- ?. location ?. slotName ?? ''
341
- const isModuleUnderAdapterThermocycler =
342
- getModuleType ( moduleModel ) === THERMOCYCLER_MODULE_TYPE
343
- if ( isModuleUnderAdapterThermocycler ) {
344
- displayLocation =
345
- robotType === OT2_ROBOT_TYPE
346
- ? TC_MODULE_LOCATION_OT2
347
- : TC_MODULE_LOCATION_OT3
348
- } else {
349
- displayLocation = slotName
350
- }
351
- }
352
- } else {
353
- console . warn ( 'display location could not be established: ' , location )
354
- }
355
- }
356
- return < DeckInfoLabel deckLabel = { displayLocation } />
357
- }
0 commit comments