Skip to content

Commit

Permalink
Add create new server button
Browse files Browse the repository at this point in the history
  • Loading branch information
trungleduc committed Jan 16, 2024
1 parent 5127a50 commit 397ceff
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 31 deletions.
31 changes: 22 additions & 9 deletions frontend/src/environments/EnvironmentList.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { IconButton } from '@mui/material';
import { DataGrid, GridColDef } from '@mui/x-data-grid';
import { DataGrid, GridColDef, GridRowSelectionModel } from '@mui/x-data-grid';
import { IEnvironmentData } from './types';
import { memo, useMemo } from 'react';
import CheckIcon from '@mui/icons-material/Check';
Expand Down Expand Up @@ -84,8 +84,13 @@ const columns: GridColDef[] = [

export interface IEnvironmentListProps {
images: IEnvironmentData[];
default_cpu_limit: string;
default_mem_limit: string;
default_cpu_limit?: string;
default_mem_limit?: string;
hideRemoveButton?: boolean;
pageSize?: number;
selectable?: boolean;
rowSelectionModel?: GridRowSelectionModel;
setRowSelectionModel?: (selected: GridRowSelectionModel) => void;
}

function _EnvironmentList(props: IEnvironmentListProps) {
Expand All @@ -95,12 +100,11 @@ function _EnvironmentList(props: IEnvironmentListProps) {
newItem.cpu_limit =
newItem.cpu_limit.length > 0
? newItem.cpu_limit
: props.default_cpu_limit;
: props.default_cpu_limit ?? '2';
newItem.mem_limit =
newItem.mem_limit.length > 0
? newItem.mem_limit
: props.default_mem_limit;
// newItem.status = 'building';
: props.default_mem_limit ?? '2';
return newItem;
});
}, [props]);
Expand All @@ -113,12 +117,21 @@ function _EnvironmentList(props: IEnvironmentListProps) {
initialState={{
pagination: {
paginationModel: {
pageSize: 100
pageSize: props.pageSize ?? 100
}
}
}}
pageSizeOptions={[100]}
disableRowSelectionOnClick
pageSizeOptions={[props.pageSize ?? 100]}
disableRowSelectionOnClick={!Boolean(props.selectable)}
sx={{
'& .MuiDataGrid-virtualScroller::-webkit-scrollbar': {
overflow: rows.length > 0 ? 'auto' : 'hidden'
}
}}
columnVisibilityModel={{ remove: !Boolean(props.hideRemoveButton) }}
checkboxSelection={Boolean(props.selectable)}
rowSelectionModel={props.rowSelectionModel}
onRowSelectionModelChange={props.setRowSelectionModel}
/>
</Box>
);
Expand Down
6 changes: 5 additions & 1 deletion frontend/src/servers/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ import { AxiosContext } from '../common/AxiosContext';
import { useMemo } from 'react';
import { AxiosClient } from '../common/axiosclient';
import { ServerList } from './ServersList';
import { NewServerDialog } from './NewServerDialog';
import { IEnvironmentData } from '../environments/types';

export interface IAppProps {
images: IEnvironmentData[]
server_data: IServerData[];
allow_named_servers: boolean;
named_server_limit_per_user: number;
Expand All @@ -22,12 +25,13 @@ export default function App(props: IAppProps) {
return new AxiosClient({ baseUrl, xsrfToken });
}, []);
console.log('props', props);

