SavePageControls.jsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import ButtonToolbar from 'react-bootstrap/es/ButtonToolbar';
  5. import SplitButton from 'react-bootstrap/es/SplitButton';
  6. import MenuItem from 'react-bootstrap/es/MenuItem';
  7. import PageContainer from '../services/PageContainer';
  8. import AppContainer from '../services/AppContainer';
  9. import EditorContainer from '../services/EditorContainer';
  10. import { createSubscribedElement } from './UnstatedUtils';
  11. import SlackNotification from './SlackNotification';
  12. import GrantSelector from './SavePageControls/GrantSelector';
  13. class SavePageControls extends React.Component {
  14. constructor(props) {
  15. super(props);
  16. const config = this.props.appContainer.getConfig();
  17. this.hasSlackConfig = config.hasSlackConfig;
  18. this.isAclEnabled = config.isAclEnabled;
  19. this.slackEnabledFlagChangedHandler = this.slackEnabledFlagChangedHandler.bind(this);
  20. this.slackChannelsChangedHandler = this.slackChannelsChangedHandler.bind(this);
  21. this.updateGrantHandler = this.updateGrantHandler.bind(this);
  22. this.submit = this.submit.bind(this);
  23. this.submitAndOverwriteScopesOfDescendants = this.submitAndOverwriteScopesOfDescendants.bind(this);
  24. }
  25. slackEnabledFlagChangedHandler(isSlackEnabled) {
  26. this.props.editorContainer.setState({ isSlackEnabled });
  27. }
  28. slackChannelsChangedHandler(slackChannels) {
  29. this.props.editorContainer.setState({ slackChannels });
  30. }
  31. updateGrantHandler(data) {
  32. this.props.editorContainer.setState(data);
  33. }
  34. submit() {
  35. this.props.appContainer.setIsDocSaved(true);
  36. this.props.onSubmit();
  37. }
  38. submitAndOverwriteScopesOfDescendants() {
  39. this.props.onSubmit({ overwriteScopesOfDescendants: true });
  40. }
  41. render() {
  42. const { t, editorContainer } = this.props;
  43. const labelSubmitButton = this.props.pageContainer.state.pageId == null ? t('Create') : t('Update');
  44. const labelOverwriteScopes = t('page_edit.overwrite_scopes', { operation: labelSubmitButton });
  45. return (
  46. <div className="d-flex align-items-center form-inline">
  47. {this.hasSlackConfig
  48. && (
  49. <div className="mr-2">
  50. <SlackNotification
  51. isSlackEnabled={editorContainer.state.isSlackEnabled}
  52. slackChannels={editorContainer.state.slackChannels}
  53. onEnabledFlagChange={this.slackEnabledFlagChangedHandler}
  54. onChannelChange={this.slackChannelsChangedHandler}
  55. />
  56. </div>
  57. )
  58. }
  59. {this.isAclEnabled
  60. && (
  61. <div className="mr-2">
  62. <GrantSelector
  63. grant={editorContainer.state.grant}
  64. grantGroupId={editorContainer.state.grantGroupId}
  65. grantGroupName={editorContainer.state.grantGroupName}
  66. onUpdateGrant={this.updateGrantHandler}
  67. />
  68. </div>
  69. )
  70. }
  71. <ButtonToolbar>
  72. <SplitButton
  73. id="spl-btn-submit"
  74. bsStyle="primary"
  75. className="btn-submit"
  76. dropup
  77. pullRight
  78. onClick={this.submit}
  79. title={labelSubmitButton}
  80. >
  81. <MenuItem eventKey="1" onClick={this.submitAndOverwriteScopesOfDescendants}>{labelOverwriteScopes}</MenuItem>
  82. {/* <MenuItem divider /> */}
  83. </SplitButton>
  84. </ButtonToolbar>
  85. </div>
  86. );
  87. }
  88. }
  89. /**
  90. * Wrapper component for using unstated
  91. */
  92. const SavePageControlsWrapper = (props) => {
  93. return createSubscribedElement(SavePageControls, props, [AppContainer, PageContainer, EditorContainer]);
  94. };
  95. SavePageControls.propTypes = {
  96. t: PropTypes.func.isRequired, // i18next
  97. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  98. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  99. editorContainer: PropTypes.instanceOf(EditorContainer).isRequired,
  100. onSubmit: PropTypes.func.isRequired,
  101. };
  102. export default withTranslation()(SavePageControlsWrapper);