WhiteListInput.jsx 3.0 KB

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