Files
SCM-Manager/scm-ui/ui-webapp/src/repos/permissions/containers/Permissions.tsx

298 lines
8.6 KiB
TypeScript
Raw Normal View History

import React from 'react';
import { connect } from 'react-redux';
import { translate } from 'react-i18next';
2019-01-24 08:05:28 +01:00
import {
2019-08-15 10:51:36 +02:00
createPermission,
createPermissionReset,
deletePermissionReset,
2019-01-24 08:05:28 +01:00
fetchAvailablePermissionsIfNeeded,
fetchPermissions,
getAvailablePermissions,
2019-08-15 10:51:36 +02:00
getAvailableRepositoryRoles,
getAvailableRepositoryVerbs,
getCreatePermissionFailure,
getDeletePermissionsFailure,
getFetchAvailablePermissionsFailure,
2019-01-24 08:05:28 +01:00
getFetchPermissionsFailure,
2019-08-15 10:51:36 +02:00
getModifyPermissionsFailure,
2019-01-24 08:05:28 +01:00
getPermissionsOfRepo,
hasCreatePermission,
isCreatePermissionPending,
2019-08-15 10:51:36 +02:00
isFetchAvailablePermissionsPending,
isFetchPermissionsPending,
modifyPermissionReset,
} from '../modules/permissions';
import {
ErrorPage,
LabelWithHelpIcon,
Loading,
Subtitle,
} from '@scm-manager/ui-components';
import {
Permission,
PermissionCollection,
PermissionCreateEntry,
RepositoryRole,
} from '@scm-manager/ui-types';
import SinglePermission from './SinglePermission';
import CreatePermissionForm from './CreatePermissionForm';
import { History } from 'history';
import { getPermissionsLink } from '../../modules/repos';
2019-01-24 08:05:28 +01:00
import {
2019-05-15 15:52:16 +02:00
getGroupAutoCompleteLink,
getRepositoryRolesLink,
getRepositoryVerbsLink,
getUserAutoCompleteLink,
} from '../../../modules/indexResource';
2019-01-24 08:05:28 +01:00
type Props = {
availablePermissions: boolean;
availableRepositoryRoles: RepositoryRole[];
availableVerbs: string[];
namespace: string;
repoName: string;
loading: boolean;
error: Error;
permissions: PermissionCollection;
hasPermissionToCreate: boolean;
loadingCreatePermission: boolean;
repositoryRolesLink: string;
repositoryVerbsLink: string;
permissionsLink: string;
groupAutocompleteLink: string;
userAutocompleteLink: string;
2019-01-24 08:05:28 +01:00
//dispatch functions
2019-05-15 15:52:16 +02:00
fetchAvailablePermissionsIfNeeded: (
repositoryRolesLink: string,
repositoryVerbsLink: string,
) => void;
fetchPermissions: (link: string, namespace: string, repoName: string) => void;
2019-01-24 08:05:28 +01:00
createPermission: (
link: string,
permission: PermissionCreateEntry,
namespace: string,
repoName: string,
callback?: () => void,
) => void;
createPermissionReset: (p1: string, p2: string) => void;
modifyPermissionReset: (p1: string, p2: string) => void;
deletePermissionReset: (p1: string, p2: string) => void;
2019-01-24 08:05:28 +01:00
// context props
t: (p: string) => string;
match: any;
history: History;
2019-01-24 08:05:28 +01:00
};
class Permissions extends React.Component<Props> {
componentDidMount() {
const {
fetchAvailablePermissionsIfNeeded,
fetchPermissions,
namespace,
repoName,
modifyPermissionReset,
createPermissionReset,
deletePermissionReset,
permissionsLink,
repositoryRolesLink,
repositoryVerbsLink,
2019-01-24 08:05:28 +01:00
} = this.props;
createPermissionReset(namespace, repoName);
modifyPermissionReset(namespace, repoName);
deletePermissionReset(namespace, repoName);
fetchAvailablePermissionsIfNeeded(repositoryRolesLink, repositoryVerbsLink);
2019-01-24 08:05:28 +01:00
fetchPermissions(permissionsLink, namespace, repoName);
}
createPermission = (permission: Permission) => {
this.props.createPermission(
this.props.permissionsLink,
permission,
this.props.namespace,
this.props.repoName,
2019-01-24 08:05:28 +01:00
);
};
render() {
const {
availablePermissions,
availableRepositoryRoles,
availableVerbs,
2019-01-24 08:05:28 +01:00
loading,
error,
permissions,
t,
namespace,
repoName,
loadingCreatePermission,
hasPermissionToCreate,
2019-06-12 09:47:13 +02:00
userAutocompleteLink,
groupAutocompleteLink,
2019-01-24 08:05:28 +01:00
} = this.props;
if (error) {
return (
<ErrorPage
title={t('permission.error-title')}
subtitle={t('permission.error-subtitle')}
2019-01-24 08:05:28 +01:00
error={error}
/>
);
}
if (loading || !permissions || !availablePermissions) {
2019-01-24 08:05:28 +01:00
return <Loading />;
}
const createPermissionForm = hasPermissionToCreate ? (
<CreatePermissionForm
availableRoles={availableRepositoryRoles}
availableVerbs={availableVerbs}
2019-01-24 08:05:28 +01:00
createPermission={permission => this.createPermission(permission)}
loading={loadingCreatePermission}
currentPermissions={permissions}
2019-06-12 09:47:13 +02:00
userAutocompleteLink={userAutocompleteLink}
groupAutocompleteLink={groupAutocompleteLink}
2019-01-24 08:05:28 +01:00
/>
) : null;
return (
<div>
<Subtitle subtitle={t('permission.title')} />
2019-05-24 09:26:27 +02:00
<table className="card-table table is-hoverable is-fullwidth">
2019-01-24 08:05:28 +01:00
<thead>
<tr>
2019-01-25 12:32:19 +01:00
<th>
<LabelWithHelpIcon
label={t('permission.name')}
helpText={t('permission.help.nameHelpText')}
2019-01-25 12:32:19 +01:00
/>
</th>
<th>
<LabelWithHelpIcon
label={t('permission.role')}
helpText={t('permission.help.roleHelpText')}
2019-01-25 12:32:19 +01:00
/>
</th>
<th>
<LabelWithHelpIcon
label={t('permission.permissions')}
helpText={t('permission.help.permissionsHelpText')}
2019-01-25 12:32:19 +01:00
/>
2019-01-24 08:05:28 +01:00
</th>
2019-01-24 13:34:05 +01:00
<th />
2019-01-24 08:05:28 +01:00
</tr>
</thead>
<tbody>
{permissions.map(permission => {
return (
<SinglePermission
availableRepositoryRoles={availableRepositoryRoles}
availableRepositoryVerbs={availableVerbs}
2019-01-24 08:05:28 +01:00
key={permission.name + permission.groupPermission.toString()}
namespace={namespace}
repoName={repoName}
permission={permission}
/>
);
})}
</tbody>
</table>
{createPermissionForm}
</div>
);
}
}
const mapStateToProps = (state, ownProps) => {
const namespace = ownProps.namespace;
const repoName = ownProps.repoName;
const error =
getFetchPermissionsFailure(state, namespace, repoName) ||
getCreatePermissionFailure(state, namespace, repoName) ||
getDeletePermissionsFailure(state, namespace, repoName) ||
getModifyPermissionsFailure(state, namespace, repoName) ||
getFetchAvailablePermissionsFailure(state);
const loading =
isFetchPermissionsPending(state, namespace, repoName) ||
isFetchAvailablePermissionsPending(state);
const permissions = getPermissionsOfRepo(state, namespace, repoName);
const loadingCreatePermission = isCreatePermissionPending(
state,
namespace,
repoName,
2019-01-24 08:05:28 +01:00
);
const hasPermissionToCreate = hasCreatePermission(state, namespace, repoName);
const repositoryRolesLink = getRepositoryRolesLink(state);
const repositoryVerbsLink = getRepositoryVerbsLink(state);
2019-01-24 08:05:28 +01:00
const permissionsLink = getPermissionsLink(state, namespace, repoName);
2019-06-12 09:47:13 +02:00
const groupAutocompleteLink = getGroupAutoCompleteLink(state);
const userAutocompleteLink = getUserAutoCompleteLink(state);
const availablePermissions = getAvailablePermissions(state);
const availableRepositoryRoles = getAvailableRepositoryRoles(state);
const availableVerbs = getAvailableRepositoryVerbs(state);
2019-01-24 08:05:28 +01:00
return {
availablePermissions,
availableRepositoryRoles,
availableVerbs,
2019-01-24 08:05:28 +01:00
namespace,
repoName,
repositoryRolesLink,
repositoryVerbsLink,
2019-01-24 08:05:28 +01:00
error,
loading,
permissions,
hasPermissionToCreate,
loadingCreatePermission,
permissionsLink,
2019-06-12 09:47:13 +02:00
groupAutocompleteLink,
userAutocompleteLink,
2019-01-24 08:05:28 +01:00
};
};
const mapDispatchToProps = dispatch => {
return {
fetchPermissions: (link: string, namespace: string, repoName: string) => {
dispatch(fetchPermissions(link, namespace, repoName));
},
2019-05-15 15:52:16 +02:00
fetchAvailablePermissionsIfNeeded: (
repositoryRolesLink: string,
repositoryVerbsLink: string,
2019-05-15 15:52:16 +02:00
) => {
dispatch(
fetchAvailablePermissionsIfNeeded(
repositoryRolesLink,
repositoryVerbsLink,
),
2019-05-15 15:52:16 +02:00
);
2019-01-24 08:05:28 +01:00
},
createPermission: (
link: string,
permission: PermissionCreateEntry,
namespace: string,
repoName: string,
callback?: () => void,
2019-01-24 08:05:28 +01:00
) => {
dispatch(
createPermission(link, permission, namespace, repoName, callback),
2019-01-24 08:05:28 +01:00
);
},
createPermissionReset: (namespace: string, repoName: string) => {
dispatch(createPermissionReset(namespace, repoName));
},
modifyPermissionReset: (namespace: string, repoName: string) => {
dispatch(modifyPermissionReset(namespace, repoName));
},
deletePermissionReset: (namespace: string, repoName: string) => {
dispatch(deletePermissionReset(namespace, repoName));
},
2019-01-24 08:05:28 +01:00
};
};
export default connect(
mapStateToProps,
mapDispatchToProps,
)(translate('repos')(Permissions));