WhitelistInput.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import React from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. import { defaultSchema as sanitizeDefaultSchema } from 'rehype-sanitize';
  5. import AdminMarkDownContainer from '~/client/services/AdminMarkDownContainer';
  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.tags = sanitizeDefaultSchema.tagNames;
  13. this.attrs = JSON.stringify(sanitizeDefaultSchema.attributes);
  14. this.onClickRecommendTagButton = this.onClickRecommendTagButton.bind(this);
  15. this.onClickRecommendAttrButton = this.onClickRecommendAttrButton.bind(this);
  16. }
  17. onClickRecommendTagButton() {
  18. this.tagWhitelist.current.value = this.tags;
  19. this.props.adminMarkDownContainer.setState({ tagWhitelist: this.tags });
  20. }
  21. onClickRecommendAttrButton() {
  22. this.attrWhitelist.current.value = this.attrs;
  23. this.props.adminMarkDownContainer.setState({ attrWhitelist: this.attrs });
  24. }
  25. render() {
  26. const { t, adminMarkDownContainer } = this.props;
  27. return (
  28. <>
  29. <div className="mt-4">
  30. <div className="d-flex justify-content-between">
  31. {t('markdown_settings.xss_options.tag_names')}
  32. <p id="btn-import-tags" className="btn btn-sm btn-primary mb-0" onClick={this.onClickRecommendTagButton}>
  33. {t('markdown_settings.xss_options.import_recommended', { target: 'Tags' })}
  34. </p>
  35. </div>
  36. <textarea
  37. className="form-control xss-list"
  38. name="recommendedTags"
  39. rows="6"
  40. cols="40"
  41. ref={this.tagWhitelist}
  42. defaultValue={adminMarkDownContainer.state.tagWhitelist}
  43. onChange={(e) => { adminMarkDownContainer.setState({ tagWhitelist: e.target.value }) }}
  44. />
  45. </div>
  46. <div className="mt-4">
  47. <div className="d-flex justify-content-between">
  48. {t('markdown_settings.xss_options.tag_attributes')}
  49. <p id="btn-import-tags" className="btn btn-sm btn-primary mb-0" onClick={this.onClickRecommendAttrButton}>
  50. {t('markdown_settings.xss_options.import_recommended', { target: 'Attrs' })}
  51. </p>
  52. </div>
  53. <textarea
  54. className="form-control xss-list"
  55. name="recommendedAttrs"
  56. rows="6"
  57. cols="40"
  58. ref={this.attrWhitelist}
  59. defaultValue={adminMarkDownContainer.state.attrWhitelist}
  60. onChange={(e) => { adminMarkDownContainer.setState({ attrWhitelist: e.target.value }) }}
  61. />
  62. </div>
  63. </>
  64. );
  65. }
  66. }
  67. WhitelistInput.propTypes = {
  68. t: PropTypes.func.isRequired, // i18next
  69. adminMarkDownContainer: PropTypes.instanceOf(AdminMarkDownContainer).isRequired,
  70. };
  71. const PresentationFormWrapperFC = (props) => {
  72. const { t } = useTranslation('admin');
  73. return <WhitelistInput t={t} {...props} />;
  74. };
  75. const WhitelistWrapper = withUnstatedContainers(PresentationFormWrapperFC, [AdminMarkDownContainer]);
  76. export default WhitelistWrapper;