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
MoveLabwareOnDeck ,
20
- RESPONSIVENESS ,
21
12
SPACING ,
22
- TEXT_TRANSFORM_UPPERCASE ,
23
- TYPOGRAPHY ,
24
13
} from '@opentrons/components'
25
14
import {
26
15
getDeckDefFromRobotType ,
27
16
getLoadedLabwareDefinitionsByUri ,
28
- getModuleType ,
29
- GRIPPER_WASTE_CHUTE_ADDRESSABLE_AREA ,
30
- OT2_ROBOT_TYPE ,
31
- TC_MODULE_LOCATION_OT2 ,
32
- TC_MODULE_LOCATION_OT3 ,
33
- THERMOCYCLER_MODULE_TYPE ,
34
17
} from '@opentrons/shared-data'
35
18
36
- import { Divider } from '/app/atoms/structure '
19
+ import { InterventionInfo } from '/app/molecules/InterventionModal/InterventionContent '
37
20
import { useNotifyDeckConfigurationQuery } from '/app/resources/deck_configuration'
38
21
39
22
import {
40
23
getLabwareNameFromRunData ,
41
- getModuleModelFromRunData ,
42
24
getRunLabwareRenderInfo ,
43
25
getRunModuleRenderInfo ,
44
26
} from './utils'
45
27
46
28
import type { RunData } from '@opentrons/api-client'
47
29
import type {
48
30
CompletedProtocolAnalysis ,
49
- LabwareDefinitionsByUri ,
50
- LabwareLocation ,
51
31
MoveLabwareRunTimeCommand ,
52
32
RobotType ,
53
33
} from '@opentrons/shared-data'
54
34
55
- const LABWARE_DESCRIPTION_STYLE = css `
56
- flex-direction : ${ DIRECTION_COLUMN } ;
57
- grid-gap : ${ SPACING . spacing8 } ;
58
- padding : ${ SPACING . spacing16 } ;
59
- background-color : ${ COLORS . grey20 } ;
60
- border-radius : ${ BORDERS . borderRadius4 } ;
61
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
62
- background-color : ${ COLORS . grey35 } ;
63
- border-radius : ${ BORDERS . borderRadius8 } ;
64
- }
65
- `
66
-
67
- const LABWARE_NAME_TITLE_STYLE = css `
68
- font-weight : ${ TYPOGRAPHY . fontWeightSemiBold } ;
69
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
70
- display : ${ DISPLAY_NONE } ;
71
- }
72
- `
73
-
74
- const LABWARE_NAME_STYLE = css `
75
- color : ${ COLORS . grey60 } ;
76
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
77
- ${ TYPOGRAPHY . bodyTextBold }
78
- color : ${ COLORS . black90 } ;
79
- }
80
- `
81
-
82
- const DIVIDER_STYLE = css `
83
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
84
- display : ${ DISPLAY_NONE } ;
85
- }
86
- `
87
-
88
- const LABWARE_DIRECTION_STYLE = css `
89
- align-items : ${ ALIGN_CENTER } ;
90
- grid-gap : ${ SPACING . spacing4 } ;
91
- text-transform : ${ TEXT_TRANSFORM_UPPERCASE } ;
92
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
93
- grid-gap : ${ SPACING . spacing8 } ;
94
- }
95
- `
96
-
97
- const ICON_STYLE = css `
98
- height : 1.5rem ;
99
- @media ${ RESPONSIVENESS . touchscreenMediaQuerySpecs } {
100
- height : 2.5rem ;
101
- }
102
- `
103
-
104
35
export interface MoveLabwareInterventionProps {
105
36
command : MoveLabwareRunTimeCommand
106
37
analysis : CompletedProtocolAnalysis | null
@@ -116,7 +47,7 @@ export function MoveLabwareInterventionContent({
116
47
robotType,
117
48
isOnDevice,
118
49
} : MoveLabwareInterventionProps ) : JSX . Element | null {
119
- const { t } = useTranslation ( [ 'protocol_setup' , ' protocol_command_text'] )
50
+ const { i18n , t } = useTranslation ( ' protocol_command_text')
120
51
121
52
const analysisCommands = analysis ?. commands ?? [ ]
122
53
const labwareDefsByUri = getLoadedLabwareDefinitionsByUri ( analysisCommands )
@@ -162,6 +93,24 @@ export function MoveLabwareInterventionContent({
162
93
? labwareDefsByUri ?. [ movedLabwareDefUri ] ?? null
163
94
: null
164
95
if ( oldLabwareLocation == null || movedLabwareDef == null ) return null
96
+ const oldDisplayLabwareLocation = getLabwareDisplayLocation ( {
97
+ location : oldLabwareLocation ,
98
+ loadedModules : run . modules ,
99
+ loadedLabwares : run . labware ,
100
+ robotType : 'OT-3 Standard' ,
101
+ detailLevel : 'slot-only' ,
102
+ includeSlotText : false ,
103
+ t,
104
+ } )
105
+ const newDisplayLabwareLocation = getLabwareDisplayLocation ( {
106
+ location : command . params . newLocation ,
107
+ loadedModules : run . modules ,
108
+ loadedLabwares : run . labware ,
109
+ robotType : 'OT-3 Standard' ,
110
+ detailLevel : 'slot-only' ,
111
+ includeSlotText : false ,
112
+ t,
113
+ } )
165
114
return (
166
115
< Flex
167
116
flexDirection = { DIRECTION_COLUMN }
@@ -174,41 +123,17 @@ export function MoveLabwareInterventionContent({
174
123
gridGap = { SPACING . spacing12 }
175
124
width = "50%"
176
125
>
177
- < Flex css = { LABWARE_DESCRIPTION_STYLE } >
178
- < Flex flexDirection = { DIRECTION_COLUMN } >
179
- < LegacyStyledText as = "h2" css = { LABWARE_NAME_TITLE_STYLE } >
180
- { t ( 'labware_name' ) }
181
- </ LegacyStyledText >
182
- < LegacyStyledText as = "p" css = { LABWARE_NAME_STYLE } >
183
- { labwareName }
184
- </ LegacyStyledText >
185
- </ Flex >
186
- < Divider css = { DIVIDER_STYLE } />
187
- < Flex css = { LABWARE_DIRECTION_STYLE } >
188
- < DeckInfoLabel
189
- deckLabel = { getLabwareDisplayLocation ( {
190
- location : oldLabwareLocation ,
191
- loadedModules : run . modules ,
192
- loadedLabwares : run . labware ,
193
- robotType : 'OT-3 Standard' ,
194
- detailLevel : 'slot-only' ,
195
- t,
196
- } ) }
197
- />
198
-
199
- < Icon name = "arrow-right" css = { ICON_STYLE } />
200
- < DeckInfoLabel
201
- deckLabel = { getLabwareDisplayLocation ( {
202
- location : command . params . newLocation ,
203
- loadedModules : run . modules ,
204
- loadedLabwares : run . labware ,
205
- robotType : 'OT-3 Standard' ,
206
- detailLevel : 'slot-only' ,
207
- t,
208
- } ) }
209
- />
210
- </ Flex >
211
- </ Flex >
126
+ < InterventionInfo
127
+ layout = "default"
128
+ type = "location-arrow-location"
129
+ labwareName = { labwareName }
130
+ currentLocationProps = { {
131
+ deckLabel : oldDisplayLabwareLocation ,
132
+ } }
133
+ newLocationProps = { {
134
+ deckLabel : newDisplayLabwareLocation ,
135
+ } }
136
+ />
212
137
</ Flex >
213
138
< Flex width = "50%" >
214
139
< Box margin = "0 auto" width = "100%" >
@@ -247,92 +172,3 @@ export function MoveLabwareInterventionContent({
247
172
</ Flex >
248
173
)
249
174
}
250
-
251
- interface LabwareDisplayLocationProps {
252
- protocolData : RunData
253
- location : LabwareLocation
254
- robotType : RobotType
255
- labwareDefsByUri : LabwareDefinitionsByUri
256
- }
257
- function LabwareDisplayLocation (
258
- props : LabwareDisplayLocationProps
259
- ) : JSX . Element {
260
- const { t } = useTranslation ( 'protocol_command_text' )
261
- const { protocolData, location, robotType } = props
262
- let displayLocation : string = ''
263
- if ( location === 'offDeck' || location === 'systemLocation' ) {
264
- // 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)
265
- displayLocation = String ( t ( 'offdeck' ) )
266
- } else if ( 'slotName' in location ) {
267
- displayLocation = location . slotName
268
- } else if ( 'addressableAreaName' in location ) {
269
- const aaLocation = location . addressableAreaName
270
- displayLocation =
271
- aaLocation === GRIPPER_WASTE_CHUTE_ADDRESSABLE_AREA
272
- ? t ( 'waste_chute' )
273
- : aaLocation
274
- } else if ( 'moduleId' in location ) {
275
- const moduleModel = getModuleModelFromRunData (
276
- protocolData ,
277
- location . moduleId
278
- )
279
- if ( moduleModel == null ) {
280
- console . warn ( 'labware is located on an unknown module model' )
281
- } else {
282
- const slotName =
283
- getLoadedModule ( protocolData . modules , location . moduleId ) ?. location
284
- ?. slotName ?? ''
285
- const isModuleUnderAdapterThermocycler =
286
- getModuleType ( moduleModel ) === THERMOCYCLER_MODULE_TYPE
287
- if ( isModuleUnderAdapterThermocycler ) {
288
- displayLocation =
289
- robotType === OT2_ROBOT_TYPE
290
- ? TC_MODULE_LOCATION_OT2
291
- : TC_MODULE_LOCATION_OT3
292
- } else {
293
- displayLocation = slotName
294
- }
295
- }
296
- } else if ( 'labwareId' in location ) {
297
- const adapter = protocolData . labware . find (
298
- lw => lw . id === location . labwareId
299
- )
300
- if ( adapter == null ) {
301
- console . warn ( 'labware is located on an unknown adapter' )
302
- } else if (
303
- adapter . location === 'offDeck' ||
304
- adapter . location === 'systemLocation'
305
- ) {
306
- displayLocation = t ( 'off_deck' )
307
- } else if ( 'slotName' in adapter . location ) {
308
- displayLocation = adapter . location . slotName
309
- } else if ( 'addressableAreaName' in adapter . location ) {
310
- displayLocation = adapter . location . addressableAreaName
311
- } else if ( 'moduleId' in adapter . location ) {
312
- const moduleIdUnderAdapter = adapter . location . moduleId
313
- const moduleModel = protocolData . modules . find (
314
- module => module . id === moduleIdUnderAdapter
315
- ) ?. model
316
- if ( moduleModel == null ) {
317
- console . warn ( 'labware is located on an adapter on an unknown module' )
318
- } else {
319
- const slotName =
320
- getLoadedModule ( protocolData . modules , adapter . location . moduleId )
321
- ?. location ?. slotName ?? ''
322
- const isModuleUnderAdapterThermocycler =
323
- getModuleType ( moduleModel ) === THERMOCYCLER_MODULE_TYPE
324
- if ( isModuleUnderAdapterThermocycler ) {
325
- displayLocation =
326
- robotType === OT2_ROBOT_TYPE
327
- ? TC_MODULE_LOCATION_OT2
328
- : TC_MODULE_LOCATION_OT3
329
- } else {
330
- displayLocation = slotName
331
- }
332
- }
333
- } else {
334
- console . warn ( 'display location could not be established: ' , location )
335
- }
336
- }
337
- return < DeckInfoLabel deckLabel = { displayLocation } />
338
- }
0 commit comments