IndentForm.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /* eslint-disable react/no-danger */
  2. import React, { useCallback } from 'react';
  3. import { useTranslation } from 'react-i18next';
  4. import {
  5. UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem,
  6. } from 'reactstrap';
  7. import AdminMarkDownContainer from '~/client/services/AdminMarkDownContainer';
  8. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  9. import loggerFactory from '~/utils/logger';
  10. import { withUnstatedContainers } from '../../UnstatedUtils';
  11. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  12. const logger = loggerFactory('growi:importer');
  13. type Props = {
  14. adminMarkDownContainer: AdminMarkDownContainer;
  15. }
  16. const IndentForm = (props: Props) => {
  17. const { t } = useTranslation();
  18. const onClickSubmit = useCallback(async(props) => {
  19. try {
  20. await props.adminMarkDownContainer.updateIndentSetting();
  21. toastSuccess(t('toaster.update_successed', { target: t('admin:markdown_setting.indent_header') }));
  22. }
  23. catch (err) {
  24. toastError(err);
  25. logger.error(err);
  26. }
  27. }, [t]);
  28. const renderIndentSizeOption = (props) => {
  29. const { adminMarkDownContainer } = props;
  30. const { adminPreferredIndentSize } = adminMarkDownContainer.state;
  31. return (
  32. <div className="col">
  33. <div>
  34. <label htmlFor="adminPreferredIndentSize">{t('admin:markdown_setting.indent_options.indentSize')}</label>
  35. <UncontrolledDropdown id="adminPreferredIndentSize">
  36. <DropdownToggle caret className="col-3 col-sm-2 col-md-5 col-lg-5 col-xl-3 text-right">
  37. <span className="float-left">
  38. {adminPreferredIndentSize || 4}
  39. </span>
  40. </DropdownToggle>
  41. <DropdownMenu className="dropdown-menu" role="menu">
  42. {[2, 4].map((num) => {
  43. return (
  44. <DropdownItem key={num} role="presentation" onClick={() => adminMarkDownContainer.setAdminPreferredIndentSize(num)}>
  45. <a role="menuitem">{num}</a>
  46. </DropdownItem>
  47. );
  48. })}
  49. </DropdownMenu>
  50. </UncontrolledDropdown>
  51. </div>
  52. <p className="form-text text-muted">
  53. {t('admin:markdown_setting.indent_options.indentSize_desc')}
  54. </p>
  55. </div>
  56. );
  57. };
  58. const renderIndentForceOption = (props) => {
  59. const { adminMarkDownContainer } = props;
  60. const { isIndentSizeForced } = adminMarkDownContainer.state;
  61. const helpIndentInComment = { __html: t('admin:markdown_setting.indent_options.disallow_indent_change_desc') };
  62. return (
  63. <div className="col">
  64. <div className="custom-control custom-checkbox custom-checkbox-success">
  65. <input
  66. type="checkbox"
  67. className="custom-control-input"
  68. id="isIndentSizeForced"
  69. checked={isIndentSizeForced || false}
  70. onChange={() => {
  71. adminMarkDownContainer.setState({ isIndentSizeForced: !isIndentSizeForced });
  72. }}
  73. />
  74. <label className="custom-control-label" htmlFor="isIndentSizeForced">
  75. {t('admin:markdown_setting.indent_options.disallow_indent_change')}
  76. </label>
  77. </div>
  78. <p className="form-text text-muted" dangerouslySetInnerHTML={helpIndentInComment} />
  79. </div>
  80. );
  81. };
  82. const { adminMarkDownContainer } = props;
  83. return (
  84. <React.Fragment>
  85. <fieldset className="form-group row row-cols-1 row-cols-md-2 mx-3">
  86. {renderIndentSizeOption(props)}
  87. {renderIndentForceOption(props)}
  88. </fieldset>
  89. <AdminUpdateButtonRow onClick={() => onClickSubmit(props)} disabled={adminMarkDownContainer.state.retrieveError != null} />
  90. </React.Fragment>
  91. );
  92. };
  93. /**
  94. * Wrapper component for using unstated
  95. */
  96. const IndentFormWrapper = withUnstatedContainers(IndentForm, [AdminMarkDownContainer]);
  97. export default IndentFormWrapper;