| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- /* eslint-disable react/no-multi-comp */
- import React, { Fragment } from 'react';
- import PropTypes from 'prop-types';
- import { Subscribe } from 'unstated';
- import UserGroupTable from './UserGroupTable';
- import UserGroupCreateForm from './UserGroupCreateForm';
- import UserGroupDeleteModal from './UserGroupDeleteModal';
- import { apiErrorHandler, apiSuccessHandler } from '../../../util/apiNotification';
- class UserGroupPage extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- userGroups: props.userGroups,
- userGroupRelations: props.userGroupRelations,
- selectedUserGroup: undefined, // not null but undefined (to use defaultProps in UserGroupDeleteModal)
- isDeleteModalShow: false,
- };
- this.xss = window.xss;
- this.showDeleteModal = this.showDeleteModal.bind(this);
- this.hideDeleteModal = this.hideDeleteModal.bind(this);
- this.addUserGroup = this.addUserGroup.bind(this);
- this.deleteUserGroupById = this.deleteUserGroupById.bind(this);
- }
- async showDeleteModal(group) {
- await this.syncUserGroupAndRelations();
- this.setState({
- selectedUserGroup: group,
- isDeleteModalShow: true,
- });
- }
- hideDeleteModal() {
- this.setState({
- selectedUserGroup: undefined,
- isDeleteModalShow: false,
- });
- }
- addUserGroup(userGroup, users) {
- this.setState((prevState) => {
- const userGroupRelations = Object.assign(prevState.userGroupRelations, {
- [userGroup._id]: users,
- });
- return {
- userGroups: [...prevState.userGroups, userGroup],
- userGroupRelations,
- };
- });
- }
- async deleteUserGroupById({ deleteGroupId, actionName, transferToUserGroupId }) {
- try {
- const res = await this.props.crowi.apiv3.post(`/user-groups/${deleteGroupId}/delete`, {
- actionName,
- transferToUserGroupId,
- });
- if (res.errors) {
- return apiErrorHandler(res.errors);
- }
- this.setState((prevState) => {
- const userGroups = prevState.userGroups.filter((userGroup) => {
- return userGroup._id !== deleteGroupId;
- });
- delete prevState.userGroupRelations[deleteGroupId];
- return {
- userGroups,
- userGroupRelations: prevState.userGroupRelations,
- selectedUserGroup: undefined,
- isDeleteModalShow: false,
- };
- });
- apiSuccessHandler(`Deleted a group "${this.xss.process(res.data.userGroup.name)}"`);
- }
- catch (err) {
- apiErrorHandler(new Error('Unable to delete the group'));
- }
- }
- async syncUserGroupAndRelations() {
- let userGroups = [];
- let userGroupRelations = [];
- try {
- const responses = await Promise.all([
- this.props.crowi.apiv3.get('/user-groups'),
- this.props.crowi.apiv3.get('/user-group-relations'),
- ]);
- const isAllOk = responses.reduce((isAllOk, res) => {
- return isAllOk && !res.errors;
- }, true);
- if (isAllOk) {
- const [userGroupsRes, userGroupRelationsRes] = responses;
- userGroups = userGroupsRes.data.userGroups;
- userGroupRelations = userGroupRelationsRes.data.userGroupRelations;
- }
- else {
- throw new Error('Unable to fetch groups from server');
- }
- }
- catch (err) {
- apiErrorHandler(err);
- }
- this.setState({
- userGroups,
- userGroupRelations,
- });
- }
- render() {
- return (
- <Fragment>
- <UserGroupCreateForm
- crowi={this.props.crowi}
- isAclEnabled={this.props.isAclEnabled}
- onCreate={this.addUserGroup}
- />
- <UserGroupTable
- crowi={this.props.crowi}
- userGroups={this.state.userGroups}
- userGroupRelations={this.state.userGroupRelations}
- isAclEnabled={this.props.isAclEnabled}
- onDelete={this.showDeleteModal}
- />
- <UserGroupDeleteModal
- crowi={this.props.crowi}
- userGroups={this.state.userGroups}
- deleteUserGroup={this.state.selectedUserGroup}
- onDelete={this.deleteUserGroupById}
- isShow={this.state.isDeleteModalShow}
- onShow={this.showDeleteModal}
- onHide={this.hideDeleteModal}
- />
- </Fragment>
- );
- }
- }
- /**
- * Wrapper component for using unstated
- */
- class UserGroupPageWrapper extends React.PureComponent {
- render() {
- return (
- <Subscribe to={[]}>
- {() => (
- // eslint-disable-next-line arrow-body-style
- <UserGroupPage {...this.props} />
- )}
- </Subscribe>
- );
- }
- }
- UserGroupPage.propTypes = {
- crowi: PropTypes.object.isRequired,
- userGroups: PropTypes.arrayOf(PropTypes.object).isRequired,
- userGroupRelations: PropTypes.object.isRequired,
- isAclEnabled: PropTypes.bool,
- };
- UserGroupPageWrapper.propTypes = {
- crowi: PropTypes.object.isRequired,
- userGroups: PropTypes.arrayOf(PropTypes.object).isRequired,
- userGroupRelations: PropTypes.object.isRequired,
- isAclEnabled: PropTypes.bool,
- };
- export default UserGroupPageWrapper;
|