XssForm.jsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { createSubscribedElement } from '../../UnstatedUtils';
  5. import AppContainer from '../../../services/AppContainer';
  6. import MarkDownSettingContainer from '../../../services/MarkDownSettingContainer';
  7. import WhiteListInput from './WhiteListInput';
  8. class XssForm extends React.Component {
  9. constructor(props) {
  10. super(props);
  11. this.onClickSubmit = this.onClickSubmit.bind(this);
  12. }
  13. async onClickSubmit() {
  14. // TODO GW-303 create apiV3 of update setting
  15. }
  16. xssOptions() {
  17. const { t, markDownSettingContainer } = this.props;
  18. const { xssOption } = markDownSettingContainer.state;
  19. return (
  20. <fieldset className="form-group col-xs-12 my-3">
  21. <div className="col-xs-4 radio radio-primary">
  22. <input
  23. type="radio"
  24. id="xssOption1"
  25. name="XssOption"
  26. checked={xssOption === 1}
  27. onChange={() => { markDownSettingContainer.setState({ xssOption: 1 }) }}
  28. />
  29. <label htmlFor="xssOption1">
  30. <p className="font-weight-bold">{ t('markdown_setting.Ignore all tags') }</p>
  31. <div className="m-t-15">
  32. { t('markdown_setting.Ignore all tags desc') }
  33. </div>
  34. </label>
  35. </div>
  36. <div className="col-xs-4 radio radio-primary">
  37. <input
  38. type="radio"
  39. id="xssOption2"
  40. name="XssOption"
  41. checked={xssOption === 2}
  42. onChange={() => { markDownSettingContainer.setState({ xssOption: 2 }) }}
  43. />
  44. <label htmlFor="xssOption2">
  45. <p className="font-weight-bold">{ t('markdown_setting.Recommended setting') }</p>
  46. <WhiteListInput customizable={false} />
  47. </label>
  48. </div>
  49. <div className="col-xs-4 radio radio-primary">
  50. <input
  51. type="radio"
  52. id="xssOption3"
  53. name="XssOption"
  54. checked={xssOption === 3}
  55. onChange={() => { markDownSettingContainer.setState({ xssOption: 3 }) }}
  56. />
  57. <label htmlFor="xssOption3">
  58. <p className="font-weight-bold">{ t('markdown_setting.Custom Whitelist') }</p>
  59. <WhiteListInput customizable />
  60. </label>
  61. </div>
  62. </fieldset>
  63. );
  64. }
  65. render() {
  66. const { t, markDownSettingContainer } = this.props;
  67. const { isEnabledXss } = markDownSettingContainer.state;
  68. return (
  69. <React.Fragment>
  70. <form className="row">
  71. <div className="form-group">
  72. <div className="col-xs-4 text-right">
  73. <div className="checkbox checkbox-success" onChange={markDownSettingContainer.switchEnableXss}>
  74. <input type="checkbox" id="XssEnable" className="form-check-input" name="isEnabledXss" checked={isEnabledXss} />
  75. <label htmlFor="XssEnable">
  76. { t('markdown_setting.Enable XSS prevention') }
  77. </label>
  78. </div>
  79. </div>
  80. {isEnabledXss && this.xssOptions()}
  81. </div>
  82. <div className="form-group my-3">
  83. <div className="col-xs-offset-4 col-xs-5">
  84. <div className="btn btn-primary" onClick={this.onClickSubmit}>{ t('Update') }</div>
  85. </div>
  86. </div>
  87. </form>
  88. </React.Fragment>
  89. );
  90. }
  91. }
  92. const XssFormWrapper = (props) => {
  93. return createSubscribedElement(XssForm, props, [AppContainer, MarkDownSettingContainer]);
  94. };
  95. XssForm.propTypes = {
  96. t: PropTypes.func.isRequired, // i18next
  97. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  98. markDownSettingContainer: PropTypes.instanceOf(MarkDownSettingContainer).isRequired,
  99. };
  100. export default withTranslation()(XssFormWrapper);