Yuki Takei 6 лет назад
Родитель
Сommit
28f08e209f

+ 24 - 25
src/client/js/app.js

@@ -45,7 +45,7 @@ import CustomHeaderEditor from './components/Admin/CustomHeaderEditor';
 import AdminRebuildSearch from './components/Admin/AdminRebuildSearch';
 import AdminRebuildSearch from './components/Admin/AdminRebuildSearch';
 import GroupDeleteModal from './components/GroupDeleteModal/GroupDeleteModal';
 import GroupDeleteModal from './components/GroupDeleteModal/GroupDeleteModal';
 
 
-import AppContextContainer from './services/AppContextContainer';
+import AppContainer from './services/AppContainer';
 import PageContainer from './services/PageContainer';
 import PageContainer from './services/PageContainer';
 import CommentContainer from './components/PageComment/CommentContainer';
 import CommentContainer from './components/PageComment/CommentContainer';
 import EditorContainer from './services/EditorContainer';
 import EditorContainer from './services/EditorContainer';
@@ -95,23 +95,23 @@ if (mainContent !== null) {
 }
 }
 const isLoggedin = document.querySelector('.main-container.nologin') == null;
 const isLoggedin = document.querySelector('.main-container.nologin') == null;
 
 
-const appContextContainer = new AppContextContainer();
+const appContainer = new AppContainer();
 
 
 // backward compatibility
 // backward compatibility
-const crowi = appContextContainer;
-window.crowi = appContextContainer;
+const crowi = appContainer;
+window.crowi = appContainer;
 
 
 if (isLoggedin) {
 if (isLoggedin) {
-  appContextContainer.fetchUsers();
+  appContainer.fetchUsers();
 }
 }
 
 
-const socket = crowi.getWebSocket();
-const socketClientId = crowi.getSocketClientId();
+const socket = appContainer.getWebSocket();
+const socketClientId = appContainer.getSocketClientId();
 
 
 const crowiRenderer = new GrowiRenderer(crowi, null, {
 const crowiRenderer = new GrowiRenderer(crowi, null, {
   mode: 'page',
   mode: 'page',
   isAutoSetup: false, // manually setup because plugins may configure it
   isAutoSetup: false, // manually setup because plugins may configure it
-  renderToc: crowi.getCrowiForJquery().renderTocContent, // function for rendering Table Of Contents
+  renderToc: appContainer.getCrowiForJquery().renderTocContent, // function for rendering Table Of Contents
 });
 });
 window.crowiRenderer = crowiRenderer;
 window.crowiRenderer = crowiRenderer;
 
 
