@@ -17,25 +17,32 @@ import {
17
17
import { withStyles } from '@material-ui/core/styles' ;
18
18
import _ from 'lodash' ;
19
19
import moment from "moment" ;
20
+ import { Alert } from "@material-ui/lab" ;
20
21
21
22
const styles = theme => ( {
23
+ root : {
24
+ margin : theme . spacing ( 2 ) ,
25
+ } ,
22
26
backdrop : {
23
27
zIndex : theme . zIndex . drawer + 1 ,
24
28
color : '#fff' ,
25
29
}
26
30
} ) ;
27
31
28
32
33
+ const executing = "executing"
34
+
29
35
class Admin extends Component {
30
36
constructor ( props ) {
31
37
super ( props ) ;
32
38
this . state = {
33
39
activeIndex : 0 ,
34
- isLoading : false ,
35
- statistics : [ ] ,
40
+ isLoading : undefined ,
41
+ statistics : undefined ,
36
42
filesInput : undefined ,
37
43
fileListHtml : undefined ,
38
- lastExecution : undefined
44
+ lastExecution : undefined ,
45
+ serverBusy : false
39
46
}
40
47
41
48
this . handleIndexChange = this . handleIndexChange . bind ( this ) ;
@@ -45,9 +52,13 @@ class Admin extends Component {
45
52
this . handleGetStatistics = this . handleGetStatistics . bind ( this ) ;
46
53
}
47
54
48
- refreshPage ( ) {
49
- this . handleGetFileList ( ) ;
50
- this . handleGetStatistics ( ) ;
55
+ async refreshPage ( ) {
56
+ this . setState ( { isLoading : true } )
57
+
58
+ await this . handleGetFileList ( ) ;
59
+ await this . handleGetStatistics ( ) ;
60
+
61
+ this . setState ( { isLoading : false } )
51
62
}
52
63
53
64
componentDidMount ( ) {
@@ -82,138 +93,130 @@ class Admin extends Component {
82
93
83
94
this . setState ( { isLoading : true } ) ;
84
95
85
- const response = await fetch ( '/api/execute' ) ;
86
- const result = await response . json ( ) ;
87
-
88
- this . setState ( { isLoading : false } ) ;
96
+ await fetch ( '/api/execute' ) ;
89
97
90
98
this . refreshPage ( ) ;
91
-
92
- return result
93
99
}
94
100
95
101
async handleGetStatistics ( ) {
96
- this . setState ( { isLoading : true } )
97
-
98
- try {
99
- const statsData = await fetch ( "/api/statistics" ) ;
100
- const statsResponse = await statsData . json ( ) ;
102
+ const statsData = await fetch ( "/api/statistics" ) ;
103
+ const statsResponse = await statsData . json ( )
101
104
105
+ if ( statsResponse !== 'executing' ) {
102
106
this . setState ( {
103
107
statistics : _ . toPairsIn ( statsResponse . stats ) ,
104
108
lastExecution : statsResponse . executionTime
105
109
} ) ;
106
-
107
- this . setState ( { isLoading : false } )
108
- } finally {
109
- this . setState ( { isLoading : false } )
110
+ } else {
111
+ this . setState ( { statistics : statsResponse } ) ;
110
112
}
111
-
112
113
}
113
114
114
115
async handleGetFileList ( ) {
115
- this . setState ( { isLoading : true } )
116
-
117
- try {
118
- const filesData = await fetch ( "/api/listCurrentFiles" ) ;
119
- const filesResponse = await filesData . json ( ) ;
120
-
121
- this . setState ( { fileListHtml : filesResponse } ) ;
122
-
123
- } finally {
124
- this . setState ( { isLoading : false } )
125
- }
116
+ const filesData = await fetch ( "/api/listCurrentFiles" ) ;
117
+ const filesResponse = await filesData . json ( ) ;
118
+ this . setState ( { fileListHtml : filesResponse } ) ;
126
119
}
127
120
128
121
render ( ) {
129
122
const { classes} = this . props ;
130
123
131
124
return (
132
- < div style = { { paddingLeft : 20 } } >
125
+ < div className = { classes . root } >
133
126
< h1 > Admin Portal</ h1 >
134
- < Backdrop className = { classes . backdrop } open = { this . state . isLoading === true } >
135
- < CircularProgress size = { 60 } />
136
- </ Backdrop >
137
- < Grid container spacing = { 3 } direction = "column" style = { { padding : 30 } } >
138
- < Grid container spacing = { 3 } direction = "row" >
139
- < Grid item sm = { 6 } >
140
- < h2 > Latest Files</ h2 >
141
- { _ . isEmpty ( this . state . fileListHtml ) !== true &&
142
- < TableContainer component = { Paper } className = "statisticsData" >
143
- < Table aria-label = "simple table" className = { classes . table } >
144
- < TableHead >
145
- < TableRow >
146
- < TableCell > < b > File Type</ b > </ TableCell >
147
- < TableCell > < b > Last Updated</ b > </ TableCell >
148
- </ TableRow >
149
- </ TableHead >
150
- < TableBody >
151
- { _ . map ( this . state . fileListHtml , file => {
152
- const fileName = file . split ( "-" ) [ 0 ] ;
153
- let fileDate = file . split ( "-" ) . slice ( 1 ) . join ( ) . split ( "." ) [ 0 ] ;
154
- let fileDateOnlyNumbers = fileDate . replaceAll ( "," , "" ) ;
155
- let fileDateFormatted = moment ( fileDateOnlyNumbers , "YYYYMMDDhmmss" ) . local ( ) . format ( "MMMM Do YYYY, h:mm:ss a" ) ;
156
-
157
- return (
158
- < TableRow >
159
- < TableCell > { fileName } </ TableCell >
160
- < TableCell > { fileDateFormatted } </ TableCell >
161
- </ TableRow >
162
- )
163
- } )
164
- }
165
- </ TableBody >
166
- </ Table >
167
- </ TableContainer > }
168
-
169
- < Paper style = { { padding : 5 , marginTop : 10 } } >
170
- < CardContent >
171
- < h3 style = { { marginTop : 0 } } > Upload Files</ h3 >
172
- < form onSubmit = { this . handleUpload } >
173
- < input type = "file" value = { this . state . filesInput } multiple />
174
- < Button type = "submit" variant = "contained" color = "primary" > Upload</ Button >
175
- </ form >
176
- </ CardContent >
177
- </ Paper >
178
- </ Grid >
179
-
180
- < Grid item sm = { 6 } >
181
- < h2 > Last Match Analysis </ h2 >
182
- { _ . isEmpty ( this . state . statistics ) !== true &&
183
- < TableContainer component = { Paper } className = "statisticsData" >
184
- < Table aria-label = "simple table" className = { classes . table } >
185
- < TableBody >
186
- < TableRow key = 'time' >
127
+ { this . state . statistics === 'Running' && < Alert severity = "info" > Execution is in Progress...</ Alert > }
128
+ < Backdrop className = { classes . backdrop } open = { this . state . isLoading !== false } >
129
+ < CircularProgress size = { 60 } />
130
+ </ Backdrop >
131
+ < Grid container spacing = { 3 } direction = "column" style = { { padding : 20 } } >
132
+ < Grid container spacing = { 3 } direction = "row" >
133
+ < Grid item sm = { 6 } >
134
+ < h2 > Latest Files</ h2 >
135
+ { _ . isEmpty ( this . state . fileListHtml ) !== true &&
136
+ < TableContainer component = { Paper } className = "statisticsData" >
137
+ < Table aria-label = "simple table" className = { classes . table } >
138
+ < TableHead >
139
+ < TableRow >
140
+ < TableCell > < b > File Type</ b > </ TableCell >
141
+ < TableCell > < b > Last Updated</ b > </ TableCell >
142
+ </ TableRow >
143
+ </ TableHead >
144
+ < TableBody >
145
+ { _ . map ( this . state . fileListHtml , ( file , index ) => {
146
+ const fileName = file . split ( "-" ) [ 0 ] ;
147
+ let fileDate = file . split ( "-" ) . slice ( 1 ) . join ( ) . split ( "." ) [ 0 ] ;
148
+ let fileDateOnlyNumbers = fileDate . replaceAll ( "," , "" ) ;
149
+ let fileDateFormatted = moment ( fileDateOnlyNumbers , "YYYYMMDDhmmss" ) . local ( ) . format ( "MMMM Do YYYY, h:mm:ss a" ) ;
150
+
151
+ return (
152
+ < TableRow key = { index } >
153
+ < TableCell > { fileName } </ TableCell >
154
+ < TableCell > { fileDateFormatted } </ TableCell >
155
+ </ TableRow >
156
+ )
157
+ } )
158
+ }
159
+ </ TableBody >
160
+ </ Table >
161
+ </ TableContainer > }
162
+
163
+ < Paper style = { { padding : 5 , marginTop : 10 } } >
164
+ < CardContent >
165
+ < h3 style = { { marginTop : 0 } } > Upload Files</ h3 >
166
+ < form onSubmit = { this . handleUpload } >
167
+ < input type = "file" value = { this . state . filesInput } multiple />
168
+ < Button type = "submit" variant = "contained" color = "primary"
169
+ disabled = { this . state . statistics === 'Running' } >
170
+ Upload
171
+ </ Button >
172
+ </ form >
173
+ </ CardContent >
174
+ </ Paper >
175
+ </ Grid >
176
+
177
+ < Grid item sm = { 6 } >
178
+ < h2 > Last Match Analysis </ h2 >
179
+ { _ . isEmpty ( this . state . statistics ) !== true &&
180
+ this . state . statistics !== 'Running' &&
181
+ < TableContainer component = { Paper } className = "statisticsData" >
182
+ < Table aria-label = "simple table" className = { classes . table } >
183
+ < TableBody >
184
+ < TableRow key = 'time' >
185
+ < TableCell align = "left" component = "th" scope = "row" >
186
+ < b > Last Analysis</ b >
187
+ </ TableCell >
188
+ < TableCell align = "left" >
189
+ < b >
190
+ { moment ( this . state . lastExecution , "dddd MMMM Do h:mm:ss YYYY" ) . local ( ) . format ( "MMMM Do YYYY, h:mm:ss a" ) }
191
+ </ b >
192
+ </ TableCell >
193
+ </ TableRow >
194
+ { this . state . statistics . map ( ( row , index ) => (
195
+ < TableRow key = { index } >
187
196
< TableCell align = "left" component = "th" scope = "row" >
188
- < b > Last Analysis</ b >
189
- </ TableCell >
190
- < TableCell align = "left" >
191
- < b > { moment ( this . state . lastExecution , "dddd MMMM Do h:mm:ss YYYY" ) . local ( ) . format ( "MMMM Do YYYY, h:mm:ss a" ) } </ b >
197
+ { row [ 0 ] }
192
198
</ TableCell >
199
+ < TableCell align = "left" > { row [ 1 ] } </ TableCell >
193
200
</ TableRow >
194
- { this . state . statistics . map ( ( row , index ) => (
195
- < TableRow key = { index } >
196
- < TableCell align = "left" component = "th" scope = "row" >
197
- { row [ 0 ] }
198
- </ TableCell >
199
- < TableCell align = "left" > { row [ 1 ] } </ TableCell >
200
- </ TableRow >
201
- ) ) }
202
- </ TableBody >
203
- </ Table >
204
- </ TableContainer > }
205
- < Paper style = { { padding : 5 , marginTop : 10 } } >
206
- < CardContent >
207
- < h3 style = { { marginTop : 0 } } > Run New Analysis</ h3 >
208
- < form onSubmit = { this . handleExecute } >
209
- < Button type = "submit" variant = "contained"
210
- color = "primary" > Run Data Analysis</ Button >
211
- </ form >
212
- </ CardContent >
213
- </ Paper >
214
- </ Grid >
201
+ ) ) }
202
+ </ TableBody >
203
+ </ Table >
204
+ </ TableContainer >
205
+ }
206
+ < Paper style = { { padding : 5 , marginTop : 10 } } >
207
+ < CardContent >
208
+ < h3 style = { { marginTop : 0 } } > Run New Analysis</ h3 >
209
+ < form onSubmit = { this . handleExecute } >
210
+ < Button type = "submit" variant = "contained" color = "primary"
211
+ disabled = { this . state . statistics === 'Running' } >
212
+ Run Data Analysis
213
+ </ Button >
214
+ </ form >
215
+ </ CardContent >
216
+ </ Paper >
215
217
</ Grid >
216
218
</ Grid >
219
+ </ Grid >
217
220
</ div >
218
221
) ;
219
222
}
0 commit comments