Skip to content

Commit 0110e17

Browse files
authored
fix(protocol-designer): form warnings always show in form (#16846)
clsoes RQA-3598
1 parent 112ea83 commit 0110e17

File tree

7 files changed

+29
-47
lines changed

7 files changed

+29
-47
lines changed

protocol-designer/src/organisms/Alerts/FormAlerts.tsx

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import type { ProfileFormError } from '../../steplist/formLevel/profileErrors'
2929
import type { MakeAlert } from './types'
3030

3131
interface FormAlertsProps {
32-
showFormErrorsAndWarnings: boolean
32+
showFormErrors: boolean
3333
focusedField?: StepFieldName | null
3434
dirtyFields?: StepFieldName[]
3535
page: number
@@ -41,7 +41,7 @@ interface WarningType {
4141
}
4242

4343
function FormAlertsComponent(props: FormAlertsProps): JSX.Element | null {
44-
const { showFormErrorsAndWarnings, focusedField, dirtyFields, page } = props
44+
const { showFormErrors, focusedField, dirtyFields, page } = props
4545

4646
const { t } = useTranslation('alert')
4747
const dispatch = useDispatch()
@@ -78,7 +78,7 @@ function FormAlertsComponent(props: FormAlertsProps): JSX.Element | null {
7878
dirtyFields: dirtyFields ?? [],
7979
errors: formLevelErrorsForUnsavedForm,
8080
page,
81-
showErrors: showFormErrorsAndWarnings,
81+
showErrors: showFormErrors,
8282
})
8383

8484
const profileItemsById: Record<string, ProfileItem> | null | undefined =
@@ -180,28 +180,19 @@ function FormAlertsComponent(props: FormAlertsProps): JSX.Element | null {
180180
}
181181
}
182182

183-
if (showFormErrorsAndWarnings) {
184-
return [...formErrors, ...formWarnings].length > 0 ? (
185-
<Flex
186-
flexDirection={DIRECTION_COLUMN}
187-
gridGap={SPACING.spacing4}
188-
padding={`${SPACING.spacing16} ${SPACING.spacing16} 0`}
189-
>
190-
{formErrors.map((error, key) => makeAlert('error', error, key))}
191-
{formWarnings.map((warning, key) => makeAlert('warning', warning, key))}
192-
</Flex>
193-
) : null
194-
}
195-
196-
return timelineWarnings.length > 0 ? (
183+
return [...formErrors, ...timelineWarnings, ...formWarnings].length > 0 ? (
197184
<Flex
198185
flexDirection={DIRECTION_COLUMN}
199186
gridGap={SPACING.spacing4}
200187
padding={`${SPACING.spacing16} ${SPACING.spacing16} 0`}
201188
>
189+
{showFormErrors
190+
? formErrors.map((error, key) => makeAlert('error', error, key))
191+
: null}
202192
{timelineWarnings.map((warning, key) =>
203193
makeAlert('warning', warning, key)
204194
)}
195+
{formWarnings.map((warning, key) => makeAlert('warning', warning, key))}
205196
</Flex>
206197
) : null
207198
}

protocol-designer/src/organisms/Alerts/__tests__/FormAlerts.test.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ describe('FormAlerts', () => {
3737
props = {
3838
focusedField: null,
3939
dirtyFields: [],
40-
showFormErrorsAndWarnings: false,
40+
showFormErrors: false,
4141
page: 0,
4242
}
4343
vi.mocked(getFormLevelErrorsForUnsavedForm).mockReturnValue([])
@@ -64,7 +64,6 @@ describe('FormAlerts', () => {
6464
expect(vi.mocked(dismissTimelineWarning)).toHaveBeenCalled()
6565
})
6666
it('renders a form level warning that is dismissible', () => {
67-
props.showFormErrorsAndWarnings = true
6867
vi.mocked(getFormWarningsForSelectedStep).mockReturnValue([
6968
{
7069
type: 'TIP_POSITIONED_LOW_IN_TUBE',

protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepFormToolbox.tsx

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,7 @@ export function StepFormToolbox(props: StepFormToolboxProps): JSX.Element {
122122
}))
123123
const timeline = useSelector(getRobotStateTimeline)
124124
const [toolboxStep, setToolboxStep] = useState<number>(0)
125-
const [
126-
showFormErrorsAndWarnings,
127-
setShowFormErrorsAndWarnings,
128-
] = useState<boolean>(false)
125+
const [showFormErrors, setShowFormErrors] = useState<boolean>(false)
129126
const [tab, setTab] = useState<LiquidHandlingTab>('aspirate')
130127
const visibleFormWarnings = getVisibleFormWarnings({
131128
focusedField,
@@ -140,7 +137,7 @@ export function StepFormToolbox(props: StepFormToolboxProps): JSX.Element {
140137
...dynamicFormLevelErrorsForUnsavedForm,
141138
],
142139
page: toolboxStep,
143-
showErrors: showFormErrorsAndWarnings,
140+
showErrors: showFormErrors,
144141
})
145142
const [isRename, setIsRename] = useState<boolean>(false)
146143
const icon = stepIconsByType[formData.stepType]
@@ -187,7 +184,6 @@ export function StepFormToolbox(props: StepFormToolboxProps): JSX.Element {
187184
})
188185
}
189186
}
190-
191187
const handleSaveClick = (): void => {
192188
if (canSave) {
193189
const duration = new Date().getTime() - analyticsStartTime.getTime()
@@ -212,7 +208,7 @@ export function StepFormToolbox(props: StepFormToolboxProps): JSX.Element {
212208
)
213209
dispatch(analyticsEvent(stepDuration))
214210
} else {
215-
setShowFormErrorsAndWarnings(true)
211+
setShowFormErrors(true)
216212
if (tab === 'aspirate' && isDispenseError && !isAspirateError) {
217213
setTab('dispense')
218214
}
@@ -227,9 +223,9 @@ export function StepFormToolbox(props: StepFormToolboxProps): JSX.Element {
227223
if (isMultiStepToolbox && toolboxStep === 0) {
228224
if (!isErrorOnCurrentPage) {
229225
setToolboxStep(1)
230-
setShowFormErrorsAndWarnings(false)
226+
setShowFormErrors(false)
231227
} else {
232-
setShowFormErrorsAndWarnings(true)
228+
setShowFormErrors(true)
233229
handleScrollToTop()
234230
}
235231
} else {
@@ -279,7 +275,7 @@ export function StepFormToolbox(props: StepFormToolboxProps): JSX.Element {
279275
width="100%"
280276
onClick={() => {
281277
setToolboxStep(0)
282-
setShowFormErrorsAndWarnings(false)
278+
setShowFormErrors(false)
283279
}}
284280
>
285281
{i18n.format(t('shared:back'), 'capitalize')}
@@ -308,7 +304,7 @@ export function StepFormToolbox(props: StepFormToolboxProps): JSX.Element {
308304
<FormAlerts
309305
focusedField={focusedField}
310306
dirtyFields={dirtyFields}
311-
showFormErrorsAndWarnings={showFormErrorsAndWarnings}
307+
showFormErrors={showFormErrors}
312308
page={toolboxStep}
313309
/>
314310
<ToolsComponent
@@ -318,9 +314,9 @@ export function StepFormToolbox(props: StepFormToolboxProps): JSX.Element {
318314
focusHandlers,
319315
toolboxStep,
320316
visibleFormErrors,
321-
showFormErrors: showFormErrorsAndWarnings,
317+
showFormErrors,
322318
focusedField,
323-
setShowFormErrorsAndWarnings,
319+
setShowFormErrors,
324320
tab,
325321
setTab,
326322
}}

protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export function MoveLiquidTools(props: StepFormProps): JSX.Element {
5656
propsForFields,
5757
formData,
5858
visibleFormErrors,
59-
setShowFormErrorsAndWarnings,
59+
setShowFormErrors,
6060
tab,
6161
setTab,
6262
} = props
@@ -101,7 +101,7 @@ export function MoveLiquidTools(props: StepFormProps): JSX.Element {
101101
isActive: tab === 'aspirate',
102102
onClick: () => {
103103
setTab('aspirate')
104-
setShowFormErrorsAndWarnings?.(false)
104+
setShowFormErrors?.(false)
105105
},
106106
}
107107
const dispenseTab = {
@@ -110,7 +110,7 @@ export function MoveLiquidTools(props: StepFormProps): JSX.Element {
110110
isActive: tab === 'dispense',
111111
onClick: () => {
112112
setTab('dispense')
113-
setShowFormErrorsAndWarnings?.(false)
113+
setShowFormErrors?.(false)
114114
},
115115
}
116116
const hideWellOrderField =

protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/PauseTools/index.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,7 @@ import type { ChangeEvent } from 'react'
3434
import type { StepFormProps } from '../../types'
3535

3636
export function PauseTools(props: StepFormProps): JSX.Element {
37-
const {
38-
propsForFields,
39-
visibleFormErrors,
40-
setShowFormErrorsAndWarnings,
41-
} = props
37+
const { propsForFields, visibleFormErrors, setShowFormErrors } = props
4238

4339
const tempModuleLabwareOptions = useSelector(
4440
uiModuleSelectors.getTemperatureLabwareOptions
@@ -101,7 +97,7 @@ export function PauseTools(props: StepFormProps): JSX.Element {
10197
<RadioButton
10298
onChange={(e: ChangeEvent<any>) => {
10399
propsForFields.pauseAction.updateValue(e.currentTarget.value)
104-
setShowFormErrorsAndWarnings?.(false)
100+
setShowFormErrors?.(false)
105101
}}
106102
buttonLabel={t(
107103
'form:step_edit_form.field.pauseAction.options.untilResume'
@@ -113,7 +109,7 @@ export function PauseTools(props: StepFormProps): JSX.Element {
113109
<RadioButton
114110
onChange={(e: ChangeEvent<any>) => {
115111
propsForFields.pauseAction.updateValue(e.currentTarget.value)
116-
setShowFormErrorsAndWarnings?.(false)
112+
setShowFormErrors?.(false)
117113
}}
118114
buttonLabel={t(
119115
'form:step_edit_form.field.pauseAction.options.untilTime'
@@ -125,7 +121,7 @@ export function PauseTools(props: StepFormProps): JSX.Element {
125121
<RadioButton
126122
onChange={(e: ChangeEvent<any>) => {
127123
propsForFields.pauseAction.updateValue(e.currentTarget.value)
128-
setShowFormErrorsAndWarnings?.(false)
124+
setShowFormErrors?.(false)
129125
}}
130126
buttonLabel={t(
131127
'form:step_edit_form.field.pauseAction.options.untilTemperature'

protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/ThermocyclerTools/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export function ThermocyclerTools(props: StepFormProps): JSX.Element {
2525
showFormErrors = true,
2626
visibleFormErrors,
2727
focusedField,
28-
setShowFormErrorsAndWarnings,
28+
setShowFormErrors,
2929
} = props
3030
const { t } = useTranslation('form')
3131

@@ -49,7 +49,7 @@ export function ThermocyclerTools(props: StepFormProps): JSX.Element {
4949
onChange={() => {
5050
setContentType('thermocyclerState')
5151
propsForFields.thermocyclerFormType.updateValue('thermocyclerState')
52-
setShowFormErrorsAndWarnings?.(false)
52+
setShowFormErrors?.(false)
5353
}}
5454
isSelected={contentType === 'thermocyclerState'}
5555
/>
@@ -64,7 +64,7 @@ export function ThermocyclerTools(props: StepFormProps): JSX.Element {
6464
propsForFields.thermocyclerFormType.updateValue(
6565
'thermocyclerProfile'
6666
)
67-
setShowFormErrorsAndWarnings?.(false)
67+
setShowFormErrors?.(false)
6868
}}
6969
isSelected={contentType === 'thermocyclerProfile'}
7070
/>

protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export interface StepFormProps {
3030
visibleFormErrors: StepFormErrors
3131
showFormErrors: boolean
3232
focusedField?: string | null
33-
setShowFormErrorsAndWarnings?: React.Dispatch<React.SetStateAction<boolean>>
33+
setShowFormErrors?: React.Dispatch<React.SetStateAction<boolean>>
3434
tab: LiquidHandlingTab
3535
setTab: React.Dispatch<React.SetStateAction<LiquidHandlingTab>>
3636
}

0 commit comments

Comments
 (0)