Skip to content

Commit ac4acaa

Browse files
committed
Created dependency dashboard & updated existing charts as specified in #578, #579, #580
Signed-off-by: Omkar Phansopkar <[email protected]>
1 parent 53fa89b commit ac4acaa

File tree

16 files changed

+600
-150
lines changed

16 files changed

+600
-150
lines changed

src/App.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from "react";
2-
import { HashRouter, Route,Routes } from "react-router-dom";
2+
import { HashRouter, Route, Routes } from "react-router-dom";
33
import { ToastContainer } from "react-toastify";
44

55
import DropZone from "./components/DropZone/DropZone";
@@ -13,7 +13,9 @@ import FileInfoDash from "./pages/FileInfoDash/FileInfoDash";
1313
import Home from "./pages/Home/Home";
1414
import Licenses from "./pages/Licenses/Licenses";
1515
import LicenseInfoDash from "./pages/LicenseInfoDash/LicenseInfoDash";
16+
import CopyrightInfoDash from "./pages/CopyrightInfoDash/CopyrightInfoDash";
1617
import PackageInfoDash from "./pages/PackageInfoDash/PackageInfoDash";
18+
import DependencyInfoDash from "./pages/DependencyInfoDash/DependencyInfoDash";
1719
import Packages from "./pages/Packages/Packages";
1820
import PageNotFound from "./pages/PageNotFound";
1921
import ScanInfo from "./pages/ScanInfo/ScanInfo";
@@ -50,14 +52,19 @@ const App = () => {
5052
path={ROUTES.LICENSE_DASHBOARD}
5153
element={<LicenseInfoDash />}
5254
/>
55+
<Route
56+
path={ROUTES.COPYRIGHT_DASHBOARD}
57+
element={<CopyrightInfoDash />}
58+
/>
5359
<Route
5460
path={ROUTES.PACKAGE_DASHBOARD}
5561
element={<PackageInfoDash />}
5662
/>
5763
<Route
58-
path={ROUTES.LICENSES}
59-
element={<Licenses />}
64+
path={ROUTES.DEPENDENCY_DASHBOARD}
65+
element={<DependencyInfoDash />}
6066
/>
67+
<Route path={ROUTES.LICENSES} element={<Licenses />} />
6168
<Route path={ROUTES.PACKAGES} element={<Packages />} />
6269
<Route path={ROUTES.CHART_SUMMARY} element={<ChartView />} />
6370
<Route path={ROUTES.SCAN_INFO} element={<ScanInfo />} />
@@ -82,4 +89,4 @@ const App = () => {
8289
);
8390
};
8491

85-
export default App;
92+
export default App;

src/components/Navbar/Navbar.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { faArchive, faBars, faChartColumn, faFileCode, faFileLines, faGavel, faHome, faInfoCircle, faList,faTable } from '@fortawesome/free-solid-svg-icons';
1+
import { faArchive, faBars, faChartColumn, faCopyright, faFileCode, faFileLines, faGavel, faHome, faInfoCircle, faList,faListCheck,faTable } from '@fortawesome/free-solid-svg-icons';
22
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
33
import React, { useState } from 'react'
44
import { Menu, MenuItem, ProSidebar, SidebarContent,SidebarFooter } from 'react-pro-sidebar';
@@ -30,11 +30,21 @@ const MENU_ITEMS = [
3030
route: "/" + ROUTES.LICENSE_DASHBOARD,
3131
icon: faGavel,
3232
},
33+
{
34+
title: "Copyright Info Dashboard",
35+
route: "/" + ROUTES.COPYRIGHT_DASHBOARD,
36+
icon: faCopyright,
37+
},
3338
{
3439
title: "Package Info Dashboard",
3540
route: "/" + ROUTES.PACKAGE_DASHBOARD,
3641
icon: faArchive,
3742
},
43+
{
44+
title: "Dependency Info Dashboard",
45+
route: "/" + ROUTES.DEPENDENCY_DASHBOARD,
46+
icon: faListCheck,
47+
},
3848
{
3949
title: "Licenses Explorer",
4050
route: "/" + ROUTES.LICENSES,
Lines changed: 80 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,99 @@
1-
import React, { useEffect } from 'react'
2-
import { Badge } from 'react-bootstrap';
3-
import ReactJson from '@microlink/react-json-view';
4-
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
5-
import { faCheck, faCogs } from '@fortawesome/free-solid-svg-icons';
1+
import React, { useEffect } from "react";
2+
import { Badge } from "react-bootstrap";
3+
import ReactJson from "@microlink/react-json-view";
4+
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
5+
import { faCheck, faCogs } from "@fortawesome/free-solid-svg-icons";
66

7-
import { DependencyDetails } from '../../pages/Packages/packageDefinitions'
8-
import { DependencyScopeMapping } from './dependencyScopeMapper';
7+
import { DependencyDetails } from "../../pages/Packages/packageDefinitions";
8+
import { DependencyScopeMapping } from "./dependencyScopeMapper";
99

10-
import '../../styles/entityCommonStyles.css';
11-
import './dependencyEntity.css'
10+
import "../../styles/entityCommonStyles.css";
11+
import "./dependencyEntity.css";
1212

1313
interface DependencyEntityProps {
14-
dependency: DependencyDetails,
15-
goToPackageByUID: (package_uid: string) => void,
14+
dependency: DependencyDetails;
15+
goToPackageByUID: (package_uid: string) => void;
16+
goToFileInTableView: (file_path: string) => void;
1617
}
1718
const DependencyEntity = (props: DependencyEntityProps) => {
18-
const { goToPackageByUID, dependency: dependency} = props;
19+
const { goToPackageByUID, goToFileInTableView, dependency } = props;
1920

2021
useEffect(() => {
2122
console.log("Active dep", dependency);
22-
}, [dependency])
23+
}, [dependency]);
2324