return (
<ThemeProvider theme={customTheme}>
<AxiosContext.Provider value={axios}>
<ScopedCssBaseline>
<Stack sx={{ padding: 1 }} spacing={1}>
<NewServerDialog images={props.images}/>
<ServerList servers={props.server_data} />
</Stack>
</ScopedCssBaseline>
Expand Down
82 changes: 82 additions & 0 deletions frontend/src/servers/NewServerDialog.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import { Box, Button, DialogContentText } from '@mui/material';
import Dialog from '@mui/material/Dialog';
import DialogActions from '@mui/material/DialogActions';
import DialogContent from '@mui/material/DialogContent';
import DialogTitle from '@mui/material/DialogTitle';
import { Fragment, memo, useCallback, useState } from 'react';

// import { useAxios } from '../common/AxiosContext';
import { IEnvironmentData } from '../environments/types';
import { EnvironmentList } from '../environments/EnvironmentList';
import { GridRowSelectionModel } from '@mui/x-data-grid';

export interface INewServerDialogProps {
images: IEnvironmentData[];
}

function _NewServerDialog(props: INewServerDialogProps) {
// const axios = useAxios();
const [open, setOpen] = useState(false);
const handleOpen = () => {
setOpen(true);
};
const handleClose = (
event?: any,
reason?: 'backdropClick' | 'escapeKeyDown'
) => {
if (reason && reason === 'backdropClick') {
return;
}
setOpen(false);
};

const [rowSelectionModel, setRowSelectionModel] =
useState<GridRowSelectionModel>([]);
const updateSelectedRow = useCallback(
(selected: GridRowSelectionModel) => {
if (selected.length > 1) {
setRowSelectionModel([selected[selected.length - 1]]);
} else {
setRowSelectionModel(selected);
}
},
[setRowSelectionModel]
);
return (
<Fragment>
<Box sx={{ display: 'flex', flexDirection: 'row-reverse' }}>
<Button onClick={handleOpen} variant="contained">
Create new Server
</Button>
</Box>
<Dialog open={open} onClose={handleClose} fullWidth maxWidth={'md'}>
<DialogTitle>Server Options</DialogTitle>
<DialogContent>
<DialogContentText>Select an environment</DialogContentText>
<EnvironmentList
images={props.images}
hideRemoveButton={true}
pageSize={10}
selectable
rowSelectionModel={rowSelectionModel}
setRowSelectionModel={updateSelectedRow}
/>
</DialogContent>
<DialogActions>
<Button variant="contained" color="error" onClick={handleClose}>
Cancel
</Button>
<Button
variant="contained"
color="primary"
disabled={rowSelectionModel.length === 0}
>
Create Server
</Button>
</DialogActions>
</Dialog>
</Fragment>
);
}

export const NewServerDialog = memo(_NewServerDialog);
46 changes: 46 additions & 0 deletions frontend/src/servers/RemoveServerButton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { Typography } from '@mui/material';
import Box from '@mui/material/Box';
import { memo, useCallback } from 'react';

import { useAxios } from '../common/AxiosContext';
import { ButtonWithConfirm } from '../common/ButtonWithConfirm';
import { API_PREFIX } from './types';

interface IRemoveServerButton {
user: string;
server: string;
}

function _RemoveServerButton(props: IRemoveServerButton) {
const axios = useAxios();

const removeEnv = useCallback(async () => {
const response = await axios.request({
method: 'delete',
path: API_PREFIX,
data: { name: props.server }
});
if (response?.status === 'ok') {
window.location.reload();
} else {
}
}, [props.server, axios]);

return (
<ButtonWithConfirm
buttonLabel="Stop Server"
dialogTitle="Stop Server"
dialogBody={
<Box>
<Typography>
Are you sure you want to stop the following server?
</Typography>
<pre>{props.server}</pre>
</Box>
}
action={removeEnv}
/>
);
}

export const RemoveServerButton = memo(_RemoveServerButton);
44 changes: 24 additions & 20 deletions frontend/src/servers/ServersList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { memo, useMemo } from 'react';
import { Box } from '@mui/system';
import { IServerData } from './types';
import { formatTime } from '../common/utils';
import { RemoveServerButton } from './RemoveServerButton';
import { Button } from '@mui/material';

const columns: GridColDef[] = [
{
Expand All @@ -12,43 +14,40 @@ const columns: GridColDef[] = [
flex: 1
},
{
field: 'url',
headerName: 'URL',
flex: 1,
renderCell: params => {
return (
<a href={params.value} target="_blank">
{params.value}
</a>
);
}
field: 'image',
headerName: 'Image',
flex: 1
},
{
field: 'last_activity',
headerName: 'Last activity',
flex: 1,
maxWidth: 150
},
{
field: 'image',
headerName: 'Image',
flex:1,
width: 150
},
{
field: 'status',
headerName: '',
width: 150,
width: 125,
filterable: false,
sortable: false,
hideable: false,
renderCell: params => {
return <RemoveServerButton server={params.row.name} user={'alice'} />;
}
},
{
field: 'action',
headerName: '',
width: 100,
width: 125,
filterable: false,
sortable: false,
hideable: false
hideable: false,
renderCell: params => {
return (
<Button href={params.row.url} target="_blank">
Open Server
</Button>
);
}
}
];

Expand Down Expand Up @@ -80,6 +79,11 @@ function _ServerList(props: IServerListProps) {
}}
pageSizeOptions={[100]}
disableRowSelectionOnClick
sx={{
'& .MuiDataGrid-virtualScroller::-webkit-scrollbar': {
overflow: rows.length > 0 ? 'auto' : 'hidden'
}
}}
/>
</Box>
);
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/servers/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import App, { IAppProps } from './App';

const rootElement = document.getElementById('servers-root');
const root = createRoot(rootElement!);
console.log('AAAAAAAAAA');

const dataElement = document.getElementById('tljh-page-data');
let configData: IAppProps = {
images: [],
server_data: [],
allow_named_servers: false,
named_server_limit_per_user: 0
Expand Down

0 comments on commit 397ceff

Please sign in to comment.