diff --git a/litmus-portal/frontend/src/views/ChaosWorkflows/BrowseWorkflow/index.tsx b/litmus-portal/frontend/src/views/ChaosWorkflows/BrowseWorkflow/index.tsx
index d7411239f..48115c3fe 100644
--- a/litmus-portal/frontend/src/views/ChaosWorkflows/BrowseWorkflow/index.tsx
+++ b/litmus-portal/frontend/src/views/ChaosWorkflows/BrowseWorkflow/index.tsx
@@ -110,23 +110,23 @@ const BrowseWorkflow: React.FC = () => {
);
// Query to get workflows
- const { subscribeToMore, data, error } = useQuery
(
- WORKFLOW_DETAILS,
- {
- variables: {
- workflowRunsInput: {
- project_id: projectID,
- pagination: {
- page: paginationData.page,
- limit: paginationData.limit,
- },
- sort: sortData,
- filter: filters,
+ const { subscribeToMore, data, error, refetch } = useQuery<
+ Workflow,
+ WorkflowDataVars
+ >(WORKFLOW_DETAILS, {
+ variables: {
+ workflowRunsInput: {
+ project_id: projectID,
+ pagination: {
+ page: paginationData.page,
+ limit: paginationData.limit,
},
+ sort: sortData,
+ filter: filters,
},
- fetchPolicy: 'cache-and-network',
- }
- );
+ },
+ fetchPolicy: 'cache-and-network',
+ });
// Using subscription to get realtime data
useEffect(() => {
@@ -272,6 +272,7 @@ const BrowseWorkflow: React.FC = () => {
+
{/* Status */}
{t('chaosWorkflows.browseWorkflows.status')}
@@ -387,7 +388,7 @@ const BrowseWorkflow: React.FC = () => {
data-cy="WorkflowRunsTableRow"
key={dataRow.workflow_run_id}
>
-
+
))
) : (
diff --git a/litmus-portal/frontend/src/views/ChaosWorkflows/BrowseWorkflow/styles.ts b/litmus-portal/frontend/src/views/ChaosWorkflows/BrowseWorkflow/styles.ts
index 7cb721666..b1c1cf5ca 100644
--- a/litmus-portal/frontend/src/views/ChaosWorkflows/BrowseWorkflow/styles.ts
+++ b/litmus-portal/frontend/src/views/ChaosWorkflows/BrowseWorkflow/styles.ts
@@ -83,7 +83,7 @@ const useStyles = makeStyles((theme) => ({
},
},
headerStatus: {
- paddingLeft: theme.spacing(10),
+ paddingLeft: theme.spacing(4),
},
workflowName: {
@@ -94,9 +94,6 @@ const useStyles = makeStyles((theme) => ({
paddingLeft: theme.spacing(5),
},
- tableDataStatus: {
- paddingLeft: theme.spacing(8.5),
- },
sortDiv: {
display: 'flex',
flexDirection: 'column',
@@ -181,6 +178,53 @@ const useStyles = makeStyles((theme) => ({
pointer: 'cursor',
},
},
+ runningSmallIcon: {
+ animation: 'runningNodeSpinAnimationSmall 2s ease-in-out infinite',
+ },
+ '@global': {
+ '@keyframes runningNodeSpinAnimationSmall': {
+ from: {
+ transform: `rotate(0deg)`,
+ },
+ to: {
+ transform: `rotate(360deg)`,
+ },
+ },
+ },
+ popoverWarning: {
+ padding: theme.spacing(3.125, 2.6),
+ width: 'fit-content',
+ },
+ runningText: {
+ color: theme.palette.text.hint,
+ marginLeft: theme.spacing(1),
+ },
+
+ // Warning pop-over styles
+ warningTableCell: {
+ maxWidth: '2.5rem',
+ },
+ imageRunning: {
+ display: 'flex',
+ marginTop: theme.spacing(1),
+ },
+ warningBtnDiv: {
+ marginTop: theme.spacing(5),
+ marginLeft: theme.spacing(2.5),
+ },
+ syncBtn: {
+ backgroundColor: 'transparent !important',
+ color: theme.palette.primary.main,
+ marginRight: theme.spacing(1.25),
+ },
+ waitingBtnText: {
+ fontSize: '0.75rem',
+ marginLeft: theme.spacing(0.625),
+ },
+ terminateText: {
+ backgroundColor: 'transparent !important',
+ color: theme.palette.primary.main,
+ },
}));
export default useStyles;
diff --git a/litmus-portal/frontend/src/views/ChaosWorkflows/CustomStatus/Status.tsx b/litmus-portal/frontend/src/views/ChaosWorkflows/CustomStatus/Status.tsx
index 68be52720..f07a1aeba 100644
--- a/litmus-portal/frontend/src/views/ChaosWorkflows/CustomStatus/Status.tsx
+++ b/litmus-portal/frontend/src/views/ChaosWorkflows/CustomStatus/Status.tsx
@@ -19,6 +19,9 @@ const CustomStatus: React.FC = ({ status }) => {
if (status === 'Running' || status === 'Pending') {
return setLabel(`${classes.status} ${classes.running}`);
}
+ if (status === 'NotAvailable') {
+ return setLabel(`${classes.naStatus} ${classes.notAvailable}`);
+ }
return setLabel(`${classes.status} ${classes.failed}`);
}, [status]);
diff --git a/litmus-portal/frontend/src/views/ChaosWorkflows/CustomStatus/styles.ts b/litmus-portal/frontend/src/views/ChaosWorkflows/CustomStatus/styles.ts
index 0c51bca81..b40b5bcf4 100644
--- a/litmus-portal/frontend/src/views/ChaosWorkflows/CustomStatus/styles.ts
+++ b/litmus-portal/frontend/src/views/ChaosWorkflows/CustomStatus/styles.ts
@@ -8,6 +8,17 @@ const useStyles = makeStyles((theme) => ({
paddingTop: theme.spacing(0.375),
paddingBottom: theme.spacing(0.375),
},
+ naStatus: {
+ width: '4.8rem',
+ textAlign: 'center',
+ borderRadius: 3,
+ paddingTop: theme.spacing(0.375),
+ paddingBottom: theme.spacing(0.375),
+ },
+ notAvailable: {
+ color: theme.palette.text.secondary,
+ backgroundColor: theme.palette.status.pending,
+ },
completed: {
color: theme.palette.success.main,
backgroundColor: theme.palette.success.light,
@@ -17,8 +28,8 @@ const useStyles = makeStyles((theme) => ({
backgroundColor: theme.palette.warning.light,
},
failed: {
- color: theme.palette.status.failed,
- backgroundColor: theme.palette.status.failed,
+ color: theme.palette.error.main,
+ backgroundColor: theme.palette.error.light,
},
statusFont: {
fontSize: '0.725rem',
diff --git a/litmus-portal/frontend/src/views/CreateWorkflow/ChooseWorkflow/styles.ts b/litmus-portal/frontend/src/views/CreateWorkflow/ChooseWorkflow/styles.ts
index d31d3cbe3..88527c74a 100644
--- a/litmus-portal/frontend/src/views/CreateWorkflow/ChooseWorkflow/styles.ts
+++ b/litmus-portal/frontend/src/views/CreateWorkflow/ChooseWorkflow/styles.ts
@@ -257,6 +257,18 @@ const useStyles = makeStyles((theme: Theme) => ({
noTemplatesDesc: {
fontSize: '1rem',
},
+
+ errorText: {
+ marginLeft: theme.spacing(1.25),
+ },
+ errorBtn: {
+ backgroundColor: 'transparent !important',
+ color: theme.palette.primary.main,
+ marginLeft: theme.spacing(2.5),
+ },
+ retryText: {
+ marginLeft: theme.spacing(1.25),
+ },
}));
export default useStyles;
diff --git a/litmus-portal/frontend/src/views/CreateWorkflow/ChooseWorkflow/uploadYAML.tsx b/litmus-portal/frontend/src/views/CreateWorkflow/ChooseWorkflow/uploadYAML.tsx
index 6d0565e6c..6e4557a6a 100644
--- a/litmus-portal/frontend/src/views/CreateWorkflow/ChooseWorkflow/uploadYAML.tsx
+++ b/litmus-portal/frontend/src/views/CreateWorkflow/ChooseWorkflow/uploadYAML.tsx
@@ -1,4 +1,5 @@
import { AccordionDetails, Button, Paper, Typography } from '@material-ui/core';
+import { ButtonFilled } from 'litmus-ui';
import localforage from 'localforage';
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
@@ -19,6 +20,7 @@ const UploadYAML = () => {
const { t } = useTranslation();
const [uploadedYAML, setUploadedYAML] = useState('');
const [fileName, setFileName] = useState('');
+ const [uploadError, setUploadError] = useState(false);
const workflowAction = useActions(WorkflowActions);
const { namespace } = useSelector((state: RootState) => state.workflowData);
@@ -42,11 +44,19 @@ const UploadYAML = () => {
const readFile = await file.text();
setUploadedYAML(readFile);
setFileName(file.name);
- const wfmanifest = updateEngineName(YAML.parse(readFile));
- const updatedManifest = updateNamespace(wfmanifest, namespace);
- workflowAction.setWorkflowManifest({
- manifest: YAML.stringify(updatedManifest),
- });
+ try {
+ setUploadError(false);
+ const wfmanifest = updateEngineName(YAML.parse(readFile));
+ const updatedManifest = updateNamespace(wfmanifest, namespace);
+ workflowAction.setWorkflowManifest({
+ manifest: YAML.stringify(updatedManifest),
+ });
+ } catch {
+ setUploadError(true);
+ workflowAction.setWorkflowManifest({
+ manifest: '',
+ });
+ }
});
saveToLocalForage();
};
@@ -61,15 +71,19 @@ const UploadYAML = () => {
if ((extension === 'yaml' || extension === 'yml') && readFile) {
readFile.text().then((response) => {
setUploadedYAML(response);
- const wfmanifest = updateEngineName(YAML.parse(response));
- const updatedManifest = updateNamespace(wfmanifest, namespace);
- workflowAction.setWorkflowManifest({
- manifest: YAML.stringify(updatedManifest),
- });
- });
- } else {
- workflowAction.setWorkflowManifest({
- manifest: '',
+ try {
+ setUploadError(false);
+ const wfmanifest = updateEngineName(YAML.parse(response));
+ const updatedManifest = updateNamespace(wfmanifest, namespace);
+ workflowAction.setWorkflowManifest({
+ manifest: YAML.stringify(updatedManifest),
+ });
+ } catch {
+ setUploadError(true);
+ workflowAction.setWorkflowManifest({
+ manifest: '',
+ });
+ }
});
}
saveToLocalForage();
@@ -88,7 +102,31 @@ const UploadYAML = () => {
}}
className={classes.uploadYAMLDiv}
>
- {uploadedYAML === '' ? (
+ {uploadError ? (
+
+

+
+ {t('customWorkflow.createWorkflow.errorUpload')}
+
+
{
+ setUploadedYAML('');
+ setUploadError(false);
+ }}
+ >
+
+
+ {t('customWorkflow.createWorkflow.retryUpload')}
+
+
+
+ ) : uploadedYAML === '' ? (

{
InputProps={{
readOnly: true,
}}
+ disabled
className={classes.nsInput}
label={t('createWorkflow.chooseWorkflow.label.namespace')}
value={workflowData.namespace}
diff --git a/litmus-portal/frontend/src/views/MyHub/MyHubCharts/index.tsx b/litmus-portal/frontend/src/views/MyHub/MyHubCharts/index.tsx
index 6a8634f4b..ecf8aacda 100644
--- a/litmus-portal/frontend/src/views/MyHub/MyHubCharts/index.tsx
+++ b/litmus-portal/frontend/src/views/MyHub/MyHubCharts/index.tsx
@@ -121,6 +121,20 @@ const MyHub: React.FC = () => {
}
}, [data]);
+ const filteredWorkflow =
+ predefinedData?.GetPredefinedWorkflowList &&
+ predefinedData?.GetPredefinedWorkflowList.filter((data: string) =>
+ data.toLowerCase().includes(searchPredefined.trim())
+ );
+
+ const filteredExperiment =
+ totalExp &&
+ totalExp.filter(
+ (data) =>
+ data.ChaosName.toLowerCase().includes(search.trim()) ||
+ data.ExperimentName.toLowerCase().includes(search.trim())
+ );
+
return loading || predefinedLoading ? (
@@ -137,11 +151,13 @@ const MyHub: React.FC = () => {
{UserHub?.HubName}
-
+
{t('myhub.myhubChart.repoLink')}
-
- {UserHub?.RepoURL}/{UserHub?.RepoBranch}
-
+ {UserHub?.RepoURL}
+
+
+ {t('myhub.myhubChart.repoBranch')}
+ {UserHub?.RepoBranch}
{t('myhub.myhubChart.lastSynced')}{' '}
@@ -173,11 +189,8 @@ const MyHub: React.FC = () => {
changeSearch={handlePreDefinedSearch}
/>
- {predefinedData?.GetPredefinedWorkflowList.length > 0 ? (
- predefinedData?.GetPredefinedWorkflowList.filter(
- (data: string) =>
- data.toLowerCase().includes(searchPredefined.trim())
- ).map((expName: string) => {
+ {filteredWorkflow?.length > 0 ? (
+ filteredWorkflow.map((expName: string) => {
return (
{
height="80px"
/>
- {t('myhub.myhubChart.noExp')}
+ {t('myhub.myhubChart.noPredefinedExp')}
>
)}
@@ -232,27 +245,33 @@ const MyHub: React.FC = () => {
- {totalExp &&
- totalExp.length > 0 &&
- totalExp
- .filter(
- (data) =>
- data.ChaosName.toLowerCase().includes(search.trim()) ||
- data.ExperimentName.toLowerCase().includes(search.trim())
- )
- .map((expName: ChartName) => {
- return (
-
- );
- })}
+ {filteredExperiment?.length > 0 ? (
+ filteredExperiment.map((expName: ChartName) => {
+ return (
+
+ );
+ })
+ ) : (
+ <>
+

+
+ {t('myhub.myhubChart.noExp')}
+
+ >
+ )}