1
- import { faPlus , faTrash } from '@fortawesome/free-solid-svg-icons ' ;
2
- import { FontAwesomeIcon } from '@fortawesome/react-fontawesome ' ;
3
- import { observable } from 'mobx' ;
1
+ import { Staff , StaffType } from '@kaiyuanshe/openhackathon-service ' ;
2
+ import { Loading } from 'idea-react ' ;
3
+ import { computed } from 'mobx' ;
4
4
import { observer } from 'mobx-react' ;
5
5
import { ObservedComponent } from 'mobx-react-helper' ;
6
- import { ScrollList } from 'mobx-restful-table' ;
6
+ import { Column , RestTable } from 'mobx-restful-table' ;
7
7
import { compose , RouteProps , router } from 'next-ssr-middleware' ;
8
- import { FC , FormEvent , useContext } from 'react' ;
9
- import { Badge , Button , Col , Form , ListGroup , Row } from 'react-bootstrap' ;
8
+ import { FC , useContext } from 'react' ;
9
+ import { Badge , Col , ListGroup , Row } from 'react-bootstrap' ;
10
10
11
11
import { ActivityManageFrame } from '../../../../components/Activity/ActivityManageFrame' ;
12
- import { AdministratorModal } from '../../../../components/User/ActivityAdministratorModal' ;
13
- import { HackathonAdminList } from '../../../../components/User/HackathonAdminList' ;
12
+ import { adminColumns } from '../../../../components/User/HackathonAdminList' ;
14
13
import activityStore from '../../../../models/Activity' ;
15
14
import { i18n , I18nContext } from '../../../../models/Base/Translation' ;
16
15
import { sessionGuard } from '../../../api/core' ;
@@ -40,46 +39,56 @@ class AdministratorEditor extends ObservedComponent<AdministratorPageProps, type
40
39
41
40
store = activityStore . staffOf ( this . props . route . params ! . name + '' ) ;
42
41
43
- @observable
44
- accessor selectedIds : number [ ] = [ ] ;
45
-
46
- @observable
47
- accessor show = false ;
48
-
49
- //处理删除管理员或裁判
50
- handleSubmit = async ( event : FormEvent < HTMLFormElement > ) => {
51
- event . preventDefault ( ) ;
52
- event . stopPropagation ( ) ;
53
-
54
- const { t } = this . observedContext ,
55
- { selectedIds } = this ;
56
-
57
- if ( ! selectedIds [ 0 ] ) return alert ( t ( 'please_select_at_least_one_user' ) ) ;
58
-
59
- if ( ! confirm ( t ( 'confirm_to_delete_admin_or_referee' ) ) ) return ;
60
-
61
- for ( const id of selectedIds ) await this . store . deleteOne ( id ) ;
62
- } ;
42
+ @computed
43
+ get columns ( ) {
44
+ const i18n = this . observedContext ;
45
+ const { t } = i18n ;
46
+
47
+ return [
48
+ {
49
+ key : 'type' ,
50
+ renderHead : t ( 'type' ) ,
51
+ type : 'radio' ,
52
+ options : [
53
+ { value : 'admin' , label : t ( 'admin' ) } ,
54
+ { value : 'judge' , label : t ( 'referee' ) } ,
55
+ ] ,
56
+ } ,
57
+ ...adminColumns ( i18n ) ,
58
+ ] as Column < Staff > [ ] ;
59
+ }
63
60
64
61
renderList ( ) {
65
62
const { t } = this . observedContext ,
66
63
{ allItems, typeCount } = this . store ;
67
64
68
65
return (
69
66
< ListGroup >
70
- < ListGroup . Item className = "d-flex justify-content-between" >
67
+ < ListGroup . Item
68
+ className = "d-flex justify-content-between"
69
+ action
70
+ onClick = { ( ) => this . store . getList ( { } , 1 ) }
71
+ >
71
72
{ t ( 'all_user' ) }
72
73
< Badge className = "ms-2" bg = "secondary" >
73
74
{ allItems . length }
74
75
</ Badge >
75
76
</ ListGroup . Item >
76
- < ListGroup . Item className = "d-flex justify-content-between" >
77
+ < ListGroup . Item
78
+ className = "d-flex justify-content-between"
79
+ action
80
+ onClick = { ( ) => this . store . getList ( { type : 'admin' as StaffType . Admin } , 1 ) }
81
+ >
77
82
{ t ( 'admin' ) }
78
83
< Badge className = "ms-2" bg = "secondary" >
79
84
{ typeCount . admin }
80
85
</ Badge >
81
86
</ ListGroup . Item >
82
- < ListGroup . Item className = "d-flex justify-content-between" >
87
+ < ListGroup . Item
88
+ className = "d-flex justify-content-between"
89
+ action
90
+ onClick = { ( ) => this . store . getList ( { type : 'judge' as StaffType . Judge } , 1 ) }
91
+ >
83
92
{ t ( 'referee' ) }
84
93
< Badge className = "ms-2" bg = "secondary" >
85
94
{ typeCount . judge }
@@ -91,57 +100,26 @@ class AdministratorEditor extends ObservedComponent<AdministratorPageProps, type
91
100
92
101
render ( ) {
93
102
const i18n = this . observedContext ,
94
- { store, show } = this ;
95
- const { t } = i18n ,
96
- loading = store . uploading > 0 ;
103
+ { downloading, uploading } = this . store ;
97
104
98
- return (
99
- < Form onSubmit = { this . handleSubmit } >
100
- < Row xs = "1" sm = "2" >
101
- < Col sm = "auto" md = "auto" >
102
- { this . renderList ( ) }
105
+ const loading = downloading > 0 || uploading > 0 ;
103
106
104
- < Col className = "d-flex flex-column" >
105
- < Button
106
- variant = "success"
107
- className = "my-3"
108
- disabled = { loading }
109
- onClick = { ( ) => ( this . show = true ) }
110
- >
111
- < FontAwesomeIcon className = "me-2" icon = { faPlus } />
112
- { t ( 'add' ) }
113
- </ Button >
114
- < Button variant = "danger" type = "submit" disabled = { loading } >
115
- < FontAwesomeIcon className = "me-2" icon = { faTrash } />
116
- { t ( 'delete' ) }
117
- </ Button >
118
- </ Col >
119
- </ Col >
120
- < Col className = "flex-fill" >
121
- < ScrollList
122
- translator = { i18n }
123
- store = { store }
124
- renderList = { allItems => (
125
- < HackathonAdminList
126
- defaultData = { allItems }
127
- selectedIds = { this . selectedIds }
128
- onSelect = { list => ( this . selectedIds = list ) }
129
- />
130
- ) }
131
- />
132
- </ Col >
133
- </ Row >
134
-
135
- < AdministratorModal
136
- store = { store }
137
- show = { show }
138
- onHide = { ( ) => ( this . show = false ) }
139
- onSave = { ( ) => {
140
- this . show = false ;
141
- this . store . refreshList ( ) ;
142
- } }
143
- />
144
- </ Form >
107
+ return (
108
+ < Row xs = "1" sm = "2" >
109
+ < Col sm = "auto" md = "auto" >
110
+ { this . renderList ( ) }
111
+ </ Col >
112
+ < Col className = "flex-fill" >
113
+ < RestTable
114
+ translator = { i18n }
115
+ store = { this . store }
116
+ columns = { this . columns }
117
+ editable
118
+ deletable
119
+ />
120
+ { loading && < Loading /> }
121
+ </ Col >
122
+ </ Row >
145
123
) ;
146
124
}
147
125
}
0 commit comments