GrowiSubNavigation.jsx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withUnstatedContainers } from '../UnstatedUtils';
  4. import AppContainer from '~/client/services/AppContainer';
  5. import NavigationContainer from '~/client/services/NavigationContainer';
  6. import PageContainer from '~/client/services/PageContainer';
  7. import PagePathNav from './PagePathNav';
  8. import TagLabels from '../Page/TagLabels';
  9. import SubnavButtons from './SubNavButtons';
  10. import PageEditorModeManager from './PageEditorModeManager';
  11. import AuthorInfo from './AuthorInfo';
  12. import DrawerToggler from './DrawerToggler';
  13. const GrowiSubNavigation = (props) => {
  14. const {
  15. appContainer,
  16. navigationContainer,
  17. isCompactMode,
  18. isSearchPageMode,
  19. } = props;
  20. const { isDrawerMode, editorMode, isDeviceSmallerThanMd } = navigationContainer.state;
  21. let {
  22. isPageExist, isAbleToShowTagLabel, isAbleToShowPageEditorModeManager, isAbleToShowPageAuthors,
  23. } = false;
  24. let {
  25. pageId,
  26. path,
  27. } = props;
  28. if (props.pageContainer != null) {
  29. ({
  30. pageId,
  31. path,
  32. } = props.pageContainer.state);
  33. isPageExist = props.pageContainer.isPageExist;
  34. isAbleToShowTagLabel = props.pageContainer.isAbleToShowTagLabel;
  35. isAbleToShowPageEditorModeManager = props.pageContainer.isAbleToShowPageEditorModeManager;
  36. isAbleToShowPageAuthors = props.pageContainer.isAbleToShowPageAuthors;
  37. }
  38. const { isGuestUser } = appContainer;
  39. const isEditorMode = editorMode !== 'view';
  40. // Tags cannot be edited while the new page and editorMode is view
  41. const isTagLabelHidden = (editorMode !== 'edit' && !isPageExist);
  42. function onPageEditorModeButtonClicked(viewType) {
  43. navigationContainer.setEditorMode(viewType);
  44. }
  45. return (
  46. <div className={`grw-subnav container-fluid d-flex align-items-center justify-content-between ${isCompactMode ? 'grw-subnav-compact d-print-none' : ''}`}>
  47. {/* Left side */}
  48. <div className="d-flex grw-subnav-left-side">
  49. { isDrawerMode && (
  50. <div className={`d-none d-md-flex align-items-center ${isEditorMode ? 'mr-2 pr-2' : 'border-right mr-4 pr-4'}`}>
  51. <DrawerToggler />
  52. </div>
  53. ) }
  54. <div className="grw-path-nav-container">
  55. {/* TODO : display tags when this component is used in SearchResultContent too.
  56. For that, refactor TagLabels such that it can be used while not depending on pageContainer
  57. TASK: #80623 https://estoc.weseek.co.jp/redmine/issues/80623
  58. */}
  59. { isAbleToShowTagLabel && !isCompactMode && !isTagLabelHidden && (
  60. <div className="grw-taglabels-container">
  61. <TagLabels editorMode={editorMode} />
  62. </div>
  63. ) }
  64. <PagePathNav pageId={pageId} pagePath={path} isEditorMode={isEditorMode} isCompactMode={isCompactMode} />
  65. </div>
  66. </div>
  67. {/* Right side */}
  68. <div className="d-flex">
  69. <div className="d-flex flex-column align-items-end">
  70. <div className="d-flex">
  71. <SubnavButtons isCompactMode={isCompactMode} />
  72. {/* TODO: refactor SubNavButtons in a way that it can be used independently from pageContainer
  73. TASK : #80481 https://estoc.weseek.co.jp/redmine/issues/80481
  74. */}
  75. </div>
  76. <div className="mt-2">
  77. {isAbleToShowPageEditorModeManager && !isSearchPageMode && (
  78. <PageEditorModeManager
  79. onPageEditorModeButtonClicked={onPageEditorModeButtonClicked}
  80. isBtnDisabled={isGuestUser}
  81. editorMode={editorMode}
  82. isDeviceSmallerThanMd={isDeviceSmallerThanMd}
  83. />
  84. )}
  85. </div>
  86. </div>
  87. {/* Page Authors */}
  88. { (isAbleToShowPageAuthors && !isCompactMode && isSearchPageMode) && (
  89. <ul className="authors text-nowrap border-left d-none d-lg-block d-edit-none py-2 pl-4 mb-0 ml-3">
  90. <li className="pb-1">
  91. <AuthorInfo user={props.pageContainer.state.creator} date={props.pageContainer.state.createdAt} locate="subnav" />
  92. </li>
  93. <li className="mt-1 pt-1 border-top">
  94. <AuthorInfo user={props.pageContainer.state.revisionAuthor} date={props.pageContainer.updatedAt} mode="update" locate="subnav" />
  95. </li>
  96. </ul>
  97. )}
  98. </div>
  99. </div>
  100. );
  101. };
  102. GrowiSubNavigation.propTypes = {
  103. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  104. navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired,
  105. pageContainer: PropTypes.instanceOf(PageContainer),
  106. isCompactMode: PropTypes.bool,
  107. // Props for searchResultContent
  108. pageId: PropTypes.string,
  109. path: PropTypes.string,
  110. isSearchPageMode: PropTypes.bool,
  111. };
  112. const GrowiSubNavigationWrapper = (props) => {
  113. let GrowiSubNavigationUnstatedWrapper = <></>;
  114. if (props.isSearchPageMode) {
  115. GrowiSubNavigationUnstatedWrapper = withUnstatedContainers(GrowiSubNavigation, [AppContainer, NavigationContainer]);
  116. return <GrowiSubNavigationUnstatedWrapper isSearchPageMode pageId={props.pageId} path={props.path}></GrowiSubNavigationUnstatedWrapper>;
  117. }
  118. GrowiSubNavigationUnstatedWrapper = withUnstatedContainers(GrowiSubNavigation, [AppContainer, NavigationContainer, PageContainer]);
  119. return <GrowiSubNavigationUnstatedWrapper></GrowiSubNavigationUnstatedWrapper>;
  120. };
  121. GrowiSubNavigationWrapper.propTypes = {
  122. isSearchPageMode: PropTypes.bool,
  123. pageId: PropTypes.string,
  124. path: PropTypes.string,
  125. };
  126. export default GrowiSubNavigationWrapper;