24-
if(!dependency){
25+
if (!dependency) {
2526
return (
2627
<div>
27-
<h5>
28-
No dependency data found !!
29-
</h5>
28+
<h5>No dependency data found !!</h5>
3029
</div>
31-
)
30+
);
3231
}
3332
return (
34-
<div className='dependency-entity'>
35-
<h5>
36-
{ dependency.purl }
37-
</h5>
38-
{
39-
dependency.is_runtime ?
40-
<Badge pill bg="primary">
41-
<FontAwesomeIcon icon={faCogs} />
42-
{ ' ' } Runtime
43-
</Badge>
44-
: dependency.is_optional ?
45-
<Badge pill bg="dark">
46-
{
47-
DependencyScopeMapping[dependency.scope] ?
48-
<>
49-
<FontAwesomeIcon icon={DependencyScopeMapping[dependency.scope].icon} />
50-
{ " " } { DependencyScopeMapping[dependency.scope].text}
51-
</>
52-
: dependency.scope || "Optional"
53-
}
54-
</Badge>
55-
: ""
56-
}
57-
{
58-
dependency.is_resolved &&
33+
<div className="dependency-entity">
34+
<h5>{dependency.purl}</h5>
35+
{dependency.is_runtime ? (
36+
<Badge pill bg="primary">
37+
<FontAwesomeIcon icon={faCogs} /> Runtime
38+
</Badge>
39+
) : dependency.is_optional ? (
40+
<Badge pill bg="dark">
41+
{DependencyScopeMapping[dependency.scope] ? (
42+
<>
43+
<FontAwesomeIcon
44+
icon={DependencyScopeMapping[dependency.scope].icon}
45+
/>{" "}
46+
{DependencyScopeMapping[dependency.scope].text}
47+
</>
48+
) : (
49+
dependency.scope || "Optional"
50+
)}
51+
</Badge>
52+
) : (
53+
""
54+
)}
55+
{dependency.is_resolved && (
5956
<Badge pill bg="success">
60-
<FontAwesomeIcon icon={faCheck} />
61-
{ ' ' } Resolved
57+
<FontAwesomeIcon icon={faCheck} /> Resolved
6258
</Badge>
63-
}
64-
<br/>
65-
<br/>
66-
<div className='entity-properties'>
67-
{
59+
)}
60+
<br />
61+
<br />
62+
<div className="entity-properties">
63+
{[
6864
[
69-
[
70-
"For:",
71-
dependency.for_package_uid ?
65+
"For:",
66+
dependency.for_package_uid ? (
7267
<a onClick={() => goToPackageByUID(dependency.for_package_uid)}>
73-
{ dependency.for_package_uid || "NA" }
68+
{dependency.for_package_uid}
7469
</a>
75-
: <>NA</>
76-
],
77-
[ "Scope:", dependency.scope || "NA" ],
78-
[ "Extracted requirement:", dependency.extracted_requirement || "NA" ],
79-
[ "Data file:", dependency.datafile_path || "NA" ],
80-
[ "Data source ID", dependency.datasource_id || "NA" ],
81-
].map(entry => (
82-
<React.Fragment key={entry[0].toString()}>
83-
<span className='property'>
84-
{ entry[0] || "" }
85-
</span>
86-
<span className='value'>
87-
{ entry[1] || "" }
88-
</span>
89-
<br/>
90-
</React.Fragment>
91-
))
92-
}
70+
) : (
71+
<>NA</>
72+
),
73+
],
74+
["Scope:", dependency.scope || "NA"],
75+
["Extracted requirement:", dependency.extracted_requirement || "NA"],
76+
[
77+
"Data file:",
78+
dependency.datafile_path ? (
79+
<a onClick={() => goToFileInTableView(dependency.datafile_path)}>
80+
{dependency.datafile_path}
81+
</a>
82+
) : (
83+
<>NA</>
84+
),
85+
],
86+
["Data source ID", dependency.datasource_id || "NA"],
87+
].map((entry) => (
88+
<React.Fragment key={entry[0].toString()}>
89+
<span className="property">{entry[0] || ""}</span>
90+
<span className="value">{entry[1] || ""}</span>
91+
<br />
92+
</React.Fragment>
93+
))}
9394
</div>
94-
<br/>
95-
{
96-
dependency.is_resolved && dependency.resolved_package &&
95+
<br />
96+
{dependency.is_resolved && dependency.resolved_package && (
9797
<div>
9898
Resolved package:
9999
<ReactJson
@@ -103,8 +103,8 @@ const DependencyEntity = (props: DependencyEntityProps) => {
103103
collapsed={0}
104104
/>
105105
</div>
106-
}
107-
<br/>
106+
)}
107+
<br />
108108
Raw package:
109109
<ReactJson
110110
src={dependency || {}}
@@ -113,7 +113,7 @@ const DependencyEntity = (props: DependencyEntityProps) => {
113113
collapsed={0}
114114
/>
115115
</div>
116-
)
117-
}
116+
);
117+
};
118118

