type(bugfix): Fixed Radio Button selection issue at Choose Workflow Screen 🐛 (#2933)

* Fixed Radio Button selection issue at Choose Workflow Screen

Signed-off-by: Sayan Mondal <sayan@chaosnative.com>

* Fixed Issues with workflow localforage state and persistence

Signed-off-by: Sayan Mondal <sayan@chaosnative.com>
This commit is contained in:
Sayan Mondal 2021-06-24 11:45:08 +05:30 committed by GitHub
parent b7db9f42cb
commit c9ac99b947
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 293 additions and 266 deletions

View File

@ -1,4 +1,11 @@
import { Paper, Step, StepLabel, Stepper, Typography } from '@material-ui/core'; import {
Paper,
Step,
StepLabel,
Stepper,
Tooltip,
Typography,
} from '@material-ui/core';
import clsx from 'clsx'; import clsx from 'clsx';
import { ButtonFilled, ButtonOutlined } from 'litmus-ui'; import { ButtonFilled, ButtonOutlined } from 'litmus-ui';
import React from 'react'; import React from 'react';
@ -77,11 +84,23 @@ const LitmusStepper: React.FC<LitmusStepperProps> = ({
{/* Stepper Actions */} {/* Stepper Actions */}
<div className={classes.stepperActions}> <div className={classes.stepperActions}>
{activeStep > 0 && ( {activeStep === 2 ? (
<Tooltip
title="All selected Workflow Data will be lost"
placement="top"
leaveDelay={300}
>
<div>
<ButtonOutlined onClick={handleBack}> <ButtonOutlined onClick={handleBack}>
<Typography>{t('workflowStepper.back')}</Typography> <Typography>{t('workflowStepper.back')}</Typography>
</ButtonOutlined> </ButtonOutlined>
)} </div>
</Tooltip>
) : activeStep > 0 ? (
<ButtonOutlined onClick={handleBack}>
<Typography>{t('workflowStepper.back')}</Typography>
</ButtonOutlined>
) : null}
{moreStepperActions} {moreStepperActions}
<div className={classes.endAction}> <div className={classes.endAction}>
{activeStep !== steps.length - 1 ? ( {activeStep !== steps.length - 1 ? (

View File

@ -1,3 +1,4 @@
import { Tooltip } from '@material-ui/core';
import Snackbar from '@material-ui/core/Snackbar'; import Snackbar from '@material-ui/core/Snackbar';
import Typography from '@material-ui/core/Typography'; import Typography from '@material-ui/core/Typography';
import MuiAlert, { AlertProps } from '@material-ui/lab/Alert'; import MuiAlert, { AlertProps } from '@material-ui/lab/Alert';
@ -145,6 +146,26 @@ const WorkflowStepper = () => {
Finish Finish
</ButtonFilled> </ButtonFilled>
) )
) : activeStep === 2 ? (
<div className={classes.headerButtonWrapper} aria-label="buttons">
<Tooltip
title="All selected Workflow Data will be lost"
placement="top"
leaveDelay={300}
>
<div>
<ButtonOutlined
className={classes.btn}
onClick={() => handleBack()}
>
Back
</ButtonOutlined>
</div>
</Tooltip>
<ButtonFilled className={classes.btn} onClick={() => handleNext()}>
Next
</ButtonFilled>
</div>
) : ( ) : (
// Apply headerButtonWrapper style for top button's div // Apply headerButtonWrapper style for top button's div
<div className={classes.headerButtonWrapper} aria-label="buttons"> <div className={classes.headerButtonWrapper} aria-label="buttons">

View File

@ -8,7 +8,7 @@ import {
} from '@material-ui/core'; } from '@material-ui/core';
import { LitmusCard, RadioButton, Search } from 'litmus-ui'; import { LitmusCard, RadioButton, Search } from 'litmus-ui';
import localforage from 'localforage'; import localforage from 'localforage';
import React, { useEffect, useState } from 'react'; import React, { useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { import {
DELETE_WORKFLOW_TEMPLATE, DELETE_WORKFLOW_TEMPLATE,
@ -18,17 +18,23 @@ import {
ListManifestTemplate, ListManifestTemplate,
ListManifestTemplateArray, ListManifestTemplateArray,
} from '../../../models/graphql/workflowListData'; } from '../../../models/graphql/workflowListData';
import { getProjectID } from '../../../utils/getSearchParams';
import * as WorkflowActions from '../../../redux/actions/workflow';
import useStyles from './styles';
import useActions from '../../../redux/actions'; import useActions from '../../../redux/actions';
import * as WorkflowActions from '../../../redux/actions/workflow';
import { getProjectID } from '../../../utils/getSearchParams';
import useStyles from './styles';
interface ChooseWorkflowRadio { interface ChooseWorkflowRadio {
selected: string; selected: string;
id: string; id: string;
} }
const ChooseWorkflowFromExisting = () => { interface ChooseWorkflowFromExistingProps {
selectedExp: (expID: string) => void;
}
const ChooseWorkflowFromExisting: React.FC<ChooseWorkflowFromExistingProps> = ({
selectedExp,
}) => {
const { t } = useTranslation(); const { t } = useTranslation();
const classes = useStyles(); const classes = useStyles();
const { palette } = useTheme(); const { palette } = useTheme();
@ -73,6 +79,7 @@ const ChooseWorkflowFromExisting = () => {
selected: 'B', selected: 'B',
id: event.target.value, id: event.target.value,
}; };
selectedExp(selection.id);
const templateData = filteredExistingWorkflows.filter((workflow) => { const templateData = filteredExistingWorkflows.filter((workflow) => {
return workflow.template_id === event.target.value; return workflow.template_id === event.target.value;
})[0]; })[0];
@ -83,17 +90,6 @@ const ChooseWorkflowFromExisting = () => {
localforage.setItem('hasSetWorkflowData', false); localforage.setItem('hasSetWorkflowData', false);
}; };
// Selects Option B -> Sub Experiment Options which was already selected by the user
useEffect(() => {
localforage
.getItem('selectedScheduleOption')
.then((value) =>
value !== null
? setSelected((value as ChooseWorkflowRadio).id)
: setSelected('')
);
}, []);
return ( return (
<AccordionDetails> <AccordionDetails>
{/* Wrapping content inside the Accordion to take full width */} {/* Wrapping content inside the Accordion to take full width */}

View File

@ -25,7 +25,12 @@ interface ChooseWorkflowRadio {
id: string; id: string;
} }
const ChoosePreDefinedExperiments = () => { interface ChoosePreDefinedExperimentsProps {
selectedExp: (expID: string) => void;
}
const ChoosePreDefinedExperiments: React.FC<ChoosePreDefinedExperimentsProps> =
({ selectedExp }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const classes = useStyles(); const classes = useStyles();
const { palette } = useTheme(); const { palette } = useTheme();
@ -69,6 +74,7 @@ const ChoosePreDefinedExperiments = () => {
selected: 'A', selected: 'A',
id: event.target.value, id: event.target.value,
}; };
selectedExp(selection.id);
localforage.setItem('selectedScheduleOption', selection); localforage.setItem('selectedScheduleOption', selection);
localforage.setItem('hasSetWorkflowData', false); localforage.setItem('hasSetWorkflowData', false);
}; };
@ -98,17 +104,6 @@ const ChoosePreDefinedExperiments = () => {
localforage.setItem('selectedHub', event.target.value as string); localforage.setItem('selectedHub', event.target.value as string);
}; };
// Selects Option A -> Sub Experiment Options which was already selected by the user
useEffect(() => {
localforage
.getItem('selectedScheduleOption')
.then((value) =>
value !== null
? setSelected((value as ChooseWorkflowRadio).id)
: setSelected('')
);
}, []);
/** /**
* UseEffect to check if Chaos Hub exists and if exists * UseEffect to check if Chaos Hub exists and if exists
* fetch the pre-defined workflows * fetch the pre-defined workflows

View File

@ -14,7 +14,6 @@ import React, {
} from 'react'; } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import { ChooseWorkflowRadio } from '../../../models/localforage/radioButton';
import useActions from '../../../redux/actions'; import useActions from '../../../redux/actions';
import * as AlertActions from '../../../redux/actions/alert'; import * as AlertActions from '../../../redux/actions/alert';
import * as WorkflowActions from '../../../redux/actions/workflow'; import * as WorkflowActions from '../../../redux/actions/workflow';
@ -30,6 +29,7 @@ const ChooseWorkflow = forwardRef((_, ref) => {
const { t } = useTranslation(); const { t } = useTranslation();
const alert = useActions(AlertActions); const alert = useActions(AlertActions);
const [selected, setSelected] = useState<string>(''); const [selected, setSelected] = useState<string>('');
const [id, setSelectedID] = useState<string | undefined>(undefined);
const workflowDetails = useSelector( const workflowDetails = useSelector(
(state: RootState) => state.workflowManifest.manifest (state: RootState) => state.workflowManifest.manifest
); );
@ -50,11 +50,21 @@ const ChooseWorkflow = forwardRef((_, ref) => {
} }
}; };
useEffect(() => {
workflowAction.setWorkflowManifest({ manifest: '' });
}, []);
function onNext() { function onNext() {
if (selected === '') { if (selected === '') {
alert.changeAlertState(true); // No Workflow Type has been selected and user clicked on Next alert.changeAlertState(true); // No Workflow Type has been selected and user clicked on Next
return false; return false;
} }
if (selected === 'A' || selected === 'B') {
if (id === undefined) {
alert.changeAlertState(true);
return false;
}
}
if (selected === 'D' && workflowDetails === '') { if (selected === 'D' && workflowDetails === '') {
alert.changeAlertState(true); alert.changeAlertState(true);
return false; return false;
@ -63,20 +73,9 @@ const ChooseWorkflow = forwardRef((_, ref) => {
return true; return true;
} }
useEffect(() => { const pickedExperiment = (subExpNumber: string) => {
localforage.getItem('selectedScheduleOption').then((value) => { setSelectedID(subExpNumber);
if (value) { };
setSelected((value as ChooseWorkflowRadio).selected);
} else setSelected('');
});
workflowAction.setWorkflowManifest({
manifest: '',
});
/**
* Removes the workflow details if already present
*/
localforage.removeItem('workflow');
}, []);
useImperativeHandle(ref, () => ({ useImperativeHandle(ref, () => ({
onNext, onNext,
@ -120,7 +119,7 @@ const ChooseWorkflow = forwardRef((_, ref) => {
</span> </span>
</RadioButton> </RadioButton>
</AccordionSummary> </AccordionSummary>
<ChoosePreDefinedExperiments /> <ChoosePreDefinedExperiments selectedExp={pickedExperiment} />
</Accordion> </Accordion>
<Accordion <Accordion
@ -141,7 +140,7 @@ const ChooseWorkflow = forwardRef((_, ref) => {
</span> </span>
</RadioButton> </RadioButton>
</AccordionSummary> </AccordionSummary>
<ChooseWorkflowFromExisting /> <ChooseWorkflowFromExisting selectedExp={pickedExperiment} />
</Accordion> </Accordion>
<Accordion <Accordion

View File

@ -272,13 +272,13 @@ const TuneWorkflow = forwardRef((_, ref) => {
* Index DB Fetching for extracting selected Button and Workflow Details * Index DB Fetching for extracting selected Button and Workflow Details
*/ */
const getSelectedWorkflowDetails = () => { const getSelectedWorkflowDetails = () => {
localforage.getItem('workflow').then((workflow) => localforage.getItem('workflow').then((workflow) => {
setWorkflow({ setWorkflow({
name: (workflow as WorkflowDetailsProps).name, name: (workflow as WorkflowDetailsProps).name,
crd: (workflow as WorkflowDetailsProps).CRDLink, crd: (workflow as WorkflowDetailsProps).CRDLink,
description: (workflow as WorkflowDetailsProps).description, description: (workflow as WorkflowDetailsProps).description,
}) });
); });
localforage.getItem('selectedScheduleOption').then((value) => { localforage.getItem('selectedScheduleOption').then((value) => {
/** /**
* Setting default data when MyHub is selected * Setting default data when MyHub is selected
@ -331,7 +331,7 @@ const TuneWorkflow = forwardRef((_, ref) => {
useEffect(() => { useEffect(() => {
getSelectedWorkflowDetails(); getSelectedWorkflowDetails();
}, []); }, [manifest]);
/** /**
* Graphql Query for fetching Engine YAML * Graphql Query for fetching Engine YAML

View File

@ -241,11 +241,7 @@ const VerifyCommit = forwardRef(
isLoading(loading); isLoading(loading);
const handleMutation = () => { const handleMutation = () => {
if ( if (workflow.name.length !== 0 && weights.length !== 0) {
workflow.name.length !== 0 &&
workflow.description.length !== 0 &&
weights.length !== 0
) {
const weightData: WeightMap[] = []; const weightData: WeightMap[] = [];
weights.forEach((data) => { weights.forEach((data) => {

View File

@ -130,6 +130,7 @@ const WorkflowSettings = forwardRef((_, ref) => {
}, },
}); });
}); });
workflowAction.setWorkflowManifest({ manifest: '' });
} }
if ((value as ChooseWorkflowRadio).selected === 'B') { if ((value as ChooseWorkflowRadio).selected === 'B') {
getSavedTemplateDetails({ getSavedTemplateDetails({