5
5
6
6
import React from 'react' ;
7
7
import styled from 'styled-components' ;
8
+ import Gmp from 'gmp/gmp' ;
9
+ import Rejection from 'gmp/http/rejection' ;
10
+ import Group from 'gmp/models/group' ;
11
+ import Model from 'gmp/models/model' ;
12
+ import Permission from 'gmp/models/permission' ;
13
+ import Role from 'gmp/models/role' ;
14
+ import User from 'gmp/models/user' ;
8
15
import { getEntityType } from 'gmp/utils/entitytype' ;
9
16
import { selectSaveId } from 'gmp/utils/id' ;
10
17
import { isDefined } from 'gmp/utils/identity' ;
11
18
import { NewIcon } from 'web/components/icon' ;
12
19
import ManualIcon from 'web/components/icon/ManualIcon' ;
13
20
import IconDivider from 'web/components/layout/IconDivider' ;
14
21
import Layout from 'web/components/layout/Layout' ;
22
+ import { OnDownloadedFunc } from 'web/entity/hooks/useEntityDownload' ;
15
23
import useCapabilities from 'web/hooks/useCapabilities' ;
16
- import useTranslation from 'web/hooks/useTranslation' ;
24
+ import useTranslation , { TranslateFunc } from 'web/hooks/useTranslation' ;
17
25
import MultiplePermissionDialog , {
18
26
CURRENT_RESOURCE_ONLY ,
19
27
INCLUDE_RELATED_RESOURCES ,
20
28
} from 'web/pages/permissions/MultipleDialog' ;
21
29
import PermissionComponent from 'web/pages/permissions/PermissionsComponent' ;
22
30
import PermissionsTable from 'web/pages/permissions/Table' ;
23
31
import compose from 'web/utils/Compose' ;
24
- import PropTypes from 'web/utils/PropTypes' ;
25
32
import withGmp from 'web/utils/withGmp' ;
26
33
import withTranslation from 'web/utils/withTranslation' ;
34
+
27
35
const SectionElementDivider = styled ( IconDivider ) `
28
36
margin-bottom: 3px;
29
37
` ;
30
38
31
- const SectionElements = ( { onPermissionCreateClick} ) => {
39
+ interface SectionElementsProps {
40
+ onPermissionCreateClick ?: ( ) => void ;
41
+ }
42
+
43
+ const SectionElements = ( { onPermissionCreateClick} : SectionElementsProps ) => {
32
44
const [ _ ] = useTranslation ( ) ;
33
45
const capabilities = useCapabilities ( ) ;
34
46
return (
@@ -50,13 +62,48 @@ const SectionElements = ({onPermissionCreateClick}) => {
50
62
) ;
51
63
} ;
52
64
53
- SectionElements . propTypes = {
54
- onPermissionCreateClick : PropTypes . func . isRequired ,
55
- } ;
65
+ type RelatedResourcesLoader < TEntity > = ( {
66
+ entity,
67
+ gmp,
68
+ } : {
69
+ entity : TEntity ;
70
+ gmp : Gmp ;
71
+ } ) => Promise < Model [ ] > ;
72
+
73
+ interface PermissionsBaseState {
74
+ entityType ?: string ;
75
+ entityName ?: string ;
76
+ groups ?: Group [ ] ;
77
+ groupId ?: string ;
78
+ id ?: string ;
79
+ includeRelated ?:
80
+ | typeof CURRENT_RESOURCE_ONLY
81
+ | typeof INCLUDE_RELATED_RESOURCES ;
82
+ multiplePermissionDialogVisible : boolean ;
83
+ related ?: Model [ ] ;
84
+ roles ?: Role [ ] ;
85
+ roleId ?: string ;
86
+ title ?: string ;
87
+ users ?: User [ ] ;
88
+ userId ?: string ;
89
+ }
90
+
91
+ interface PermissionsBaseProps < TEntity > {
92
+ entity : TEntity ;
93
+ gmp : Gmp ;
94
+ permissions ?: Permission [ ] ;
95
+ relatedResourcesLoaders ?: RelatedResourcesLoader < TEntity > [ ] ;
96
+ _ : TranslateFunc ;
97
+ onChanged : ( ) => void ;
98
+ onPermissionEditClick : ( permission : Permission , value : boolean ) => void ;
99
+ }
56
100
57
- class PermissionsBase extends React . Component {
58
- constructor ( ...args ) {
59
- super ( ...args ) ;
101
+ class PermissionsBase < TEntity extends Model > extends React . Component <
102
+ PermissionsBaseProps < TEntity > ,
103
+ PermissionsBaseState
104
+ > {
105
+ constructor ( props : PermissionsBaseProps < TEntity > ) {
106
+ super ( props ) ;
60
107
61
108
this . state = {
62
109
multiplePermissionDialogVisible : false ,
@@ -71,7 +118,7 @@ class PermissionsBase extends React.Component {
71
118
this . openPermissionDialog = this . openPermissionDialog . bind ( this ) ;
72
119
}
73
120
74
- openPermissionDialog ( permission ) {
121
+ openPermissionDialog ( permission : Permission ) {
75
122
const { onPermissionEditClick} = this . props ;
76
123
77
124
if ( isDefined ( onPermissionEditClick ) ) {
@@ -94,35 +141,37 @@ class PermissionsBase extends React.Component {
94
141
title : _ ( 'Create Multiple Permissions' ) ,
95
142
} ) ;
96
143
97
- Promise . all ( relatedResourcesLoaders . map ( func => func ( { entity, gmp} ) ) ) . then (
98
- loaded => {
99
- const related = loaded . reduce ( ( sum , cur ) => sum . concat ( cur ) , [ ] ) ;
100
-
101
- this . setState ( {
102
- related,
103
- includeRelated :
104
- loaded . length === 0
105
- ? CURRENT_RESOURCE_ONLY
106
- : INCLUDE_RELATED_RESOURCES ,
107
- } ) ;
108
- } ,
109
- ) ;
144
+ void Promise . all (
145
+ relatedResourcesLoaders . map ( func => func ( { entity, gmp} ) ) ,
146
+ ) . then ( loaded => {
147
+ const related = loaded . reduce ( ( sum , cur ) => sum . concat ( cur ) , [ ] ) ;
110
148
149
+ this . setState ( {
150
+ related,
151
+ includeRelated :
152
+ loaded . length === 0
153
+ ? CURRENT_RESOURCE_ONLY
154
+ : INCLUDE_RELATED_RESOURCES ,
155
+ } ) ;
156
+ } ) ;
157
+
158
+ // @ts -expect-error
111
159
gmp . groups . getAll ( ) . then ( response => {
112
160
const { data : groups } = response ;
113
161
this . setState ( {
114
162
groups,
115
163
groupId : selectSaveId ( groups ) ,
116
164
} ) ;
117
165
} ) ;
166
+ // @ts -expect-error
118
167
gmp . roles . getAll ( ) . then ( response => {
119
168
const { data : roles } = response ;
120
169
this . setState ( {
121
170
roles,
122
171
roleId : selectSaveId ( roles ) ,
123
172
} ) ;
124
173
} ) ;
125
- gmp . users . getAll ( ) . then ( response => {
174
+ void gmp . users . getAll ( ) . then ( response => {
126
175
const { data : users } = response ;
127
176
this . setState ( {
128
177
users,
@@ -135,7 +184,8 @@ class PermissionsBase extends React.Component {
135
184
this . setState ( { multiplePermissionDialogVisible : false } ) ;
136
185
}
137
186
138
- handleChange ( value , name ) {
187
+ handleChange ( value : unknown , name : string ) {
188
+ // @ts -expect-error
139
189
this . setState ( { [ name ] : value } ) ;
140
190
}
141
191
@@ -146,6 +196,7 @@ class PermissionsBase extends React.Component {
146
196
handleMultipleSave ( data ) {
147
197
const { gmp, onChanged} = this . props ;
148
198
199
+ // @ts -expect-error
149
200
return gmp . permissions
150
201
. create ( data )
151
202
. then ( onChanged )
@@ -175,7 +226,6 @@ class PermissionsBase extends React.Component {
175
226
176
227
const extra = (
177
228
< SectionElements
178
- entity = { entity }
179
229
onPermissionCreateClick = { this . openMultiplePermissionDialog }
180
230
/>
181
231
) ;
@@ -202,14 +252,19 @@ class PermissionsBase extends React.Component {
202
252
entityName = { entityName }
203
253
entityType = { entityType }
204
254
groupId = { groupId }
255
+ // @ts -expect-error
205
256
groups = { groups }
257
+ // @ts -expect-error
206
258
id = { id }
207
259
includeRelated = { includeRelated }
260
+ // @ts -expect-error
208
261
related = { related }
209
262
roleId = { roleId }
263
+ // @ts -expect-error
210
264
roles = { roles }
211
265
title = { title }
212
266
userId = { userId }
267
+ // @ts -expect-error
213
268
users = { users }
214
269
onChange = { this . handleChange }
215
270
onClose = { this . handleCloseMultiplePermissionDialog }
@@ -221,62 +276,52 @@ class PermissionsBase extends React.Component {
221
276
}
222
277
}
223
278
224
- PermissionsBase . propTypes = {
225
- entity : PropTypes . model . isRequired ,
226
- gmp : PropTypes . gmp . isRequired ,
227
- permissions : PropTypes . array ,
228
- relatedResourcesLoaders : PropTypes . arrayOf ( PropTypes . func ) ,
229
- onChanged : PropTypes . func . isRequired ,
230
- onPermissionCloneClick : PropTypes . func . isRequired ,
231
- onPermissionDeleteClick : PropTypes . func . isRequired ,
232
- onPermissionDownloadClick : PropTypes . func . isRequired ,
233
- onPermissionEditClick : PropTypes . func . isRequired ,
234
- _ : PropTypes . func . isRequired ,
235
- } ;
236
279
const Permissions = compose ( withGmp , withTranslation ) ( PermissionsBase ) ;
237
280
238
- const EntityPermissions = ( {
281
+ export interface EntityPermissionsProps < TEntity = Model > {
282
+ entity : TEntity ;
283
+ permissions : Permission [ ] ;
284
+ relatedResourcesLoaders ?: RelatedResourcesLoader < TEntity > [ ] ;
285
+ onChanged ?: ( ) => void ;
286
+ onDownloaded ?: OnDownloadedFunc ;
287
+ onError ?: ( error : Error | Rejection ) => void ;
288
+ }
289
+
290
+ function EntityPermissions < TEntity = Model > ( {
239
291
entity,
240
292
permissions,
241
293
relatedResourcesLoaders,
242
294
onChanged,
243
295
onDownloaded,
244
296
onError,
245
- } ) => (
246
- < PermissionComponent
247
- onCloneError = { onError }
248
- onCloned = { onChanged }
249
- onCreated = { onChanged }
250
- onDeleteError = { onError }
251
- onDeleted = { onChanged }
252
- onDownloadError = { onError }
253
- onDownloaded = { onDownloaded }
254
- onSaved = { onChanged }
255
- >
256
- { ( { clone, create, delete : delete_func , download, edit} ) => (
257
- < Permissions
258
- entity = { entity }
259
- permissions = { permissions }
260
- relatedResourcesLoaders = { relatedResourcesLoaders }
261
- toggleDetailsIcon = { false }
262
- onChanged = { onChanged }
263
- onPermissionCloneClick = { clone }
264
- onPermissionCreateClick = { create }
265
- onPermissionDeleteClick = { delete_func }
266
- onPermissionDownloadClick = { download }
267
- onPermissionEditClick = { edit }
268
- />
269
- ) }
270
- </ PermissionComponent >
271
- ) ;
272
-
273
- EntityPermissions . propTypes = {
274
- entity : PropTypes . model ,
275
- permissions : PropTypes . array ,
276
- relatedResourcesLoaders : PropTypes . arrayOf ( PropTypes . func ) ,
277
- onChanged : PropTypes . func . isRequired ,
278
- onDownloaded : PropTypes . func ,
279
- onError : PropTypes . func . isRequired ,
280
- } ;
297
+ } : EntityPermissionsProps < TEntity > ) {
298
+ return (
299
+ < PermissionComponent
300
+ onCloneError = { onError }
301
+ onCloned = { onChanged }
302
+ onCreated = { onChanged }
303
+ onDeleteError = { onError }
304
+ onDeleted = { onChanged }
305
+ onDownloadError = { onError }
306
+ onDownloaded = { onDownloaded }
307
+ onSaved = { onChanged }
308
+ >
309
+ { ( { clone, create, delete : deleteFunc , download, edit} ) => (
310
+ < Permissions
311
+ entity = { entity }
312
+ permissions = { permissions }
313
+ relatedResourcesLoaders = { relatedResourcesLoaders }
314
+ toggleDetailsIcon = { false }
315
+ onChanged = { onChanged }
316
+ onPermissionCloneClick = { clone }
317
+ onPermissionCreateClick = { create }
318
+ onPermissionDeleteClick = { deleteFunc }
319
+ onPermissionDownloadClick = { download }
320
+ onPermissionEditClick = { edit }
321
+ />
322
+ ) }
323
+ </ PermissionComponent >
324
+ ) ;
325
+ }
281
326
282
327
export default EntityPermissions ;
0 commit comments