119-
export default DependencyEntity
119+
export default DependencyEntity;

src/components/PieChart/PieChart.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ import "./piechart.css";
1010

1111
interface PieChartProps extends PieChartFallbackProps {
1212
chartData: FormattedEntry[] | null;
13+
hideLegend?: boolean;
1314
}
1415

1516
const PieChart = (props: PieChartProps) => {
16-
const { chartData } = props;
17+
const { chartData, hideLegend } = props;
1718
const chartRef = useRef<HTMLDivElement | null>(null);
1819
const chartContainerRef = useRef<HTMLDivElement | null>(null);
1920
const [c3Chart, setC3Chart] = useState<ChartAPI | null>(null);
@@ -37,6 +38,9 @@ const PieChart = (props: PieChartProps) => {
3738
`${String(value)} \n${(ratio * 100).toFixed(1)}%`,
3839
},
3940
},
41+
legend: {
42+
hide: hideLegend,
43+
}
4044
});
4145
setC3Chart(newChart);
4246
}, [chartData]);
Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
1-
import React from 'react';
2-
import { TailSpin } from 'react-loader-spinner';
3-
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
4-
import { faUpRightFromSquare } from '@fortawesome/free-solid-svg-icons';
1+
import React from "react";
2+
import { TailSpin } from "react-loader-spinner";
3+
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4+
import { faUpRightFromSquare } from "@fortawesome/free-solid-svg-icons";
55

66
export interface PieChartFallbackProps {
7-
noDataText: string,
8-
noDataLink: string,
9-
loading?: boolean,
7+
noDataText: string;
8+
noDataLink: string;
9+
loading?: boolean;
1010
}
1111

1212
export const PieChartFallback = (props: PieChartFallbackProps) => {
1313
return (
14-
<div className='fallback-container'>
15-
{
16-
props.loading ?
14+
<div className="fallback-container">
15+
{props.loading ? (
1716
<TailSpin
1817
radius={5}
1918
height={100}
2019
width={100}
21-
color="#3898fc"
20+
color="#3898fc"
2221
ariaLabel="loading-chart"
2322
/>
24-
:
23+
) : (
2524
<div>
26-
No Data <br/><br/>
25+
No Data <br />
26+
<br />
2727
<a href={props.noDataLink}>
28-
{ props.noDataText }
28+
{props.noDataText}
2929
&nbsp;
3030
<FontAwesomeIcon icon={faUpRightFromSquare} />
3131
</a>
3232
</div>
33-
}
33+
)}
3434
</div>
35-
)
36-
}
35+
);
36+
};

src/constants/routes.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ export const ROUTES = {
55
TABLE_VIEW: "table-view",
66
FILE_DASHBOARD: "file-dashboard",
77
LICENSE_DASHBOARD: "license-dashboard",
8+
COPYRIGHT_DASHBOARD: "copyright-dashboard",
89
PACKAGE_DASHBOARD: "package-dashboard",
10+
DEPENDENCY_DASHBOARD: "dependency-dashboard",
911
LICENSES: "licenses",
1012
PACKAGES: "packages",
1113
CHART_SUMMARY: "chart-summary",
@@ -16,19 +18,23 @@ export const FILE_TREE_ROUTES = [
1618
ROUTES.TABLE_VIEW,
1719
ROUTES.FILE_DASHBOARD,
1820
ROUTES.LICENSE_DASHBOARD,
21+
ROUTES.COPYRIGHT_DASHBOARD,
1922
ROUTES.PACKAGE_DASHBOARD,
23+
ROUTES.DEPENDENCY_DASHBOARD,
2024
ROUTES.CHART_SUMMARY,
2125
];
2226

2327
export const IMPORT_FALLBACK_ROUTES = [
2428
ROUTES.TABLE_VIEW,
2529
ROUTES.FILE_DASHBOARD,
2630
ROUTES.LICENSE_DASHBOARD,
31+
ROUTES.COPYRIGHT_DASHBOARD,
2732
ROUTES.PACKAGES,
2833
ROUTES.PACKAGE_DASHBOARD,
34+
ROUTES.DEPENDENCY_DASHBOARD,
2935
ROUTES.LICENSES,
3036
ROUTES.CHART_SUMMARY,
3137
ROUTES.SCAN_INFO,
3238
];
3339

34-
export const DEFAULT_ROUTE_ON_IMPORT = ROUTES.TABLE_VIEW;
40+
export const DEFAULT_ROUTE_ON_IMPORT = ROUTES.TABLE_VIEW;

0 commit comments

Comments
 (0)