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'