Skip to content

Commit 3c5e7a2

Browse files
authored
Create general info page, Part 1 (#18)
✨ feat: Add general info page
1 parent 1b481bc commit 3c5e7a2

File tree

4 files changed

+136
-0
lines changed

4 files changed

+136
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
'use client';
2+
import { Button, Chip, Paper, Stack, TextField, Typography } from '@mui/material';
3+
import { MouseEvent, useState } from 'react';
4+
5+
import { removeChip } from './util';
6+
7+
export default function Contest() {
8+
const [contests, setContests] = useState(['Contest 1', 'Contest 2', 'Contest 3']);
9+
10+
const handleContestDelete = (event: MouseEvent<HTMLElement, MouseEvent>) => {
11+
removeChip(event, setContests);
12+
13+
// TODO: Remove the contest from the database
14+
};
15+
16+
return (
17+
<Paper>
18+
<Stack px={4} py={2} gap={2}>
19+
<Typography component='h2' variant='h6'>
20+
Contests
21+
</Typography>
22+
<Stack direction='row' gap={2}>
23+
<TextField id='contest' label='Contest UID' />
24+
<Button variant='contained'>Add</Button>
25+
</Stack>
26+
<Stack direction='row' gap={2}>
27+
{contests.map((contest, index) => (
28+
<Chip key={index} label={contest} onDelete={handleContestDelete} />
29+
))}
30+
</Stack>
31+
</Stack>
32+
</Paper>
33+
);
34+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
'use client';
2+
import { Button, Chip, Paper, Stack, TextField, Typography } from '@mui/material';
3+
import { MouseEvent, useState } from 'react';
4+
5+
import { removeChip } from './util';
6+
7+
export default function Tag() {
8+
const [tags, setTags] = useState(['Contest 1', 'Contest 2', 'Contest 3']);
9+
10+
const handleTagDelete = (event: MouseEvent<HTMLElement, MouseEvent>) => {
11+
removeChip(event, setTags);
12+
13+
// TODO: Remove the tag from the database
14+
};
15+
16+
return (
17+
<Paper>
18+
<Stack px={4} py={2} gap={2}>
19+
<Typography component='h2' variant='h6'>
20+
Tags
21+
</Typography>
22+
<Stack direction='row' gap={2}>
23+
<TextField
24+
id='tag'
25+
label='Tag'
26+
helperText='Use only English and try autocomplete tags'
27+
/>
28+
<Button variant='contained'>Add</Button>
29+
</Stack>
30+
<Stack direction='row' gap={2}>
31+
{tags.map((contest, index) => (
32+
<Chip key={index} label={contest} onDelete={handleTagDelete} />
33+
))}
34+
</Stack>
35+
</Stack>
36+
</Paper>
37+
);
38+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import {
2+
Button,
3+
Checkbox,
4+
FormControlLabel,
5+
Paper,
6+
Stack,
7+
TextField,
8+
} from '@mui/material';
9+
10+
import Tag from './Tag';
11+
import Contest from './Contest';
12+
13+
export default function Problem() {
14+
return (
15+
<Stack mt={2} gap={4}>
16+
<Paper>
17+
<Stack direction='column' px={4} py={2} gap={2}>
18+
<TextField
19+
id='input_file'
20+
label='Input file'
21+
helperText='Input file name or "stdin" for standard input'
22+
/>
23+
<TextField
24+
id='output_file'
25+
label='Output file'
26+
helperText='Output file name or "stdout" for standard output'
27+
/>
28+
<TextField
29+
id='time_limit'
30+
label='Time limit (ms)'
31+
helperText='Time limit per test (between 250 ms and 15000 ms)'
32+
/>
33+
<TextField
34+
id='memory_limit'
35+
label='Memory limit (MB)'
36+
helperText='Memory limit (between 4 MB and 1024 MB)'
37+
/>
38+
<FormControlLabel
39+
control={<Checkbox />}
40+
label='This problem is interactive'
41+
/>
42+
<Button variant='contained'>Save</Button>
43+
</Stack>
44+
</Paper>
45+
46+
<Tag />
47+
<Contest />
48+
</Stack>
49+
);
50+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Dispatch, MouseEvent, SetStateAction } from 'react';
2+
3+
export const removeChip = (event: MouseEvent<HTMLElement, MouseEvent>, setHook: Dispatch<SetStateAction<string[]>>) => {
4+
if (event.currentTarget.tagName === 'PATH') {
5+
console.info('Path');
6+
return;
7+
}
8+
9+
const contest = event.currentTarget.parentNode?.firstElementChild?.textContent;
10+
if (!contest) {
11+
return;
12+
}
13+
setHook((contests) => contests.filter((c) => c !== contest));
14+
};

0 commit comments

Comments
 (0)