@@ -145,7 +145,7 @@ const componentInstances = {};
  * @param {object} page Page instance
  * @param {object} page Page instance
  */
  */
 const saveWithShortcutSuccessHandler = function(page) {
 const saveWithShortcutSuccessHandler = function(page) {
-  const editorMode = crowi.getCrowiForJquery().getCurrentEditorMode();
+  const editorMode = appContainer.getCrowiForJquery().getCurrentEditorMode();
 
 
   // show toastr
   // show toastr
   toastr.success(undefined, 'Saved successfully', {
   toastr.success(undefined, 'Saved successfully', {
@@ -163,7 +163,7 @@ const saveWithShortcutSuccessHandler = function(page) {
   pageRevisionIdHackmdSynced = page.revisionHackmdSynced;
   pageRevisionIdHackmdSynced = page.revisionHackmdSynced;
 
 
   // set page id to SavePageControls
   // set page id to SavePageControls
-  componentInstances.savePageControls.setPageId(pageId);
+  pageContainer.setState({ pageId });
 
 
   // Page component
   // Page component
   if (componentInstances.page != null) {
   if (componentInstances.page != null) {
@@ -207,11 +207,11 @@ const errorHandler = function(error) {
 };
 };
 
 
 const saveWithShortcut = function(markdown) {
 const saveWithShortcut = function(markdown) {
-  const editorMode = crowi.getCrowiForJquery().getCurrentEditorMode();
+  const editorMode = appContainer.getCrowiForJquery().getCurrentEditorMode();
 
 
   let revisionId = pageRevisionId;
   let revisionId = pageRevisionId;
   // get options
   // get options
-  const options = componentInstances.savePageControls.getCurrentOptionsToSave();
+  const options = pageContainer.getCurrentOptionsToSave();
   options.socketClientId = socketClientId;
   options.socketClientId = socketClientId;
   options.pageTags = pageTags;
   options.pageTags = pageTags;
 
 
@@ -224,10 +224,10 @@ const saveWithShortcut = function(markdown) {
 
 
   let promise;
   let promise;
   if (pageId == null) {
   if (pageId == null) {
-    promise = crowi.createPage(pagePath, markdown, options);
+    promise = appContainer.createPage(pagePath, markdown, options);
   }
   }
   else {
   else {
-    promise = crowi.updatePage(pageId, revisionId, markdown, options);
+    promise = appContainer.updatePage(pageId, revisionId, markdown, options);
   }
   }
 
 
   promise
   promise
@@ -236,12 +236,12 @@ const saveWithShortcut = function(markdown) {
 };
 };
 
 
 const saveWithSubmitButtonSuccessHandler = function() {
 const saveWithSubmitButtonSuccessHandler = function() {
-  crowi.clearDraft(pagePath);
+  appContainer.clearDraft(pagePath);
   window.location.href = pagePath;
   window.location.href = pagePath;
 };
 };
 
 
 const saveWithSubmitButton = function(submitOpts) {
 const saveWithSubmitButton = function(submitOpts) {
-  const editorMode = crowi.getCrowiForJquery().getCurrentEditorMode();
+  const editorMode = appContainer.getCrowiForJquery().getCurrentEditorMode();
   if (editorMode == null) {
   if (editorMode == null) {
     // do nothing
     // do nothing
     return;
     return;
@@ -272,12 +272,12 @@ const saveWithSubmitButton = function(submitOpts) {
   // create or update
   // create or update
   if (pageId == null) {
   if (pageId == null) {
     promise = promise.then((markdown) => {
     promise = promise.then((markdown) => {
-      return crowi.createPage(pagePath, markdown, options);
+      return appContainer.createPage(pagePath, markdown, options);
     });
     });
   }
   }
   else {
   else {
     promise = promise.then((markdown) => {
     promise = promise.then((markdown) => {
-      return crowi.updatePage(pageId, revisionId, markdown, options);
+      return appContainer.updatePage(pageId, revisionId, markdown, options);
     });
     });
   }
   }
 
 
@@ -290,7 +290,7 @@ const saveWithSubmitButton = function(submitOpts) {
 crowiRenderer.setup();
 crowiRenderer.setup();
 
 
 // restore draft when the first time to edit
 // restore draft when the first time to edit
-const draft = crowi.findDraft(pagePath);
+const draft = appContainer.findDraft(pagePath);
 if (!pageRevisionId && draft != null) {
 if (!pageRevisionId && draft != null) {
   markdown = draft;
   markdown = draft;
 }
 }
@@ -357,7 +357,7 @@ Object.keys(componentMappings).forEach((key) => {
 
 
 // set page if exists
 // set page if exists
 if (componentInstances.page != null) {
 if (componentInstances.page != null) {
-  crowi.setPage(componentInstances.page);
+  appContainer.setPage(componentInstances.page);
 }
 }
 
 
 // render LikeButton
 // render LikeButton
@@ -397,9 +397,8 @@ const savePageControlsElem = document.getElementById('save-page-controls');
 if (savePageControlsElem) {
 if (savePageControlsElem) {
   ReactDOM.render(
   ReactDOM.render(
     <I18nextProvider i18n={i18n}>
     <I18nextProvider i18n={i18n}>
-      <Provider inject={[pageContainer]}>
+      <Provider inject={[appContainer, pageContainer]}>
         <SavePageControls
         <SavePageControls
-          crowi={crowi}
           onSubmit={saveWithSubmitButton}
           onSubmit={saveWithSubmitButton}
           ref={(elem) => {
           ref={(elem) => {
               if (savePageControls == null) {
               if (savePageControls == null) {
@@ -416,7 +415,7 @@ if (savePageControlsElem) {
 
 
 const recentCreatedControlsElem = document.getElementById('user-created-list');
 const recentCreatedControlsElem = document.getElementById('user-created-list');
 if (recentCreatedControlsElem) {
 if (recentCreatedControlsElem) {
-  let limit = crowi.getConfig().recentCreatedLimit;
+  let limit = appContainer.getConfig().recentCreatedLimit;
   if (limit == null) {
   if (limit == null) {
     limit = 10;
     limit = 10;
   }
   }
@@ -429,7 +428,7 @@ if (recentCreatedControlsElem) {
 
 
 const myDraftControlsElem = document.getElementById('user-draft-list');
 const myDraftControlsElem = document.getElementById('user-draft-list');
 if (myDraftControlsElem) {
 if (myDraftControlsElem) {
-  let limit = crowi.getConfig().recentCreatedLimit;
+  let limit = appContainer.getConfig().recentCreatedLimit;
   if (limit == null) {
   if (limit == null) {
     limit = 10;
     limit = 10;
   }
   }
@@ -500,7 +499,7 @@ if (pageEditorElem) {
   );
   );
   componentInstances.pageEditor = pageEditor;
   componentInstances.pageEditor = pageEditor;
   // set refs for setCaretLine/forceToFocus when tab is changed
   // set refs for setCaretLine/forceToFocus when tab is changed
-  crowi.setPageEditor(pageEditor);
+  appContainer.setPageEditor(pageEditor);
 }
 }
 
 
 // render comment form
 // render comment form

+ 8 - 8
src/client/js/components/SavePageControls.jsx

@@ -9,16 +9,18 @@ import SplitButton from 'react-bootstrap/es/SplitButton';
 import MenuItem from 'react-bootstrap/es/MenuItem';
 import MenuItem from 'react-bootstrap/es/MenuItem';
 
 
 import PageContainer from '../services/PageContainer';
 import PageContainer from '../services/PageContainer';
+import AppContainer from '../services/AppContainer';
 
 
 import SlackNotification from './SlackNotification';
 import SlackNotification from './SlackNotification';
 import GrantSelector from './SavePageControls/GrantSelector';
 import GrantSelector from './SavePageControls/GrantSelector';
 
 
+
 class SavePageControls extends React.PureComponent {
 class SavePageControls extends React.PureComponent {
 
 
   constructor(props) {
   constructor(props) {
     super(props);
     super(props);
 
 
-    const config = this.props.crowi.getConfig();
+    const config = this.props.appContainer.getConfig();
     this.hasSlackConfig = config.hasSlackConfig;
     this.hasSlackConfig = config.hasSlackConfig;
     this.isAclEnabled = config.isAclEnabled;
     this.isAclEnabled = config.isAclEnabled;
 
 
@@ -30,7 +32,7 @@ class SavePageControls extends React.PureComponent {
   }
   }
 
 
   submit() {
   submit() {
-    this.props.crowi.setIsDocSaved(true);
+    this.props.appContainer.setIsDocSaved(true);
     this.props.onSubmit();
     this.props.onSubmit();
   }
   }
 
 
@@ -60,7 +62,6 @@ class SavePageControls extends React.PureComponent {
           && (
           && (
           <div className="mr-2">
           <div className="mr-2">
             <GrantSelector
             <GrantSelector
-              crowi={this.props.crowi}
               ref={(elem) => {
               ref={(elem) => {
                   if (this.grantSelector == null) {
                   if (this.grantSelector == null) {
                     this.grantSelector = elem;
                     this.grantSelector = elem;
@@ -99,10 +100,10 @@ class SavePageControlsWrapper extends React.PureComponent {
 
 
   render() {
   render() {
     return (
     return (
-      <Subscribe to={[PageContainer]}>
-        { pageContainer => (
+      <Subscribe to={[AppContainer, PageContainer]}>
+        { (appContainer, pageContainer) => (
           // eslint-disable-next-line arrow-body-style
           // eslint-disable-next-line arrow-body-style
-          <SavePageControls pageContainer={pageContainer} {...this.props} />
+          <SavePageControls appContainer={appContainer} pageContainer={pageContainer} {...this.props} />
         )}
         )}
       </Subscribe>
       </Subscribe>
     );
     );
@@ -112,14 +113,13 @@ class SavePageControlsWrapper extends React.PureComponent {
 
 
 SavePageControls.propTypes = {
 SavePageControls.propTypes = {
   t: PropTypes.func.isRequired, // i18next
   t: PropTypes.func.isRequired, // i18next
-  crowi: PropTypes.object.isRequired,
+  appContainer: PropTypes.instanceOf(AppContainer).isRequired,
   pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
   pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
   onSubmit: PropTypes.func.isRequired,
   onSubmit: PropTypes.func.isRequired,
 };
 };
 
 
 SavePageControlsWrapper.propTypes = {
 SavePageControlsWrapper.propTypes = {
   t: PropTypes.func.isRequired, // i18next
   t: PropTypes.func.isRequired, // i18next
-  crowi: PropTypes.object.isRequired,
   onSubmit: PropTypes.func.isRequired,
   onSubmit: PropTypes.func.isRequired,
 };
 };
 
 

+ 7 - 7
src/client/js/components/SavePageControls/GrantSelector.jsx

@@ -11,6 +11,7 @@ import ListGroupItem from 'react-bootstrap/es/ListGroupItem';
 import Modal from 'react-bootstrap/es/Modal';
 import Modal from 'react-bootstrap/es/Modal';
 
 
 import PageContainer from '../../services/PageContainer';
 import PageContainer from '../../services/PageContainer';
+import AppContainer from '../../services/AppContainer';
 
 
 const SPECIFIED_GROUP_VALUE = 'specifiedGroup';
 const SPECIFIED_GROUP_VALUE = 'specifiedGroup';
 
 
@@ -108,7 +109,7 @@ class GrantSelector extends React.Component {
    * Retrieve user-group-relations data from backend
    * Retrieve user-group-relations data from backend
    */
    */
   retrieveUserGroupRelations() {
   retrieveUserGroupRelations() {
-    this.props.crowi.apiGet('/me/user-group-relations')
+    this.props.appContainer.apiGet('/me/user-group-relations')
       .then((res) => {
       .then((res) => {
         return res.userGroupRelations;
         return res.userGroupRelations;
       })
       })
@@ -240,7 +241,7 @@ class GrantSelector extends React.Component {
       ? (
       ? (
         <div>
         <div>
           <h4>There is no group to which you belong.</h4>
           <h4>There is no group to which you belong.</h4>
-          { this.props.crowi.isAdmin
+          { this.props.appContainer.isAdmin
             && <p><a href="/admin/user-groups"><i className="icon icon-fw icon-login"></i> Manage Groups</a></p>
             && <p><a href="/admin/user-groups"><i className="icon icon-fw icon-login"></i> Manage Groups</a></p>
           }
           }
         </div>
         </div>
@@ -289,10 +290,10 @@ class GrantSelectorWrapper extends React.PureComponent {
 
 
   render() {
   render() {
     return (
     return (
-      <Subscribe to={[PageContainer]}>
-        { pageContainer => (
+      <Subscribe to={[AppContainer, PageContainer]}>
+        { (appContainer, pageContainer) => (
           // eslint-disable-next-line arrow-body-style
           // eslint-disable-next-line arrow-body-style
-          <GrantSelector pageContainer={pageContainer} {...this.props} />
+          <GrantSelector appContainer={appContainer} pageContainer={pageContainer} {...this.props} />
         )}
         )}
       </Subscribe>
       </Subscribe>
     );
     );
@@ -303,12 +304,11 @@ class GrantSelectorWrapper extends React.PureComponent {
 
 
 GrantSelector.propTypes = {
 GrantSelector.propTypes = {
   t: PropTypes.func.isRequired, // i18next
   t: PropTypes.func.isRequired, // i18next
-  crowi: PropTypes.object.isRequired,
+  appContainer: PropTypes.instanceOf(AppContainer).isRequired,
   pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
   pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
 };
 };
 GrantSelectorWrapper.propTypes = {
 GrantSelectorWrapper.propTypes = {
   t: PropTypes.func.isRequired, // i18next
   t: PropTypes.func.isRequired, // i18next
-  crowi: PropTypes.object.isRequired,
 };
 };
 
 
 export default withTranslation(null, { withRef: true })(GrantSelectorWrapper);
 export default withTranslation(null, { withRef: true })(GrantSelectorWrapper);

+ 1 - 1
src/client/js/services/AppContextContainer.js → src/client/js/services/AppContainer.js

@@ -16,7 +16,7 @@ import {
  * Service container related to options for Application
  * Service container related to options for Application
  * @extends {Container} unstated Container
  * @extends {Container} unstated Container
  */
  */
-export default class AppContextContainer extends Container {
+export default class AppContainer extends Container {
 
 
   constructor() {
   constructor() {
     super();
     super();