GrantSelector.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import FormGroup from 'react-bootstrap/es/FormGroup';
  4. import FormControl from 'react-bootstrap/es/FormControl';
  5. import ControlLabel from 'react-bootstrap/es/ControlLabel';
  6. import Button from 'react-bootstrap/es/Button';
  7. import Modal from 'react-bootstrap/es/Modal';
  8. /**
  9. * Page grant select component
  10. *
  11. * @export
  12. * @class GrantSelector
  13. * @extends {React.Component}
  14. */
  15. export default class GrantSelector extends React.Component {
  16. constructor(props) {
  17. super(props);
  18. this.state = {
  19. pageGrant: this.props.pageGrant,
  20. isGroupModalShown: false,
  21. };
  22. this.availableGrants = [1, 2, /*3, */4, 5];
  23. this.availableGrantLabels = {
  24. 1: 'Public',
  25. 2: 'Anyone with the linc',
  26. // 3:'Specified users only',
  27. 4: 'Just me',
  28. 5: 'Only inside the group',
  29. };
  30. this.onChangeGrant = this.onChangeGrant.bind(this);
  31. // this.updateElementValue = this.updateElementValue.bind(this);
  32. }
  33. // Init component when the component did mount.
  34. componentDidMount() {
  35. this.init();
  36. }
  37. // Initialize the component.
  38. init() {
  39. this.grantSelectorInputEl.value = this.state.pageGrant.grant;
  40. }
  41. /**
  42. * On change event handler for pagegrant.
  43. * @param {any} grant page grant
  44. * @memberof GrantSelector
  45. */
  46. onChangeGrant(grant) {
  47. const newValue = this.grantSelectorInputEl.value;
  48. const newGrant = Object.assign(this.state.pageGrant, {grant: newValue});
  49. this.setState({ pageGrant: newGrant });
  50. // dispatch event
  51. this.dispatchOnChange();
  52. }
  53. /**
  54. * On click event handler for grant usergroup.
  55. *
  56. * @memberof GrantSelector
  57. */
  58. onClickGrantGroup() {
  59. const newValue = this.groupSelectorInputEl.value;
  60. const newGrant = Object.assign(this.state.pageGrant, { grantGroup: newValue });
  61. this.setState({ pageGrant: newGrant });
  62. // dispatch event
  63. this.dispatchOnChange();
  64. // close group select modal
  65. if (this.state.isModalShown) {
  66. this.setState({ isGroupModalShown: false });
  67. }
  68. }
  69. /**
  70. * dispatch onChange event
  71. * @memberof GrantSelector
  72. */
  73. dispatchOnChange() {
  74. if (this.props.onChange != null) {
  75. this.props.onChange(this.state.pageGrant);
  76. }
  77. }
  78. /**
  79. * Render grant selector DOM.
  80. * @returns
  81. * @memberof GrantSelector
  82. */
  83. renderGrantSelector() {
  84. const grantElems = this.availableGrants.map((grant) => {
  85. return <option key={grant} value={grant}>{this.availableGrantLabels[grant]}</option>;
  86. });
  87. const bsClassName = 'form-control-dummy'; // set form-control* to shrink width
  88. return (
  89. <FormGroup controlId="formControlsSelect">
  90. <ControlLabel>Grant:</ControlLabel>
  91. <FormControl componentClass="select" placeholder="select" defaultValue={this.state.pageGrant.grant} bsClass={bsClassName} className="btn-group-sm selectpicker"
  92. onChange={this.onChangeGrant}
  93. inputRef={ el => this.grantSelectorInputEl=el }>
  94. {grantElems}
  95. </FormControl>
  96. </FormGroup>
  97. );
  98. }
  99. /**
  100. * Render select grantgroup modal.
  101. *
  102. * @returns
  103. * @memberof GrantSelector
  104. */
  105. renderSelectGroupModal() {
  106. // const userRelatedGroups = this.props.userRelatedGroups;
  107. const groupList = this.userRelatedGroups.map((group) => {
  108. return <li>
  109. <Button onClick={this.onClickGrantGroup(group)} bsClass="btn btn-sm btn-primary">{group.name}</Button>
  110. </li>;
  111. });
  112. return (
  113. <Modal show={this.props.isGroupModalShown} onHide={this.props.cancel} className="select-grant-group">
  114. <Modal.Header closeButton>
  115. <Modal.Title>
  116. Select a Group
  117. </Modal.Title>
  118. </Modal.Header>
  119. <Modal.Body>
  120. <ul className="list-inline">
  121. {groupList}
  122. </ul>
  123. </Modal.Body>
  124. </Modal>
  125. );
  126. }
  127. render() {
  128. return <span>
  129. <span className="m-l-5">{this.renderGrantSelector()}</span>
  130. </span>;
  131. }
  132. }
  133. export class PageGrant {
  134. constructor(props) {
  135. this.grant = '';
  136. this.grantGroup = null;
  137. Object.assign(this, props);
  138. }
  139. }
  140. export class UserGroup {
  141. constructor(props) {
  142. this.userGroupId = '';
  143. this.userGroup;
  144. Object.assign(this, props);
  145. }
  146. }
  147. GrantSelector.propTypes = {
  148. crowi: PropTypes.object.isRequired,
  149. isGroupModalShown: PropTypes.bool,
  150. userRelatedGroups: PropTypes.object,
  151. pageGrant: PropTypes.instanceOf(PageGrant),
  152. onChange: PropTypes.func,
  153. };