WhiteListInput.jsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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 { tags, attrs } from '~/services/xss/recommended-whitelist';
  6. import { withUnstatedContainers } from '../../UnstatedUtils';
  7. class WhiteListInput extends React.Component {
  8. constructor(props) {
  9. super(props);
  10. this.tagWhiteList = React.createRef();
  11. this.attrWhiteList = React.createRef();
  12. this.onClickRecommendTagButton = this.onClickRecommendTagButton.bind(this);
  13. this.onClickRecommendAttrButton = this.onClickRecommendAttrButton.bind(this);
  14. }
  15. onClickRecommendTagButton() {
  16. this.tagWhiteList.current.value = tags;
  17. this.props.adminMarkDownContainer.setState({ tagWhiteList: tags });
  18. }
  19. onClickRecommendAttrButton() {
  20. this.attrWhiteList.current.value = attrs;
  21. this.props.adminMarkDownContainer.setState({ attrWhiteList: attrs });
  22. }
  23. render() {
  24. const { t, adminMarkDownContainer } = this.props;
  25. return (
  26. <>
  27. <div className="mt-4">
  28. <div className="d-flex justify-content-between">
  29. {t('markdown_settings.xss_options.tag_names')}
  30. <p id="btn-import-tags" className="btn btn-sm btn-primary mb-0" onClick={this.onClickRecommendTagButton}>
  31. {t('markdown_settings.xss_options.import_recommended', { target: 'Tags' })}
  32. </p>
  33. </div>
  34. <textarea
  35. className="form-control xss-list"
  36. name="recommendedTags"
  37. rows="6"
  38. cols="40"
  39. ref={this.tagWhiteList}
  40. defaultValue={adminMarkDownContainer.state.tagWhiteList}
  41. onChange={(e) => { adminMarkDownContainer.setState({ tagWhiteList: e.target.value }) }}
  42. />
  43. </div>
  44. <div className="mt-4">
  45. <div className="d-flex justify-content-between">
  46. {t('markdown_settings.xss_options.tag_attributes')}
  47. <p id="btn-import-tags" className="btn btn-sm btn-primary mb-0" onClick={this.onClickRecommendAttrButton}>
  48. {t('markdown_settings.xss_options.import_recommended', { target: 'Attrs' })}
  49. </p>
  50. </div>
  51. <textarea
  52. className="form-control xss-list"
  53. name="recommendedAttrs"
  54. rows="6"
  55. cols="40"
  56. ref={this.attrWhiteList}
  57. defaultValue={adminMarkDownContainer.state.attrWhiteList}
  58. onChange={(e) => { adminMarkDownContainer.setState({ attrWhiteList: e.target.value }) }}
  59. />
  60. </div>
  61. </>
  62. );
  63. }
  64. }
  65. WhiteListInput.propTypes = {
  66. t: PropTypes.func.isRequired, // i18next
  67. adminMarkDownContainer: PropTypes.instanceOf(AdminMarkDownContainer).isRequired,
  68. };
  69. const PresentationFormWrapperFC = (props) => {
  70. const { t } = useTranslation('admin');
  71. return <WhiteListInput t={t} {...props} />;
  72. };
  73. const WhiteListWrapper = withUnstatedContainers(PresentationFormWrapperFC, [AdminMarkDownContainer]);
  74. export default WhiteListWrapper;