diff --git a/visualization_tool/src/App.tsx b/visualization_tool/src/App.tsx index 7171e5fa..4bd58053 100644 --- a/visualization_tool/src/App.tsx +++ b/visualization_tool/src/App.tsx @@ -3,7 +3,7 @@ import {useState} from 'react'; import {Routes, Route} from 'react-router-dom'; import {Resource, availableResourceTypes} from './types/resources'; -import {IAMRole} from './types/IMAPolicy'; +import {IAMRole} from './types/IAMPolicy'; import ControlMenu from './components/ControlMenu/ControlMenu'; import ResourcesPage from './pages/ResourcesPage'; import IAMPolicyPage from './pages/IAMPolicyPage'; @@ -40,7 +40,7 @@ function App() { /> } + element={} /> diff --git a/visualization_tool/src/components/ControlMenu/ControlMenu.tsx b/visualization_tool/src/components/ControlMenu/ControlMenu.tsx index 9c179d63..1ddd8000 100644 --- a/visualization_tool/src/components/ControlMenu/ControlMenu.tsx +++ b/visualization_tool/src/components/ControlMenu/ControlMenu.tsx @@ -5,7 +5,7 @@ import SortMenu from './partials/SortMenu'; import FilterMenu from './partials/FilterMenu'; import {Resource} from '../../types/resources'; -import {IAMRole} from '../../types/IMAPolicy'; +import {IAMRole} from '../../types/IAMPolicy'; import './ControlMenu.css'; diff --git a/visualization_tool/src/components/ControlMenu/Controller.ts b/visualization_tool/src/components/ControlMenu/Controller.ts index 21171d81..afcf29b0 100644 --- a/visualization_tool/src/components/ControlMenu/Controller.ts +++ b/visualization_tool/src/components/ControlMenu/Controller.ts @@ -5,7 +5,7 @@ import { availableResourceTypes, } from '../../types/resources'; -import {IAMRole, IMAPolicyField} from '../../types/IMAPolicy'; +import {IAMRole, IMAPolicyField} from '../../types/IAMPolicy'; const titleCase = (str: string) => { return str diff --git a/visualization_tool/src/components/ControlMenu/partials/UploadMenu.tsx b/visualization_tool/src/components/ControlMenu/partials/UploadMenu.tsx index 15778f83..23873ebb 100644 --- a/visualization_tool/src/components/ControlMenu/partials/UploadMenu.tsx +++ b/visualization_tool/src/components/ControlMenu/partials/UploadMenu.tsx @@ -3,7 +3,7 @@ import AddIcon from '@mui/icons-material/Add'; import CloseIcon from '@mui/icons-material/Close'; import {Resource} from '../../../types/resources'; -import {IAMRole} from '../../../types/IMAPolicy'; +import {IAMRole} from '../../../types/IAMPolicy'; import {parseData, parseIAMData} from '../Controller'; type UploadMenuProps = { diff --git a/visualization_tool/src/components/Navbar/Navbar.css b/visualization_tool/src/components/Navbar/Navbar.css index 0b803d88..550b3633 100644 --- a/visualization_tool/src/components/Navbar/Navbar.css +++ b/visualization_tool/src/components/Navbar/Navbar.css @@ -26,13 +26,14 @@ header p { .pages-nav { position: sticky; top: 50px; - display: flex; - align-items: center; padding: 10px 0; border-bottom: 2px solid #dadce0; background-color: white; + width: 100%; display: grid; + scrollbar-gutter: stable both-edges; grid-template-columns: 1fr 0.8fr 1fr; + align-items: center; } .links { diff --git a/visualization_tool/src/components/Navbar/Navbar.tsx b/visualization_tool/src/components/Navbar/Navbar.tsx index 82959190..9f344d1f 100644 --- a/visualization_tool/src/components/Navbar/Navbar.tsx +++ b/visualization_tool/src/components/Navbar/Navbar.tsx @@ -67,7 +67,11 @@ const Navbar = ({searchQuery, setSearchQuery}: NavbarProps) => { type="text" name="search-input" id="search-input" - placeholder="Search" + placeholder={ + location.pathname === '/static/iam-policy' + ? 'Email' + : 'Resources Name' + } value={searchQuery} onChange={e => setSearchQuery(e.target.value)} /> diff --git a/visualization_tool/src/components/RolesList/RolesList.tsx b/visualization_tool/src/components/RolesList/RolesList.tsx index 6e46c588..6c4e3b69 100644 --- a/visualization_tool/src/components/RolesList/RolesList.tsx +++ b/visualization_tool/src/components/RolesList/RolesList.tsx @@ -6,19 +6,25 @@ import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import Paper from '@mui/material/Paper'; import Row from './partials/Row'; -import {IAMRole} from '../../types/IMAPolicy'; + +import {IAMRole} from '../../types/IAMPolicy'; +import {useFilter} from './useFilter'; import './RolesList.css'; type RolesListProps = { roles: IAMRole[]; + emailQuery: string; }; -const RolesList = ({roles}: RolesListProps) => { +const RolesList = ({roles, emailQuery}: RolesListProps) => { + const filteredRoles = useFilter(roles, emailQuery); + // console.log(filteredRoles); + return (

{roles.length > 0 ? 'Found Roles' : 'No Roles Found'}

- {roles.length > 0 && ( + {filteredRoles.length > 0 && ( @@ -40,7 +46,7 @@ const RolesList = ({roles}: RolesListProps) => { - {roles.map(role => ( + {filteredRoles.map(role => ( ))} diff --git a/visualization_tool/src/components/RolesList/partials/Row.tsx b/visualization_tool/src/components/RolesList/partials/Row.tsx index 422ec399..69009325 100644 --- a/visualization_tool/src/components/RolesList/partials/Row.tsx +++ b/visualization_tool/src/components/RolesList/partials/Row.tsx @@ -10,7 +10,7 @@ import TableRow from '@mui/material/TableRow'; import Typography from '@mui/material/Typography'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; -import {IAMRole} from '../../../types/IMAPolicy'; +import {IAMRole} from '../../../types/IAMPolicy'; type RowProps = { row: IAMRole; diff --git a/visualization_tool/src/components/RolesList/useFilter.ts b/visualization_tool/src/components/RolesList/useFilter.ts new file mode 100644 index 00000000..4b2237ec --- /dev/null +++ b/visualization_tool/src/components/RolesList/useFilter.ts @@ -0,0 +1,22 @@ +import {useEffect, useState} from 'react'; +import {IAMRole} from '../../types/IAMPolicy'; +import {debounce} from '@mui/material'; + +export const useFilter = (roles: IAMRole[], email: string) => { + const [filteredRoles, setFilteredRoles] = useState(roles); + + useEffect(() => { + const filterRoles = () => { + setFilteredRoles( + roles.filter(role => { + // check if this email is in the role's members + return role.members.some(member => member.email.includes(email)); + }) + ); + }; + + debounce(filterRoles, 200)(); + }, [roles, email]); + + return filteredRoles; +}; diff --git a/visualization_tool/src/index.css b/visualization_tool/src/index.css index f8f736bb..aec7c545 100644 --- a/visualization_tool/src/index.css +++ b/visualization_tool/src/index.css @@ -6,3 +6,7 @@ box-sizing: border-box; font-family: 'Inter', sans-serif; } + +html { + scrollbar-gutter: stable; +} diff --git a/visualization_tool/src/pages/IAMPolicyPage.tsx b/visualization_tool/src/pages/IAMPolicyPage.tsx index eba72e92..7ccfbf09 100644 --- a/visualization_tool/src/pages/IAMPolicyPage.tsx +++ b/visualization_tool/src/pages/IAMPolicyPage.tsx @@ -1,12 +1,13 @@ -import {IAMRole} from '../types/IMAPolicy'; +import {IAMRole} from '../types/IAMPolicy'; import RolesList from '../components/RolesList/RolesList'; type IAMPolicyPageProps = { roles: IAMRole[]; + emailQuery: string; }; -const IAMPolicyPage = ({roles}: IAMPolicyPageProps) => { - return ; +const IAMPolicyPage = ({roles, emailQuery}: IAMPolicyPageProps) => { + return ; }; export default IAMPolicyPage; diff --git a/visualization_tool/src/types/IMAPolicy.ts b/visualization_tool/src/types/IAMPolicy.ts similarity index 100% rename from visualization_tool/src/types/IMAPolicy.ts rename to visualization_tool/src/types/IAMPolicy.ts diff --git a/visualization_tool/src/types/resources.ts b/visualization_tool/src/types/resources.ts index eeec7f73..f243fdd7 100644 --- a/visualization_tool/src/types/resources.ts +++ b/visualization_tool/src/types/resources.ts @@ -1,4 +1,4 @@ -import {IMAPolicyField} from './IMAPolicy'; +import {IMAPolicyField} from './IAMPolicy'; type ResourceType = | 'Compute Instance'