WhiteListInput.jsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { createSubscribedElement } from '../../UnstatedUtils';
  5. import { tags, attrs } from '../../../../../lib/service/xss/recommended-whitelist';
  6. import AppContainer from '../../../services/AppContainer';
  7. import MarkDownSettingContainer from '../../../services/MarkDownSettingContainer';
  8. class WhiteListInput extends React.Component {
  9. renderRecommendTagBtn() {
  10. const { t, markDownSettingContainer } = this.props;
  11. return (
  12. <p id="btn-import-tags" className="btn btn-xs btn-primary" onClick={() => { markDownSettingContainer.setState({ tagWhiteList: tags }) }}>
  13. { t('markdown_setting.import_recommended', 'tags') }
  14. </p>
  15. );
  16. }
  17. renderRecommendAttrBtn() {
  18. const { t, markDownSettingContainer } = this.props;
  19. return (
  20. <p id="btn-import-tags" className="btn btn-xs btn-primary" onClick={() => { markDownSettingContainer.setState({ attrWhiteList: attrs }) }}>
  21. { t('markdown_setting.import_recommended', 'Attrs') }
  22. </p>
  23. );
  24. }
  25. renderTagValue() {
  26. const { customizable, markDownSettingContainer } = this.props;
  27. if (customizable) {
  28. return markDownSettingContainer.state.tagWhiteList;
  29. }
  30. return tags;
  31. }
  32. renderAttrValue() {
  33. const { customizable, markDownSettingContainer } = this.props;
  34. if (customizable) {
  35. return markDownSettingContainer.state.attrWhiteList;
  36. }
  37. return attrs;
  38. }
  39. render() {
  40. const { t, customizable, markDownSettingContainer } = this.props;
  41. return (
  42. <>
  43. <div className="m-t-15">
  44. <div className="d-flex justify-content-between">
  45. { t('markdown_setting.Tag names') }
  46. {customizable && this.renderRecommendTagBtn()}
  47. </div>
  48. <textarea
  49. className="form-control xss-list"
  50. name="recommendedTags"
  51. rows="6"
  52. cols="40"
  53. readOnly={!customizable}
  54. value={this.renderTagValue()}
  55. onChange={(e) => { markDownSettingContainer.setState({ tagWhiteList: e.target.value }) }}
  56. />
  57. </div>
  58. <div className="m-t-15">
  59. <div className="d-flex justify-content-between">
  60. { t('markdown_setting.Tag attributes') }
  61. {customizable && this.renderRecommendAttrBtn()}
  62. </div>
  63. <textarea
  64. className="form-control xss-list"
  65. name="recommendedAttrs"
  66. rows="6"
  67. cols="40"
  68. readOnly={!customizable}
  69. value={this.renderAttrValue()}
  70. onChange={(e) => { markDownSettingContainer.setState({ attrWhiteList: e.target.value }) }}
  71. />
  72. </div>
  73. </>
  74. );
  75. }
  76. }
  77. const WhiteListWrapper = (props) => {
  78. return createSubscribedElement(WhiteListInput, props, [AppContainer, MarkDownSettingContainer]);
  79. };
  80. WhiteListInput.propTypes = {
  81. t: PropTypes.func.isRequired, // i18next
  82. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  83. markDownSettingContainer: PropTypes.instanceOf(MarkDownSettingContainer).isRequired,
  84. customizable: PropTypes.bool.isRequired,
  85. };
  86. export default withTranslation()(WhiteListWrapper);