UserGroupTable.jsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import dateFnsFormat from 'date-fns/format';
  5. class UserGroupTable extends React.Component {
  6. constructor(props) {
  7. super(props);
  8. this.xss = window.xss;
  9. this.onDelete = this.onDelete.bind(this);
  10. }
  11. onDelete(e) {
  12. const { target } = e;
  13. const groupId = target.getAttribute('data-user-group-id');
  14. const group = this.props.userGroups.find((group) => {
  15. return group._id === groupId;
  16. });
  17. this.props.onDelete(group);
  18. }
  19. render() {
  20. const { t } = this.props;
  21. return (
  22. <Fragment>
  23. <h2>{t('user_group_management.group_list')}</h2>
  24. <table className="table table-bordered table-user-list">
  25. <thead>
  26. <tr>
  27. <th>{ t('Name') }</th>
  28. <th>{ t('User') }</th>
  29. <th width="100px">{ t('Created') }</th>
  30. <th width="70px"></th>
  31. </tr>
  32. </thead>
  33. <tbody>
  34. {this.props.userGroups.map((group) => {
  35. return (
  36. <tr key={group._id}>
  37. {this.props.isAclEnabled
  38. ? (
  39. <td><a href={`/admin/user-group-detail/${group._id}`}>{this.xss.process(group.name)}</a></td>
  40. )
  41. : (
  42. <td>{this.xss.process(group.name)}</td>
  43. )
  44. }
  45. <td>
  46. <ul className="list-inline">
  47. {this.props.userGroupRelations[group._id].map((user) => {
  48. return <li key={user._id} className="list-inline-item badge badge-primary">{this.xss.process(user.username)}</li>;
  49. })}
  50. </ul>
  51. </td>
  52. <td>{dateFnsFormat(new Date(group.createdAt), 'YYYY-MM-DD')}</td>
  53. {this.props.isAclEnabled
  54. ? (
  55. <td>
  56. <div className="btn-group admin-group-menu">
  57. <button type="button" className="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
  58. <i className="icon-settings"></i> <span className="caret"></span>
  59. </button>
  60. <ul className="dropdown-menu" role="menu">
  61. <li>
  62. <a href={`/admin/user-group-detail/${group._id}`}>
  63. <i className="icon-fw icon-note"></i> { t('Edit') }
  64. </a>
  65. </li>
  66. <li>
  67. <a href="#" onClick={this.onDelete} data-user-group-id={group._id}>
  68. <i className="icon-fw icon-fire text-danger"></i> { t('Delete') }
  69. </a>
  70. </li>
  71. </ul>
  72. </div>
  73. </td>
  74. )
  75. : (
  76. <td></td>
  77. )
  78. }
  79. </tr>
  80. );
  81. })}
  82. </tbody>
  83. </table>
  84. </Fragment>
  85. );
  86. }
  87. }
  88. UserGroupTable.propTypes = {
  89. t: PropTypes.func.isRequired, // i18next
  90. crowi: PropTypes.object.isRequired,
  91. userGroups: PropTypes.arrayOf(PropTypes.object).isRequired,
  92. userGroupRelations: PropTypes.object.isRequired,
  93. isAclEnabled: PropTypes.bool,
  94. onDelete: PropTypes.func.isRequired,
  95. };
  96. export default withTranslation()(UserGroupTable);