AdminMarkDownContainer.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { isServer } from '@growi/core/dist/utils';
  2. import { Container } from 'unstated';
  3. import { apiv3Get, apiv3Put } from '../util/apiv3-client';
  4. /**
  5. * Service container for admin markdown setting page (MarkDownSetting.jsx)
  6. * @extends {Container} unstated Container
  7. */
  8. export default class AdminMarkDownContainer extends Container {
  9. constructor(appContainer) {
  10. super();
  11. if (isServer()) {
  12. return;
  13. }
  14. this.appContainer = appContainer;
  15. this.state = {
  16. retrieveError: null,
  17. isEnabledLinebreaks: false,
  18. isEnabledLinebreaksInComments: false,
  19. adminPreferredIndentSize: 4,
  20. isIndentSizeForced: false,
  21. isEnabledXss: false,
  22. xssOption: '',
  23. tagWhitelist: '',
  24. attrWhitelist: '{}',
  25. };
  26. this.switchEnableXss = this.switchEnableXss.bind(this);
  27. this.setAdminPreferredIndentSize = this.setAdminPreferredIndentSize.bind(this);
  28. }
  29. /**
  30. * Workaround for the mangling in production build to break constructor.name
  31. */
  32. static getClassName() {
  33. return 'AdminMarkDownContainer';
  34. }
  35. /**
  36. * retrieve markdown data
  37. */
  38. async retrieveMarkdownData() {
  39. const response = await apiv3Get('/markdown-setting/');
  40. const { markdownParams } = response.data;
  41. this.setState({
  42. isEnabledLinebreaks: markdownParams.isEnabledLinebreaks,
  43. isEnabledLinebreaksInComments: markdownParams.isEnabledLinebreaksInComments,
  44. adminPreferredIndentSize: markdownParams.adminPreferredIndentSize,
  45. isIndentSizeForced: markdownParams.isIndentSizeForced,
  46. isEnabledXss: markdownParams.isEnabledXss,
  47. xssOption: markdownParams.xssOption,
  48. tagWhitelist: markdownParams.tagWhitelist || '',
  49. attrWhitelist: markdownParams.attrWhitelist || '',
  50. });
  51. }
  52. setAdminPreferredIndentSize(adminPreferredIndentSize) {
  53. this.setState({ adminPreferredIndentSize });
  54. }
  55. /**
  56. * Switch enableXss
  57. */
  58. switchEnableXss() {
  59. this.setState({ isEnabledXss: !this.state.isEnabledXss });
  60. }
  61. /**
  62. * Update LineBreak Setting
  63. */
  64. async updateLineBreakSetting() {
  65. const response = await apiv3Put('/markdown-setting/lineBreak', {
  66. isEnabledLinebreaks: this.state.isEnabledLinebreaks,
  67. isEnabledLinebreaksInComments: this.state.isEnabledLinebreaksInComments,
  68. });
  69. return response;
  70. }
  71. /**
  72. * Update
  73. */
  74. async updateIndentSetting() {
  75. const response = await apiv3Put('/markdown-setting/indent', {
  76. adminPreferredIndentSize: this.state.adminPreferredIndentSize,
  77. isIndentSizeForced: this.state.isIndentSizeForced,
  78. });
  79. return response;
  80. }
  81. /**
  82. * Update Xss Setting
  83. */
  84. async updateXssSetting() {
  85. let { tagWhitelist = '' } = this.state;
  86. const { attrWhitelist = '{}' } = this.state;
  87. tagWhitelist = Array.isArray(tagWhitelist) ? tagWhitelist : tagWhitelist.split(',');
  88. try {
  89. // Check if parsing is possible
  90. JSON.parse(attrWhitelist);
  91. }
  92. catch (err) {
  93. throw Error(`attrWhitelist parsing error occured: ${err.message}`);
  94. }
  95. await apiv3Put('/markdown-setting/xss', {
  96. isEnabledXss: this.state.isEnabledXss,
  97. xssOption: this.state.xssOption,
  98. tagWhitelist,
  99. attrWhitelist,
  100. });
  101. }
  102. }