Просмотр исходного кода

Merge pull request #1444 from weseek/imprv/refactor-fetch-markdown-setting-with-apiV3

Imprv/refactor fetch markdown setting with api v3
Yuki Takei 6 лет назад
Родитель
Сommit
e54d5c690f

+ 11 - 4
src/client/js/components/Admin/MarkdownSetting/LineBreakForm.jsx

@@ -51,7 +51,7 @@ class LineBreakForm extends React.Component {
               onChange={() => { adminMarkDownContainer.setState({ isEnabledLinebreaks: !isEnabledLinebreaks }) }}
               onChange={() => { adminMarkDownContainer.setState({ isEnabledLinebreaks: !isEnabledLinebreaks }) }}
             />
             />
             <label htmlFor="isEnabledLinebreaks">
             <label htmlFor="isEnabledLinebreaks">
-              { t('markdown_setting.Enable Line Break') }
+              {t('markdown_setting.Enable Line Break')}
             </label>
             </label>
           </div>
           </div>
           <p className="help-block" dangerouslySetInnerHTML={helpLineBreak} />
           <p className="help-block" dangerouslySetInnerHTML={helpLineBreak} />
@@ -77,7 +77,7 @@ class LineBreakForm extends React.Component {
               onChange={() => { adminMarkDownContainer.setState({ isEnabledLinebreaksInComments: !isEnabledLinebreaksInComments }) }}
               onChange={() => { adminMarkDownContainer.setState({ isEnabledLinebreaksInComments: !isEnabledLinebreaksInComments }) }}
             />
             />
             <label htmlFor="isEnabledLinebreaksInComments">
             <label htmlFor="isEnabledLinebreaksInComments">
-              { t('markdown_setting.Enable Line Break for comment') }
+              {t('markdown_setting.Enable Line Break for comment')}
             </label>
             </label>
           </div>
           </div>
           <p className="help-block" dangerouslySetInnerHTML={helpLineBreakInComment} />
           <p className="help-block" dangerouslySetInnerHTML={helpLineBreakInComment} />
@@ -87,7 +87,7 @@ class LineBreakForm extends React.Component {
   }
   }
 
 
   render() {
   render() {
-    const { t } = this.props;
+    const { t, adminMarkDownContainer } = this.props;
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
@@ -97,7 +97,14 @@ class LineBreakForm extends React.Component {
         </fieldset>
         </fieldset>
         <div className="form-group my-3">
         <div className="form-group my-3">
           <div className="col-xs-offset-4 col-xs-5">
           <div className="col-xs-offset-4 col-xs-5">
-            <button type="submit" className="btn btn-primary" onClick={this.onClickSubmit}>{ t('Update') }</button>
+            <button
+              type="submit"
+              className="btn btn-primary"
+              onClick={this.onClickSubmit}
+              disabled={adminMarkDownContainer.state.retrieveError != null}
+            >
+              {t('Update')}
+            </button>
           </div>
           </div>
         </div>
         </div>
       </React.Fragment>
       </React.Fragment>

+ 22 - 1
src/client/js/components/Admin/MarkdownSetting/MarkDownSetting.jsx

@@ -2,15 +2,35 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import PropTypes from 'prop-types';
 import { withTranslation } from 'react-i18next';
 import { withTranslation } from 'react-i18next';
 
 
+import loggerFactory from '@alias/logger';
+
 import { createSubscribedElement } from '../../UnstatedUtils';
 import { createSubscribedElement } from '../../UnstatedUtils';
+import { toastError } from '../../../util/apiNotification';
 
 
 import AppContainer from '../../../services/AppContainer';
 import AppContainer from '../../../services/AppContainer';
 import LineBreakForm from './LineBreakForm';
 import LineBreakForm from './LineBreakForm';
 import PresentationForm from './PresentationForm';
 import PresentationForm from './PresentationForm';
 import XssForm from './XssForm';
 import XssForm from './XssForm';
+import AdminMarkDownContainer from '../../../services/AdminMarkDownContainer';
+
+const logger = loggerFactory('growi:MarkDown');
 
 
 class MarkdownSetting extends React.Component {
 class MarkdownSetting extends React.Component {
 
 
+  async componentDidMount() {
+    const { adminMarkDownContainer } = this.props;
+
+    try {
+      await adminMarkDownContainer.retrieveMarkdownData();
+    }
+    catch (err) {
+      toastError(err);
+      adminMarkDownContainer.setState({ retrieveError: err });
+      logger.error(err);
+    }
+
+  }
+
   render() {
   render() {
     const { t } = this.props;
     const { t } = this.props;
 
 
@@ -43,12 +63,13 @@ class MarkdownSetting extends React.Component {
 }
 }
 
 
 const MarkdownSettingWrapper = (props) => {
 const MarkdownSettingWrapper = (props) => {
-  return createSubscribedElement(MarkdownSetting, props, [AppContainer]);
+  return createSubscribedElement(MarkdownSetting, props, [AppContainer, AdminMarkDownContainer]);
 };
 };
 
 
 MarkdownSetting.propTypes = {
 MarkdownSetting.propTypes = {
   t: PropTypes.func.isRequired, // i18next
   t: PropTypes.func.isRequired, // i18next
   appContainer: PropTypes.instanceOf(AppContainer).isRequired,
   appContainer: PropTypes.instanceOf(AppContainer).isRequired,
+  adminMarkDownContainer: PropTypes.instanceOf(AdminMarkDownContainer).isRequired,
 
 
 };
 };
 
 

+ 2 - 2
src/client/js/components/Admin/MarkdownSetting/PresentationForm.jsx

@@ -89,7 +89,7 @@ class PresentationForm extends React.Component {
               { t('markdown_setting.Custom separator desc') }
               { t('markdown_setting.Custom separator desc') }
               <input
               <input
                 className="form-control"
                 className="form-control"
-                value={pageBreakCustomSeparator}
+                defaultValue={pageBreakCustomSeparator}
                 onChange={(e) => { adminMarkDownContainer.setPageBreakCustomSeparator(e.target.value) }}
                 onChange={(e) => { adminMarkDownContainer.setPageBreakCustomSeparator(e.target.value) }}
               />
               />
             </div>
             </div>
@@ -98,7 +98,7 @@ class PresentationForm extends React.Component {
 
 
         <div className="form-group my-3">
         <div className="form-group my-3">
           <div className="col-xs-offset-4 col-xs-5">
           <div className="col-xs-offset-4 col-xs-5">
-            <div className="btn btn-primary" onClick={this.onClickSubmit}>{ t('Update') }</div>
+            <div className="btn btn-primary" onClick={this.onClickSubmit} disabled={adminMarkDownContainer.state.retrieveError != null}>{ t('Update') }</div>
           </div>
           </div>
         </div>
         </div>
 
 

+ 1 - 1
src/client/js/components/Admin/MarkdownSetting/PresentationLineBreakOptions.jsx

@@ -60,7 +60,7 @@ class PresentationLineBreakOptions extends React.Component {
               { t('markdown_setting.Custom separator desc') }
               { t('markdown_setting.Custom separator desc') }
               <input
               <input
                 className="form-control"
                 className="form-control"
-                value={customRegularExpression}
+                defaultValue={customRegularExpression}
                 onChange={(e) => { adminMarkDownContainer.setState({ customRegularExpression: e.target.value }) }}
                 onChange={(e) => { adminMarkDownContainer.setState({ customRegularExpression: e.target.value }) }}
               />
               />
             </div>
             </div>

+ 2 - 2
src/client/js/components/Admin/MarkdownSetting/WhiteListInput.jsx

@@ -66,7 +66,7 @@ class WhiteListInput extends React.Component {
             rows="6"
             rows="6"
             cols="40"
             cols="40"
             readOnly={!customizable}
             readOnly={!customizable}
-            value={this.renderTagValue()}
+            defaultValue={this.renderTagValue()}
             onChange={(e) => { adminMarkDownContainer.setState({ tagWhiteList: e.target.value }) }}
             onChange={(e) => { adminMarkDownContainer.setState({ tagWhiteList: e.target.value }) }}
           />
           />
         </div>
         </div>
@@ -81,7 +81,7 @@ class WhiteListInput extends React.Component {
             rows="6"
             rows="6"
             cols="40"
             cols="40"
             readOnly={!customizable}
             readOnly={!customizable}
-            value={this.renderAttrValue()}
+            defaultValue={this.renderAttrValue()}
             onChange={(e) => { adminMarkDownContainer.setState({ attrWhiteList: e.target.value }) }}
             onChange={(e) => { adminMarkDownContainer.setState({ attrWhiteList: e.target.value }) }}
           />
           />
         </div>
         </div>

+ 1 - 1
src/client/js/components/Admin/MarkdownSetting/XssForm.jsx

@@ -114,7 +114,7 @@ class XssForm extends React.Component {
           </div>
           </div>
           <div className="form-group my-3">
           <div className="form-group my-3">
             <div className="col-xs-offset-4 col-xs-5">
             <div className="col-xs-offset-4 col-xs-5">
-              <div className="btn btn-primary" onClick={this.onClickSubmit}>{ t('Update') }</div>
+              <div className="btn btn-primary" onClick={this.onClickSubmit} disabled={adminMarkDownContainer.state.retrieveError != null}> {t('Update')}</div>
             </div>
             </div>
           </div>
           </div>
         </form>
         </form>

+ 41 - 10
src/client/js/services/AdminMarkDownContainer.js

@@ -1,5 +1,11 @@
 import { Container } from 'unstated';
 import { Container } from 'unstated';
 
 
+import loggerFactory from '@alias/logger';
+
+import { toastError } from '../util/apiNotification';
+
+const logger = loggerFactory('growi:services:AdminMarkdownContainer');
+
 /**
 /**
  * Service container for admin markdown setting page (MarkDownSetting.jsx)
  * Service container for admin markdown setting page (MarkDownSetting.jsx)
  * @extends {Container} unstated Container
  * @extends {Container} unstated Container
@@ -12,16 +18,15 @@ export default class AdminMarkDownContainer extends Container {
     this.appContainer = appContainer;
     this.appContainer = appContainer;
 
 
     this.state = {
     this.state = {
-      isEnabledLinebreaks: appContainer.config.isEnabledLinebreaks,
-      isEnabledLinebreaksInComments: appContainer.config.isEnabledLinebreaksInComments,
-      pageBreakSeparator: appContainer.config.pageBreakSeparator,
-      pageBreakCustomSeparator: appContainer.config.pageBreakCustomSeparator || '',
-      // pageBreakOption: appContainer.config.pageBreakOption,
-      customRegularExpression: appContainer.config.customRegularExpression || '',
-      isEnabledXss: (appContainer.config.xssOption != null),
-      xssOption: appContainer.config.xssOption,
-      tagWhiteList: appContainer.config.tagWhiteList || '',
-      attrWhiteList: appContainer.config.attrWhiteList || '',
+      retrieveError: null,
+      isEnabledLinebreaks: false,
+      isEnabledLinebreaksInComments: false,
+      pageBreakSeparator: 1,
+      pageBreakCustomSeparator: '',
+      isEnabledXss: false,
+      xssOption: 1,
+      tagWhiteList: '',
+      attrWhiteList: '',
     };
     };
 
 
     this.switchEnableXss = this.switchEnableXss.bind(this);
     this.switchEnableXss = this.switchEnableXss.bind(this);
@@ -34,6 +39,32 @@ export default class AdminMarkDownContainer extends Container {
     return 'AdminMarkDownContainer';
     return 'AdminMarkDownContainer';
   }
   }
 
 
+  /**
+   * retrieve markdown data
+   */
+  async retrieveMarkdownData() {
+    try {
+      const response = await this.appContainer.apiv3.get('/markdown-setting/');
+      const { markdownParams } = response.data;
+
+      this.setState({
+        isEnabledLinebreaks: markdownParams.isEnabledLinebreaks,
+        isEnabledLinebreaksInComments: markdownParams.isEnabledLinebreaksInComments,
+        pageBreakSeparator: markdownParams.pageBreakSeparator,
+        pageBreakCustomSeparator: markdownParams.pageBreakCustomSeparator || '',
+        isEnabledXss: markdownParams.isEnabledXss,
+        xssOption: markdownParams.xssOption,
+        tagWhiteList: markdownParams.tagWhiteList || '',
+        attrWhiteList: markdownParams.attrWhiteList || '',
+      });
+
+    }
+    catch (err) {
+      logger.error(err);
+      toastError(new Error('Failed to fetch data'));
+    }
+  }
+
   /**
   /**
    * Switch PageBreakSeparator
    * Switch PageBreakSeparator
    */
    */

+ 32 - 0
src/server/routes/apiv3/markdown-setting.js

@@ -88,6 +88,38 @@ module.exports = (crowi) => {
 
 
   const { ApiV3FormValidator } = crowi.middlewares;
   const { ApiV3FormValidator } = crowi.middlewares;
 
 
+  /**
+   * @swagger
+   *
+   *    /markdown-setting/:
+   *      get:
+   *        tags: [MarkDownSettind]
+   *        description: Get markdown paramators
+   *        responses:
+   *          200:
+   *            description: params of markdown
+   *            content:
+   *              application/json:
+   *                schema:
+   *                  properties:
+   *                    markdonwParams:
+   *                      $ref: '#/components/schemas/CustomizeParams'
+   */
+  router.get('/', loginRequiredStrictly, adminRequired, async(req, res) => {
+    const markdownParams = {
+      isEnabledLinebreaks: await crowi.configManager.getConfig('markdown', 'markdown:isEnabledLinebreaks'),
+      isEnabledLinebreaksInComments: await crowi.configManager.getConfig('markdown', 'markdown:isEnabledLinebreaksInComments'),
+      pageBreakSeparator: await crowi.configManager.getConfig('markdown', 'markdown:presentation:pageBreakSeparator'),
+      pageBreakCustomSeparator: await crowi.configManager.getConfig('markdown', 'markdown:presentation:pageBreakCustomSeparator'),
+      isEnabledXss: await crowi.configManager.getConfig('markdown', 'markdown:xss:isEnabledPrevention'),
+      xssOption: await crowi.configManager.getConfig('markdown', 'markdown:xss:option'),
+      tagWhiteList: await crowi.configManager.getConfig('markdown', 'markdown:xss:tagWhiteList'),
+      attrWhiteList: await crowi.configManager.getConfig('markdown', 'markdown:xss:attrWhiteList'),
+    };
+
+    return res.apiv3({ markdownParams });
+  });
+
   /**
   /**
    * @swagger
    * @swagger
    *
    *