AdminMarkDownContainer.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import { isServer } from '@growi/core';
  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. pageBreakSeparator: 1,
  22. pageBreakCustomSeparator: '',
  23. isEnabledXss: false,
  24. xssOption: 1,
  25. tagWhiteList: '',
  26. attrWhiteList: '',
  27. };
  28. this.switchEnableXss = this.switchEnableXss.bind(this);
  29. this.setAdminPreferredIndentSize = this.setAdminPreferredIndentSize.bind(this);
  30. }
  31. /**
  32. * Workaround for the mangling in production build to break constructor.name
  33. */
  34. static getClassName() {
  35. return 'AdminMarkDownContainer';
  36. }
  37. /**
  38. * retrieve markdown data
  39. */
  40. async retrieveMarkdownData() {
  41. const response = await apiv3Get('/markdown-setting/');
  42. const { markdownParams } = response.data;
  43. this.setState({
  44. isEnabledLinebreaks: markdownParams.isEnabledLinebreaks,
  45. isEnabledLinebreaksInComments: markdownParams.isEnabledLinebreaksInComments,
  46. adminPreferredIndentSize: markdownParams.adminPreferredIndentSize,
  47. isIndentSizeForced: markdownParams.isIndentSizeForced,
  48. pageBreakSeparator: markdownParams.pageBreakSeparator,
  49. pageBreakCustomSeparator: markdownParams.pageBreakCustomSeparator || '',
  50. isEnabledXss: markdownParams.isEnabledXss,
  51. xssOption: markdownParams.xssOption,
  52. tagWhiteList: markdownParams.tagWhiteList || '',
  53. attrWhiteList: markdownParams.attrWhiteList || '',
  54. });
  55. }
  56. setAdminPreferredIndentSize(adminPreferredIndentSize) {
  57. this.setState({ adminPreferredIndentSize });
  58. }
  59. /**
  60. * Switch PageBreakSeparator
  61. */
  62. switchPageBreakSeparator(pageBreakSeparator) {
  63. this.setState({ pageBreakSeparator });
  64. }
  65. /**
  66. * Set PageBreakCustomSeparator
  67. */
  68. setPageBreakCustomSeparator(pageBreakCustomSeparator) {
  69. this.setState({ pageBreakCustomSeparator });
  70. }
  71. /**
  72. * Switch enableXss
  73. */
  74. switchEnableXss() {
  75. if (this.state.isEnabledXss) {
  76. this.setState({ xssOption: null });
  77. }
  78. this.setState({ isEnabledXss: !this.state.isEnabledXss });
  79. }
  80. /**
  81. * Update LineBreak Setting
  82. */
  83. async updateLineBreakSetting() {
  84. const response = await apiv3Put('/markdown-setting/lineBreak', {
  85. isEnabledLinebreaks: this.state.isEnabledLinebreaks,
  86. isEnabledLinebreaksInComments: this.state.isEnabledLinebreaksInComments,
  87. });
  88. return response;
  89. }
  90. /**
  91. * Update
  92. */
  93. async updateIndentSetting() {
  94. const response = await apiv3Put('/markdown-setting/indent', {
  95. adminPreferredIndentSize: this.state.adminPreferredIndentSize,
  96. isIndentSizeForced: this.state.isIndentSizeForced,
  97. });
  98. return response;
  99. }
  100. /**
  101. * Update Xss Setting
  102. */
  103. async updateXssSetting() {
  104. let { tagWhiteList, attrWhiteList } = this.state;
  105. tagWhiteList = Array.isArray(tagWhiteList) ? tagWhiteList : tagWhiteList.split(',');
  106. attrWhiteList = Array.isArray(attrWhiteList) ? attrWhiteList : attrWhiteList.split(',');
  107. const response = await apiv3Put('/markdown-setting/xss', {
  108. isEnabledXss: this.state.isEnabledXss,
  109. xssOption: this.state.xssOption,
  110. tagWhiteList,
  111. attrWhiteList,
  112. });
  113. return response;
  114. }
  115. /**
  116. * Update Presentation Setting
  117. */
  118. async updatePresentationSetting() {
  119. const response = await apiv3Put('/markdown-setting/presentation', {
  120. pageBreakSeparator: this.state.pageBreakSeparator,
  121. pageBreakCustomSeparator: this.state.pageBreakCustomSeparator,
  122. });
  123. this.setState({
  124. pageBreakSeparator: response.data.presentationParams.pageBreakSeparator,
  125. pageBreakCustomSeparator: response.data.presentationParams.pageBreakCustomSeparator,
  126. });
  127. return response;
  128. }
  129. }