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:
Arkajyoti Mukherjee 2020-09-10 22:40:31 +05:30 committed by GitHub
parent c9ce014d5d
commit 456c67e409
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
112 changed files with 531 additions and 438 deletions

View File

@ -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', () => {

View File

@ -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', () => {

View File

@ -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

View File

@ -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) => {

View File

@ -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;

View File

@ -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>

View File

@ -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 />

View File

@ -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 {

View File

@ -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}

View File

@ -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';

View File

@ -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 {

View File

@ -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,
}); });
} }
}); });

View File

@ -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>

View File

@ -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>
); );

View File

@ -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';

View File

@ -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>

View File

@ -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 (

View File

@ -12,3 +12,10 @@ export interface MemberInviteNew {
role: string; role: string;
}; };
} }
export interface UserInvite {
id: string;
name: string;
username: string;
email: string;
}

View File

@ -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>;

View File

@ -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 }) => {

View File

@ -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')}

View File

@ -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>
); );
}; };

View File

@ -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(

View File

@ -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>
); );

View File

@ -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,
};
}

View File

@ -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,
}); });

View File

@ -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;

View File

@ -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}>

View File

@ -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>

View File

@ -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: {

View File

@ -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 {

View File

@ -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;

View File

@ -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';

View File

@ -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>

View File

@ -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>
</> </>

View File

@ -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

View File

@ -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: {

View File

@ -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,

View File

@ -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);

View File

@ -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;

View File

@ -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 */

View File

@ -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';

View File

@ -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 = () => {

View File

@ -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,

View File

@ -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)}

View File

@ -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';

View File

@ -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 = () => {

View File

@ -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 {

View File

@ -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';
/* /*

View File

@ -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';

View File

@ -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';

View File

@ -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,

View File

@ -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>

View File

@ -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';

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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';

View File

@ -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 =

View File

@ -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

View File

@ -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 {

View File

@ -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