1
1
import AddIcon from '@mui/icons-material/Add' ;
2
+ import CheckIcon from '@mui/icons-material/Check' ;
3
+ import CloseIcon from '@mui/icons-material/Close' ;
2
4
import Box from '@mui/material/Box' ;
3
5
import Button from '@mui/material/Button' ;
6
+ import IconButton from '@mui/material/IconButton' ;
4
7
import Paper from '@mui/material/Paper' ;
5
8
import Table from '@mui/material/Table' ;
6
9
import TableBody from '@mui/material/TableBody' ;
7
10
import TableCell from '@mui/material/TableCell' ;
8
11
import TableContainer from '@mui/material/TableContainer' ;
9
12
import TableHead from '@mui/material/TableHead' ;
10
13
import TableRow from '@mui/material/TableRow' ;
14
+ import TextField from '@mui/material/TextField' ;
11
15
import Typography from '@mui/material/Typography' ;
12
- import React , { useState } from 'react' ;
16
+ import React , { useEffect , useMemo , useRef , useState } from 'react' ;
13
17
import { Server } from '../../../shared/types/servers' ;
18
+ import { ServersResourceImpl } from './servers-service' ;
19
+
14
20
export default function Servers ( ) {
15
- const [ servers ] = useState < Server [ ] > ( [ ] ) ;
21
+ const service = useMemo ( ( ) => new ServersResourceImpl ( ) , [ ] ) ;
22
+ const [ add , setAdd ] = useState < boolean > ( false ) ;
23
+ const [ servers , setServers ] = useState < Server [ ] > ( [ ] ) ;
24
+ useEffect ( ( ) => {
25
+ console . log ( 'load servers' ) ;
26
+ service . read ( ) . then ( servers => setServers ( servers ) ) ;
27
+ } , [ ] ) ;
28
+ const createServer = ( server : Server ) =>
29
+ service
30
+ . create ( server )
31
+ . then ( ( ) => service . read ( ) )
32
+ . then ( servers => setServers ( servers ) )
33
+ . then ( ( ) => setAdd ( false ) ) ;
16
34
17
35
return (
18
36
< React . Fragment >
@@ -21,64 +39,89 @@ export default function Servers() {
21
39
display : 'flex' ,
22
40
alignItems : 'center' ,
23
41
justifyContent : 'space-between' ,
24
- p : 3 ,
42
+ mb : 2 ,
25
43
} }
26
44
>
27
45
< Typography variant = "h5" > Servers</ Typography >
28
46
29
- < Button variant = "outlined" startIcon = { < AddIcon /> } >
30
- Add
47
+ < Button
48
+ variant = "outlined"
49
+ startIcon = { < AddIcon /> }
50
+ onClick = { ( ) => setAdd ( ! add ) }
51
+ >
52
+ Create
31
53
</ Button >
32
54
</ Box >
33
- < BasicTable />
55
+
56
+ { add && (
57
+ < CreateServer onSubmit = { createServer } onCancel = { ( ) => setAdd ( false ) } />
58
+ ) }
59
+
60
+ < ServersTable servers = { servers } />
34
61
</ React . Fragment >
35
62
) ;
36
63
}
37
64
38
- function createData (
39
- name : string ,
40
- calories : number ,
41
- fat : number ,
42
- carbs : number ,
43
- protein : number
44
- ) {
45
- return { name, calories, fat, carbs, protein } ;
46
- }
65
+ function CreateServer ( props : {
66
+ onSubmit : ( server : Server ) => void ;
67
+ onCancel : ( ) => void ;
68
+ } ) {
69
+ const nameRef = useRef < HTMLInputElement > ( ) ;
70
+ const urlRef = useRef < HTMLInputElement > ( ) ;
47
71
48
- const rows = [
49
- createData ( 'Frozen yoghurt' , 159 , 6.0 , 24 , 4.0 ) ,
50
- createData ( 'Ice cream sandwich' , 237 , 9.0 , 37 , 4.3 ) ,
51
- createData ( 'Eclair' , 262 , 16.0 , 24 , 6.0 ) ,
52
- createData ( 'Cupcake' , 305 , 3.7 , 67 , 4.3 ) ,
53
- createData ( 'Gingerbread' , 356 , 16.0 , 49 , 3.9 ) ,
54
- ] ;
72
+ return (
73
+ < Box
74
+ component = "form"
75
+ sx = { {
76
+ '& > :not(style)' : { m : 1 } ,
77
+ mb : 2 ,
78
+ display : 'flex' ,
79
+ alignItems : 'center' ,
80
+ } }
81
+ noValidate
82
+ autoComplete = "off"
83
+ >
84
+ < TextField id = "name" label = "Name" variant = "standard" inputRef = { nameRef } />
85
+ < TextField id = "url" label = "URL" variant = "standard" inputRef = { urlRef } />
86
+
87
+ < IconButton
88
+ aria-label = "submit"
89
+ onClick = { ( ) =>
90
+ props . onSubmit ( {
91
+ name : nameRef . current . value ,
92
+ url : urlRef . current . value ,
93
+ } )
94
+ }
95
+ >
96
+ < CheckIcon />
97
+ </ IconButton >
98
+ < IconButton aria-label = "cancel" onClick = { ( ) => props . onCancel ( ) } >
99
+ < CloseIcon />
100
+ </ IconButton >
101
+ </ Box >
102
+ ) ;
103
+ }
55
104
56
- function BasicTable ( ) {
105
+ function ServersTable ( { servers } : { servers : Server [ ] } ) {
57
106
return (
58
107
< TableContainer component = { Paper } >
59
108
< Table sx = { { minWidth : 650 } } aria-label = "simple table" >
60
109
< TableHead >
61
110
< TableRow >
62
- < TableCell > Dessert (100g serving)</ TableCell >
63
- < TableCell align = "right" > Calories</ TableCell >
64
- < TableCell align = "right" > Fat (g)</ TableCell >
65
- < TableCell align = "right" > Carbs (g)</ TableCell >
66
- < TableCell align = "right" > Protein (g)</ TableCell >
111
+ < TableCell > Name</ TableCell >
112
+ < TableCell > URL</ TableCell >
67
113
</ TableRow >
68
114
</ TableHead >
69
115
< TableBody >
70
- { rows . map ( row => (
116
+ { servers . map ( ( row , index ) => (
71
117
< TableRow
72
- key = { row . name }
118
+ key = { index }
73
119
sx = { { '&:last-child td, &:last-child th' : { border : 0 } } }
74
120
>
75
121
< TableCell component = "th" scope = "row" >
76
122
{ row . name }
77
123
</ TableCell >
78
- < TableCell align = "right" > { row . calories } </ TableCell >
79
- < TableCell align = "right" > { row . fat } </ TableCell >
80
- < TableCell align = "right" > { row . carbs } </ TableCell >
81
- < TableCell align = "right" > { row . protein } </ TableCell >
124
+ < TableCell > { row . url } </ TableCell >
82
125
</ TableRow >
83
126
) ) }
84
127
</ TableBody >
0 commit comments