Skip to content

Commit f273fea

Browse files
committed
change: Use TypeScript for EntityPermission component
The EntityPermission component is used in the TaskDetailsPage in conjunction with the withComponentDefaults HOC.
1 parent 11d4d74 commit f273fea

File tree

1 file changed

+120
-75
lines changed

1 file changed

+120
-75
lines changed

src/web/entity/Permissions.jsx renamed to src/web/entity/Permissions.tsx

Lines changed: 120 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,42 @@
55

66
import React from 'react';
77
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';
815
import {getEntityType} from 'gmp/utils/entitytype';
916
import {selectSaveId} from 'gmp/utils/id';
1017
import {isDefined} from 'gmp/utils/identity';
1118
import {NewIcon} from 'web/components/icon';
1219
import ManualIcon from 'web/components/icon/ManualIcon';
1320
import IconDivider from 'web/components/layout/IconDivider';
1421
import Layout from 'web/components/layout/Layout';
22+
import {OnDownloadedFunc} from 'web/entity/hooks/useEntityDownload';
1523
import useCapabilities from 'web/hooks/useCapabilities';
16-
import useTranslation from 'web/hooks/useTranslation';
24+
import useTranslation, {TranslateFunc} from 'web/hooks/useTranslation';
1725
import MultiplePermissionDialog, {
1826
CURRENT_RESOURCE_ONLY,
1927
INCLUDE_RELATED_RESOURCES,
2028
} from 'web/pages/permissions/MultipleDialog';
2129
import PermissionComponent from 'web/pages/permissions/PermissionsComponent';
2230
import PermissionsTable from 'web/pages/permissions/Table';
2331
import compose from 'web/utils/Compose';
24-
import PropTypes from 'web/utils/PropTypes';
2532
import withGmp from 'web/utils/withGmp';
2633
import withTranslation from 'web/utils/withTranslation';
34+
2735
const SectionElementDivider = styled(IconDivider)`
2836
margin-bottom: 3px;
2937
`;
3038

31-
const SectionElements = ({onPermissionCreateClick}) => {
39+
interface SectionElementsProps {
40+
onPermissionCreateClick?: () => void;
41+
}
42+
43+
const SectionElements = ({onPermissionCreateClick}: SectionElementsProps) => {
3244
const [_] = useTranslation();
3345
const capabilities = useCapabilities();
3446
return (
@@ -50,13 +62,48 @@ const SectionElements = ({onPermissionCreateClick}) => {
5062
);
5163
};
5264

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+
}
56100

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);
60107

61108
this.state = {
62109
multiplePermissionDialogVisible: false,
@@ -71,7 +118,7 @@ class PermissionsBase extends React.Component {
71118
this.openPermissionDialog = this.openPermissionDialog.bind(this);
72119
}
73120

74-
openPermissionDialog(permission) {
121+
openPermissionDialog(permission: Permission) {
75122
const {onPermissionEditClick} = this.props;
76123

77124
if (isDefined(onPermissionEditClick)) {
@@ -94,35 +141,37 @@ class PermissionsBase extends React.Component {
94141
title: _('Create Multiple Permissions'),
95142
});
96143

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), []);
110148

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
111159
gmp.groups.getAll().then(response => {
112160
const {data: groups} = response;
113161
this.setState({
114162
groups,
115163
groupId: selectSaveId(groups),
116164
});
117165
});
166+
// @ts-expect-error
118167
gmp.roles.getAll().then(response => {
119168
const {data: roles} = response;
120169
this.setState({
121170
roles,
122171
roleId: selectSaveId(roles),
123172
});
124173
});
125-
gmp.users.getAll().then(response => {
174+
void gmp.users.getAll().then(response => {
126175
const {data: users} = response;
127176
this.setState({
128177
users,
@@ -135,7 +184,8 @@ class PermissionsBase extends React.Component {
135184
this.setState({multiplePermissionDialogVisible: false});
136185
}
137186

138-
handleChange(value, name) {
187+
handleChange(value: unknown, name: string) {
188+
// @ts-expect-error
139189
this.setState({[name]: value});
140190
}
141191

@@ -146,6 +196,7 @@ class PermissionsBase extends React.Component {
146196
handleMultipleSave(data) {
147197
const {gmp, onChanged} = this.props;
148198

199+
// @ts-expect-error
149200
return gmp.permissions
150201
.create(data)
151202
.then(onChanged)
@@ -175,7 +226,6 @@ class PermissionsBase extends React.Component {
175226

176227
const extra = (
177228
<SectionElements
178-
entity={entity}
179229
onPermissionCreateClick={this.openMultiplePermissionDialog}
180230
/>
181231
);
@@ -202,14 +252,19 @@ class PermissionsBase extends React.Component {
202252
entityName={entityName}
203253
entityType={entityType}
204254
groupId={groupId}
255+
// @ts-expect-error
205256
groups={groups}
257+
// @ts-expect-error
206258
id={id}
207259
includeRelated={includeRelated}
260+
// @ts-expect-error
208261
related={related}
209262
roleId={roleId}
263+
// @ts-expect-error
210264
roles={roles}
211265
title={title}
212266
userId={userId}
267+
// @ts-expect-error
213268
users={users}
214269
onChange={this.handleChange}
215270
onClose={this.handleCloseMultiplePermissionDialog}
@@ -221,62 +276,52 @@ class PermissionsBase extends React.Component {
221276
}
222277
}
223278

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-
};
236279
const Permissions = compose(withGmp, withTranslation)(PermissionsBase);
237280

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>({
239291
entity,
240292
permissions,
241293
relatedResourcesLoaders,
242294
onChanged,
243295
onDownloaded,
244296
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+
}
281326

282327
export default EntityPermissions;

0 commit comments

Comments
 (0)