1
0
mirror of https://github.com/ellmau/adf-obdd.git synced 2025-12-19 09:29:36 +01:00
Stefan Ellmauthaler c9278cf5ce
milestone/frontend (#63)
* Introduce separate server package

* Implement basic visualization of solve response

* Make fetch endpoint depend on environment

* Introduce features flag for localhost cors support

* Serve static files from './assets' directory

* Add Dockerfile as example for server with frontend

* Support multiple solving strategies

* Support stable model semantics with nogoods

* Introduce custom node type for nicer layout

* Support more options and multiple models

* Use standard example for adfs on the frontend

* Use unoptimised hybrid step for better presentation

* Upgrade frontend dependencies

* Animate graph changes

* Experiment with timeout on API endpoints

* Relax CORS restrictions for local development

* Add API for adding/deleting users; login; logout

* Add API for uploading and solving adf problems

* Add API for getting and updating user

* Return early for parse and solve; Add Adf GET

* Add Delete and Index endpoints for ADFs

* Add basic UI for user endpoints

* Enforce username and password to be set on login

* Show colored snackbars

* Allow file upload for ADF; fix some server bugs

* Implement ADF Add Form and Overview

* Add Detail View for ADF problems

* Add docker-compose file for mongodb (development)

* Add mongodb (DEV) data directory to dockerignore

* Let unknown routes be handled by frontend

* Add legal information page to frontend

* Change G6 Graph layout slightly

* Add missing doc comments to lib

* Update legal information regarding cookies

* Add project logos to frontend

* Add help texts to frontend

* Move DoubleLabeledGraph from lib to server

* Give example for custom Adf datastructure in docs

* Update README and Project Website

* Update devskim.yml

* Add READMEs for frontend and server

---------

Co-authored-by: monsterkrampe <monsterkrampe@users.noreply.github.com>
2023-05-04 17:10:38 +02:00

156 lines
5.4 KiB
TypeScript

import React, { useState, useMemo } from 'react';
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import { ThemeProvider, createTheme } from '@mui/material/styles';
import {
Alert,
AlertColor,
Backdrop,
Container,
CircularProgress,
CssBaseline,
Link,
Snackbar,
Stack,
useMediaQuery,
} from '@mui/material';
import LoadingContext from './loading-context';
import SnackbarContext from './snackbar-context';
import Footer from './footer';
import AdfOverview from './adf-overview';
import AdfDetails from './adf-details';
const browserRouter = createBrowserRouter([
{
path: '/',
element: <AdfOverview />,
},
{
path: '/:adfName',
element: <AdfDetails />,
},
]);
function App() {
const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');
const theme = useMemo(
() => createTheme({
palette: {
mode: prefersDarkMode ? 'dark' : 'light',
},
}),
[prefersDarkMode],
);
const [loading, setLoading] = useState(false);
const loadingContext = useMemo(() => ({ loading, setLoading }), [loading, setLoading]);
const [snackbarInfo, setSnackbarInfo] = useState<{
message: string,
severity: AlertColor,
potentialUserChange: boolean,
} | undefined>();
const snackbarContext = useMemo(
() => ({ status: snackbarInfo, setStatus: setSnackbarInfo }),
[snackbarInfo, setSnackbarInfo],
);
return (
<ThemeProvider theme={theme}>
<LoadingContext.Provider value={loadingContext}>
<SnackbarContext.Provider value={snackbarContext}>
<CssBaseline />
<main style={{ maxHeight: 'calc(100vh - 70px)', overflowY: 'auto' }}>
<RouterProvider router={browserRouter} />
<Container sx={{ marginTop: 4 }}>
<Stack direction="row" justifyContent="center" flexWrap="wrap">
<Link href="https://www.innosale.eu/" target="_blank" rel="noopener noreferrer">
<img
src={new URL('../innosale-logo.png', import.meta.url).toString()}
alt="InnoSale Logo"
height="40"
style={{
display: 'inline-block', borderRadius: 4, margin: 2, boxShadow: '0 0 5px 0 rgba(0,0,0,0.4)', padding: 8, background: '#FFFFFF',
}}
/>
</Link>
<Link href="https://scads.ai/" target="_blank" rel="noopener noreferrer">
<img
src={new URL('../scads-logo.png', import.meta.url).toString()}
alt="Scads.AI Logo"
height="40"
style={{
display: 'inline-block', borderRadius: 4, margin: 2, boxShadow: '0 0 5px 0 rgba(0,0,0,0.4)', padding: 2, background: '#FFFFFF',
}}
/>
</Link>
<Link href="https://secai.org/" target="_blank" rel="noopener noreferrer">
<img
src={new URL('../secai-logo.png', import.meta.url).toString()}
alt="Secai Logo"
height="40"
style={{
display: 'inline-block', borderRadius: 4, margin: 2, boxShadow: '0 0 5px 0 rgba(0,0,0,0.4)',
}}
/>
</Link>
<Link href="https://perspicuous-computing.science" target="_blank" rel="noopener noreferrer">
<img
src={new URL('../cpec-logo.png', import.meta.url).toString()}
alt="CPEC Logo"
height="40"
style={{
display: 'inline-block', borderRadius: 4, margin: 2, boxShadow: '0 0 5px 0 rgba(0,0,0,0.4)', padding: 8, background: '#FFFFFF',
}}
/>
</Link>
<Link href="https://iccl.inf.tu-dresden.de" target="_blank" rel="noopener noreferrer">
<img
src={new URL('../iccl-logo.png', import.meta.url).toString()}
alt="ICCL Logo"
height="40"
style={{
display: 'inline-block', borderRadius: 4, margin: 2, boxShadow: '0 0 5px 0 rgba(0,0,0,0.4)', padding: 4, background: '#FFFFFF',
}}
/>
</Link>
<Link href="https://tu-dresden.de" target="_blank" rel="noopener noreferrer">
<img
src={new URL('../tud-logo.png', import.meta.url).toString()}
alt="TU Dresden Logo"
height="40"
style={{
display: 'inline-block', borderRadius: 4, margin: 2, boxShadow: '0 0 5px 0 rgba(0,0,0,0.4)',
}}
/>
</Link>
</Stack>
</Container>
</main>
<Footer />
<Backdrop
open={loading}
>
<CircularProgress color="inherit" />
</Backdrop>
<Snackbar
open={!!snackbarInfo}
autoHideDuration={10000}
onClose={() => setSnackbarInfo(undefined)}
>
<Alert severity={snackbarInfo?.severity}>{snackbarInfo?.message}</Alert>
</Snackbar>
</SnackbarContext.Provider>
</LoadingContext.Provider>
</ThemeProvider>
);
}
export default App;