LineBreakForm.jsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import React from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. import AdminMarkDownContainer from '~/client/services/AdminMarkDownContainer';
  5. import { toastError, toastSuccess } from '~/client/util/toastr';
  6. import loggerFactory from '~/utils/logger';
  7. import { withUnstatedContainers } from '../../UnstatedUtils';
  8. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  9. const logger = loggerFactory('growi:importer');
  10. class LineBreakForm extends React.Component {
  11. constructor(props) {
  12. super(props);
  13. this.onClickSubmit = this.onClickSubmit.bind(this);
  14. }
  15. async onClickSubmit() {
  16. const { t } = this.props;
  17. try {
  18. await this.props.adminMarkDownContainer.updateLineBreakSetting();
  19. toastSuccess(
  20. t('toaster.update_successed', {
  21. target: t('markdown_settings.lineBreak_header'),
  22. ns: 'commons',
  23. }),
  24. );
  25. } catch (err) {
  26. toastError(err);
  27. logger.error(err);
  28. }
  29. }
  30. renderLineBreakOption() {
  31. const { t, adminMarkDownContainer } = this.props;
  32. const { isEnabledLinebreaks } = adminMarkDownContainer.state;
  33. const helpLineBreak = {
  34. __html: t('markdown_settings.lineBreak_options.enable_lineBreak_desc'),
  35. };
  36. return (
  37. <div className="col">
  38. <div className="form-check form-check-success">
  39. <input
  40. type="checkbox"
  41. className="form-check-input"
  42. id="isEnabledLinebreaks"
  43. checked={isEnabledLinebreaks}
  44. onChange={() => {
  45. adminMarkDownContainer.setState({
  46. isEnabledLinebreaks: !isEnabledLinebreaks,
  47. });
  48. }}
  49. />
  50. <label
  51. className="form-label form-check-label"
  52. htmlFor="isEnabledLinebreaks"
  53. >
  54. {t('markdown_settings.lineBreak_options.enable_lineBreak')}
  55. </label>
  56. </div>
  57. <p
  58. className="form-text text-muted"
  59. // biome-ignore lint/security/noDangerouslySetInnerHtml: translation contains HTML markup
  60. dangerouslySetInnerHTML={helpLineBreak}
  61. />
  62. </div>
  63. );
  64. }
  65. renderLineBreakInCommentOption() {
  66. const { t, adminMarkDownContainer } = this.props;
  67. const { isEnabledLinebreaksInComments } = adminMarkDownContainer.state;
  68. const helpLineBreakInComment = {
  69. __html: t(
  70. 'markdown_settings.lineBreak_options.enable_lineBreak_for_comment_desc',
  71. ),
  72. };
  73. return (
  74. <div className="col">
  75. <div className="form-check form-check-success">
  76. <input
  77. type="checkbox"
  78. className="form-check-input"
  79. id="isEnabledLinebreaksInComments"
  80. checked={isEnabledLinebreaksInComments}
  81. onChange={() => {
  82. adminMarkDownContainer.setState({
  83. isEnabledLinebreaksInComments: !isEnabledLinebreaksInComments,
  84. });
  85. }}
  86. />
  87. <label
  88. className="form-label form-check-label"
  89. htmlFor="isEnabledLinebreaksInComments"
  90. >
  91. {t(
  92. 'markdown_settings.lineBreak_options.enable_lineBreak_for_comment',
  93. )}
  94. </label>
  95. </div>
  96. <p
  97. className="form-text text-muted"
  98. // biome-ignore lint/security/noDangerouslySetInnerHtml: translation contains HTML markup
  99. dangerouslySetInnerHTML={helpLineBreakInComment}
  100. />
  101. </div>
  102. );
  103. }
  104. render() {
  105. const { adminMarkDownContainer } = this.props;
  106. return (
  107. <React.Fragment>
  108. <fieldset className="row row-cols-1 row-cols-md-2 mx-3">
  109. {this.renderLineBreakOption()}
  110. {this.renderLineBreakInCommentOption()}
  111. </fieldset>
  112. <AdminUpdateButtonRow
  113. onClick={this.onClickSubmit}
  114. disabled={adminMarkDownContainer.state.retrieveError != null}
  115. />
  116. </React.Fragment>
  117. );
  118. }
  119. }
  120. const LineBreakFormFC = (props) => {
  121. const { t } = useTranslation('admin');
  122. return <LineBreakForm t={t} {...props} />;
  123. };
  124. /**
  125. * Wrapper component for using unstated
  126. */
  127. const LineBreakFormWrapper = withUnstatedContainers(LineBreakFormFC, [
  128. AdminMarkDownContainer,
  129. ]);
  130. LineBreakForm.propTypes = {
  131. t: PropTypes.func.isRequired,
  132. adminMarkDownContainer: PropTypes.instanceOf(AdminMarkDownContainer)
  133. .isRequired,
  134. };
  135. export default LineBreakFormWrapper;