mirror of
https://github.com/ellmau/adf-obdd.git
synced 2025-12-19 09:29:36 +01:00
* 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>
156 lines
5.4 KiB
TypeScript
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;
|