IndentForm.tsx 4.0 KB

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