diff --git a/package-lock.json b/package-lock.json
index 4d5e000..b22bb47 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -28,7 +28,7 @@
"pre-commit": "^1.2.2",
"ts-jest": "^29.1.1",
"ts-node": "^10.9.1",
- "turbo": "^1.10.7",
+ "turbo": "^1.10.12",
"typescript": "^5.1.6"
}
},
@@ -14202,27 +14202,27 @@
}
},
"node_modules/turbo": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.10.7.tgz",
- "integrity": "sha512-xm0MPM28TWx1e6TNC3wokfE5eaDqlfi0G24kmeHupDUZt5Wd0OzHFENEHMPqEaNKJ0I+AMObL6nbSZonZBV2HA==",
+ "version": "1.10.12",
+ "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.10.12.tgz",
+ "integrity": "sha512-WM3+jTfQWnB9W208pmP4oeehZcC6JQNlydb/ZHMRrhmQa+htGhWLCzd6Q9rLe0MwZLPpSPFV2/bN5egCLyoKjQ==",
"dev": true,
"hasInstallScript": true,
"bin": {
"turbo": "bin/turbo"
},
"optionalDependencies": {
- "turbo-darwin-64": "1.10.7",
- "turbo-darwin-arm64": "1.10.7",
- "turbo-linux-64": "1.10.7",
- "turbo-linux-arm64": "1.10.7",
- "turbo-windows-64": "1.10.7",
- "turbo-windows-arm64": "1.10.7"
+ "turbo-darwin-64": "1.10.12",
+ "turbo-darwin-arm64": "1.10.12",
+ "turbo-linux-64": "1.10.12",
+ "turbo-linux-arm64": "1.10.12",
+ "turbo-windows-64": "1.10.12",
+ "turbo-windows-arm64": "1.10.12"
}
},
"node_modules/turbo-darwin-64": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.10.7.tgz",
- "integrity": "sha512-N2MNuhwrl6g7vGuz4y3fFG2aR1oCs0UZ5HKl8KSTn/VC2y2YIuLGedQ3OVbo0TfEvygAlF3QGAAKKtOCmGPNKA==",
+ "version": "1.10.12",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.10.12.tgz",
+ "integrity": "sha512-vmDfGVPl5/aFenAbOj3eOx3ePNcWVUyZwYr7taRl0ZBbmv2TzjRiFotO4vrKCiTVnbqjQqAFQWY2ugbqCI1kOQ==",
"cpu": [
"x64"
],
@@ -14233,9 +14233,9 @@
]
},
"node_modules/turbo-darwin-arm64": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.7.tgz",
- "integrity": "sha512-WbJkvjU+6qkngp7K4EsswOriO3xrNQag7YEGRtfLoDdMTk4O4QTeU6sfg2dKfDsBpTidTvEDwgIYJhYVGzrz9Q==",
+ "version": "1.10.12",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.12.tgz",
+ "integrity": "sha512-3JliEESLNX2s7g54SOBqqkqJ7UhcOGkS0ywMr5SNuvF6kWVTbuUq7uBU/sVbGq8RwvK1ONlhPvJne5MUqBCTCQ==",
"cpu": [
"arm64"
],
@@ -14246,9 +14246,9 @@
]
},
"node_modules/turbo-linux-64": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.10.7.tgz",
- "integrity": "sha512-x1CF2CDP1pDz/J8/B2T0hnmmOQI2+y11JGIzNP0KtwxDM7rmeg3DDTtDM/9PwGqfPotN9iVGgMiMvBuMFbsLhg==",
+ "version": "1.10.12",
+ "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.10.12.tgz",
+ "integrity": "sha512-siYhgeX0DidIfHSgCR95b8xPee9enKSOjCzx7EjTLmPqPaCiVebRYvbOIYdQWRqiaKh9yfhUtFmtMOMScUf1gg==",
"cpu": [
"x64"
],
@@ -14259,9 +14259,9 @@
]
},
"node_modules/turbo-linux-arm64": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.10.7.tgz",
- "integrity": "sha512-JtnBmaBSYbs7peJPkXzXxsRGSGBmBEIb6/kC8RRmyvPAMyqF8wIex0pttsI+9plghREiGPtRWv/lfQEPRlXnNQ==",
+ "version": "1.10.12",
+ "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.10.12.tgz",
+ "integrity": "sha512-K/ZhvD9l4SslclaMkTiIrnfcACgos79YcAo4kwc8bnMQaKuUeRpM15sxLpZp3xDjDg8EY93vsKyjaOhdFG2UbA==",
"cpu": [
"arm64"
],
@@ -14272,9 +14272,9 @@
]
},
"node_modules/turbo-windows-64": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.10.7.tgz",
- "integrity": "sha512-7A/4CByoHdolWS8dg3DPm99owfu1aY/W0V0+KxFd0o2JQMTQtoBgIMSvZesXaWM57z3OLsietFivDLQPuzE75w==",
+ "version": "1.10.12",
+ "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.10.12.tgz",
+ "integrity": "sha512-7FSgSwvktWDNOqV65l9AbZwcoueAILeE4L7JvjauNASAjjbuzXGCEq5uN8AQU3U5BOFj4TdXrVmO2dX+lLu8Zg==",
"cpu": [
"x64"
],
@@ -14285,9 +14285,9 @@
]
},
"node_modules/turbo-windows-arm64": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.10.7.tgz",
- "integrity": "sha512-D36K/3b6+hqm9IBAymnuVgyePktwQ+F0lSXr2B9JfAdFPBktSqGmp50JNC7pahxhnuCLj0Vdpe9RqfnJw5zATA==",
+ "version": "1.10.12",
+ "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.10.12.tgz",
+ "integrity": "sha512-gCNXF52dwom1HLY9ry/cneBPOKTBHhzpqhMylcyvJP0vp9zeMQQkt6yjYv+6QdnmELC92CtKNp2FsNZo+z0pyw==",
"cpu": [
"arm64"
],
diff --git a/package.json b/package.json
index a53c87b..8582117 100644
--- a/package.json
+++ b/package.json
@@ -47,7 +47,7 @@
"pre-commit": "^1.2.2",
"ts-jest": "^29.1.1",
"ts-node": "^10.9.1",
- "turbo": "^1.10.7",
+ "turbo": "^1.10.12",
"typescript": "^5.1.6"
},
"keywords": [],
diff --git a/packages/app/src/analysis/AnalysisPage.tsx b/packages/app/src/analysis/AnalysisPage.tsx
index e1ea417..1055ec9 100644
--- a/packages/app/src/analysis/AnalysisPage.tsx
+++ b/packages/app/src/analysis/AnalysisPage.tsx
@@ -1,22 +1,39 @@
-import { FC, useEffect } from "react";
+import { Theme } from "@mui/material";
+import { FC, useCallback } from "react";
+import { useNavigate } from "react-router-dom";
+import { makeStyles } from "tss-react/mui";
import { AnalysisHeader } from "./components/AnalysisHeader";
-import { InputForm } from "./components/InputForm";
-import { clearAnalysisStore } from "./stores/analysis-store";
+import { AnalysisInputForm } from "./components/AnalysisInputForm";
const AnalysisPage: FC = () => {
- useEffect(() => {
- return () => {
- // on unmount
- clearAnalysisStore();
- };
- }, []);
+ const { classes } = useStyles();
+ const navigate = useNavigate();
+
+ const handleAfterSubmit = useCallback(
+ (requestId: string) => {
+ navigate({ pathname: `/report/${requestId}` });
+ },
+ [navigate]
+ );
return (
);
};
export default AnalysisPage;
+
+const useStyles = makeStyles()((theme: Theme) => ({
+ main: {
+ marginBlockStart: theme.spacing(3),
+ maxWidth: 620,
+ marginInline: "auto",
+ borderRadius: 15,
+ overflow: "hidden",
+ },
+}));
diff --git a/packages/app/src/analysis/actions/analysis-actions.ts b/packages/app/src/analysis/actions/analysis-actions.ts
index 490e125..c7c1a1d 100644
--- a/packages/app/src/analysis/actions/analysis-actions.ts
+++ b/packages/app/src/analysis/actions/analysis-actions.ts
@@ -1,5 +1,4 @@
import axios from "axios";
-import { NavigateFunction } from "react-router-dom";
import {
Analysis,
AnalysisType,
@@ -11,7 +10,7 @@ import config from "../../config";
import { ReportStore } from "../../report/stores/fe-report-store";
import { AnalysisStore, AsyncState } from "../stores/analysis-store";
-export const startAnalysis = async (navigate: NavigateFunction) => {
+export const startAnalysis = async () => {
AnalysisStore.setState({
sending: AsyncState.Loading,
});
@@ -32,8 +31,8 @@ export const startAnalysis = async (navigate: NavigateFunction) => {
},
}
);
- const requestId = report.data.requestId;
- navigate({ pathname: `/report/${requestId}` });
+ AnalysisStore.getState().reset();
+ return report.data.requestId;
} catch (err) {
console.error(err);
AnalysisStore.setState({
diff --git a/packages/app/src/analysis/components/AnalysisHeader.tsx b/packages/app/src/analysis/components/AnalysisHeader.tsx
index c12067d..7534c20 100644
--- a/packages/app/src/analysis/components/AnalysisHeader.tsx
+++ b/packages/app/src/analysis/components/AnalysisHeader.tsx
@@ -36,11 +36,11 @@ const useStyles = makeStyles()((theme: Theme) => ({
avatar: {
marginInlineStart: -20,
width: 140,
- height: 130,
+ height: "14vh",
},
title: {
marginBlockStart: theme.spacing(1),
- fontSize: 50,
+ fontSize: "clamp(30px, 5vw, 50px)",
fontWeight: 800,
letterSpacing: 0.3,
},
diff --git a/packages/app/src/analysis/components/InputForm.tsx b/packages/app/src/analysis/components/AnalysisInputForm.tsx
similarity index 59%
rename from packages/app/src/analysis/components/InputForm.tsx
rename to packages/app/src/analysis/components/AnalysisInputForm.tsx
index 0add499..3240b76 100644
--- a/packages/app/src/analysis/components/InputForm.tsx
+++ b/packages/app/src/analysis/components/AnalysisInputForm.tsx
@@ -1,16 +1,22 @@
import { Alert, Paper, Tab, Tabs, Theme } from "@mui/material";
-import { FC } from "react";
+import { FC, useCallback } from "react";
+import { useNavigate } from "react-router-dom";
import { AnalysisType, OneOfValues } from "shared-types";
import { makeStyles } from "tss-react/mui";
+import { initProgress } from "../../report/actions/init-report-action";
+import { startAnalysis } from "../actions/analysis-actions";
import { AnalysisStore, useAnalysisStore } from "../stores/analysis-store";
import { AnalysisTabPanel } from "./AnalysisTabPanel";
import { CodeSnippetForm } from "./CodeSnippetForm";
import { FileUploadForm } from "./FileUploadForm";
import { RepositoryForm } from "./RepositoryForm";
-export const InputForm: FC = () => {
+export const AnalysisInputForm: FC = ({
+ onAfterSubmit,
+}) => {
const { classes } = useStyles();
const { sending, inputType } = useAnalysisStore();
+ const navigate = useNavigate();
const handleFormTypeChange = (
_: unknown,
@@ -19,8 +25,14 @@ export const InputForm: FC = () => {
AnalysisStore.setState({ inputType: newInputType });
};
+ const handleSubmit = useCallback(async () => {
+ const requestId = await startAnalysis();
+ initProgress(requestId, navigate);
+ onAfterSubmit(requestId);
+ }, [onAfterSubmit, navigate]);
+
return (
-
+
{
-
- {sending === "error" && (
-
- Unable to start scanning, please try again later
-
- )}
-
-
-
-
-
-
-
-
-
-
+ {sending === "error" && (
+
+ Unable to start scanning, please try again later
+
+ )}
+
+
+
+
+
+
+
+
+
);
@@ -70,7 +80,6 @@ export const InputForm: FC = () => {
const useStyles = makeStyles()((theme: Theme) => ({
inputForm: {
- marginBlockStart: theme.spacing(3),
textAlign: "center",
transition: theme.transitions.create("all"),
display: "flex",
@@ -81,8 +90,7 @@ const useStyles = makeStyles()((theme: Theme) => ({
: `0px 0px 10px 10px #00000010`,
width: "100%",
marginInline: "auto",
- minHeight: 200,
- maxWidth: 620,
+ minHeight: 280,
},
tabsContainer: {
borderBottom: 1,
@@ -100,3 +108,11 @@ const useStyles = makeStyles()((theme: Theme) => ({
position: "relative",
},
}));
+
+interface AnalysisInputFormProps {
+ onAfterSubmit(requestId: string): void;
+}
+
+export interface AnalysisFormProps {
+ onSubmit(): void;
+}
diff --git a/packages/app/src/analysis/components/AnalysisTabPanel.tsx b/packages/app/src/analysis/components/AnalysisTabPanel.tsx
index 7bda66b..e913747 100644
--- a/packages/app/src/analysis/components/AnalysisTabPanel.tsx
+++ b/packages/app/src/analysis/components/AnalysisTabPanel.tsx
@@ -11,8 +11,8 @@ export const AnalysisTabPanel: FC> = (
diff --git a/packages/app/src/analysis/components/CodeSnippetForm.tsx b/packages/app/src/analysis/components/CodeSnippetForm.tsx
index bfa637e..ef4a328 100644
--- a/packages/app/src/analysis/components/CodeSnippetForm.tsx
+++ b/packages/app/src/analysis/components/CodeSnippetForm.tsx
@@ -1,17 +1,15 @@
import { TextField, Theme, Typography } from "@mui/material";
import { FC, useCallback } from "react";
-import { useNavigate } from "react-router-dom";
import { makeStyles } from "tss-react/mui";
import { LanguageIcon } from "../../common/LanguageIcon";
import { fetchDetect } from "../../common/utils/detect-lanauge-utils";
-import { startAnalysis } from "../actions/analysis-actions";
import { AnalysisStore, useAnalysisStore } from "../stores/analysis-store";
+import { AnalysisFormProps } from "./AnalysisInputForm";
import { SubmitButton } from "./SubmitButton";
-export const CodeSnippetForm: FC = () => {
+export const CodeSnippetForm: FC
= ({ onSubmit }) => {
const { classes } = useStyles();
const { snippet, snippetEnabled, sending, language } = useAnalysisStore();
- const navigate = useNavigate();
const handleChange = useCallback((e: React.ChangeEvent) => {
const snippet = e.target.value;
@@ -19,10 +17,6 @@ export const CodeSnippetForm: FC = () => {
fetchDetect(snippet);
}, []);
- const handleSubmit = () => {
- startAnalysis(navigate);
- };
-
return (
{
{
+export const FileUploadForm: FC = ({ onSubmit }) => {
const { classes } = useStyles();
- const navigate = useNavigate();
const { sending } = useAnalysisStore();
const [error, setError] = useState("");
@@ -47,9 +45,9 @@ export const FileUploadForm: FC = () => {
const file = files[0];
AnalysisStore.setState({ file });
- startAnalysis(navigate);
+ onSubmit();
},
- [navigate]
+ [onSubmit]
);
const { getRootProps, getInputProps, isDragActive } = useDropzone({
diff --git a/packages/app/src/analysis/components/RepositoryForm.tsx b/packages/app/src/analysis/components/RepositoryForm.tsx
index 5dadd44..321f232 100644
--- a/packages/app/src/analysis/components/RepositoryForm.tsx
+++ b/packages/app/src/analysis/components/RepositoryForm.tsx
@@ -1,24 +1,18 @@
import { FormControl, TextField, Theme } from "@mui/material";
import { FC, useCallback } from "react";
-import { useNavigate } from "react-router-dom";
import { makeStyles } from "tss-react/mui";
-import { startAnalysis } from "../actions/analysis-actions";
import { AnalysisStore, useAnalysisStore } from "../stores/analysis-store";
+import { AnalysisFormProps } from "./AnalysisInputForm";
import { SubmitButton } from "./SubmitButton";
-export const RepositoryForm: FC = () => {
+export const RepositoryForm: FC = ({ onSubmit }) => {
const { classes } = useStyles();
- const navigate = useNavigate();
const { repositoryURL, repoEnabled, sending } = useAnalysisStore();
const handleChange = useCallback((e: React.ChangeEvent) => {
AnalysisStore.setState({ repositoryURL: e.target.value });
}, []);
- const handleSubmit = () => {
- startAnalysis(navigate);
- };
-
return (
@@ -32,7 +26,7 @@ export const RepositoryForm: FC = () => {
diff --git a/packages/app/src/analysis/stores/analysis-store.ts b/packages/app/src/analysis/stores/analysis-store.ts
index 31c8bd0..e8d7abe 100644
--- a/packages/app/src/analysis/stores/analysis-store.ts
+++ b/packages/app/src/analysis/stores/analysis-store.ts
@@ -13,10 +13,11 @@ const initialState: AnalysisStoreState = {
export const AnalysisStore = createStore<
AnalysisStoreState & AnalysisStoreFunctions
->((_, get) => ({
+>((set, get) => ({
...initialState,
repoEnabled: () => !!get().repositoryURL && get().repositoryURL.length > 0,
snippetEnabled: () => !!get().snippet && get().snippet.length > 0,
+ reset: () => set({ ...initialState }),
}));
interface AnalysisStoreState {
@@ -31,6 +32,7 @@ interface AnalysisStoreState {
interface AnalysisStoreFunctions {
repoEnabled(): boolean;
snippetEnabled(): boolean;
+ reset(): void;
}
export const AsyncState = {
@@ -41,7 +43,3 @@ export const AsyncState = {
} as const;
export const useAnalysisStore = () => useStore(AnalysisStore);
-
-export const clearAnalysisStore = () => {
- AnalysisStore.setState(initialState);
-};
diff --git a/packages/app/src/report/ReportPage.tsx b/packages/app/src/report/ReportPage.tsx
index 0322086..66532c4 100644
--- a/packages/app/src/report/ReportPage.tsx
+++ b/packages/app/src/report/ReportPage.tsx
@@ -1,25 +1,12 @@
-import { FC, useEffect, useRef } from "react";
-import { useNavigate, useParams } from "react-router-dom";
+import { FC } from "react";
import { AnalysisErrorDialog } from "../common/AnalysisErrorDialog";
-import { initProgress } from "./actions/init-report-action";
import { IssuesTable } from "./components/IssuesTable";
+import { NewAnalysisDialog } from "./components/NewAnalysisDialog";
import { ReportDrawer } from "./components/ReportDrawer";
import { ReportHeader } from "./components/ReportHeader";
import { ReportTabs } from "./components/ReportTabs";
const ReportPage: FC = () => {
- const calls = useRef(0);
- const { requestId } = useParams();
- const navigate = useNavigate();
-
- useEffect(() => {
- if (calls.current === 0) {
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- initProgress(requestId!, navigate);
- calls.current += 1;
- }
- }, [requestId, navigate]);
-
return (
@@ -28,6 +15,7 @@ const ReportPage: FC = () => {
+
);
};
diff --git a/packages/app/src/report/actions/init-report-action.ts b/packages/app/src/report/actions/init-report-action.ts
index e56ec30..df0f45c 100644
--- a/packages/app/src/report/actions/init-report-action.ts
+++ b/packages/app/src/report/actions/init-report-action.ts
@@ -18,6 +18,7 @@ export const initProgress = async (
switch (status) {
case AnalysisStatus.Created:
subscribeToReportProgress(requestId);
+ navigate({ pathname: `/report/${requestId}` });
break;
case AnalysisStatus.NotFound:
navigate("/");
diff --git a/packages/app/src/report/components/BackButton.tsx b/packages/app/src/report/components/BackButton.tsx
new file mode 100644
index 0000000..3e4899e
--- /dev/null
+++ b/packages/app/src/report/components/BackButton.tsx
@@ -0,0 +1,21 @@
+import { IconButton, Tooltip } from "@mui/material";
+import { FC, SyntheticEvent } from "react";
+import { IoMdArrowBack } from "react-icons/io";
+import { useNavigate } from "react-router-dom";
+
+export const BackButton: FC = () => {
+ const navigate = useNavigate();
+
+ const navigateBack = (e: SyntheticEvent) => {
+ e.preventDefault();
+ navigate("/");
+ };
+
+ return (
+
+
+
+
+
+ );
+};
diff --git a/packages/app/src/report/components/DownloadAllIssuesButton.tsx b/packages/app/src/report/components/DownloadAllIssuesButton.tsx
new file mode 100644
index 0000000..a772194
--- /dev/null
+++ b/packages/app/src/report/components/DownloadAllIssuesButton.tsx
@@ -0,0 +1,60 @@
+import { Button, Theme, Tooltip } from "@mui/material";
+import { FC } from "react";
+import { CSVLink } from "react-csv";
+import { MdCloudDownload } from "react-icons/md";
+import { makeStyles } from "tss-react/mui";
+import { useReportStore } from "../stores/fe-report-store";
+
+export const DownloadAllIssuesButton: FC = () => {
+ const { classes } = useStyles();
+ const { allIssues, requestId } = useReportStore();
+
+ const disabled = allIssues().length === 0;
+ const button = (
+ }
+ tabIndex={-1}
+ size="small"
+ color="primary"
+ disabled={disabled}
+ sx={{ textTransform: "none" }}
+ >
+ Issues
+
+ );
+ const downloadLink = (
+
+ {button}
+
+ );
+
+ return (
+
+ {disabled ? button : downloadLink}
+
+ );
+};
+
+const useStyles = makeStyles()((theme: Theme) => ({
+ exportToCSV: {
+ display: "inline-flex",
+ alignItems: "center",
+ gap: theme.spacing(1),
+ color: theme.palette.primary.main,
+ fontWeight: 400,
+ textDecoration: "none",
+ "&:hover": {
+ textDecoration: "underline",
+ },
+ },
+}));
diff --git a/packages/app/src/report/components/ExportToCSV.tsx b/packages/app/src/report/components/ExportToCSV.tsx
deleted file mode 100644
index 5a97d4e..0000000
--- a/packages/app/src/report/components/ExportToCSV.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { IconButton, Theme, Tooltip, Zoom } from "@mui/material";
-import { FC } from "react";
-import { CSVLink } from "react-csv";
-import { MdCloudDownload } from "react-icons/md";
-import { AnalysisStatus } from "shared-types";
-import { makeStyles } from "tss-react/mui";
-import { useReportStore } from "../stores/fe-report-store";
-
-export const ExportToCSV: FC = () => {
- const { classes } = useStyles();
- const { status, allIssues, requestId } = useReportStore();
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-const useStyles = makeStyles()((theme: Theme) => ({
- exportToCSV: {
- display: "inline-flex",
- alignItems: "center",
- gap: theme.spacing(1),
- color: theme.palette.primary.main,
- fontWeight: 400,
- textDecoration: "none",
- "&:hover": {
- textDecoration: "underline",
- },
- },
-}));
diff --git a/packages/app/src/report/components/NewAnalysisDialog.tsx b/packages/app/src/report/components/NewAnalysisDialog.tsx
new file mode 100644
index 0000000..7eda441
--- /dev/null
+++ b/packages/app/src/report/components/NewAnalysisDialog.tsx
@@ -0,0 +1,42 @@
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ Theme,
+} from "@mui/material";
+import { FC } from "react";
+import { makeStyles } from "tss-react/mui";
+import { AnalysisInputForm } from "../../analysis/components/AnalysisInputForm";
+import { useReportStore } from "../stores/fe-report-store";
+
+export const NewAnalysisDialog: FC = () => {
+ const { classes } = useStyles();
+ const { newAnalysisDialogOpen, closeNewAnalysisDialog } = useReportStore();
+
+ return (
+
+ );
+};
+
+const useStyles = makeStyles()((theme: Theme) => ({
+ dialogContent: {
+ display: "flex",
+ flexDirection: "column",
+ gap: theme.spacing(2),
+ padding: 0,
+ },
+}));
diff --git a/packages/app/src/report/components/ReportHeader.tsx b/packages/app/src/report/components/ReportHeader.tsx
index 2db0713..f161c54 100644
--- a/packages/app/src/report/components/ReportHeader.tsx
+++ b/packages/app/src/report/components/ReportHeader.tsx
@@ -1,21 +1,17 @@
import {
Divider,
- IconButton,
Paper,
Theme,
- Tooltip,
Typography,
useMediaQuery,
useTheme,
} from "@mui/material";
import { FC } from "react";
-import { IoMdArrowBack } from "react-icons/io";
-import { NavLink } from "react-router-dom";
import { makeStyles } from "tss-react/mui";
import { LanguageIcon } from "../../common/LanguageIcon";
import { useReportStore } from "../stores/fe-report-store";
-import { ExportToCSV } from "./ExportToCSV";
import { ReportHeaderSection } from "./ReportHeaderSection";
+import { ReportToolbar } from "./ReportToolbar";
import { Score } from "./Score";
export const ReportHeader: FC = ({ ready }) => {
@@ -32,6 +28,7 @@ export const ReportHeader: FC = ({ ready }) => {
progress,
language,
} = useReportStore();
+
if (!lintersWithIssues) {
return null;
}
@@ -75,16 +72,7 @@ export const ReportHeader: FC = ({ ready }) => {
-
-
-
-
-
-
-
-
-
-
+
({
nowrap: {
wordBreak: "keep-all",
},
- footer: {
- display: "flex",
- alignItems: "center",
- gap: theme.spacing(2),
- paddingBlockStart: theme.spacing(1),
- justifyContent: "space-between"
- },
}));
interface ReportBannerProps {
diff --git a/packages/app/src/report/components/ReportTabs.tsx b/packages/app/src/report/components/ReportTabs.tsx
index 85b3f50..1a95aa0 100644
--- a/packages/app/src/report/components/ReportTabs.tsx
+++ b/packages/app/src/report/components/ReportTabs.tsx
@@ -11,7 +11,6 @@ import {
import { FC, useState } from "react";
import { makeStyles } from "tss-react/mui";
import { ReportType } from "../fe-report-types";
-
import { Details } from "./Details";
import { Detection } from "./Detection";
import { ReportPanel } from "./ReportPanel";
@@ -44,19 +43,17 @@ export const ReportTabs: FC = () => {
onChange={handlePanelTypeChange}
>
{
const useStyles = makeStyles()((theme: Theme) => ({
tab: {
textTransform: "none",
+
transition: theme.transitions.create("background"),
[theme.breakpoints.up("md")]: {
minWidth: 180,
+ borderTopRightRadius: 15,
+ borderTopLeftRadius: 15,
},
},
selectedTab: {
diff --git a/packages/app/src/report/components/ReportToolbar.tsx b/packages/app/src/report/components/ReportToolbar.tsx
new file mode 100644
index 0000000..d45120d
--- /dev/null
+++ b/packages/app/src/report/components/ReportToolbar.tsx
@@ -0,0 +1,41 @@
+import { Button, Divider, Theme } from "@mui/material";
+import { FC } from "react";
+import { makeStyles } from "tss-react/mui";
+import { useReportStore } from "../stores/fe-report-store";
+import { BackButton } from "./BackButton";
+import { DownloadAllIssuesButton } from "./DownloadAllIssuesButton";
+
+export const ReportToolbar: FC = () => {
+ const { classes } = useStyles();
+ const { openNewAnalysisDialog } = useReportStore();
+
+ return (
+
+
+
+
+
+
+
+
+ );
+};
+
+const useStyles = makeStyles()((theme: Theme) => ({
+ reportToolbar: {
+ display: "flex",
+ alignItems: "center",
+ gap: theme.spacing(2),
+ paddingBlockStart: theme.spacing(1),
+ justifyContent: "space-between",
+ },
+}));
diff --git a/packages/app/src/report/stores/fe-report-store.ts b/packages/app/src/report/stores/fe-report-store.ts
index 6af6e91..cda55e9 100644
--- a/packages/app/src/report/stores/fe-report-store.ts
+++ b/packages/app/src/report/stores/fe-report-store.ts
@@ -17,6 +17,7 @@ const initialState: InitialState = {
fileDetails: undefined,
wsError: undefined,
analysisError: undefined,
+ newAnalysisDialogOpen: false,
};
export const ReportStore = createStore((set, get) => ({
@@ -65,6 +66,8 @@ export const ReportStore = createStore((set, get) => ({
)
.flat();
},
+ openNewAnalysisDialog: () => set({ newAnalysisDialogOpen: true }),
+ closeNewAnalysisDialog: () => set({ newAnalysisDialogOpen: false }),
}));
export const useReportStore = () => useStore(ReportStore);
@@ -78,6 +81,8 @@ type InitialState = Omit<
| "lintersCompleted"
| "progress"
| "allIssues"
+ | "openNewAnalysisDialog"
+ | "closeNewAnalysisDialog"
>;
interface FeReportStoreState extends ReportState {
@@ -92,4 +97,7 @@ interface FeReportStoreState extends ReportState {
progress(): number;
reset(): void;
allIssues(): Issue[];
+ newAnalysisDialogOpen: boolean;
+ openNewAnalysisDialog(): void;
+ closeNewAnalysisDialog(): void;
}