Files
SCM-Manager/scm-ui/ui-webapp/src/permissions/components/SetPermissions.tsx

209 lines
5.0 KiB
TypeScript
Raw Normal View History

import React from 'react';
import { connect } from 'react-redux';
import { translate } from 'react-i18next';
import classNames from 'classnames';
import styled from 'styled-components';
import { Link } from '@scm-manager/ui-types';
import {
Notification,
ErrorNotification,
SubmitButton,
} from '@scm-manager/ui-components';
import { getLink } from '../../modules/indexResource';
import { loadPermissionsForEntity, setPermissions } from './handlePermissions';
import PermissionCheckbox from './PermissionCheckbox';
type Props = {
availablePermissionLink: string;
selectedPermissionsLink: Link;
// context props
t: (p: string) => string;
};
type State = {
permissions: {
[key: string]: boolean;
};
loading: boolean;
error?: Error;
permissionsChanged: boolean;
permissionsSubmitted: boolean;
overwritePermissionsLink?: Link;
};
const PermissionsWrapper = styled.div`
padding-bottom: 0;
& .field .control {
width: 100%;
word-wrap: break-word;
}
`;
2019-01-18 14:16:26 +01:00
class SetPermissions extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
2019-01-18 14:16:26 +01:00
permissions: {},
loading: true,
permissionsChanged: false,
permissionsSubmitted: false,
2019-01-18 14:16:26 +01:00
modifiable: false,
overwritePermissionsLink: undefined,
};
}
setLoadingState = () => {
this.setState({
loading: true,
});
};
setErrorState = (error: Error) => {
this.setState({
error: error,
loading: false,
});
};
setSuccessfulState = () => {
this.setState({
loading: false,
2019-01-21 10:50:22 +01:00
error: undefined,
permissionsSubmitted: true,
permissionsChanged: false,
});
};
componentDidMount(): void {
2019-01-21 13:05:05 +01:00
loadPermissionsForEntity(
this.props.availablePermissionLink,
this.props.selectedPermissionsLink.href,
2019-01-21 13:05:05 +01:00
).then(response => {
const { permissions, overwriteLink } = response;
this.setState({
permissions: permissions,
loading: false,
overwritePermissionsLink: overwriteLink,
2019-01-21 13:05:05 +01:00
});
});
}
submit = (event: Event) => {
event.preventDefault();
if (this.state.permissions) {
const { permissions } = this.state;
this.setLoadingState();
const selectedPermissions = Object.entries(permissions)
.filter(e => e[1])
.map(e => e[0]);
2019-01-18 14:16:26 +01:00
if (this.state.overwritePermissionsLink) {
setPermissions(
this.state.overwritePermissionsLink.href,
selectedPermissions,
2019-01-18 14:16:26 +01:00
)
.then(result => {
2019-01-21 10:50:22 +01:00
this.setSuccessfulState();
2019-01-18 14:16:26 +01:00
})
2019-01-21 10:50:22 +01:00
.catch(err => {
this.setErrorState(err);
});
2019-01-18 14:16:26 +01:00
}
}
};
render() {
const { t } = this.props;
const { loading, permissionsSubmitted, error } = this.state;
let message = null;
if (permissionsSubmitted) {
message = (
<Notification
type={'success'}
children={t('setPermissions.setPermissionsSuccessful')}
onClose={() => this.onClose()}
/>
);
} else if (error) {
message = <ErrorNotification error={error} />;
}
return (
<form onSubmit={this.submit}>
{message}
{this.renderPermissions()}
<SubmitButton
disabled={!this.state.permissionsChanged}
loading={loading}
label={t('setPermissions.button')}
/>
</form>
);
}
renderPermissions = () => {
2019-01-18 14:16:26 +01:00
const { overwritePermissionsLink, permissions } = this.state;
const permissionArray = Object.keys(permissions);
return (
<div className="columns">
<PermissionsWrapper className={classNames('column', 'is-half')}>
{permissionArray.slice(0, permissionArray.length / 2 + 1).map(p => (
<PermissionCheckbox
key={p}
permission={p}
checked={permissions[p]}
onChange={this.valueChanged}
disabled={!overwritePermissionsLink}
/>
))}
</PermissionsWrapper>
<PermissionsWrapper className={classNames('column', 'is-half')}>
{permissionArray
.slice(permissionArray.length / 2 + 1, permissionArray.length)
.map(p => (
<PermissionCheckbox
key={p}
permission={p}
checked={permissions[p]}
onChange={this.valueChanged}
disabled={!overwritePermissionsLink}
/>
))}
</PermissionsWrapper>
</div>
);
};
valueChanged = (value: boolean, name: string) => {
this.setState(state => {
const newPermissions = state.permissions;
newPermissions[name] = value;
return {
permissions: newPermissions,
permissionsChanged: true,
};
});
};
onClose = () => {
this.setState({
permissionsSubmitted: false,
});
};
}
const mapStateToProps = state => {
const availablePermissionLink = getLink(state, 'permissions');
return {
availablePermissionLink,
};
};
2019-01-18 14:16:26 +01:00
export default connect(mapStateToProps)(
translate('permissions')(SetPermissions),
);