chore: (litmus-portal) Final build bug fixes, refactoring and imporvements (#2029)
- refactored directory structure for frontend - browse workflow table fixes and header notification fixes - settings and project selection fixes - project switching fixes, routing changes for settings and disabling buttons for release - routes and breadcrumbs fixed - tab switching improved with redux Signed-off-by: arkajyotiMukherjee <arkajyoti.mukherjee@mayadata.io>
This commit is contained in:
parent
c9ce014d5d
commit
456c67e409
|
@ -1,7 +1,7 @@
|
||||||
/// <reference types="Cypress" />
|
/// <reference types="Cypress" />
|
||||||
import React from 'react';
|
|
||||||
import { mount } from 'cypress-react-unit-test';
|
import { mount } from 'cypress-react-unit-test';
|
||||||
import LinearProgressBar from '../../src/components/Sections/ReturningHome/ProgressBar/LinearProgressBar';
|
import React from 'react';
|
||||||
|
import LinearProgressBar from '../../src/views/ReturningHome/ProgressBar/LinearProgressBar';
|
||||||
|
|
||||||
describe('Linear Progressbar Testing', () => {
|
describe('Linear Progressbar Testing', () => {
|
||||||
it('Progressbar stroke for value 3', () => {
|
it('Progressbar stroke for value 3', () => {
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/// <reference types="Cypress" />
|
/// <reference types="Cypress" />
|
||||||
|
|
||||||
import React from 'react';
|
|
||||||
import { mount } from 'cypress-react-unit-test';
|
import { mount } from 'cypress-react-unit-test';
|
||||||
|
import React from 'react';
|
||||||
import PassedVsFailed from '../../src/components/Sections/ReturningHome/PassedVsFailed/index';
|
import PassedVsFailed from '../../src/views/ReturningHome/PassedVsFailed/index';
|
||||||
|
|
||||||
// Test Suite - Passing props -> passed: 75, failed: 25
|
// Test Suite - Passing props -> passed: 75, failed: 25
|
||||||
describe('Passed Vs Failed: props -> passed: 75, failed: 25', () => {
|
describe('Passed Vs Failed: props -> passed: 75, failed: 25', () => {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/// <reference types="Cypress" />
|
/// <reference types="Cypress" />
|
||||||
|
|
||||||
import React from 'react';
|
|
||||||
import { mount } from 'cypress-react-unit-test';
|
import { mount } from 'cypress-react-unit-test';
|
||||||
import SemiCircularProgressBar from '../../src/components/Sections/ReturningHome/ProgressBar/SemiCircularProgressBar';
|
import React from 'react';
|
||||||
|
import SemiCircularProgressBar from '../../src/views/ReturningHome/ProgressBar/SemiCircularProgressBar';
|
||||||
|
|
||||||
// Test Suite -
|
// Test Suite -
|
||||||
// Progress Bar props -> value = 50, 10, 100
|
// Progress Bar props -> value = 50, 10, 100
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/// <reference types="Cypress" />
|
/// <reference types="Cypress" />
|
||||||
import { mount } from 'cypress-react-unit-test';
|
import { mount } from 'cypress-react-unit-test';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import CustomSlider from '../../src/components/Sections/CreateWorkflow/WeightSlider';
|
import CustomSlider from '../../src/views/CreateWorkflow/WeightSlider';
|
||||||
|
|
||||||
describe('Testing Custom Slider with different values', () => {
|
describe('Testing Custom Slider with different values', () => {
|
||||||
[10, 5, 2].map((i) => {
|
[10, 5, 2].map((i) => {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import React from 'react';
|
|
||||||
import { Typography } from '@material-ui/core';
|
import { Typography } from '@material-ui/core';
|
||||||
import LinearProgressBar from '../Sections/ReturningHome/ProgressBar/LinearProgressBar';
|
import React from 'react';
|
||||||
import useStyles from './styles';
|
|
||||||
import capitalize from '../../utils/capitalize';
|
import capitalize from '../../utils/capitalize';
|
||||||
|
import LinearProgressBar from '../../views/ReturningHome/ProgressBar/LinearProgressBar';
|
||||||
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface AdjustedWeightsProps {
|
interface AdjustedWeightsProps {
|
||||||
testName: string;
|
testName: string;
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import Breadcrumbs from '@material-ui/core/Breadcrumbs';
|
import Breadcrumbs from '@material-ui/core/Breadcrumbs';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { useEffect } from 'react';
|
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { history } from '../../redux/configureStore';
|
import capitalize from '../../utils/capitalize';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface CustomBreadcrumbsProps {
|
interface CustomBreadcrumbsProps {
|
||||||
|
@ -10,38 +9,32 @@ interface CustomBreadcrumbsProps {
|
||||||
}
|
}
|
||||||
|
|
||||||
const CustomBreadcrumbs: React.FC<CustomBreadcrumbsProps> = ({ location }) => {
|
const CustomBreadcrumbs: React.FC<CustomBreadcrumbsProps> = ({ location }) => {
|
||||||
const path: string[] = location.split('/');
|
const pathname: string[] = location.split('/');
|
||||||
|
let intermediateRoutes = '/';
|
||||||
let intermediateRoutes: string = '/';
|
|
||||||
|
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
|
|
||||||
useEffect(() => {}, [path]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Breadcrumbs aria-label="breadcrumb">
|
<Breadcrumbs aria-label="breadcrumb">
|
||||||
{path.map((path: string) => {
|
{pathname.map((path) => {
|
||||||
if (path) {
|
if (path) {
|
||||||
intermediateRoutes += path;
|
intermediateRoutes += path;
|
||||||
|
// If Template/Workflow Name is clicked [Workflow / Workflow-name / Template]
|
||||||
|
// it would redirect to /workflows
|
||||||
|
if (pathname[2] === 'template' && path === pathname[3]) {
|
||||||
|
return <span>{path}</span>;
|
||||||
|
}
|
||||||
const link = (
|
const link = (
|
||||||
<Link
|
<Link
|
||||||
key={path}
|
key={path}
|
||||||
to={intermediateRoutes}
|
to={intermediateRoutes}
|
||||||
className={classes.breadCrumb}
|
className={classes.breadCrumb}
|
||||||
onClick={() => {
|
|
||||||
history.push(`/${path}`);
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
{path.charAt(0).toUpperCase() + path.slice(1)}
|
{capitalize(path)}
|
||||||
</Link>
|
</Link>
|
||||||
);
|
);
|
||||||
|
|
||||||
intermediateRoutes += '/';
|
intermediateRoutes += '/';
|
||||||
|
|
||||||
return link;
|
return link;
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
})}
|
})}
|
||||||
</Breadcrumbs>
|
</Breadcrumbs>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
/* eslint-disable no-nested-ternary */
|
/* eslint-disable no-nested-ternary */
|
||||||
import React, { useState, useRef } from 'react';
|
|
||||||
import {
|
import {
|
||||||
Popover,
|
|
||||||
IconButton,
|
|
||||||
AppBar,
|
AppBar,
|
||||||
|
Badge,
|
||||||
|
Box,
|
||||||
|
IconButton,
|
||||||
List,
|
List,
|
||||||
ListItem,
|
ListItem,
|
||||||
ListItemText,
|
ListItemText,
|
||||||
|
Popover,
|
||||||
Typography,
|
Typography,
|
||||||
Box,
|
|
||||||
Badge,
|
|
||||||
} from '@material-ui/core';
|
} from '@material-ui/core';
|
||||||
import NotificationsOutlinedIcon from '@material-ui/icons/NotificationsOutlined';
|
import NotificationsOutlinedIcon from '@material-ui/icons/NotificationsOutlined';
|
||||||
import NotificationListItem from './NotificationListItem';
|
import React, { useRef, useState } from 'react';
|
||||||
import useStyles from './styles';
|
|
||||||
import {
|
import {
|
||||||
Message,
|
Message,
|
||||||
NotificationsCallBackType,
|
|
||||||
NotificationIds,
|
NotificationIds,
|
||||||
} from '../../../models/header';
|
NotificationsCallBackType,
|
||||||
|
} from '../../models/header';
|
||||||
|
import NotificationListItem from './NotificationListItem';
|
||||||
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface NotificationDropdownProps {
|
interface NotificationDropdownProps {
|
||||||
messages: Message[];
|
messages: Message[];
|
||||||
|
@ -61,7 +61,8 @@ const NotificationsDropdown: React.FC<NotificationDropdownProps> = ({
|
||||||
color="inherit"
|
color="inherit"
|
||||||
>
|
>
|
||||||
<Badge
|
<Badge
|
||||||
badgeContent={count === '0' ? messages.length : count}
|
// badgeContent={count === '0' ? messages.length : count}
|
||||||
|
badgeContent={0}
|
||||||
color="secondary"
|
color="secondary"
|
||||||
>
|
>
|
||||||
<NotificationsOutlinedIcon />
|
<NotificationsOutlinedIcon />
|
|
@ -1,17 +1,17 @@
|
||||||
|
import {
|
||||||
|
IconButton,
|
||||||
|
ListItem,
|
||||||
|
ListItemSecondaryAction,
|
||||||
|
ListItemText,
|
||||||
|
} from '@material-ui/core';
|
||||||
|
import ClearIcon from '@material-ui/icons/Clear';
|
||||||
|
import formatDistance from 'date-fns/formatDistance';
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import {
|
|
||||||
ListItem,
|
|
||||||
ListItemText,
|
|
||||||
ListItemSecondaryAction,
|
|
||||||
IconButton,
|
|
||||||
} from '@material-ui/core';
|
|
||||||
import formatDistance from 'date-fns/formatDistance';
|
|
||||||
import ClearIcon from '@material-ui/icons/Clear';
|
|
||||||
import {
|
import {
|
||||||
Message,
|
Message,
|
||||||
NotificationsCallBackType,
|
|
||||||
NotificationIds,
|
NotificationIds,
|
||||||
} from '../../../models/header';
|
NotificationsCallBackType,
|
||||||
|
} from '../../models/header';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface NotificationListItemProps {
|
interface NotificationListItemProps {
|
|
@ -12,19 +12,20 @@ import {
|
||||||
} from '@material-ui/core';
|
} from '@material-ui/core';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import config from '../../../config';
|
import config from '../../config';
|
||||||
import { GET_USER } from '../../../graphql';
|
import { GET_USER } from '../../graphql';
|
||||||
import {
|
import {
|
||||||
CurrentUserDedtailsVars,
|
CurrentUserDedtailsVars,
|
||||||
CurrentUserDetails,
|
CurrentUserDetails,
|
||||||
Member,
|
Member,
|
||||||
Project,
|
Project,
|
||||||
} from '../../../models/graphql/user';
|
} from '../../models/graphql/user';
|
||||||
import { ProjectsCallBackType } from '../../../models/header';
|
import { ProjectsCallBackType } from '../../models/header';
|
||||||
import useActions from '../../../redux/actions';
|
import useActions from '../../redux/actions';
|
||||||
import * as UserActions from '../../../redux/actions/user';
|
import * as UserActions from '../../redux/actions/user';
|
||||||
import { RootState } from '../../../redux/reducers';
|
import { history } from '../../redux/configureStore';
|
||||||
import userAvatar from '../../../utils/user';
|
import { RootState } from '../../redux/reducers';
|
||||||
|
import userAvatar from '../../utils/user';
|
||||||
import ProjectListItem from './ProjectListItem';
|
import ProjectListItem from './ProjectListItem';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
|
@ -62,11 +63,9 @@ const ProfileInfoDropdownItems: React.FC<ProfileInfoDropdownItemProps> = ({
|
||||||
{ variables: { username } }
|
{ variables: { username } }
|
||||||
);
|
);
|
||||||
const projects = data?.getUser.projects ?? [];
|
const projects = data?.getUser.projects ?? [];
|
||||||
const [switchableProjects, setSwitchableProjects] = useState<Project[]>(
|
const [switchableProjects, setSwitchableProjects] = useState<Project[]>([]);
|
||||||
projects
|
|
||||||
);
|
|
||||||
const [loggedOut, doLogout] = useState(false);
|
const [loggedOut, doLogout] = useState(false);
|
||||||
const { userData } = useSelector((state: RootState) => state);
|
const userData = useSelector((state: RootState) => state.userData);
|
||||||
|
|
||||||
const logOut = () => {
|
const logOut = () => {
|
||||||
doLogout(true);
|
doLogout(true);
|
||||||
|
@ -88,8 +87,6 @@ const ProfileInfoDropdownItems: React.FC<ProfileInfoDropdownItemProps> = ({
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const editProfile = () => {};
|
|
||||||
|
|
||||||
const CallbackFromProjectListItem = (selectedProjectIDFromList: string) => {
|
const CallbackFromProjectListItem = (selectedProjectIDFromList: string) => {
|
||||||
CallbackToSetSelectedProjectIDOnProfileDropdown(selectedProjectIDFromList);
|
CallbackToSetSelectedProjectIDOnProfileDropdown(selectedProjectIDFromList);
|
||||||
};
|
};
|
||||||
|
@ -98,6 +95,7 @@ const ProfileInfoDropdownItems: React.FC<ProfileInfoDropdownItemProps> = ({
|
||||||
const projectsAvailableForSwitching: Project[] = [];
|
const projectsAvailableForSwitching: Project[] = [];
|
||||||
projects.forEach((project) => {
|
projects.forEach((project) => {
|
||||||
const memberList: Member[] = project.members;
|
const memberList: Member[] = project.members;
|
||||||
|
|
||||||
memberList.forEach((member) => {
|
memberList.forEach((member) => {
|
||||||
if (member.user_name === username && member.invitation === 'Accepted') {
|
if (member.user_name === username && member.invitation === 'Accepted') {
|
||||||
projectsAvailableForSwitching.push(project);
|
projectsAvailableForSwitching.push(project);
|
||||||
|
@ -105,10 +103,6 @@ const ProfileInfoDropdownItems: React.FC<ProfileInfoDropdownItemProps> = ({
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
setSwitchableProjects(projectsAvailableForSwitching);
|
setSwitchableProjects(projectsAvailableForSwitching);
|
||||||
}, []);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setSwitchableProjects(projects);
|
|
||||||
}, [data]);
|
}, [data]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -157,14 +151,16 @@ const ProfileInfoDropdownItems: React.FC<ProfileInfoDropdownItemProps> = ({
|
||||||
{email}
|
{email}
|
||||||
</Typography>
|
</Typography>
|
||||||
|
|
||||||
<Button
|
{userData.userRole === 'Owner' && (
|
||||||
variant="outlined"
|
<Button
|
||||||
size="small"
|
variant="outlined"
|
||||||
onClick={editProfile}
|
size="small"
|
||||||
className={classes.buttonEditProfile}
|
className={classes.buttonEditProfile}
|
||||||
>
|
onClick={() => history.push('/settings')}
|
||||||
Edit Profile
|
>
|
||||||
</Button>
|
Edit Profile
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
disabled={loggedOut}
|
disabled={loggedOut}
|
|
@ -3,8 +3,8 @@ import Avatar from '@material-ui/core/Avatar';
|
||||||
import Typography from '@material-ui/core/Typography';
|
import Typography from '@material-ui/core/Typography';
|
||||||
import ExpandMoreTwoToneIcon from '@material-ui/icons/ExpandMoreTwoTone';
|
import ExpandMoreTwoToneIcon from '@material-ui/icons/ExpandMoreTwoTone';
|
||||||
import React, { useRef, useState } from 'react';
|
import React, { useRef, useState } from 'react';
|
||||||
import { ProjectsCallBackType } from '../../../models/header';
|
import { ProjectsCallBackType } from '../../models/header';
|
||||||
import userAvatar from '../../../utils/user';
|
import userAvatar from '../../utils/user';
|
||||||
import ProfileInfoDropdownItems from './ProfileDropdownItems';
|
import ProfileInfoDropdownItems from './ProfileDropdownItems';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
|
@ -10,8 +10,8 @@ import CheckCircleSharpIcon from '@material-ui/icons/CheckCircleSharp';
|
||||||
import InsertDriveFileOutlinedIcon from '@material-ui/icons/InsertDriveFileOutlined';
|
import InsertDriveFileOutlinedIcon from '@material-ui/icons/InsertDriveFileOutlined';
|
||||||
import MoreHorizIcon from '@material-ui/icons/MoreHoriz';
|
import MoreHorizIcon from '@material-ui/icons/MoreHoriz';
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { Project } from '../../../models/graphql/user';
|
import { Project } from '../../models/graphql/user';
|
||||||
import { ProjectsCallBackType } from '../../../models/header';
|
import { ProjectsCallBackType } from '../../models/header';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface ProjectListItemProps {
|
interface ProjectListItemProps {
|
|
@ -5,18 +5,18 @@ import Toolbar from '@material-ui/core/Toolbar';
|
||||||
import React, { useCallback, useEffect, useState } from 'react';
|
import React, { useCallback, useEffect, useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { useLocation } from 'react-router-dom';
|
import { useLocation } from 'react-router-dom';
|
||||||
import CustomBreadCrumbs from '../../../components/BreadCrumbs';
|
import { GET_USER } from '../../graphql';
|
||||||
import { GET_USER } from '../../../graphql';
|
|
||||||
import {
|
import {
|
||||||
CurrentUserDedtailsVars,
|
CurrentUserDedtailsVars,
|
||||||
CurrentUserDetails,
|
CurrentUserDetails,
|
||||||
Member,
|
Member,
|
||||||
Project,
|
Project,
|
||||||
} from '../../../models/graphql/user';
|
} from '../../models/graphql/user';
|
||||||
import { Message, NotificationIds } from '../../../models/header';
|
import { Message, NotificationIds } from '../../models/header';
|
||||||
import useActions from '../../../redux/actions';
|
import useActions from '../../redux/actions';
|
||||||
import * as UserActions from '../../../redux/actions/user';
|
import * as UserActions from '../../redux/actions/user';
|
||||||
import { RootState } from '../../../redux/reducers';
|
import { RootState } from '../../redux/reducers';
|
||||||
|
import CustomBreadCrumbs from '../BreadCrumbs';
|
||||||
import NotificationsDropdown from './NotificationDropdown';
|
import NotificationsDropdown from './NotificationDropdown';
|
||||||
import ProfileDropdownSection from './ProfileDropdownSection';
|
import ProfileDropdownSection from './ProfileDropdownSection';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
@ -53,17 +53,18 @@ const Header: React.FC = () => {
|
||||||
projects.forEach((project) => {
|
projects.forEach((project) => {
|
||||||
if (selectedProjectID === project.id) {
|
if (selectedProjectID === project.id) {
|
||||||
const memberList: Member[] = project.members;
|
const memberList: Member[] = project.members;
|
||||||
|
|
||||||
memberList.forEach((member) => {
|
memberList.forEach((member) => {
|
||||||
if (member.user_name === data?.getUser.username) {
|
if (member.user_name === data?.getUser.username) {
|
||||||
user.updateUserDetails({
|
user.updateUserDetails({
|
||||||
selectedProjectID,
|
selectedProjectID,
|
||||||
userRole: project.name,
|
userRole: member.role,
|
||||||
selectedProjectName: member.role,
|
selectedProjectName: project.name,
|
||||||
});
|
});
|
||||||
setSelectedProjectDetails({
|
setSelectedProjectDetails({
|
||||||
selectedProjectID,
|
selectedProjectID,
|
||||||
selectedProjectName: project.name,
|
|
||||||
selectedUserRole: member.role,
|
selectedUserRole: member.role,
|
||||||
|
selectedProjectName: project.name,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
|
@ -1,56 +1,65 @@
|
||||||
import { List, ListItem, Typography } from '@material-ui/core';
|
import { List, ListItem, Typography } from '@material-ui/core';
|
||||||
import React from 'react';
|
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import Card from '@material-ui/core/Card';
|
import Card from '@material-ui/core/Card';
|
||||||
|
import React from 'react';
|
||||||
|
import { useSelector } from 'react-redux';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import useActions from '../../redux/actions';
|
||||||
|
import * as TabActions from '../../redux/actions/tabs';
|
||||||
|
import { RootState } from '../../redux/reducers';
|
||||||
import useStyles from './style';
|
import useStyles from './style';
|
||||||
|
|
||||||
interface QuickActionItemsProps {
|
const QuickActionItems: React.FC = ({ children }) => {
|
||||||
children: React.ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QuickActionItems: React.FC<QuickActionItemsProps> = ({ children }) => {
|
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
return <ListItem className={classes.listItems}>{children}</ListItem>;
|
return <ListItem className={classes.listItems}>{children}</ListItem>;
|
||||||
};
|
};
|
||||||
|
|
||||||
const QuickActionCard = () => {
|
const QuickActionCard = () => {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
|
const userRole = useSelector((state: RootState) => state.userData.userRole);
|
||||||
|
const tabs = useActions(TabActions);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classes.quickActionCard}>
|
<div className={classes.quickActionCard}>
|
||||||
<Card elevation={0}>
|
<Card elevation={0}>
|
||||||
<Typography className={classes.mainHeader}>Quick Actions</Typography>
|
<Typography className={classes.mainHeader}>Quick Actions</Typography>
|
||||||
<List>
|
<List>
|
||||||
<QuickActionItems>
|
{/* <QuickActionItems>
|
||||||
<>
|
<img src="icons/cluster.png" alt="cluster" />
|
||||||
<img src="icons/cluster.png" alt="cluster" />
|
<Link to="/" className={classes.listItem}>
|
||||||
<Link to="/" className={classes.listItem}>
|
Connect a new cluster
|
||||||
Connect a new cluster
|
</Link>
|
||||||
</Link>
|
</QuickActionItems> */}
|
||||||
</>
|
{userRole === 'Owner' && (
|
||||||
</QuickActionItems>
|
<QuickActionItems>
|
||||||
<QuickActionItems>
|
|
||||||
<>
|
|
||||||
<img src="icons/team.png" alt="team" />
|
<img src="icons/team.png" alt="team" />
|
||||||
<Link to="/" className={classes.listItem}>
|
<Link
|
||||||
|
to="/settings"
|
||||||
|
className={classes.listItem}
|
||||||
|
onClick={() => tabs.changeSettingsTabs(0)}
|
||||||
|
>
|
||||||
Invite a team member
|
Invite a team member
|
||||||
</Link>
|
</Link>
|
||||||
</>
|
</QuickActionItems>
|
||||||
|
)}
|
||||||
|
<QuickActionItems>
|
||||||
|
<img src="icons/survey.png" alt="survey" />
|
||||||
|
<a
|
||||||
|
href="https://forms.gle/qMuVphRyEWCFqjD56"
|
||||||
|
className={classes.listItem}
|
||||||
|
target="_"
|
||||||
|
>
|
||||||
|
Take a quick survey
|
||||||
|
</a>
|
||||||
</QuickActionItems>
|
</QuickActionItems>
|
||||||
<QuickActionItems>
|
<QuickActionItems>
|
||||||
<>
|
<img src="icons/docs.png" alt="docs" />
|
||||||
<img src="icons/survey.png" alt="survey" />
|
<a
|
||||||
<Link to="/" className={classes.listItem}>
|
href="https://docs.litmuschaos.io/docs/getstarted/"
|
||||||
Take a quick survey
|
className={classes.listItem}
|
||||||
</Link>
|
target="_"
|
||||||
</>
|
>
|
||||||
</QuickActionItems>
|
Read Litmus docs
|
||||||
<QuickActionItems>
|
</a>
|
||||||
<>
|
|
||||||
<img src="icons/docs.png" alt="docs" />
|
|
||||||
<Link to="/" className={classes.listItem}>
|
|
||||||
Read Litmus docs
|
|
||||||
</Link>
|
|
||||||
</>
|
|
||||||
</QuickActionItems>
|
</QuickActionItems>
|
||||||
</List>
|
</List>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
|
@ -5,13 +5,14 @@ import ListItem from '@material-ui/core/ListItem';
|
||||||
import ListItemIcon from '@material-ui/core/ListItemIcon';
|
import ListItemIcon from '@material-ui/core/ListItemIcon';
|
||||||
import ListItemText from '@material-ui/core/ListItemText';
|
import ListItemText from '@material-ui/core/ListItemText';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import { useSelector } from 'react-redux';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { history } from '../../../redux/configureStore';
|
import { history } from '../../redux/configureStore';
|
||||||
|
import { RootState } from '../../redux/reducers';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface CustomisedListItemProps {
|
interface CustomisedListItemProps {
|
||||||
handleClick: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
|
handleClick: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
|
||||||
children: JSX.Element;
|
|
||||||
label: string;
|
label: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,8 +30,9 @@ const CustomisedListItem: React.FC<CustomisedListItemProps> = ({
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const SideBar = () => {
|
const SideBar: React.FC = () => {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
|
const userRole = useSelector((state: RootState) => state.userData.userRole);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Drawer
|
<Drawer
|
||||||
|
@ -73,7 +75,7 @@ const SideBar = () => {
|
||||||
>
|
>
|
||||||
<img src="/icons/workflows.png" alt="workflow" />
|
<img src="/icons/workflows.png" alt="workflow" />
|
||||||
</CustomisedListItem>
|
</CustomisedListItem>
|
||||||
<CustomisedListItem
|
{/* <CustomisedListItem
|
||||||
key="hub"
|
key="hub"
|
||||||
handleClick={() => {
|
handleClick={() => {
|
||||||
history.push('/404');
|
history.push('/404');
|
||||||
|
@ -81,16 +83,7 @@ const SideBar = () => {
|
||||||
label="My Hub"
|
label="My Hub"
|
||||||
>
|
>
|
||||||
<img src="/icons/hub.png" alt="hub" />
|
<img src="/icons/hub.png" alt="hub" />
|
||||||
</CustomisedListItem>
|
</CustomisedListItem> */}
|
||||||
<CustomisedListItem
|
|
||||||
key="settings"
|
|
||||||
handleClick={() => {
|
|
||||||
history.push('/settings');
|
|
||||||
}}
|
|
||||||
label="Settings"
|
|
||||||
>
|
|
||||||
<img src="/icons/setting.png" alt="settings" />
|
|
||||||
</CustomisedListItem>
|
|
||||||
<CustomisedListItem
|
<CustomisedListItem
|
||||||
key="community"
|
key="community"
|
||||||
handleClick={() => {
|
handleClick={() => {
|
||||||
|
@ -100,6 +93,17 @@ const SideBar = () => {
|
||||||
>
|
>
|
||||||
<img src="/icons/community.png" alt="community" />
|
<img src="/icons/community.png" alt="community" />
|
||||||
</CustomisedListItem>
|
</CustomisedListItem>
|
||||||
|
{userRole === 'Owner' && (
|
||||||
|
<CustomisedListItem
|
||||||
|
key="settings"
|
||||||
|
handleClick={() => {
|
||||||
|
history.push('/settings');
|
||||||
|
}}
|
||||||
|
label="Settings"
|
||||||
|
>
|
||||||
|
<img src="/icons/setting.png" alt="settings" />
|
||||||
|
</CustomisedListItem>
|
||||||
|
)}
|
||||||
</List>
|
</List>
|
||||||
</Drawer>
|
</Drawer>
|
||||||
);
|
);
|
|
@ -20,14 +20,14 @@ import * as WorkflowActions from '../../redux/actions/workflow';
|
||||||
import { history } from '../../redux/configureStore';
|
import { history } from '../../redux/configureStore';
|
||||||
import { RootState } from '../../redux/reducers';
|
import { RootState } from '../../redux/reducers';
|
||||||
import parsed from '../../utils/yamlUtils';
|
import parsed from '../../utils/yamlUtils';
|
||||||
|
import ChooseWorkflow from '../../views/CreateWorkflow/ChooseWorkflow/index';
|
||||||
|
import ReliablityScore from '../../views/CreateWorkflow/ReliabilityScore';
|
||||||
|
import ScheduleWorkflow from '../../views/CreateWorkflow/ScheduleWorkflow';
|
||||||
|
import TuneWorkflow from '../../views/CreateWorkflow/TuneWorkflow/index';
|
||||||
|
import VerifyCommit from '../../views/CreateWorkflow/VerifyCommit';
|
||||||
|
import ChooseAWorkflowCluster from '../../views/CreateWorkflow/WorkflowCluster';
|
||||||
import ButtonFilled from '../Button/ButtonFilled';
|
import ButtonFilled from '../Button/ButtonFilled';
|
||||||
import ButtonOutline from '../Button/ButtonOutline';
|
import ButtonOutline from '../Button/ButtonOutline';
|
||||||
import ChooseWorkflow from '../Sections/CreateWorkflow/ChooseWorkflow/index';
|
|
||||||
import ReliablityScore from '../Sections/CreateWorkflow/ReliabilityScore';
|
|
||||||
import ScheduleWorkflow from '../Sections/CreateWorkflow/ScheduleWorkflow';
|
|
||||||
import TuneWorkflow from '../Sections/CreateWorkflow/TuneWorkflow/index';
|
|
||||||
import VerifyCommit from '../Sections/CreateWorkflow/VerifyCommit';
|
|
||||||
import ChooseAWorkflowCluster from '../Sections/CreateWorkflow/WorkflowCluster';
|
|
||||||
import QontoConnector from './quontoConnector';
|
import QontoConnector from './quontoConnector';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
import useQontoStepIconStyles from './useQontoStepIconStyles';
|
import useQontoStepIconStyles from './useQontoStepIconStyles';
|
||||||
|
|
|
@ -16,20 +16,20 @@ const CreateWorkflow = lazy(() => import('../../pages/CreateWorkflow'));
|
||||||
const LoginPage = lazy(() => import('../../pages/LoginPage'));
|
const LoginPage = lazy(() => import('../../pages/LoginPage'));
|
||||||
const WorkflowDetails = lazy(() => import('../../pages/WorkflowDetails'));
|
const WorkflowDetails = lazy(() => import('../../pages/WorkflowDetails'));
|
||||||
const BrowseTemplate = lazy(() =>
|
const BrowseTemplate = lazy(() =>
|
||||||
import('../../components/Sections/ChaosWorkflows/BrowseTemplate')
|
import('../../views/ChaosWorkflows/BrowseTemplate')
|
||||||
);
|
);
|
||||||
const HomePage = lazy(() => import('../../pages/HomePage'));
|
const HomePage = lazy(() => import('../../pages/HomePage'));
|
||||||
const Community = lazy(() => import('../../pages/Community'));
|
const Community = lazy(() => import('../../pages/Community'));
|
||||||
const Settings = lazy(() => import('../../pages/Settings'));
|
const Settings = lazy(() => import('../../pages/Settings'));
|
||||||
const SchedulePage = lazy(() => import('../../pages/SchedulePage'));
|
const SchedulePage = lazy(() => import('../../pages/SchedulePage'));
|
||||||
interface RoutesProps {
|
interface RoutesProps {
|
||||||
userData: string;
|
userData: UserData;
|
||||||
isProjectAvailable: boolean;
|
isProjectAvailable: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Routes: React.FC<RoutesProps> = ({ userData, isProjectAvailable }) => {
|
const Routes: React.FC<RoutesProps> = ({ userData, isProjectAvailable }) => {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
if (userData === '') {
|
if (userData.token === '') {
|
||||||
return (
|
return (
|
||||||
<div className={classes.content}>
|
<div className={classes.content}>
|
||||||
<Switch>
|
<Switch>
|
||||||
|
@ -58,28 +58,32 @@ const Routes: React.FC<RoutesProps> = ({ userData, isProjectAvailable }) => {
|
||||||
<Route exact path="/login" component={LoginPage} />
|
<Route exact path="/login" component={LoginPage} />
|
||||||
<Route exact path="/workflows" component={Workflows} />
|
<Route exact path="/workflows" component={Workflows} />
|
||||||
<Route exact path="/create-workflow" component={CreateWorkflow} />
|
<Route exact path="/create-workflow" component={CreateWorkflow} />
|
||||||
|
|
||||||
|
{/* Redirects */}
|
||||||
|
<Redirect exact path="/workflows/details" to="/workflows" />
|
||||||
|
<Redirect exact path="/workflows/schedule" to="/workflows" />
|
||||||
|
<Redirect exact path="/workflows/template" to="/workflows" />
|
||||||
<Route
|
<Route
|
||||||
exact
|
exact
|
||||||
path="/workflows/:workflowName"
|
path="/workflows/details/:workflowRunId"
|
||||||
component={WorkflowDetails}
|
component={WorkflowDetails}
|
||||||
/>
|
/>
|
||||||
<Route
|
<Route
|
||||||
exact
|
exact
|
||||||
path="/workflows/:workflowName/details"
|
path="/workflows/schedule/:scheduleId"
|
||||||
component={WorkflowDetails}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
exact
|
|
||||||
path="/workflows/:scheduleId/schedule"
|
|
||||||
component={SchedulePage}
|
component={SchedulePage}
|
||||||
/>
|
/>
|
||||||
<Route
|
<Route
|
||||||
exact
|
exact
|
||||||
path="/workflows/:templateName/template"
|
path="/workflows/template/:templateName"
|
||||||
component={BrowseTemplate}
|
component={BrowseTemplate}
|
||||||
/>
|
/>
|
||||||
<Route exact path="/community" component={Community} />
|
<Route exact path="/community" component={Community} />
|
||||||
<Route exact path="/settings" component={Settings} />
|
{userData.userRole === 'Owner' ? (
|
||||||
|
<Route exact path="/settings" component={Settings} />
|
||||||
|
) : (
|
||||||
|
<Redirect to="/" />
|
||||||
|
)}
|
||||||
<Route exact path="/404" component={ErrorPage} />
|
<Route exact path="/404" component={ErrorPage} />
|
||||||
<Redirect to="/404" />
|
<Redirect to="/404" />
|
||||||
</Switch>
|
</Switch>
|
||||||
|
@ -90,10 +94,11 @@ const Routes: React.FC<RoutesProps> = ({ userData, isProjectAvailable }) => {
|
||||||
function App() {
|
function App() {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
const analyticsAction = useActions(AnalyticsActions);
|
const analyticsAction = useActions(AnalyticsActions);
|
||||||
const userData: UserData = useSelector((state: RootState) => state.userData);
|
const userData = useSelector((state: RootState) => state.userData);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (userData.token !== '') analyticsAction.loadCommunityAnalytics();
|
if (userData.token !== '') analyticsAction.loadCommunityAnalytics();
|
||||||
}, [userData.token]);
|
}, [userData.token]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Suspense fallback={<Loader />}>
|
<Suspense fallback={<Loader />}>
|
||||||
<Router history={history}>
|
<Router history={history}>
|
||||||
|
@ -101,7 +106,7 @@ function App() {
|
||||||
<div className={classes.appFrame}>
|
<div className={classes.appFrame}>
|
||||||
{/* <Routes /> */}
|
{/* <Routes /> */}
|
||||||
<Routes
|
<Routes
|
||||||
userData={userData.token}
|
userData={userData}
|
||||||
isProjectAvailable={!!userData.selectedProjectID}
|
isProjectAvailable={!!userData.selectedProjectID}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
import CssBaseline from '@material-ui/core/CssBaseline';
|
import CssBaseline from '@material-ui/core/CssBaseline';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Header from '../Header';
|
import Header from '../../../components/Header';
|
||||||
import SideBar from '../SideBar';
|
import SideBar from '../../../components/SideBar';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface ScaffoldProps {
|
const Scaffold: React.FC = ({ children }) => {
|
||||||
children: React.ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Scaffold: React.FC<ScaffoldProps> = ({ children }) => {
|
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -12,3 +12,10 @@ export interface MemberInviteNew {
|
||||||
role: string;
|
role: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface UserInvite {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
username: string;
|
||||||
|
email: string;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
export interface TabState {
|
||||||
|
workflows: number;
|
||||||
|
settings: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum TabActions {
|
||||||
|
CHANGE_WORKFLOWS_TAB = 'CHANGE_WORKFLOWS_TAB',
|
||||||
|
CHANGE_SETTINGS_TAB = 'CHANGE_SETTINGS_TAB',
|
||||||
|
}
|
||||||
|
|
||||||
|
interface TabActionType<T, P> {
|
||||||
|
type: T;
|
||||||
|
payload: P;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type TabAction =
|
||||||
|
| TabActionType<typeof TabActions.CHANGE_WORKFLOWS_TAB, number>
|
||||||
|
| TabActionType<typeof TabActions.CHANGE_SETTINGS_TAB, number>;
|
|
@ -1,17 +1,17 @@
|
||||||
import React from 'react';
|
import Button from '@material-ui/core/Button';
|
||||||
import Typography from '@material-ui/core/Typography';
|
|
||||||
import Paper from '@material-ui/core/Paper'; // Temporary -> Should be replaced with Chart
|
|
||||||
import Card from '@material-ui/core/Card';
|
import Card from '@material-ui/core/Card';
|
||||||
import CardContent from '@material-ui/core/CardContent';
|
import CardContent from '@material-ui/core/CardContent';
|
||||||
import Button from '@material-ui/core/Button';
|
import Paper from '@material-ui/core/Paper'; // Temporary -> Should be replaced with Chart
|
||||||
import { Link } from 'react-router-dom';
|
import Typography from '@material-ui/core/Typography';
|
||||||
|
import React from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
import InfoFilledWrap from '../../components/InfoFilled/index';
|
import InfoFilledWrap from '../../components/InfoFilled/index';
|
||||||
import Scaffold from '../../containers/layouts/Scaffold/index';
|
|
||||||
import useStyles from './styles';
|
|
||||||
import QuickActionCard from '../../components/QuickActionCard';
|
import QuickActionCard from '../../components/QuickActionCard';
|
||||||
import GeoMap from '../../components/Sections/Community/GeoMap/index';
|
import Scaffold from '../../containers/layouts/Scaffold/index';
|
||||||
import CommunityAnalyticsPlot from '../../components/Sections/Community/CommunityTimeSeriesPlot';
|
import CommunityAnalyticsPlot from '../../views/Community/CommunityTimeSeriesPlot';
|
||||||
|
import GeoMap from '../../views/Community/GeoMap/index';
|
||||||
|
import useStyles from './styles';
|
||||||
|
|
||||||
// Reusable Header Component
|
// Reusable Header Component
|
||||||
const Header2: React.FC = ({ children }) => {
|
const Header2: React.FC = ({ children }) => {
|
||||||
|
|
|
@ -4,7 +4,7 @@ import ArrowForwardIcon from '@material-ui/icons/ArrowForward';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { Link, useHistory } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import InfoFilledWrap from '../../components/InfoFilled';
|
import InfoFilledWrap from '../../components/InfoFilled';
|
||||||
import Loader from '../../components/Loader';
|
import Loader from '../../components/Loader';
|
||||||
import QuickActionCard from '../../components/QuickActionCard';
|
import QuickActionCard from '../../components/QuickActionCard';
|
||||||
|
@ -18,24 +18,21 @@ import {
|
||||||
Project,
|
Project,
|
||||||
} from '../../models/graphql/user';
|
} from '../../models/graphql/user';
|
||||||
import useActions from '../../redux/actions';
|
import useActions from '../../redux/actions';
|
||||||
|
import * as TabActions from '../../redux/actions/tabs';
|
||||||
import * as UserActions from '../../redux/actions/user';
|
import * as UserActions from '../../redux/actions/user';
|
||||||
|
import { history } from '../../redux/configureStore';
|
||||||
import { RootState } from '../../redux/reducers';
|
import { RootState } from '../../redux/reducers';
|
||||||
import useStyles from './style';
|
import useStyles from './style';
|
||||||
|
|
||||||
const CreateWorkflowCard = () => {
|
const CreateWorkflowCard = () => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
const history = useHistory();
|
|
||||||
const routeChange = () => {
|
|
||||||
history.push('/create-workflow');
|
|
||||||
};
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<Card
|
||||||
elevation={3}
|
elevation={3}
|
||||||
className={classes.createWorkflowCard}
|
className={classes.createWorkflowCard}
|
||||||
onClick={() => {
|
onClick={() => history.push('/create-workflow')}
|
||||||
routeChange();
|
|
||||||
}}
|
|
||||||
data-cy="createWorkflow"
|
data-cy="createWorkflow"
|
||||||
>
|
>
|
||||||
<CardActionArea>
|
<CardActionArea>
|
||||||
|
@ -57,6 +54,7 @@ const HomePage = () => {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const user = useActions(UserActions);
|
const user = useActions(UserActions);
|
||||||
|
const tabs = useActions(TabActions);
|
||||||
|
|
||||||
// Query to get user details
|
// Query to get user details
|
||||||
const { data, loading } = useQuery<
|
const { data, loading } = useQuery<
|
||||||
|
@ -109,7 +107,7 @@ const HomePage = () => {
|
||||||
<div className={classes.root}>
|
<div className={classes.root}>
|
||||||
<Typography className={classes.userName}>
|
<Typography className={classes.userName}>
|
||||||
{t('home.heading')}
|
{t('home.heading')}
|
||||||
<strong>{name}</strong>
|
<strong>{` ${name}`}</strong>
|
||||||
</Typography>
|
</Typography>
|
||||||
<div className={classes.headingDiv}>
|
<div className={classes.headingDiv}>
|
||||||
<div className={classes.mainDiv}>
|
<div className={classes.mainDiv}>
|
||||||
|
@ -126,6 +124,10 @@ const HomePage = () => {
|
||||||
<Button
|
<Button
|
||||||
variant="contained"
|
variant="contained"
|
||||||
className={classes.predefinedBtn}
|
className={classes.predefinedBtn}
|
||||||
|
onClick={() => {
|
||||||
|
tabs.changeWorkflowsTabs(2);
|
||||||
|
history.push('/workflows');
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<Typography variant="subtitle1">
|
<Typography variant="subtitle1">
|
||||||
{t('home.button1')}
|
{t('home.button1')}
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
import { Box, Paper, Tab, Tabs, Typography } from '@material-ui/core';
|
import { Box, Paper, Tab, Tabs, Typography } from '@material-ui/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import AccountSettings from '../../components/Sections/Settings/AccountsTab/AccountSettings';
|
import Center from '../../containers/layouts/Center';
|
||||||
import TeammingTab from '../../components/Sections/Settings/TeammingTab';
|
|
||||||
import UserManagement from '../../components/Sections/Settings/UserManagementTab/UserManagement';
|
|
||||||
import Scaffold from '../../containers/layouts/Scaffold';
|
import Scaffold from '../../containers/layouts/Scaffold';
|
||||||
|
import useActions from '../../redux/actions';
|
||||||
|
import * as TabActions from '../../redux/actions/tabs';
|
||||||
import { RootState } from '../../redux/reducers';
|
import { RootState } from '../../redux/reducers';
|
||||||
|
import TeammingTab from '../../views/Settings/TeammingTab';
|
||||||
|
import UserManagement from '../../views/Settings/UserManagementTab/UserManagement';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface TabPanelProps {
|
interface TabPanelProps {
|
||||||
|
@ -40,48 +42,57 @@ function tabProps(index: any) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const Settings: React.FC = () => {
|
const Settings: React.FC = () => {
|
||||||
const [activeTab, setActiveTab] = React.useState(0);
|
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
const handleChange = (event: React.ChangeEvent<{}>, actTab: number) => {
|
|
||||||
setActiveTab(actTab);
|
const settingsTabValue = useSelector(
|
||||||
|
(state: RootState) => state.tabNumber.settings
|
||||||
|
);
|
||||||
|
const userData = useSelector((state: RootState) => state.userData);
|
||||||
|
const tabs = useActions(TabActions);
|
||||||
|
|
||||||
|
const handleChange = (event: React.ChangeEvent<{}>, newValue: number) => {
|
||||||
|
tabs.changeSettingsTabs(newValue);
|
||||||
};
|
};
|
||||||
|
|
||||||
const { userData } = useSelector((state: RootState) => state);
|
|
||||||
return (
|
return (
|
||||||
<Scaffold>
|
<Scaffold>
|
||||||
<div>
|
<Typography className={classes.Head}>Settings </Typography>
|
||||||
<Typography className={classes.Head}>Settings </Typography>
|
<Paper className={classes.root} elevation={0}>
|
||||||
<Paper className={classes.root} elevation={0}>
|
<Tabs
|
||||||
<Tabs
|
className={classes.tab}
|
||||||
className={classes.tab}
|
value={settingsTabValue}
|
||||||
value={activeTab}
|
onChange={handleChange}
|
||||||
onChange={handleChange}
|
indicatorColor="secondary"
|
||||||
indicatorColor="secondary"
|
textColor="secondary"
|
||||||
textColor="secondary"
|
>
|
||||||
>
|
<Tab label="Team" {...tabProps(0)} />
|
||||||
<Tab label="My Account" {...tabProps(0)} />
|
{userData.username === 'admin' ? (
|
||||||
<Tab label="Team" {...tabProps(1)} />
|
<Tab label="User Management" {...tabProps(1)} />
|
||||||
{userData.username === 'admin' ? (
|
) : (
|
||||||
<Tab label="User Management" {...tabProps(2)} />
|
<></>
|
||||||
) : (
|
)}
|
||||||
<></>
|
<Tab label="My Account" {...tabProps(2)} />
|
||||||
)}
|
</Tabs>
|
||||||
</Tabs>
|
</Paper>
|
||||||
</Paper>
|
|
||||||
<TabPanel value={activeTab} index={0}>
|
<TabPanel value={settingsTabValue} index={0}>
|
||||||
<AccountSettings />
|
<TeammingTab />
|
||||||
|
</TabPanel>
|
||||||
|
{userData.username === 'admin' ? (
|
||||||
|
<TabPanel value={settingsTabValue} index={1}>
|
||||||
|
<UserManagement />
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
<TabPanel value={activeTab} index={1}>
|
) : (
|
||||||
<TeammingTab />
|
<></>
|
||||||
</TabPanel>
|
)}
|
||||||
{userData.username === 'admin' ? (
|
<TabPanel value={settingsTabValue} index={2}>
|
||||||
<TabPanel value={activeTab} index={2}>
|
{/* <AccountSettings /> */}
|
||||||
<UserManagement />
|
<Center>
|
||||||
</TabPanel>
|
<Typography variant="h3" align="center">
|
||||||
) : (
|
My Account Page comming soon
|
||||||
<></>
|
</Typography>
|
||||||
)}
|
</Center>
|
||||||
</div>
|
</TabPanel>
|
||||||
</Scaffold>
|
</Scaffold>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,8 +4,6 @@ import React, { useEffect } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { useLocation } from 'react-router-dom';
|
import { useLocation } from 'react-router-dom';
|
||||||
import Loader from '../../components/Loader';
|
import Loader from '../../components/Loader';
|
||||||
import ArgoWorkflow from '../../components/Sections/WorkflowDetails/ArgoWorkflow';
|
|
||||||
import WorkflowInfo from '../../components/Sections/WorkflowDetails/WorkflowInfo';
|
|
||||||
import Scaffold from '../../containers/layouts/Scaffold';
|
import Scaffold from '../../containers/layouts/Scaffold';
|
||||||
import { WORKFLOW_DETAILS, WORKFLOW_EVENTS } from '../../graphql';
|
import { WORKFLOW_DETAILS, WORKFLOW_EVENTS } from '../../graphql';
|
||||||
import {
|
import {
|
||||||
|
@ -15,13 +13,15 @@ import {
|
||||||
WorkflowSubscription,
|
WorkflowSubscription,
|
||||||
} from '../../models/graphql/workflowData';
|
} from '../../models/graphql/workflowData';
|
||||||
import { RootState } from '../../redux/reducers';
|
import { RootState } from '../../redux/reducers';
|
||||||
|
import ArgoWorkflow from '../../views/WorkflowDetails/ArgoWorkflow';
|
||||||
|
import WorkflowInfo from '../../views/WorkflowDetails/WorkflowInfo';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
const WorkflowDetails: React.FC = () => {
|
const WorkflowDetails: React.FC = () => {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
const { pathname } = useLocation();
|
const { pathname } = useLocation();
|
||||||
// Getting the workflow nome from the pathname
|
// Getting the workflow nome from the pathname
|
||||||
const workflowRunId = pathname.split('/')[2];
|
const workflowRunId = pathname.split('/')[3];
|
||||||
|
|
||||||
// get ProjectID
|
// get ProjectID
|
||||||
const selectedProjectID = useSelector(
|
const selectedProjectID = useSelector(
|
||||||
|
|
|
@ -1,21 +1,28 @@
|
||||||
import { AppBar, Typography } from '@material-ui/core';
|
import { AppBar, Typography } from '@material-ui/core';
|
||||||
import Tabs from '@material-ui/core/Tabs';
|
import Tabs from '@material-ui/core/Tabs';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import { useSelector } from 'react-redux';
|
||||||
import ButtonFilled from '../../components/Button/ButtonFilled';
|
import ButtonFilled from '../../components/Button/ButtonFilled';
|
||||||
import BrowseSchedule from '../../components/Sections/ChaosWorkflows/BrowseSchedule';
|
|
||||||
import BrowseWorkflow from '../../components/Sections/ChaosWorkflows/BrowseWorkflow';
|
|
||||||
import Templates from '../../components/Sections/ChaosWorkflows/Templates';
|
|
||||||
import { StyledTab, TabPanel } from '../../components/Tabs';
|
import { StyledTab, TabPanel } from '../../components/Tabs';
|
||||||
|
import Center from '../../containers/layouts/Center';
|
||||||
import Scaffold from '../../containers/layouts/Scaffold';
|
import Scaffold from '../../containers/layouts/Scaffold';
|
||||||
|
import useActions from '../../redux/actions';
|
||||||
|
import * as TabActions from '../../redux/actions/tabs';
|
||||||
import { history } from '../../redux/configureStore';
|
import { history } from '../../redux/configureStore';
|
||||||
|
import { RootState } from '../../redux/reducers';
|
||||||
|
import BrowseWorkflow from '../../views/ChaosWorkflows/BrowseWorkflow';
|
||||||
|
import Templates from '../../views/ChaosWorkflows/Templates';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
const Workflows = () => {
|
const Workflows = () => {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
const [value, setValue] = React.useState(0);
|
const workflowTabValue = useSelector(
|
||||||
|
(state: RootState) => state.tabNumber.workflows
|
||||||
|
);
|
||||||
|
const tabs = useActions(TabActions);
|
||||||
|
|
||||||
const handleChange = (event: React.ChangeEvent<{}>, newValue: number) => {
|
const handleChange = (event: React.ChangeEvent<{}>, newValue: number) => {
|
||||||
setValue(newValue);
|
tabs.changeWorkflowsTabs(newValue);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -35,7 +42,7 @@ const Workflows = () => {
|
||||||
</section>
|
</section>
|
||||||
<AppBar position="static" color="default" className={classes.appBar}>
|
<AppBar position="static" color="default" className={classes.appBar}>
|
||||||
<Tabs
|
<Tabs
|
||||||
value={value}
|
value={workflowTabValue}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
indicatorColor="secondary"
|
indicatorColor="secondary"
|
||||||
textColor="secondary"
|
textColor="secondary"
|
||||||
|
@ -47,17 +54,26 @@ const Workflows = () => {
|
||||||
<StyledTab label="Analytics" />
|
<StyledTab label="Analytics" />
|
||||||
</Tabs>
|
</Tabs>
|
||||||
</AppBar>
|
</AppBar>
|
||||||
<TabPanel value={value} index={0}>
|
<TabPanel value={workflowTabValue} index={0}>
|
||||||
<BrowseWorkflow />
|
<BrowseWorkflow />
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
<TabPanel value={value} index={1}>
|
<TabPanel value={workflowTabValue} index={1}>
|
||||||
<BrowseSchedule />
|
{/* <BrowseSchedule /> */}
|
||||||
|
<Center>
|
||||||
|
<Typography variant="h3" align="center">
|
||||||
|
Schedule comming soon
|
||||||
|
</Typography>
|
||||||
|
</Center>
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
<TabPanel value={value} index={2}>
|
<TabPanel value={workflowTabValue} index={2}>
|
||||||
<Templates />
|
<Templates />
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
<TabPanel value={value} index={3}>
|
<TabPanel value={workflowTabValue} index={3}>
|
||||||
Analytics comming soon
|
<Center>
|
||||||
|
<Typography variant="h3" align="center">
|
||||||
|
Analytics comming soon
|
||||||
|
</Typography>
|
||||||
|
</Center>
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
</Scaffold>
|
</Scaffold>
|
||||||
);
|
);
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
import { TabAction, TabActions } from '../../models/redux/tabs';
|
||||||
|
|
||||||
|
export function changeWorkflowsTabs(tabNumber: number): TabAction {
|
||||||
|
return {
|
||||||
|
type: TabActions.CHANGE_WORKFLOWS_TAB,
|
||||||
|
payload: tabNumber,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function changeSettingsTabs(tabNumber: number): TabAction {
|
||||||
|
return {
|
||||||
|
type: TabActions.CHANGE_SETTINGS_TAB,
|
||||||
|
payload: tabNumber,
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,10 +1,12 @@
|
||||||
import { combineReducers } from 'redux';
|
import { combineReducers } from 'redux';
|
||||||
import { Node } from '../../models/graphql/workflowData';
|
import { Node } from '../../models/graphql/workflowData';
|
||||||
import { CommunityData } from '../../models/redux/analytics';
|
import { CommunityData } from '../../models/redux/analytics';
|
||||||
|
import { TabState } from '../../models/redux/tabs';
|
||||||
import { UserData } from '../../models/redux/user';
|
import { UserData } from '../../models/redux/user';
|
||||||
import { WorkflowData } from '../../models/redux/workflow';
|
import { WorkflowData } from '../../models/redux/workflow';
|
||||||
import * as analyticsReducer from './analytics';
|
import * as analyticsReducer from './analytics';
|
||||||
import * as nodeSelectionReducer from './nodeSelection';
|
import * as nodeSelectionReducer from './nodeSelection';
|
||||||
|
import * as tabsReducer from './tabs';
|
||||||
import * as userReducer from './user';
|
import * as userReducer from './user';
|
||||||
import * as workflowReducer from './workflow';
|
import * as workflowReducer from './workflow';
|
||||||
|
|
||||||
|
@ -13,6 +15,7 @@ export interface RootState {
|
||||||
userData: UserData;
|
userData: UserData;
|
||||||
workflowData: WorkflowData;
|
workflowData: WorkflowData;
|
||||||
selectedNode: Node;
|
selectedNode: Node;
|
||||||
|
tabNumber: TabState;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default () =>
|
export default () =>
|
||||||
|
@ -21,4 +24,5 @@ export default () =>
|
||||||
...userReducer,
|
...userReducer,
|
||||||
...workflowReducer,
|
...workflowReducer,
|
||||||
...nodeSelectionReducer,
|
...nodeSelectionReducer,
|
||||||
|
...tabsReducer,
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/* eslint-disable import/prefer-default-export */
|
||||||
|
import { TabAction, TabActions, TabState } from '../../models/redux/tabs';
|
||||||
|
import createReducer from './createReducer';
|
||||||
|
|
||||||
|
const initialState: TabState = {
|
||||||
|
workflows: 0,
|
||||||
|
settings: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const tabNumber = createReducer<TabState>(initialState, {
|
||||||
|
[TabActions.CHANGE_WORKFLOWS_TAB](state: TabState, action: TabAction) {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
workflows: action.payload,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
[TabActions.CHANGE_SETTINGS_TAB](state: TabState, action: TabAction) {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
settings: action.payload,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default tabNumber;
|
|
@ -12,8 +12,8 @@ import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';
|
||||||
import MoreVertIcon from '@material-ui/icons/MoreVert';
|
import MoreVertIcon from '@material-ui/icons/MoreVert';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { WorkflowRun } from '../../../../models/graphql/workflowData';
|
import { WorkflowRun } from '../../../models/graphql/workflowData';
|
||||||
import { history } from '../../../../redux/configureStore';
|
import { history } from '../../../redux/configureStore';
|
||||||
import LinearProgressBar from '../../ReturningHome/ProgressBar/LinearProgressBar';
|
import LinearProgressBar from '../../ReturningHome/ProgressBar/LinearProgressBar';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ const TableData: React.FC<TableDataProps> = ({ data, deleteRow }) => {
|
||||||
];
|
];
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<TableCell align="center" className={classes.workflowNameData}>
|
<TableCell className={classes.workflowNameData}>
|
||||||
<Typography>
|
<Typography>
|
||||||
<strong>{data.workflow_name}</strong>
|
<strong>{data.workflow_name}</strong>
|
||||||
</Typography>
|
</Typography>
|
||||||
|
@ -170,7 +170,7 @@ const TableData: React.FC<TableDataProps> = ({ data, deleteRow }) => {
|
||||||
<MenuItem
|
<MenuItem
|
||||||
value="Workflow"
|
value="Workflow"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
history.push(`/workflows/${data.workflow_run_id}/schedule`)
|
history.push(`/workflows/schedule/${data.workflow_run_id}`)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<div className={classes.expDiv}>
|
<div className={classes.expDiv}>
|
|
@ -21,21 +21,21 @@ import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
||||||
import SearchIcon from '@material-ui/icons/Search';
|
import SearchIcon from '@material-ui/icons/Search';
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { WORKFLOW_DETAILS } from '../../../../graphql';
|
import Loader from '../../../components/Loader';
|
||||||
|
import { WORKFLOW_DETAILS } from '../../../graphql';
|
||||||
import {
|
import {
|
||||||
ExecutionData,
|
ExecutionData,
|
||||||
Workflow,
|
Workflow,
|
||||||
WorkflowDataVars,
|
WorkflowDataVars,
|
||||||
WorkflowRun,
|
WorkflowRun,
|
||||||
} from '../../../../models/graphql/workflowData';
|
} from '../../../models/graphql/workflowData';
|
||||||
import { RootState } from '../../../../redux/reducers';
|
import { RootState } from '../../../redux/reducers';
|
||||||
import {
|
import {
|
||||||
sortAlphaAsc,
|
sortAlphaAsc,
|
||||||
sortAlphaDesc,
|
sortAlphaDesc,
|
||||||
sortNumAsc,
|
sortNumAsc,
|
||||||
sortNumDesc,
|
sortNumDesc,
|
||||||
} from '../../../../utils/sort';
|
} from '../../../utils/sort';
|
||||||
import Loader from '../../../Loader';
|
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
import TableData from './TableData';
|
import TableData from './TableData';
|
||||||
|
|
||||||
|
@ -159,8 +159,8 @@ const BrowseSchedule = () => {
|
||||||
className={classes.selectText}
|
className={classes.selectText}
|
||||||
>
|
>
|
||||||
<MenuItem value="All">All</MenuItem>
|
<MenuItem value="All">All</MenuItem>
|
||||||
<MenuItem value="Predefined">Cluset pre-defined</MenuItem>
|
<MenuItem value="Internal">Internal</MenuItem>
|
||||||
<MenuItem value="Kubernetes">Kubernetes Cluster</MenuItem>
|
<MenuItem value="External">External</MenuItem>
|
||||||
</Select>
|
</Select>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
</div>
|
</div>
|
|
@ -75,6 +75,7 @@ const useStyles = makeStyles((theme) => ({
|
||||||
marginLeft: theme.spacing(1.25),
|
marginLeft: theme.spacing(1.25),
|
||||||
},
|
},
|
||||||
workflowNameData: {
|
workflowNameData: {
|
||||||
|
maxWidth: '15.625rem',
|
||||||
borderRight: `1px solid ${theme.palette.customColors.black(0.1)}`,
|
borderRight: `1px solid ${theme.palette.customColors.black(0.1)}`,
|
||||||
},
|
},
|
||||||
regularity: {
|
regularity: {
|
|
@ -1,6 +1,6 @@
|
||||||
import React from 'react';
|
|
||||||
import { Typography } from '@material-ui/core';
|
import { Typography } from '@material-ui/core';
|
||||||
import AdjustedWeight from '../../../AdjustedWeights';
|
import React from 'react';
|
||||||
|
import AdjustedWeight from '../../../components/AdjustedWeights';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface ExperimentDetailsProps {
|
interface ExperimentDetailsProps {
|
|
@ -1,7 +1,7 @@
|
||||||
import React from 'react';
|
|
||||||
import { Typography } from '@material-ui/core';
|
import { Typography } from '@material-ui/core';
|
||||||
|
import React from 'react';
|
||||||
|
import capitalize from '../../../utils/capitalize';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
import capitalize from '../../../../utils/capitalize';
|
|
||||||
|
|
||||||
interface HeadProps {
|
interface HeadProps {
|
||||||
image?: string;
|
image?: string;
|
|
@ -1,11 +1,11 @@
|
||||||
import { Divider, Typography } from '@material-ui/core';
|
import { Divider, Typography } from '@material-ui/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Scaffold from '../../../../containers/layouts/Scaffold';
|
import ButtonFilled from '../../../components/Button/ButtonFilled';
|
||||||
import { preDefinedWorkflowData } from '../../../../models/predefinedWorkflow';
|
import ButtonOutlined from '../../../components/Button/ButtonOutline';
|
||||||
import { LocationState } from '../../../../models/routerModel';
|
import Scaffold from '../../../containers/layouts/Scaffold';
|
||||||
import { history } from '../../../../redux/configureStore';
|
import { preDefinedWorkflowData } from '../../../models/predefinedWorkflow';
|
||||||
import ButtonFilled from '../../../Button/ButtonFilled';
|
import { LocationState } from '../../../models/routerModel';
|
||||||
import ButtonOutlined from '../../../Button/ButtonOutline';
|
import { history } from '../../../redux/configureStore';
|
||||||
import ExperimentDetails from './ExperimentDetails';
|
import ExperimentDetails from './ExperimentDetails';
|
||||||
import Head from './Head';
|
import Head from './Head';
|
||||||
import Recommendation from './Recommendation';
|
import Recommendation from './Recommendation';
|
|
@ -1,23 +1,23 @@
|
||||||
import React, { useState } from 'react';
|
|
||||||
import {
|
import {
|
||||||
InputBase,
|
|
||||||
InputAdornment,
|
|
||||||
FormControl,
|
|
||||||
InputLabel,
|
|
||||||
Select,
|
|
||||||
MenuItem,
|
|
||||||
Typography,
|
|
||||||
IconButton,
|
|
||||||
Popover,
|
|
||||||
Button,
|
Button,
|
||||||
|
FormControl,
|
||||||
|
IconButton,
|
||||||
|
InputAdornment,
|
||||||
|
InputBase,
|
||||||
|
InputLabel,
|
||||||
|
MenuItem,
|
||||||
|
Popover,
|
||||||
|
Select,
|
||||||
|
Typography,
|
||||||
} from '@material-ui/core';
|
} from '@material-ui/core';
|
||||||
import SearchIcon from '@material-ui/icons/Search';
|
|
||||||
import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';
|
|
||||||
import ChevronRightIcon from '@material-ui/icons/ChevronRight';
|
import ChevronRightIcon from '@material-ui/icons/ChevronRight';
|
||||||
|
import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';
|
||||||
|
import SearchIcon from '@material-ui/icons/Search';
|
||||||
|
import React, { useState } from 'react';
|
||||||
import { DateRangePicker } from 'react-date-range';
|
import { DateRangePicker } from 'react-date-range';
|
||||||
import useStyles from './styles';
|
|
||||||
import 'react-date-range/dist/styles.css'; // main css file
|
import 'react-date-range/dist/styles.css'; // main css file
|
||||||
import 'react-date-range/dist/theme/default.css'; // theme css file
|
import 'react-date-range/dist/theme/default.css'; // theme css file
|
||||||
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface HeaderSectionProps {
|
interface HeaderSectionProps {
|
||||||
searchValue: string;
|
searchValue: string;
|
||||||
|
@ -130,8 +130,8 @@ const HeaderSection: React.FC<HeaderSectionProps> = ({
|
||||||
className={classes.selectText}
|
className={classes.selectText}
|
||||||
>
|
>
|
||||||
<MenuItem value="All">All</MenuItem>
|
<MenuItem value="All">All</MenuItem>
|
||||||
<MenuItem value="Predefined">Cluset pre-defined</MenuItem>
|
<MenuItem value="Internal">Internal</MenuItem>
|
||||||
<MenuItem value="Kubernetes">Kubernetes Cluster</MenuItem>
|
<MenuItem value="External">External</MenuItem>
|
||||||
</Select>
|
</Select>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
|
|
|
@ -10,9 +10,9 @@ import React from 'react';
|
||||||
import {
|
import {
|
||||||
ExecutionData,
|
ExecutionData,
|
||||||
WorkflowRun,
|
WorkflowRun,
|
||||||
} from '../../../../models/graphql/workflowData';
|
} from '../../../models/graphql/workflowData';
|
||||||
import { history } from '../../../../redux/configureStore';
|
import { history } from '../../../redux/configureStore';
|
||||||
import timeDifferenceForDate from '../../../../utils/datesModifier';
|
import timeDifferenceForDate from '../../../utils/datesModifier';
|
||||||
import LinearProgressBar from '../../ReturningHome/ProgressBar/LinearProgressBar';
|
import LinearProgressBar from '../../ReturningHome/ProgressBar/LinearProgressBar';
|
||||||
import CustomStatus from '../CustomStatus/Status';
|
import CustomStatus from '../CustomStatus/Status';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
@ -102,17 +102,17 @@ const TableData: React.FC<TableDataProps> = ({ data, exeData }) => {
|
||||||
<MenuItem
|
<MenuItem
|
||||||
value="Workflow"
|
value="Workflow"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
history.push(`/workflows/${data.workflow_run_id}/details`)
|
history.push(`/workflows/details/${data.workflow_run_id}`)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
Show the workflow
|
Show the workflow
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem value="Analysis" onClick={handleMenu}>
|
<MenuItem value="Analysis" onClick={handleMenu}>
|
||||||
Show the analysis
|
Show the analytics
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem value="Scheduler" onClick={handleMenu}>
|
{/* <MenuItem value="Scheduler" onClick={handleMenu}>
|
||||||
Show the scheduler
|
Show the scheduler
|
||||||
</MenuItem>
|
</MenuItem> */}
|
||||||
</Menu>
|
</Menu>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</>
|
</>
|
|
@ -15,21 +15,21 @@ import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { WORKFLOW_DETAILS, WORKFLOW_EVENTS } from '../../../../graphql';
|
import { WORKFLOW_DETAILS, WORKFLOW_EVENTS } from '../../../graphql';
|
||||||
import {
|
import {
|
||||||
ExecutionData,
|
ExecutionData,
|
||||||
Workflow,
|
Workflow,
|
||||||
WorkflowDataVars,
|
WorkflowDataVars,
|
||||||
WorkflowRun,
|
WorkflowRun,
|
||||||
WorkflowSubscription,
|
WorkflowSubscription,
|
||||||
} from '../../../../models/graphql/workflowData';
|
} from '../../../models/graphql/workflowData';
|
||||||
import { RootState } from '../../../../redux/reducers';
|
import { RootState } from '../../../redux/reducers';
|
||||||
import {
|
import {
|
||||||
sortAlphaAsc,
|
sortAlphaAsc,
|
||||||
sortAlphaDesc,
|
sortAlphaDesc,
|
||||||
sortNumAsc,
|
sortNumAsc,
|
||||||
sortNumDesc,
|
sortNumDesc,
|
||||||
} from '../../../../utils/sort';
|
} from '../../../utils/sort';
|
||||||
import HeaderSection from './HeaderSection';
|
import HeaderSection from './HeaderSection';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
import TableData from './TableData';
|
import TableData from './TableData';
|
||||||
|
@ -156,7 +156,7 @@ const BrowseWorkflow = () => {
|
||||||
.filter((dataRow) =>
|
.filter((dataRow) =>
|
||||||
filters.cluster === 'All'
|
filters.cluster === 'All'
|
||||||
? true
|
? true
|
||||||
: dataRow.cluster_name.toLowerCase().includes(filters.cluster)
|
: dataRow.cluster_name.includes(filters.cluster)
|
||||||
)
|
)
|
||||||
.filter((dataRow) => {
|
.filter((dataRow) => {
|
||||||
return dateRange.fromDate && dateRange.toDate === undefined
|
return dateRange.fromDate && dateRange.toDate === undefined
|
|
@ -87,6 +87,7 @@ const useStyles = makeStyles((theme) => ({
|
||||||
marginLeft: theme.spacing(5.625),
|
marginLeft: theme.spacing(5.625),
|
||||||
},
|
},
|
||||||
workflowNameData: {
|
workflowNameData: {
|
||||||
|
maxWidth: '15.625rem',
|
||||||
borderRight: `1px solid ${theme.palette.customColors.black(0.1)}`,
|
borderRight: `1px solid ${theme.palette.customColors.black(0.1)}`,
|
||||||
},
|
},
|
||||||
targetCluster: {
|
targetCluster: {
|
|
@ -1,8 +1,8 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { history } from '../../../../redux/configureStore';
|
import PredifinedWorkflows from '../../../components/PredifinedWorkflows';
|
||||||
import parsed from '../../../../utils/yamlUtils';
|
import workflowData from '../../../components/PredifinedWorkflows/data';
|
||||||
import PredifinedWorkflows from '../../../PredifinedWorkflows';
|
import { history } from '../../../redux/configureStore';
|
||||||
import workflowData from '../../../PredifinedWorkflows/data';
|
import parsed from '../../../utils/yamlUtils';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
const Templates = () => {
|
const Templates = () => {
|
||||||
|
@ -24,7 +24,7 @@ const Templates = () => {
|
||||||
testWeights.push(10);
|
testWeights.push(10);
|
||||||
});
|
});
|
||||||
history.push({
|
history.push({
|
||||||
pathname: `/workflows/${workflowData[index].title}/template`,
|
pathname: `/workflows/template/${workflowData[index].title}`,
|
||||||
state: {
|
state: {
|
||||||
workflowData: workflowData[index],
|
workflowData: workflowData[index],
|
||||||
testNames,
|
testNames,
|
|
@ -1,13 +1,13 @@
|
||||||
/* eslint-disable no-empty-pattern */
|
/* eslint-disable no-empty-pattern */
|
||||||
/* eslint-disable no-return-assign */
|
/* eslint-disable no-return-assign */
|
||||||
/* eslint-disable no-param-reassign */
|
/* eslint-disable no-param-reassign */
|
||||||
import React, { useEffect } from 'react';
|
import { FormControl, InputLabel, MenuItem, Select } from '@material-ui/core';
|
||||||
import Plotly from 'plotly.js';
|
import Plotly from 'plotly.js';
|
||||||
|
import { string } from 'prop-types';
|
||||||
|
import React, { useEffect } from 'react';
|
||||||
import createPlotlyComponent from 'react-plotly.js/factory';
|
import createPlotlyComponent from 'react-plotly.js/factory';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { FormControl, InputLabel, MenuItem, Select } from '@material-ui/core';
|
import { RootState } from '../../../redux/reducers';
|
||||||
import { string } from 'prop-types';
|
|
||||||
import { RootState } from '../../../../redux/reducers';
|
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
const Plot = createPlotlyComponent(Plotly);
|
const Plot = createPlotlyComponent(Plotly);
|
|
@ -7,7 +7,7 @@ import {
|
||||||
Marker,
|
Marker,
|
||||||
ZoomableGroup,
|
ZoomableGroup,
|
||||||
} from 'react-simple-maps';
|
} from 'react-simple-maps';
|
||||||
import { RootState } from '../../../../redux/reducers';
|
import { RootState } from '../../../redux/reducers';
|
||||||
import datageo from './geo.json';
|
import datageo from './geo.json';
|
||||||
|
|
||||||
const geoUrl = datageo;
|
const geoUrl = datageo;
|
|
@ -1,7 +1,7 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Chart from 'react-google-charts';
|
import Chart from 'react-google-charts';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { RootState } from '../../../../redux/reducers';
|
import { RootState } from '../../../redux/reducers';
|
||||||
|
|
||||||
/* Country geo Map is used for location of users with Country and
|
/* Country geo Map is used for location of users with Country and
|
||||||
respective count of users wise to present it on map */
|
respective count of users wise to present it on map */
|
|
@ -1,5 +1,5 @@
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import BinarySwitch from '../../../Button/BinarySwitch';
|
import BinarySwitch from '../../../components/Button/BinarySwitch';
|
||||||
import CityMap from './CityMap';
|
import CityMap from './CityMap';
|
||||||
import CountryMap from './CountryMap';
|
import CountryMap from './CountryMap';
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import React, { useState, useEffect } from 'react';
|
|
||||||
import { Typography } from '@material-ui/core';
|
import { Typography } from '@material-ui/core';
|
||||||
import Divider from '@material-ui/core/Divider';
|
import Divider from '@material-ui/core/Divider';
|
||||||
|
import React, { useEffect, useState } from 'react';
|
||||||
|
import ButtonFilled from '../../../components/Button/ButtonFilled';
|
||||||
|
import ButtonOutline from '../../../components/Button/ButtonOutline';
|
||||||
|
import PredifinedWorkflows from '../../../components/PredifinedWorkflows';
|
||||||
|
import workflowsList from '../../../components/PredifinedWorkflows/data';
|
||||||
|
import Unimodal from '../../../containers/layouts/Unimodal';
|
||||||
|
import useActions from '../../../redux/actions';
|
||||||
|
import * as WorkflowActions from '../../../redux/actions/workflow';
|
||||||
import useStyles, { CssTextField } from './styles';
|
import useStyles, { CssTextField } from './styles';
|
||||||
import useActions from '../../../../redux/actions';
|
|
||||||
import * as WorkflowActions from '../../../../redux/actions/workflow';
|
|
||||||
import PredifinedWorkflows from '../../../PredifinedWorkflows';
|
|
||||||
import workflowsList from '../../../PredifinedWorkflows/data';
|
|
||||||
import Unimodal from '../../../../containers/layouts/Unimodal';
|
|
||||||
import ButtonFilled from '../../../Button/ButtonFilled';
|
|
||||||
import ButtonOutline from '../../../Button/ButtonOutline';
|
|
||||||
// import { getWkfRunCount } from "../../utils";
|
// import { getWkfRunCount } from "../../utils";
|
||||||
|
|
||||||
const ChooseWorkflow: React.FC = () => {
|
const ChooseWorkflow: React.FC = () => {
|
|
@ -6,11 +6,11 @@ import TableContainer from '@material-ui/core/TableContainer';
|
||||||
import TableHead from '@material-ui/core/TableHead';
|
import TableHead from '@material-ui/core/TableHead';
|
||||||
import TableRow from '@material-ui/core/TableRow';
|
import TableRow from '@material-ui/core/TableRow';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import InfoTooltip from '../../../components/InfoTooltip';
|
||||||
|
import Center from '../../../containers/layouts/Center';
|
||||||
import LinearProgressBar from '../../ReturningHome/ProgressBar/LinearProgressBar';
|
import LinearProgressBar from '../../ReturningHome/ProgressBar/LinearProgressBar';
|
||||||
import ToggleComponent from '../ToggleComponent';
|
import ToggleComponent from '../ToggleComponent';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
import InfoTooltip from '../../../InfoTooltip';
|
|
||||||
import Center from '../../../../containers/layouts/Center';
|
|
||||||
|
|
||||||
function createData(
|
function createData(
|
||||||
name: string,
|
name: string,
|
|
@ -1,18 +1,18 @@
|
||||||
import { Typography } from '@material-ui/core';
|
import { Typography } from '@material-ui/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import Center from '../../../../containers/layouts/Center';
|
import ButtonFilled from '../../../components/Button/ButtonFilled';
|
||||||
import Unimodal from '../../../../containers/layouts/Unimodal';
|
import ButtonOutline from '../../../components/Button/ButtonOutline';
|
||||||
import { experimentMap, WorkflowData } from '../../../../models/redux/workflow';
|
import Center from '../../../containers/layouts/Center';
|
||||||
import useActions from '../../../../redux/actions';
|
import Unimodal from '../../../containers/layouts/Unimodal';
|
||||||
import * as WorkflowActions from '../../../../redux/actions/workflow';
|
import { experimentMap, WorkflowData } from '../../../models/redux/workflow';
|
||||||
import { RootState } from '../../../../redux/reducers';
|
import useActions from '../../../redux/actions';
|
||||||
import ButtonFilled from '../../../Button/ButtonFilled';
|
import * as WorkflowActions from '../../../redux/actions/workflow';
|
||||||
import ButtonOutline from '../../../Button/ButtonOutline';
|
import { RootState } from '../../../redux/reducers';
|
||||||
import InfoTooltip from '../../../InfoTooltip';
|
|
||||||
import WeightSlider from '../WeightSlider';
|
import WeightSlider from '../WeightSlider';
|
||||||
import ResultTable from './ResultTable';
|
import ResultTable from './ResultTable';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
// import InfoTooltip from '../../../components/InfoTooltip';
|
||||||
|
|
||||||
const ReliablityScore = () => {
|
const ReliablityScore = () => {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
|
@ -99,9 +99,9 @@ const ReliablityScore = () => {
|
||||||
</Typography>
|
</Typography>
|
||||||
</div>
|
</div>
|
||||||
</ButtonOutline>
|
</ButtonOutline>
|
||||||
<div className={classes.toolTipDiv}>
|
{/* <div className={classes.toolTipDiv}>
|
||||||
<InfoTooltip value="Text Default" />
|
<InfoTooltip value="Text Default" />
|
||||||
</div>
|
</div> */}
|
||||||
<Unimodal
|
<Unimodal
|
||||||
isOpen={open}
|
isOpen={open}
|
||||||
handleClose={() => setOpen(false)}
|
handleClose={() => setOpen(false)}
|
|
@ -8,8 +8,8 @@ import {
|
||||||
Typography,
|
Typography,
|
||||||
} from '@material-ui/core';
|
} from '@material-ui/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import CustomDate from '../../../DateTime/CustomDate/index';
|
import CustomDate from '../../../components/DateTime/CustomDate/index';
|
||||||
import CustomTime from '../../../DateTime/CustomTime/index';
|
import CustomTime from '../../../components/DateTime/CustomTime/index';
|
||||||
import SetTime from './SetTime/index';
|
import SetTime from './SetTime/index';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
|
@ -3,12 +3,12 @@ import Divider from '@material-ui/core/Divider';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import YAML from 'yaml';
|
import YAML from 'yaml';
|
||||||
import { WorkflowData } from '../../../../models/redux/workflow';
|
import Loader from '../../../components/Loader';
|
||||||
import useActions from '../../../../redux/actions';
|
import YamlEditor from '../../../components/YamlEditor/Editor';
|
||||||
import * as WorkflowActions from '../../../../redux/actions/workflow';
|
import { WorkflowData } from '../../../models/redux/workflow';
|
||||||
import { RootState } from '../../../../redux/reducers';
|
import useActions from '../../../redux/actions';
|
||||||
import Loader from '../../../Loader';
|
import * as WorkflowActions from '../../../redux/actions/workflow';
|
||||||
import YamlEditor from '../../../YamlEditor/Editor';
|
import { RootState } from '../../../redux/reducers';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
const TuneWorkflow: React.FC = () => {
|
const TuneWorkflow: React.FC = () => {
|
|
@ -1,22 +1,22 @@
|
||||||
import { Divider, Typography } from '@material-ui/core';
|
import { Divider, Typography } from '@material-ui/core';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import Unimodal from '../../../../containers/layouts/Unimodal';
|
import AdjustedWeights from '../../../components/AdjustedWeights';
|
||||||
import { experimentMap, WorkflowData } from '../../../../models/redux/workflow';
|
import ButtonFilled from '../../../components/Button/ButtonFilled';
|
||||||
import useActions from '../../../../redux/actions';
|
import ButtonOutline from '../../../components/Button/ButtonOutline/index';
|
||||||
import * as WorkflowActions from '../../../../redux/actions/workflow';
|
import CustomText from '../../../components/CustomText';
|
||||||
import { RootState } from '../../../../redux/reducers';
|
import CustomDate from '../../../components/DateTime/CustomDate';
|
||||||
import AdjustedWeights from '../../../AdjustedWeights';
|
import CustomTime from '../../../components/DateTime/CustomTime';
|
||||||
import ButtonFilled from '../../../Button/ButtonFilled';
|
import YamlEditor from '../../../components/YamlEditor/Editor';
|
||||||
import ButtonOutline from '../../../Button/ButtonOutline/index';
|
|
||||||
import CustomText from '../../../CustomText';
|
|
||||||
import CustomDate from '../../../DateTime/CustomDate';
|
|
||||||
import CustomTime from '../../../DateTime/CustomTime';
|
|
||||||
import YamlEditor from '../../../YamlEditor/Editor';
|
|
||||||
import {
|
import {
|
||||||
AceValidations,
|
AceValidations,
|
||||||
parseYamlValidations,
|
parseYamlValidations,
|
||||||
} from '../../../YamlEditor/Validations';
|
} from '../../../components/YamlEditor/Validations';
|
||||||
|
import Unimodal from '../../../containers/layouts/Unimodal';
|
||||||
|
import { experimentMap, WorkflowData } from '../../../models/redux/workflow';
|
||||||
|
import useActions from '../../../redux/actions';
|
||||||
|
import * as WorkflowActions from '../../../redux/actions/workflow';
|
||||||
|
import { RootState } from '../../../redux/reducers';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface VerifyCommitProps {
|
interface VerifyCommitProps {
|
|
@ -3,18 +3,18 @@ import {
|
||||||
FormControl,
|
FormControl,
|
||||||
FormControlLabel,
|
FormControlLabel,
|
||||||
RadioGroup,
|
RadioGroup,
|
||||||
Typography,
|
|
||||||
Snackbar,
|
Snackbar,
|
||||||
|
Typography,
|
||||||
} from '@material-ui/core';
|
} from '@material-ui/core';
|
||||||
import Radio from '@material-ui/core/Radio';
|
import Radio from '@material-ui/core/Radio';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { GET_CLUSTER } from '../../../../graphql';
|
import ButtonFilled from '../../../components/Button/ButtonFilled';
|
||||||
import useActions from '../../../../redux/actions';
|
import ButtonOutLine from '../../../components/Button/ButtonOutline';
|
||||||
import * as WorkflowActions from '../../../../redux/actions/workflow';
|
import { GET_CLUSTER } from '../../../graphql';
|
||||||
import { RootState } from '../../../../redux/reducers';
|
import useActions from '../../../redux/actions';
|
||||||
import ButtonFilled from '../../../Button/ButtonFilled';
|
import * as WorkflowActions from '../../../redux/actions/workflow';
|
||||||
import ButtonOutLine from '../../../Button/ButtonOutline';
|
import { RootState } from '../../../redux/reducers';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
/*
|
/*
|
|
@ -1,11 +1,11 @@
|
||||||
import { Button, Divider, Typography } from '@material-ui/core';
|
import { Button, Divider, Typography } from '@material-ui/core';
|
||||||
import React, { useRef } from 'react';
|
import React, { useRef } from 'react';
|
||||||
import Unimodal from '../../../../../containers/layouts/Unimodal';
|
import InputField from '../../../../components/InputField';
|
||||||
|
import Unimodal from '../../../../containers/layouts/Unimodal';
|
||||||
import {
|
import {
|
||||||
validateConfirmPassword,
|
validateConfirmPassword,
|
||||||
validateStartEmptySpacing,
|
validateStartEmptySpacing,
|
||||||
} from '../../../../../utils/validate';
|
} from '../../../../utils/validate';
|
||||||
import InputField from '../../../../InputField';
|
|
||||||
import PersonalDetails from '../PersonalDetails';
|
import PersonalDetails from '../PersonalDetails';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
|
@ -2,13 +2,13 @@ import { useQuery } from '@apollo/client';
|
||||||
import { Button, Typography } from '@material-ui/core';
|
import { Button, Typography } from '@material-ui/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import Unimodal from '../../../../../containers/layouts/Unimodal';
|
import Unimodal from '../../../../containers/layouts/Unimodal';
|
||||||
import { GET_USER } from '../../../../../graphql';
|
import { GET_USER } from '../../../../graphql';
|
||||||
import {
|
import {
|
||||||
CurrentUserDedtailsVars,
|
CurrentUserDedtailsVars,
|
||||||
CurrentUserDetails,
|
CurrentUserDetails,
|
||||||
} from '../../../../../models/graphql/user';
|
} from '../../../../models/graphql/user';
|
||||||
import { RootState } from '../../../../../redux/reducers';
|
import { RootState } from '../../../../redux/reducers';
|
||||||
import UserDetails from '../../UserManagementTab/CreateUser/UserDetails';
|
import UserDetails from '../../UserManagementTab/CreateUser/UserDetails';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
|
@ -9,20 +9,20 @@ import {
|
||||||
} from '@material-ui/core';
|
} from '@material-ui/core';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
|
import ButtonFilled from '../../../../../components/Button/ButtonFilled';
|
||||||
|
import ButtonOutline from '../../../../../components/Button/ButtonOutline';
|
||||||
import {
|
import {
|
||||||
ACCEPT_INVITE,
|
ACCEPT_INVITE,
|
||||||
DECLINE_INVITE,
|
DECLINE_INVITE,
|
||||||
GET_USER,
|
GET_USER,
|
||||||
} from '../../../../../../graphql';
|
} from '../../../../../graphql';
|
||||||
import { MemberInvitation } from '../../../../../../models/graphql/invite';
|
import { MemberInvitation } from '../../../../../models/graphql/invite';
|
||||||
import {
|
import {
|
||||||
CurrentUserDedtailsVars,
|
CurrentUserDedtailsVars,
|
||||||
CurrentUserDetails,
|
CurrentUserDetails,
|
||||||
} from '../../../../../../models/graphql/user';
|
} from '../../../../../models/graphql/user';
|
||||||
import { RootState } from '../../../../../../redux/reducers';
|
import { RootState } from '../../../../../redux/reducers';
|
||||||
import userAvatar from '../../../../../../utils/user';
|
import userAvatar from '../../../../../utils/user';
|
||||||
import ButtonFilled from '../../../../../Button/ButtonFilled';
|
|
||||||
import ButtonOutline from '../../../../../Button/ButtonOutline';
|
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface ReceivedInvitation {
|
interface ReceivedInvitation {
|
||||||
|
@ -46,11 +46,7 @@ const ReceivedInvitations: React.FC = () => {
|
||||||
// mutation to accept the invitation
|
// mutation to accept the invitation
|
||||||
const [acceptInvite] = useMutation<MemberInvitation>(ACCEPT_INVITE, {
|
const [acceptInvite] = useMutation<MemberInvitation>(ACCEPT_INVITE, {
|
||||||
onCompleted: () => {
|
onCompleted: () => {
|
||||||
setRows(
|
setRows(rows.filter((row) => row.username !== acceptDecline));
|
||||||
rows.filter(function (row) {
|
|
||||||
return row.username !== acceptDecline;
|
|
||||||
})
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
onError: () => {},
|
onError: () => {},
|
||||||
refetchQueries: [{ query: GET_USER, variables: { username } }],
|
refetchQueries: [{ query: GET_USER, variables: { username } }],
|
||||||
|
@ -59,11 +55,7 @@ const ReceivedInvitations: React.FC = () => {
|
||||||
// mutation to decline the invitation
|
// mutation to decline the invitation
|
||||||
const [declineInvite] = useMutation<MemberInvitation>(DECLINE_INVITE, {
|
const [declineInvite] = useMutation<MemberInvitation>(DECLINE_INVITE, {
|
||||||
onCompleted: () => {
|
onCompleted: () => {
|
||||||
setRows(
|
setRows(rows.filter((row) => row.username !== acceptDecline));
|
||||||
rows.filter(function (row) {
|
|
||||||
return row.username !== acceptDecline;
|
|
||||||
})
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
onError: () => {},
|
onError: () => {},
|
||||||
refetchQueries: [{ query: GET_USER, variables: { username } }],
|
refetchQueries: [{ query: GET_USER, variables: { username } }],
|
||||||
|
@ -78,7 +70,7 @@ const ReceivedInvitations: React.FC = () => {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (data?.getUser.username === username) {
|
if (data?.getUser.username === username) {
|
||||||
const projectList = data?.getUser.projects;
|
const projectList = data?.getUser.projects;
|
||||||
let users: ReceivedInvitation[] = [];
|
const users: ReceivedInvitation[] = [];
|
||||||
|
|
||||||
let flag = 0;
|
let flag = 0;
|
||||||
|
|
||||||
|
@ -95,7 +87,7 @@ const ReceivedInvitations: React.FC = () => {
|
||||||
if (flag === 1) {
|
if (flag === 1) {
|
||||||
project.members.forEach((member) => {
|
project.members.forEach((member) => {
|
||||||
if (member.user_name !== username && member.role === 'Owner') {
|
if (member.user_name !== username && member.role === 'Owner') {
|
||||||
users = users.concat(rows, {
|
users.push({
|
||||||
username: member.user_name,
|
username: member.user_name,
|
||||||
role: member.role,
|
role: member.role,
|
||||||
projectName: project.name,
|
projectName: project.name,
|
|
@ -9,15 +9,15 @@ import {
|
||||||
} from '@material-ui/core';
|
} from '@material-ui/core';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { GET_USER } from '../../../../../../graphql';
|
import ButtonFilled from '../../../../../components/Button/ButtonFilled';
|
||||||
|
import { GET_USER } from '../../../../../graphql';
|
||||||
import {
|
import {
|
||||||
CurrentUserDedtailsVars,
|
CurrentUserDedtailsVars,
|
||||||
CurrentUserDetails,
|
CurrentUserDetails,
|
||||||
Member,
|
Member,
|
||||||
} from '../../../../../../models/graphql/user';
|
} from '../../../../../models/graphql/user';
|
||||||
import { RootState } from '../../../../../../redux/reducers';
|
import { RootState } from '../../../../../redux/reducers';
|
||||||
import userAvatar from '../../../../../../utils/user';
|
import userAvatar from '../../../../../utils/user';
|
||||||
import ButtonFilled from '../../../../../Button/ButtonFilled';
|
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
const SentInvitations: React.FC = () => {
|
const SentInvitations: React.FC = () => {
|
||||||
|
@ -34,7 +34,7 @@ const SentInvitations: React.FC = () => {
|
||||||
);
|
);
|
||||||
|
|
||||||
let memberList: Member[];
|
let memberList: Member[];
|
||||||
let users: Member[] = [];
|
const users: Member[] = [];
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (data?.getUser.username === userData.username) {
|
if (data?.getUser.username === userData.username) {
|
||||||
const projectList = data?.getUser.projects;
|
const projectList = data?.getUser.projects;
|
||||||
|
@ -47,12 +47,12 @@ const SentInvitations: React.FC = () => {
|
||||||
|
|
||||||
memberList.forEach((member) => {
|
memberList.forEach((member) => {
|
||||||
if (member.invitation === 'Pending') {
|
if (member.invitation === 'Pending') {
|
||||||
users = users.concat(rows, member);
|
users.push(member);
|
||||||
}
|
}
|
||||||
setRows(users);
|
setRows(users);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, [data]);
|
}, [data, userData.selectedProjectID]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
|
@ -1,7 +1,7 @@
|
||||||
import { Box, Paper, Tab, Tabs, Typography } from '@material-ui/core';
|
import { Box, Paper, Tab, Tabs, Typography } from '@material-ui/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Unimodal from '../../../../../containers/layouts/Unimodal';
|
import ButtonOutline from '../../../../components/Button/ButtonOutline';
|
||||||
import ButtonOutline from '../../../../Button/ButtonOutline';
|
import Unimodal from '../../../../containers/layouts/Unimodal';
|
||||||
import ReceivedInvitations from './ReceivedInvitations';
|
import ReceivedInvitations from './ReceivedInvitations';
|
||||||
import SentInvitations from './SentInvitations';
|
import SentInvitations from './SentInvitations';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
|
@ -8,13 +8,14 @@ import {
|
||||||
Typography,
|
Typography,
|
||||||
} from '@material-ui/core';
|
} from '@material-ui/core';
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import userAvatar from '../../../../../../utils/user';
|
import { UserInvite } from '../../../../../models/graphql/invite';
|
||||||
|
import userAvatar from '../../../../../utils/user';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface TableDataProps {
|
interface TableDataProps {
|
||||||
row: any;
|
row: UserInvite;
|
||||||
labelId: string;
|
labelId: string;
|
||||||
handleCheck: (event: React.MouseEvent<unknown>, name: any) => void;
|
handleCheck: (event: React.MouseEvent<unknown>, row: UserInvite) => void;
|
||||||
isItemSelected: boolean;
|
isItemSelected: boolean;
|
||||||
sendInvite: (username: string, role: string) => void;
|
sendInvite: (username: string, role: string) => void;
|
||||||
}
|
}
|
|
@ -11,26 +11,22 @@ import {
|
||||||
} from '@material-ui/core';
|
} from '@material-ui/core';
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { ALL_USERS, GET_USER, SEND_INVITE } from '../../../../../../graphql';
|
import ButtonFilled from '../../../../../components/Button/ButtonFilled';
|
||||||
import { MemberInviteNew } from '../../../../../../models/graphql/invite';
|
import Loader from '../../../../../components/Loader';
|
||||||
|
import { ALL_USERS, GET_USER, SEND_INVITE } from '../../../../../graphql';
|
||||||
|
import {
|
||||||
|
MemberInviteNew,
|
||||||
|
UserInvite,
|
||||||
|
} from '../../../../../models/graphql/invite';
|
||||||
import {
|
import {
|
||||||
CurrentUserDedtailsVars,
|
CurrentUserDedtailsVars,
|
||||||
CurrentUserDetails,
|
CurrentUserDetails,
|
||||||
Project,
|
Project,
|
||||||
} from '../../../../../../models/graphql/user';
|
} from '../../../../../models/graphql/user';
|
||||||
import { RootState } from '../../../../../../redux/reducers';
|
import { RootState } from '../../../../../redux/reducers';
|
||||||
import ButtonFilled from '../../../../../Button/ButtonFilled';
|
|
||||||
import Loader from '../../../../../Loader';
|
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
import TableData from './TableData';
|
import TableData from './TableData';
|
||||||
|
|
||||||
interface UserInvite {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
username: string;
|
|
||||||
email: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface FilterOptions {
|
interface FilterOptions {
|
||||||
search: string;
|
search: string;
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Unimodal from '../../../../../containers/layouts/Unimodal';
|
import ButtonFilled from '../../../../components/Button/ButtonFilled';
|
||||||
import ButtonFilled from '../../../../Button/ButtonFilled';
|
import Unimodal from '../../../../containers/layouts/Unimodal';
|
||||||
import Invite from './Invite';
|
import Invite from './Invite';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
|
@ -26,14 +26,14 @@ import SearchIcon from '@material-ui/icons/Search';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { GET_USER } from '../../../../graphql';
|
import { GET_USER } from '../../../graphql';
|
||||||
import {
|
import {
|
||||||
CurrentUserDedtailsVars,
|
CurrentUserDedtailsVars,
|
||||||
CurrentUserDetails,
|
CurrentUserDetails,
|
||||||
Member,
|
Member,
|
||||||
} from '../../../../models/graphql/user';
|
} from '../../../models/graphql/user';
|
||||||
import { RootState } from '../../../../redux/reducers';
|
import { RootState } from '../../../redux/reducers';
|
||||||
import userAvatar from '../../../../utils/user';
|
import userAvatar from '../../../utils/user';
|
||||||
import DelUser from '../UserManagementTab/EditUser/DelUser';
|
import DelUser from '../UserManagementTab/EditUser/DelUser';
|
||||||
import Invitation from './Invitation';
|
import Invitation from './Invitation';
|
||||||
import InviteNew from './InviteNew';
|
import InviteNew from './InviteNew';
|
||||||
|
@ -91,7 +91,7 @@ const TeammingTab: React.FC = () => {
|
||||||
|
|
||||||
// logic for displaying the team members of the user
|
// logic for displaying the team members of the user
|
||||||
let memberList: Member[] = [];
|
let memberList: Member[] = [];
|
||||||
let users: Member[] = [];
|
const users: Member[] = [];
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (data?.getUser.username === userData.username) {
|
if (data?.getUser.username === userData.username) {
|
||||||
const projectList = data?.getUser.projects;
|
const projectList = data?.getUser.projects;
|
||||||
|
@ -107,13 +107,13 @@ const TeammingTab: React.FC = () => {
|
||||||
member.invitation === 'Accepted' &&
|
member.invitation === 'Accepted' &&
|
||||||
member.user_name !== userData.username
|
member.user_name !== userData.username
|
||||||
) {
|
) {
|
||||||
users = users.concat(rows, member);
|
users.push(member);
|
||||||
}
|
}
|
||||||
|
|
||||||
setRows(users);
|
setRows(users);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, [data]);
|
}, [data, userData.selectedProjectID]);
|
||||||
|
|
||||||
// for data filtering based on user role
|
// for data filtering based on user role
|
||||||
const filteredData =
|
const filteredData =
|
|
@ -1,10 +1,10 @@
|
||||||
import { Typography } from '@material-ui/core';
|
import { Typography } from '@material-ui/core';
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import config from '../../../../../../config';
|
import ButtonFilled from '../../../../../components/Button/ButtonFilled';
|
||||||
import Unimodal from '../../../../../../containers/layouts/Unimodal';
|
import config from '../../../../../config';
|
||||||
import { RootState } from '../../../../../../redux/reducers';
|
import Unimodal from '../../../../../containers/layouts/Unimodal';
|
||||||
import ButtonFilled from '../../../../../Button/ButtonFilled';
|
import { RootState } from '../../../../../redux/reducers';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
// Props for NewUserModal component
|
// Props for NewUserModal component
|
|
@ -1,11 +1,11 @@
|
||||||
import { Avatar, Typography } from '@material-ui/core';
|
import { Avatar, Typography } from '@material-ui/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import userAvatar from '../../../../../../utils/user';
|
import InputField from '../../../../../components/InputField';
|
||||||
|
import userAvatar from '../../../../../utils/user';
|
||||||
import {
|
import {
|
||||||
validateEmail,
|
validateEmail,
|
||||||
validateStartEmptySpacing,
|
validateStartEmptySpacing,
|
||||||
} from '../../../../../../utils/validate';
|
} from '../../../../../utils/validate';
|
||||||
import InputField from '../../../../../InputField';
|
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
|
|
||||||
interface PersonalDetailsProps {
|
interface PersonalDetailsProps {
|
|
@ -1,10 +1,10 @@
|
||||||
import { Divider, IconButton, Typography } from '@material-ui/core';
|
import { Divider, IconButton, Typography } from '@material-ui/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import InputField from '../../../../components/InputField';
|
||||||
import {
|
import {
|
||||||
validateLength,
|
validateLength,
|
||||||
validateStartEmptySpacing,
|
validateStartEmptySpacing,
|
||||||
} from '../../../../../utils/validate';
|
} from '../../../../utils/validate';
|
||||||
import InputField from '../../../../InputField';
|
|
||||||
import NewUserModal from './NewUserModal';
|
import NewUserModal from './NewUserModal';
|
||||||
import useStyles from './styles';
|
import useStyles from './styles';
|
||||||
import UserDetails from './UserDetails';
|
import UserDetails from './UserDetails';
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue