GrantSelector.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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 Dropdown from 'react-bootstrap/es/Dropdown';
  8. import MenuItem from 'react-bootstrap/es/MenuItem';
  9. import Modal from 'react-bootstrap/es/Modal';
  10. import OverlayTrigger from 'react-bootstrap/es/OverlayTrigger';
  11. import Tooltip from 'react-bootstrap/es/Tooltip';
  12. export default class GrantSelector extends React.Component {
  13. constructor(props) {
  14. super(props);
  15. const config = this.props.crowi.getConfig();
  16. this.state = {
  17. pageGrant: this.props.pageGrant || new PageGrant(),
  18. isGroupModalShown: false,
  19. }
  20. this.availableGrants = {
  21. 1:'Public',
  22. 2:'Anyone with the linc',
  23. // 3:'Specified users only',
  24. 4:'Just me',
  25. 5:'Only inside the group',
  26. }
  27. this.onChangeGrant = this.onChangeGrant.bind(this);
  28. }
  29. componentDidMount() {
  30. this.init();
  31. }
  32. init() {
  33. this.grantSelectorInputEl.value = this.state.editorOptions.theme;
  34. }
  35. onChangeGrant(userGroup) {
  36. const newValue = userGroup;
  37. const newGrant = Object.assign(this.state.pageGrant, {grant: newValue});
  38. this.setState({ pageGrant: newGrant });
  39. // dispatch event
  40. this.dispatchOnChange();
  41. }
  42. onClickGrantGroup() {
  43. const newValue = this.groupSelectorInputEl.value;
  44. const newGrant = Object.assign(this.state.pageGrant, { grantGroup: newValue });
  45. this.setState({ pageGrant: newGrant });
  46. // dispatch event
  47. this.dispatchOnChange();
  48. // close group select modal
  49. if (this.state.isModalShown) {
  50. this.setState({ isGroupModalShown: false });
  51. }
  52. }
  53. /**
  54. * dispatch onChange event
  55. */
  56. dispatchOnChange() {
  57. if (this.props.onChange != null) {
  58. this.props.onChange(this.state.pageGrant);
  59. }
  60. }
  61. renderGrantSelector() {
  62. const optionElems = this.availableGrants.map((entry) => {
  63. return <option key={entry.key} value={entry.key}>{entry.value}</option>;
  64. });
  65. const bsClassName = 'form-control-dummy'; // set form-control* to shrink width
  66. return (
  67. <FormGroup controlId="formControlsSelect">
  68. <ControlLabel>Theme:</ControlLabel>
  69. <FormControl componentClass="select" placeholder="select" bsClass={bsClassName} className="btn-group-sm selectpicker"
  70. onChange={this.onChangeGrant}
  71. inputRef={ el => this.grantSelectorInputEl=el }>
  72. {optionElems}
  73. </FormControl>
  74. </FormGroup>
  75. )
  76. }
  77. renderConfigurationDropdown() {
  78. return (
  79. <FormGroup controlId="formControlsSelect">
  80. <Dropdown dropup id="configurationDropdown" className="configuration-dropdown"
  81. open={this.state.isCddMenuOpened} onToggle={this.onToggleConfigurationDropdown}>
  82. <Dropdown.Toggle bsSize="sm">
  83. <i className="icon-settings"></i>
  84. </Dropdown.Toggle>
  85. <Dropdown.Menu>
  86. {this.renderActiveLineMenuItem()}
  87. {this.renderRealtimeMathJaxMenuItem()}
  88. {/* <MenuItem divider /> */}
  89. </Dropdown.Menu>
  90. </Dropdown>
  91. </FormGroup>
  92. )
  93. }
  94. renderActiveLineMenuItem() {
  95. const isActive = this.state.editorOptions.styleActiveLine;
  96. const iconClasses = ['text-info']
  97. if (isActive) {
  98. iconClasses.push('ti-check')
  99. }
  100. const iconClassName = iconClasses.join(' ');
  101. return (
  102. <MenuItem onClick={this.onClickStyleActiveLine}>
  103. <span className="icon-container"></span>
  104. <span className="menuitem-label">Show active line</span>
  105. <span className="icon-container"><i className={iconClassName}></i></span>
  106. </MenuItem>
  107. )
  108. }
  109. renderRealtimeMathJaxMenuItem() {
  110. if (!this.state.isMathJaxEnabled) {
  111. return;
  112. }
  113. const isEnabled = this.state.isMathJaxEnabled;
  114. const isActive = isEnabled && this.state.previewOptions.renderMathJaxInRealtime;
  115. const iconClasses = ['text-info']
  116. if (isActive) {
  117. iconClasses.push('ti-check')
  118. }
  119. const iconClassName = iconClasses.join(' ');
  120. return (
  121. <MenuItem onClick={this.onClickRenderMathJaxInRealtime}>
  122. <span className="icon-container"><img src="/images/icons/fx.svg" width="14px"></img></span>
  123. <span className="menuitem-label">MathJax Rendering</span>
  124. <i className={iconClassName}></i>
  125. </MenuItem>
  126. )
  127. }
  128. renderSelectGroupModal() {
  129. const userRelatedGroups = this.props.userRelatedGroups;
  130. const groupList = this.userRelatedGroups.map((group) => {
  131. return
  132. <li>
  133. <Button onClick={this.onClickGrantGroup(group)} bsClass="btn btn-sm btn-primary">{group.name}</Button>
  134. </li>
  135. });
  136. return (
  137. <Modal show={this.props.isGroupModalShown} onHide={this.props.cancel} className="select-grant-group">
  138. <Modal.Header closeButton>
  139. <Modal.Title>
  140. Select a Group
  141. </Modal.Title>
  142. </Modal.Header>
  143. <Modal.Body>
  144. <ul class="list-inline">
  145. {groupList}
  146. </ul>
  147. </Modal.Body>
  148. </Modal>
  149. );
  150. }
  151. render() {
  152. return <span>
  153. <span className="m-l-5">{this.renderThemeSelector()}</span>
  154. </span>
  155. }
  156. }
  157. export class PageGrant {
  158. constructor(props) {
  159. this.grant = '';
  160. this.grantGroup = null;
  161. Object.assign(this, props);
  162. }
  163. }
  164. export class UserGroup {
  165. constructor(props) {
  166. this.userGroupId = '';
  167. this.userGroup
  168. Object.assign(this, props);
  169. }
  170. }
  171. GrantSelector.propTypes = {
  172. crowi: PropTypes.object.isRequired,
  173. userRelatedGroups: PropTypes.object,
  174. pageGrant: PropTypes.instanceOf(PageGrant),
  175. onChange: PropTypes.func,
  176. };