Ver Fonte

Merge branch 'master' into imprv/gw-4349-me-setting-layout

# Conflicts:
#	src/client/js/components/Me/PersonalSettings.jsx
#	src/server/views/me/index.html
yusuketk há 5 anos atrás
pai
commit
1136585ca8
61 ficheiros alterados com 190 adições e 289 exclusões
  1. 2 2
      bin/github-actions/update-readme.sh
  2. 5 5
      docker/README.md
  3. 3 1
      resource/locales/en_US/translation.json
  4. 3 1
      resource/locales/ja_JP/translation.json
  5. 4 2
      resource/locales/zh_CN/translation.json
  6. 10 2
      src/client/js/components/Hotkeys/Subscribers/EditPage.jsx
  7. 5 0
      src/client/js/components/Icons/LooockIcon.jsx
  8. 5 0
      src/client/js/components/Icons/PaperPlaneIcon.jsx
  9. 5 0
      src/client/js/components/Icons/ShareAltIcon.jsx
  10. 5 0
      src/client/js/components/Icons/UserIcon.jsx
  11. 1 1
      src/client/js/components/LikeButton.jsx
  12. 8 19
      src/client/js/components/Me/PersonalSettings.jsx
  13. 4 4
      src/client/js/components/MyDraftList/Draft.jsx
  14. 2 3
      src/client/js/components/MyDraftList/MyDraftList.jsx
  15. 3 3
      src/client/js/components/Navbar/GrowiSubNavigation.jsx
  16. 1 1
      src/client/js/components/Page.jsx
  17. 6 4
      src/client/js/components/PageAccessoriesModalControl.jsx
  18. 1 1
      src/client/js/components/PageComments.jsx
  19. 1 1
      src/client/js/components/PageContentFooter.jsx
  20. 21 9
      src/client/js/components/TableOfContents.jsx
  21. 1 1
      src/client/js/components/User/UserInfo.jsx
  22. 3 1
      src/client/js/services/PageContainer.js
  23. 0 10
      src/client/styles/scss/_layout.scss
  24. 1 2
      src/client/styles/scss/_page-accessories-control.scss
  25. 1 26
      src/client/styles/scss/_page.scss
  26. 0 10
      src/client/styles/scss/_page_list.scss
  27. 10 0
      src/client/styles/scss/_user.scss
  28. 0 6
      src/client/styles/scss/_user_growi.scss
  29. 1 1
      src/client/styles/scss/atoms/_buttons.scss
  30. 0 1
      src/client/styles/scss/style-app.scss
  31. 2 15
      src/client/styles/scss/theme/_apply-colors-dark.scss
  32. 2 15
      src/client/styles/scss/theme/_apply-colors-light.scss
  33. 1 1
      src/client/styles/scss/theme/_apply-colors.scss
  34. 4 0
      src/client/styles/scss/theme/spring.scss
  35. 0 3
      src/server/views/admin/app.html
  36. 0 2
      src/server/views/admin/customize.html
  37. 0 3
      src/server/views/admin/export.html
  38. 0 5
      src/server/views/admin/external-accounts.html
  39. 0 3
      src/server/views/admin/global-notification-detail.html
  40. 0 3
      src/server/views/admin/importer.html
  41. 0 3
      src/server/views/admin/index.html
  42. 0 10
      src/server/views/admin/markdown.html
  43. 0 3
      src/server/views/admin/notification.html
  44. 0 3
      src/server/views/admin/search.html
  45. 0 3
      src/server/views/admin/security.html
  46. 0 3
      src/server/views/admin/user-group-detail.html
  47. 0 5
      src/server/views/admin/user-groups.html
  48. 0 5
      src/server/views/admin/users.html
  49. 25 19
      src/server/views/layout-growi/base/layout.html
  50. 1 5
      src/server/views/layout-growi/forbidden.html
  51. 1 5
      src/server/views/layout-growi/not_creatable.html
  52. 1 5
      src/server/views/layout-growi/not_found.html
  53. 1 3
      src/server/views/layout-growi/page.html
  54. 3 1
      src/server/views/layout-growi/page_list.html
  55. 4 11
      src/server/views/layout-growi/user_page.html
  56. 1 4
      src/server/views/layout/admin.html
  57. 15 12
      src/server/views/me/drafts.html
  58. 15 12
      src/server/views/me/index.html
  59. 0 3
      src/server/views/search.html
  60. 0 3
      src/server/views/tags.html
  61. 2 4
      src/server/views/widget/page_content.html

+ 2 - 2
bin/github-actions/update-readme.sh

@@ -2,5 +2,5 @@
 
 
 cd docker
 cd docker
 
 
-sed -i -e "s/^\([*] \[\`\)[^\`]\+\(\`, \`4\.1\`, .\+\]\)\(.\+\/blob\/v\).\+\(\/docker\/Dockerfile.\+\)$/\1${RELEASE_VERSION}\2\3${RELEASE_VERSION}\4/" README.md
-sed -i -e "s/^\([*] \[\`\)[^\`]\+\(\`, \`4\.1-nocdn\`, .\+\]\)\(.\+\/blob\/v\).\+\(\/docker\/Dockerfile.\+\)$/\1${RELEASE_VERSION}-nocdn\2\3${RELEASE_VERSION}\4/" README.md
+sed -i -e "s/^\([*] \[\`\)[^\`]\+\(\`, \`4\.2\`, .\+\]\)\(.\+\/blob\/v\).\+\(\/docker\/Dockerfile.\+\)$/\1${RELEASE_VERSION}\2\3${RELEASE_VERSION}\4/" README.md
+sed -i -e "s/^\([*] \[\`\)[^\`]\+\(\`, \`4\.2-nocdn\`, .\+\]\)\(.\+\/blob\/v\).\+\(\/docker\/Dockerfile.\+\)$/\1${RELEASE_VERSION}-nocdn\2\3${RELEASE_VERSION}\4/" README.md

+ 5 - 5
docker/README.md

@@ -10,10 +10,10 @@ GROWI Official docker image
 Supported tags and respective Dockerfile links
 Supported tags and respective Dockerfile links
 ------------------------------------------------
 ------------------------------------------------
 
 
-* [`4.1.0`, `4.1`, `4`, `latest` (Dockerfile)](https://github.com/weseek/growi/blob/v4.1.0/docker/Dockerfile)
-* [`4.1.0-nocdn`, `4.1-nocdn`, `4-nocdn`, `latest-nocdn` (Dockerfile)](https://github.com/weseek/growi/blob/v4.1.0/docker/Dockerfile)
-* [`4.0.11`, `4.0`(Dockerfile)](https://github.com/weseek/growi/blob/v4.0.11/docker/Dockerfile)
-* [`4.0.11-nocdn`, `4.0-nocdn` (Dockerfile)](https://github.com/weseek/growi/blob/v4.0.11/docker/Dockerfile)
+* [`4.2.0`, `4.2`, `4`, `latest` (Dockerfile)](https://github.com/weseek/growi/blob/v4.2.0/docker/Dockerfile)
+* [`4.2.0-nocdn`, `4.2-nocdn`, `4-nocdn`, `latest-nocdn` (Dockerfile)](https://github.com/weseek/growi/blob/v4.2.0/docker/Dockerfile)
+* [`4.1.10`, `4.1` (Dockerfile)](https://github.com/weseek/growi/blob/v4.1.10/docker/Dockerfile)
+* [`4.1.10-nocdn`, `4.1-nocdn` (Dockerfile)](https://github.com/weseek/growi/blob/v4.1.10/docker/Dockerfile)
 * [`3.8.0`, `3.8`, `3` (Dockerfile)](https://github.com/weseek/growi/blob/v3.8.0/docker/Dockerfile)
 * [`3.8.0`, `3.8`, `3` (Dockerfile)](https://github.com/weseek/growi/blob/v3.8.0/docker/Dockerfile)
 * [`3.8.0-nocdn`, `3.8-nocdn`, `3-nocdn` (Dockerfile)](https://github.com/weseek/growi/blob/v3.8.0/docker/Dockerfile)
 * [`3.8.0-nocdn`, `3.8-nocdn`, `3-nocdn` (Dockerfile)](https://github.com/weseek/growi/blob/v3.8.0/docker/Dockerfile)
 
 
@@ -39,7 +39,7 @@ The GROWI official docker image for production use which concludes several offic
 Requirements
 Requirements
 -------------
 -------------
 
 
-* MongoDB (>= 3.6)
+* MongoDB (>= 4.4)
 
 
 ### Optional Dependencies
 ### Optional Dependencies
 
 

+ 3 - 1
resource/locales/en_US/translation.json

@@ -99,7 +99,6 @@
   "Input page name (optional)": "Input page name (optional)",
   "Input page name (optional)": "Input page name (optional)",
   "New Page": "New page",
   "New Page": "New page",
   "Create under": "Create page under below:",
   "Create under": "Create page under below:",
-  "Table of Contents": "Table of Contents",
   "Wiki Management Home Page": "Wiki Management Home Page",
   "Wiki Management Home Page": "Wiki Management Home Page",
   "App Settings": "App Settings",
   "App Settings": "App Settings",
   "Site URL settings": "Site URL settings",
   "Site URL settings": "Site URL settings",
@@ -295,6 +294,9 @@
       "no_deadline":"This page has no expiration date"
       "no_deadline":"This page has no expiration date"
     }
     }
   },
   },
+  "page_table_of_contents": {
+    "empty": "Table of Contents is empty"
+  },
   "page_edit": {
   "page_edit": {
     "Show active line": "Show active line",
     "Show active line": "Show active line",
     "overwrite_scopes": "{{operation}} and Overwrite scopes of all descendants",
     "overwrite_scopes": "{{operation}} and Overwrite scopes of all descendants",

+ 3 - 1
resource/locales/ja_JP/translation.json

@@ -100,7 +100,6 @@
   "Input page name (optional)": "ページ名を入力(空欄OK)",
   "Input page name (optional)": "ページ名を入力(空欄OK)",
   "New Page": "新規ページ",
   "New Page": "新規ページ",
   "Create under": "ページを以下に作成",
   "Create under": "ページを以下に作成",
-  "Table of Contents": "目次",
   "Wiki Management Home Page": "Wiki管理トップ",
   "Wiki Management Home Page": "Wiki管理トップ",
   "App Settings": "アプリ設定",
   "App Settings": "アプリ設定",
   "Site URL settings": "サイトURL設定",
   "Site URL settings": "サイトURL設定",
@@ -297,6 +296,9 @@
       "no_deadline": "このページに有効期限は設定されていません。"
       "no_deadline": "このページに有効期限は設定されていません。"
     }
     }
   },
   },
+  "page_table_of_contents": {
+    "empty": "目次は空です"
+  },
   "page_edit": {
   "page_edit": {
     "Show active line": "アクティブ行をハイライト",
     "Show active line": "アクティブ行をハイライト",
     "overwrite_scopes": "{{operation}}と同時に全ての配下ページのスコープを上書き",
     "overwrite_scopes": "{{operation}}と同時に全ての配下ページのスコープを上書き",

+ 4 - 2
resource/locales/zh_CN/translation.json

@@ -108,7 +108,6 @@
 	"Input page name (optional)": "Input page name (optional)",
 	"Input page name (optional)": "Input page name (optional)",
 	"New Page": "新页面",
 	"New Page": "新页面",
 	"Create under": "Create page under below:",
 	"Create under": "Create page under below:",
-	"Table of Contents": "Table of Contents",
 	"Wiki Management Home Page": "Wiki管理首页",
 	"Wiki Management Home Page": "Wiki管理首页",
 	"App Settings": "系统设置",
 	"App Settings": "系统设置",
 	"Site URL settings": "主页URL设置",
 	"Site URL settings": "主页URL设置",
@@ -282,7 +281,10 @@
 		"notice": {
 		"notice": {
 			"conflict": "无法保存您所做的更改,因为其他人正在编辑此页。请在重新加载页面后重新编辑受影响的部分。"
 			"conflict": "无法保存您所做的更改,因为其他人正在编辑此页。请在重新加载页面后重新编辑受影响的部分。"
 		}
 		}
-	},
+  },
+  "page_table_of_contents": {
+    "empty": "目录为空"
+  },
   "page_comment": {
   "page_comment": {
     "display_the_page_when_posting_this_comment": "Display the page when posting this comment"
     "display_the_page_when_posting_this_comment": "Display the page when posting this comment"
   },
   },

+ 10 - 2
src/client/js/components/Hotkeys/Subscribers/EditPage.jsx

@@ -1,6 +1,9 @@
 import React, { useEffect } from 'react';
 import React, { useEffect } from 'react';
 import PropTypes from 'prop-types';
 import PropTypes from 'prop-types';
 
 
+import NavigationContainer from '../../../services/NavigationContainer';
+import { withUnstatedContainers } from '../../UnstatedUtils';
+
 const EditPage = (props) => {
 const EditPage = (props) => {
 
 
   // setup effect
   // setup effect
@@ -10,6 +13,8 @@ const EditPage = (props) => {
       return;
       return;
     }
     }
 
 
+    props.navigationContainer.setEditorMode('edit');
+
     // remove this
     // remove this
     props.onDeleteRender(this);
     props.onDeleteRender(this);
   }, [props]);
   }, [props]);
@@ -18,11 +23,14 @@ const EditPage = (props) => {
 };
 };
 
 
 EditPage.propTypes = {
 EditPage.propTypes = {
+  navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired,
   onDeleteRender: PropTypes.func.isRequired,
   onDeleteRender: PropTypes.func.isRequired,
 };
 };
 
 
-EditPage.getHotkeyStrokes = () => {
+const EditPageWrapper = withUnstatedContainers(EditPage, [NavigationContainer]);
+
+EditPageWrapper.getHotkeyStrokes = () => {
   return [['e']];
   return [['e']];
 };
 };
 
 
-export default EditPage;
+export default EditPageWrapper;

+ 5 - 0
src/client/js/components/Icons/LooockIcon.jsx

@@ -0,0 +1,5 @@
+import React from 'react';
+
+const LockIcon = () => <i className="icon-fw icon-lock"></i>;
+
+export default LockIcon;

+ 5 - 0
src/client/js/components/Icons/PaperPlaneIcon.jsx

@@ -0,0 +1,5 @@
+import React from 'react';
+
+const PaperPlaneIcon = () => <i className="icon-fw icon-paper-plane"></i>;
+
+export default PaperPlaneIcon;

+ 5 - 0
src/client/js/components/Icons/ShareAltIcon.jsx

@@ -0,0 +1,5 @@
+import React from 'react';
+
+const ShareAltIcon = () => <i className="icon-fw icon-share-alt"></i>;
+
+export default ShareAltIcon;

+ 5 - 0
src/client/js/components/Icons/UserIcon.jsx

@@ -0,0 +1,5 @@
+import React from 'react';
+
+const UserIcon = () => <i className="icon-fw icon-user"></i>;
+
+export default UserIcon;

+ 1 - 1
src/client/js/components/LikeButton.jsx

@@ -39,7 +39,7 @@ class LikeButton extends React.Component {
       <button
       <button
         type="button"
         type="button"
         onClick={this.handleClick}
         onClick={this.handleClick}
-        className={`btn btn-like border-0 d-edit-none
+        className={`btn btn-like border-0
         ${pageContainer.state.isLiked ? 'active' : ''}`}
         ${pageContainer.state.isLiked ? 'active' : ''}`}
       >
       >
         <i className="icon-like mr-3"></i>
         <i className="icon-like mr-3"></i>

+ 8 - 19
src/client/js/components/Me/PersonalSettings.jsx

@@ -8,27 +8,16 @@ import PasswordSettings from './PasswordSettings';
 import ExternalAccountLinkedMe from './ExternalAccountLinkedMe';
 import ExternalAccountLinkedMe from './ExternalAccountLinkedMe';
 import ApiSettings from './ApiSettings';
 import ApiSettings from './ApiSettings';
 
 
+import UserIcon from '../Icons/UserIcon';
+import ShareAltIcon from '../Icons/ShareAltIcon';
+import LockIcon from '../Icons/LooockIcon';
+import PaperPlaneIcon from '../Icons/PaperPlaneIcon';
+
 class PersonalSettings extends React.Component {
 class PersonalSettings extends React.Component {
 
 
   render() {
   render() {
     const { t } = this.props;
     const { t } = this.props;
 
 
-    const UserIcon = () => {
-      return <i className="icon-fw icon-user"></i>;
-    };
-
-    const shereAltIcon = () => {
-      return <i className="icon-fw icon-share-alt"></i>;
-    };
-
-    const lockIcon = () => {
-      return <i className="icon-fw icon-lock"></i>;
-    };
-
-    const paperPlaneIcon = () => {
-      return <i className="icon-fw icon-paper-plane"></i>;
-    };
-
     const navTabMapping = {
     const navTabMapping = {
       user_infomation: {
       user_infomation: {
         Icon: UserIcon,
         Icon: UserIcon,
@@ -37,19 +26,19 @@ class PersonalSettings extends React.Component {
         index: 0,
         index: 0,
       },
       },
       external_accounts: {
       external_accounts: {
-        Icon: shereAltIcon,
+        Icon: ShareAltIcon,
         Content: ExternalAccountLinkedMe,
         Content: ExternalAccountLinkedMe,
         i18n: t('admin:user_management.external_accounts'),
         i18n: t('admin:user_management.external_accounts'),
         index: 1,
         index: 1,
       },
       },
       password_settings: {
       password_settings: {
-        Icon: lockIcon,
+        Icon: LockIcon,
         Content: PasswordSettings,
         Content: PasswordSettings,
         i18n: t('Password Settings'),
         i18n: t('Password Settings'),
         index: 2,
         index: 2,
       },
       },
       api_settings: {
       api_settings: {
-        Icon: paperPlaneIcon,
+        Icon: PaperPlaneIcon,
         Content: ApiSettings,
         Content: ApiSettings,
         i18n: t('API Settings'),
         i18n: t('API Settings'),
         index: 3,
         index: 3,

+ 4 - 4
src/client/js/components/MyDraftList/Draft.jsx

@@ -105,10 +105,9 @@ class Draft extends React.Component {
   }
   }
 
 
   renderControls() {
   renderControls() {
-    const { t, path } = this.props;
+    const { t, path, index } = this.props;
 
 
-    const encodedPath = path.replace(/\//g, '-');
-    const tooltipTargetId = `draft-copied-tooltip_${encodedPath}`;
+    const tooltipTargetId = `draft-copied-tooltip_${index}`;
 
 
     return (
     return (
       <div className="icon-container">
       <div className="icon-container">
@@ -116,7 +115,7 @@ class Draft extends React.Component {
           ? null
           ? null
           : (
           : (
             <a
             <a
-              href={`${this.props.path}#edit`}
+              href={`${path}#edit`}
               target="_blank"
               target="_blank"
               rel="noopener noreferrer"
               rel="noopener noreferrer"
               data-toggle="tooltip"
               data-toggle="tooltip"
@@ -203,6 +202,7 @@ Draft.propTypes = {
   t: PropTypes.func.isRequired,
   t: PropTypes.func.isRequired,
   appContainer: PropTypes.instanceOf(AppContainer).isRequired,
   appContainer: PropTypes.instanceOf(AppContainer).isRequired,
 
 
+  index: PropTypes.number.isRequired,
   path: PropTypes.string.isRequired,
   path: PropTypes.string.isRequired,
   markdown: PropTypes.string.isRequired,
   markdown: PropTypes.string.isRequired,
   isExist: PropTypes.bool.isRequired,
   isExist: PropTypes.bool.isRequired,

+ 2 - 3
src/client/js/components/MyDraftList/MyDraftList.jsx

@@ -91,9 +91,10 @@ class MyDraftList extends React.Component {
    *
    *
    */
    */
   generateDraftList(drafts) {
   generateDraftList(drafts) {
-    return drafts.map((draft) => {
+    return drafts.map((draft, index) => {
       return (
       return (
         <Draft
         <Draft
+          index={index}
           key={draft.path}
           key={draft.path}
           path={draft.path}
           path={draft.path}
           markdown={draft.markdown}
           markdown={draft.markdown}
@@ -135,8 +136,6 @@ class MyDraftList extends React.Component {
 
 
     return (
     return (
       <div className="page-list-container-create ">
       <div className="page-list-container-create ">
-        <h1>My Drafts</h1>
-        <hr />
         { totalCount === 0
         { totalCount === 0
           && <span className="mt-2">No drafts yet.</span>
           && <span className="mt-2">No drafts yet.</span>
         }
         }

+ 3 - 3
src/client/js/components/Navbar/GrowiSubNavigation.jsx

@@ -71,7 +71,7 @@ const PagePathNav = ({ pageId, pagePath, isPageForbidden }) => {
 const PageReactionButtons = ({ appContainer, pageContainer }) => {
 const PageReactionButtons = ({ appContainer, pageContainer }) => {
 
 
   const {
   const {
-    pageId, isLiked, pageUser, shareLinkId,
+    pageUser, shareLinkId,
   } = pageContainer.state;
   } = pageContainer.state;
 
 
   const isSharedPage = useMemo(() => {
   const isSharedPage = useMemo(() => {
@@ -82,11 +82,11 @@ const PageReactionButtons = ({ appContainer, pageContainer }) => {
     <>
     <>
       {pageUser == null && !isSharedPage && (
       {pageUser == null && !isSharedPage && (
       <span className="mr-2">
       <span className="mr-2">
-        <LikeButton pageId={pageId} isLiked={isLiked} />
+        <LikeButton />
       </span>
       </span>
       )}
       )}
       <span>
       <span>
-        <BookmarkButton pageId={pageId} crowi={appContainer} />
+        <BookmarkButton crowi={appContainer} />
       </span>
       </span>
     </>
     </>
   );
   );

+ 1 - 1
src/client/js/components/Page.jsx

@@ -134,7 +134,7 @@ class Page extends React.Component {
     const { markdown } = pageContainer.state;
     const { markdown } = pageContainer.state;
 
 
     return (
     return (
-      <div className={`${isMobile && 'page-mobile'}`}>
+      <div className={`mb-5 ${isMobile ? 'page-mobile' : ''}`}>
         <RevisionRenderer growiRenderer={this.growiRenderer} markdown={markdown} />
         <RevisionRenderer growiRenderer={this.growiRenderer} markdown={markdown} />
 
 
         { isLoggedIn && (
         { isLoggedIn && (

+ 6 - 4
src/client/js/components/PageAccessoriesModalControl.jsx

@@ -19,7 +19,8 @@ const PageAccessoriesModalControl = (props) => {
   const { t, pageAccessoriesContainer, isGuestUserMode } = props;
   const { t, pageAccessoriesContainer, isGuestUserMode } = props;
 
 
   return (
   return (
-    <div className="grw-page-accessories-control d-flex align-items-center pb-1">
+    <div className="grw-page-accessories-control d-flex align-items-center justify-content-between pb-1">
+
       <button
       <button
         type="button"
         type="button"
         className="btn btn-link grw-btn-page-accessories"
         className="btn btn-link grw-btn-page-accessories"
@@ -67,9 +68,10 @@ const PageAccessoriesModalControl = (props) => {
         </UncontrolledTooltip>
         </UncontrolledTooltip>
       )}
       )}
 
 
-      <span className="border-left grw-border-vr mx-1">&nbsp;</span>
-
-      <SeenUserInfo />
+      <div className="d-flex align-items-center">
+        <span className="border-left grw-border-vr">&nbsp;</span>
+        <SeenUserInfo />
+      </div>
     </div>
     </div>
   );
   );
 };
 };

+ 1 - 1
src/client/js/components/PageComments.jsx

@@ -148,7 +148,7 @@ class PageComments extends React.Component {
     }
     }
 
 
     return (
     return (
-      <div key={commentId} className={`mb-5 ${rootClassNames}`}>
+      <div key={commentId} className={rootClassNames}>
         <Comment
         <Comment
           comment={comment}
           comment={comment}
           deleteBtnClicked={this.confirmToDeleteComment}
           deleteBtnClicked={this.confirmToDeleteComment}

+ 1 - 1
src/client/js/components/PageContentFooter.jsx

@@ -14,7 +14,7 @@ const PageContentFooter = (props) => {
   } = pageContainer.state;
   } = pageContainer.state;
 
 
   return (
   return (
-    <div className="page-content-footer mt-5 py-4 d-edit-none d-print-none">
+    <div className="page-content-footer py-4 d-edit-none d-print-none">
       <div className="container-lg">
       <div className="container-lg">
         <div className="page-meta">
         <div className="page-meta">
           <AuthorInfo user={creator} date={createdAt} mode="create" locate="footer" />
           <AuthorInfo user={creator} date={createdAt} mode="create" locate="footer" />

+ 21 - 9
src/client/js/components/TableOfContents.jsx

@@ -20,7 +20,7 @@ const logger = loggerFactory('growi:TableOfContents');
  */
  */
 const TableOfContents = (props) => {
 const TableOfContents = (props) => {
 
 
-  const { pageContainer, navigationContainer } = props;
+  const { t, pageContainer, navigationContainer } = props;
   const { pageUser } = pageContainer.state;
   const { pageUser } = pageContainer.state;
   const isUserPage = pageUser != null;
   const isUserPage = pageUser != null;
 
 
@@ -59,14 +59,24 @@ const TableOfContents = (props) => {
       stickyElemSelector=".grw-side-contents-sticky-container"
       stickyElemSelector=".grw-side-contents-sticky-container"
       calcViewHeightFunc={calcViewHeight}
       calcViewHeightFunc={calcViewHeight}
     >
     >
-      <div
-        id="revision-toc-content"
-        className="revision-toc-content"
-        // eslint-disable-next-line react/no-danger
-        dangerouslySetInnerHTML={{
-        __html: tocHtml,
-      }}
-      />
+      { tocHtml !== ''
+      ? (
+        <div
+          id="revision-toc-content"
+          className="revision-toc-content mb-3"
+          // eslint-disable-next-line react/no-danger
+          dangerouslySetInnerHTML={{ __html: tocHtml }}
+        />
+      )
+      : (
+        <div
+          id="revision-toc-content"
+          className="revision-toc-content mb-2"
+        >
+          <span className="text-muted">({t('page_table_of_contents.empty')})</span>
+        </div>
+      ) }
+
     </StickyStretchableScroller>
     </StickyStretchableScroller>
   );
   );
 
 
@@ -78,6 +88,8 @@ const TableOfContents = (props) => {
 const TableOfContentsWrapper = withUnstatedContainers(TableOfContents, [PageContainer, NavigationContainer]);
 const TableOfContentsWrapper = withUnstatedContainers(TableOfContents, [PageContainer, NavigationContainer]);
 
 
 TableOfContents.propTypes = {
 TableOfContents.propTypes = {
+  t: PropTypes.func.isRequired, // i18next
+
   pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
   pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
   navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired,
   navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired,
 };
 };

+ 1 - 1
src/client/js/components/User/UserInfo.jsx

@@ -12,7 +12,7 @@ const UserInfo = (props) => {
   }
   }
 
 
   return (
   return (
-    <div className="grw-users-info d-flex align-items-center d-edit-none pb-2 border-bottom">
+    <div className="grw-users-info d-flex align-items-center d-edit-none mb-5 pb-3 border-bottom">
       <UserPicture user={pageUser} />
       <UserPicture user={pageUser} />
 
 
       <div className="users-meta">
       <div className="users-meta">

+ 3 - 1
src/client/js/services/PageContainer.js

@@ -243,6 +243,8 @@ export default class PageContainer extends Container {
       revisionIdHackmdSynced: page.revisionHackmdSynced,
       revisionIdHackmdSynced: page.revisionHackmdSynced,
       hasDraftOnHackmd: page.hasDraftOnHackmd,
       hasDraftOnHackmd: page.hasDraftOnHackmd,
       markdown: page.revision.body,
       markdown: page.revision.body,
+      createdAt: page.createdAt,
+      updatedAt: page.updatedAt,
     };
     };
     if (tags != null) {
     if (tags != null) {
       newState.tags = tags;
       newState.tags = tags;
@@ -252,7 +254,7 @@ export default class PageContainer extends Container {
     // PageEditor component
     // PageEditor component
     const pageEditor = this.appContainer.getComponentInstance('PageEditor');
     const pageEditor = this.appContainer.getComponentInstance('PageEditor');
     if (pageEditor != null) {
     if (pageEditor != null) {
-      if (editorMode !== 'builtin') {
+      if (editorMode !== 'edit') {
         pageEditor.updateEditorValue(newState.markdown);
         pageEditor.updateEditorValue(newState.markdown);
       }
       }
     }
     }

+ 0 - 10
src/client/styles/scss/_layout.scss

@@ -107,16 +107,6 @@ body {
       margin-bottom: 20px;
       margin-bottom: 20px;
       font-size: 0.9em;
       font-size: 0.9em;
       border: solid 1px $gray-400;
       border: solid 1px $gray-400;
-
-      .revision-toc-head {
-        display: inline-block;
-        float: none;
-      }
-
-      .revision-toc-content.collapse {
-        display: block;
-        height: auto;
-      }
     }
     }
 
 
     .meta {
     .meta {

+ 1 - 2
src/client/styles/scss/_page-accessories-control.scss

@@ -4,8 +4,7 @@
   border-bottom: 1px solid transparent;
   border-bottom: 1px solid transparent;
 
 
   .grw-btn-page-accessories {
   .grw-btn-page-accessories {
-    padding: 0.375rem 0.5rem;
-    margin: 0 0.2rem;
+    padding: 0.375rem;
 
 
     svg {
     svg {
       width: 16px;
       width: 16px;

+ 1 - 26
src/client/styles/scss/_page.scss

@@ -1,32 +1,7 @@
 // import diff2html styles
 // import diff2html styles
 @import '~diff2html/bundles/css/diff2html.min.css';
 @import '~diff2html/bundles/css/diff2html.min.css';
 
 
-.main-container {
-  .url-line {
-    font-size: 1rem;
-    color: $gray-400;
-  }
-
-  h1.title {
-    margin-top: 0;
-    margin-bottom: 0;
-
-    .d-flex {
-      flex-wrap: wrap; // for long page path
-    }
-
-    // crowi layout only
-    a.last-path {
-      color: $gray-300;
-
-      &:hover {
-        color: inherit;
-      }
-    }
-  }
-}
-
-.main .content-main .revision-history {
+.revision-history {
   .revision-history-list {
   .revision-history-list {
     .revision-history-outer {
     .revision-history-outer {
       // add border-top except of first element
       // add border-top except of first element

+ 0 - 10
src/client/styles/scss/_page_list.scss

@@ -72,13 +72,3 @@ body .page-list {
     background-color: $gray-300;
     background-color: $gray-300;
   }
   }
 }
 }
-
-.grw-page-list-m {
-  .grw-page-list-title-m {
-    svg {
-      width: 35px;
-      height: 35px;
-      margin-bottom: 6px;
-    }
-  }
-}

+ 10 - 0
src/client/styles/scss/_user.scss

@@ -43,3 +43,13 @@ $easeInOutCubic: cubic-bezier(0.65, 0, 0.35, 1);
     }
     }
   }
   }
 }
 }
+
+.user-page {
+  .grw-user-page-header {
+    svg {
+      width: 35px;
+      height: 35px;
+      margin-bottom: 6px;
+    }
+  }
+}

+ 0 - 6
src/client/styles/scss/_user_growi.scss

@@ -1,6 +0,0 @@
-.growi .user-page {
-  .revision-toc {
-    position: sticky;
-    top: 105px;
-  }
-}

+ 1 - 1
src/client/styles/scss/atoms/_buttons.scss

@@ -1,5 +1,5 @@
 .btn.btn-like {
 .btn.btn-like {
-  @include button-outline-variant($secondary, lighten($info, 15%), rgba(lighten($info, 10%), 0.5), rgba(lighten($info, 10%), 0.5));
+  @include button-outline-variant($secondary, lighten($info, 15%), rgba(lighten($info, 10%), 0.15), rgba(lighten($info, 10%), 0.5));
   &:not(:disabled):not(.disabled):active,
   &:not(:disabled):not(.disabled):active,
   &:not(:disabled):not(.disabled).active {
   &:not(:disabled):not(.disabled).active {
     color: lighten($info, 15%);
     color: lighten($info, 15%);

+ 0 - 1
src/client/styles/scss/style-app.scss

@@ -57,7 +57,6 @@
 @import 'tag';
 @import 'tag';
 @import 'toc';
 @import 'toc';
 @import 'user';
 @import 'user';
-@import 'user_growi';
 @import 'staff_credit';
 @import 'staff_credit';
 @import 'waves';
 @import 'waves';
 @import 'wiki';
 @import 'wiki';

+ 2 - 15
src/client/styles/scss/theme/_apply-colors-dark.scss

@@ -349,10 +349,8 @@ body.on-edit {
   }
   }
 }
 }
 
 
-.growi .main {
-  .page-comments-row {
-    background: $bgcolor-subnav;
-  }
+.page-comments-row {
+  background: $bgcolor-subnav;
 }
 }
 
 
 /*
 /*
@@ -364,14 +362,3 @@ body.on-edit {
     background-color: $bgcolor-tags;
     background-color: $bgcolor-tags;
   }
   }
 }
 }
-
-/*
- * GROWI user page
- */
-.grw-page-list-m {
-  .grw-page-list-title-m {
-    svg {
-      fill: $color-global;
-    }
-  }
-}

+ 2 - 15
src/client/styles/scss/theme/_apply-colors-light.scss

@@ -279,10 +279,8 @@ $table-hover-bg: $bgcolor-table-hover;
   }
   }
 }
 }
 
 
-.growi .main {
-  .page-comments-row {
-    background: $bgcolor-subnav;
-  }
+.page-comments-row {
+  background: $bgcolor-subnav;
 }
 }
 
 
 /*
 /*
@@ -294,14 +292,3 @@ $table-hover-bg: $bgcolor-table-hover;
     background-color: $bgcolor-tags;
     background-color: $bgcolor-tags;
   }
   }
 }
 }
-
-/*
- * GROWI user page
- */
-.grw-page-list-m {
-  .grw-page-list-title-m {
-    svg {
-      fill: $color-global;
-    }
-  }
-}

+ 1 - 1
src/client/styles/scss/theme/_apply-colors.scss

@@ -457,7 +457,7 @@ body.on-edit {
 /*
 /*
  * GROWI comment form
  * GROWI comment form
  */
  */
-.growi .main {
+.page-comments {
   .page-comment .page-comment-main,
   .page-comment .page-comment-main,
   .page-comment-form .comment-form-main {
   .page-comment-form .comment-form-main {
     background-color: $bgcolor-global;
     background-color: $bgcolor-global;

+ 4 - 0
src/client/styles/scss/theme/spring.scss

@@ -146,6 +146,10 @@ html[dark] {
   h1,
   h1,
   h2 {
   h2 {
     color: $subthemecolor;
     color: $subthemecolor;
+
+    svg {
+      fill: $subthemecolor;
+    }
   }
   }
 
 
   .nav.nav-tabs {
   .nav.nav-tabs {

+ 0 - 3
src/server/views/admin/app.html

@@ -13,6 +13,3 @@
 {% block content_main %}
 {% block content_main %}
   <div id="admin-app"></div>
   <div id="admin-app"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}

+ 0 - 2
src/server/views/admin/customize.html

@@ -22,5 +22,3 @@
 </div>
 </div>
 <div id="admin-customize" class="admin-customize"></div>
 <div id="admin-customize" class="admin-customize"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %} {% endblock content_footer %}

+ 0 - 3
src/server/views/admin/export.html

@@ -9,6 +9,3 @@
 {% block content_main %}
 {% block content_main %}
 <div id="admin-export-page" class="admin-export"></div>
 <div id="admin-export-page" class="admin-export"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}

+ 0 - 5
src/server/views/admin/external-accounts.html

@@ -9,8 +9,3 @@
 {% block content_main %}
 {% block content_main %}
 <div id="admin-external-account-setting"></div>
 <div id="admin-external-account-setting"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}
-
-

+ 0 - 3
src/server/views/admin/global-notification-detail.html

@@ -10,6 +10,3 @@
 <div id="admin-global-notification-setting"
 <div id="admin-global-notification-setting"
     data-global-notification="{{ globalNotification|json }}"></div>
     data-global-notification="{{ globalNotification|json }}"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}

+ 0 - 3
src/server/views/admin/importer.html

@@ -9,6 +9,3 @@
 {% block content_main %}
 {% block content_main %}
 <div id="admin-importer" class="admin-importer"></div>
 <div id="admin-importer" class="admin-importer"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}

+ 0 - 3
src/server/views/admin/index.html

@@ -9,6 +9,3 @@
 {% block content_main %}
 {% block content_main %}
 <div id="admin-home"></div>
 <div id="admin-home"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}

+ 0 - 10
src/server/views/admin/markdown.html

@@ -9,13 +9,3 @@
 {% block content_main %}
 {% block content_main %}
 <div id="admin-markdown-setting"></div>
 <div id="admin-markdown-setting"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}
-
-
-
-
-
-
-

+ 0 - 3
src/server/views/admin/notification.html

@@ -9,6 +9,3 @@
 {% block content_main %}
 {% block content_main %}
 <div id="admin-notification-setting" class="admin-notification"></div>
 <div id="admin-notification-setting" class="admin-notification"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}

+ 0 - 3
src/server/views/admin/search.html

@@ -9,6 +9,3 @@
 {% block content_main %}
 {% block content_main %}
   <div id ="admin-full-text-search-management"></div>
   <div id ="admin-full-text-search-management"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}

+ 0 - 3
src/server/views/admin/security.html

@@ -9,6 +9,3 @@
 {% block content_main %}
 {% block content_main %}
 <div id="admin-security-setting" class="admin-security"></div>
 <div id="admin-security-setting" class="admin-security"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}

+ 0 - 3
src/server/views/admin/user-group-detail.html

@@ -13,6 +13,3 @@
 >
 >
 </div>
 </div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}

+ 0 - 5
src/server/views/admin/user-groups.html

@@ -9,8 +9,3 @@
 {% block content_main %}
 {% block content_main %}
 <div id ="admin-user-group-page"></div>
 <div id ="admin-user-group-page"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}
-
-

+ 0 - 5
src/server/views/admin/users.html

@@ -9,8 +9,3 @@
 {% block content_main %}
 {% block content_main %}
 <div id ="admin-user-page"></div>
 <div id ="admin-user-page"></div>
 {% endblock content_main %}
 {% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}
-
-

+ 25 - 19
src/server/views/layout-growi/base/layout.html

@@ -7,29 +7,35 @@
 {% endblock %}
 {% endblock %}
 
 
 {% block layout_main %}
 {% block layout_main %}
+<div class="h-100 d-flex flex-column justify-content-between">
 
 
-{% block content_header_wrapper %}
-<header class="py-0">
-  {% block content_header %}
-    <div id="grw-subnav-container"></div>
+  {% block content_header_wrapper %}
+    <header class="py-0">
+      {% block content_header %}
+        <div id="grw-subnav-container"></div>
+      {% endblock %}
+      <div id="grw-subnav-switcher-container" class="d-edit-none"></div>
+      <div id="grw-subnav-sticky-trigger" class="sticky-top"></div>
+      <div id="grw-fav-sticky-trigger" class="sticky-top"></div>
+    </header>
   {% endblock %}
   {% endblock %}
-</header>
-<div id="grw-subnav-switcher-container" class="d-edit-none"></div>
-<div id="grw-subnav-sticky-trigger" class="sticky-top"></div>
-<div id="grw-fav-sticky-trigger" class="sticky-top"></div>
-{% endblock %}
 
 
-<div id="main" class="main {% if page %}{{ css.grant(page) }}{% endif %} {% block main_css_class %}{% endblock %}">
-  {% block content_main_before %}
-  {% endblock %}
+  <div class="flex-grow-1">
+    <div id="main" class="main {% if page %}{{ css.grant(page) }}{% endif %}">
+      {% block content_main_before %}
+      {% endblock %}
 
 
-  {% block content_main %}
-  {% endblock content_main %}
+      {% block content_main %}
+      {% endblock content_main %}
 
 
-  {% block content_main_after %}
-  {% endblock %}
-</div><!-- /.main -->
+      {% block content_main_after %}
+      {% endblock %}
+    </div>
+  </div>
+
+  <footer class="footer">
+    {% block content_footer %}{% endblock %}
+  </footer>
 
 
-<footer class="footer">
-</footer>
+</div>
 {% endblock %} {# layout_main #}
 {% endblock %} {# layout_main #}

+ 1 - 5
src/server/views/layout-growi/forbidden.html

@@ -9,11 +9,7 @@
 
 
 {% block content_main %}
 {% block content_main %}
   <div class="container-lg">
   <div class="container-lg">
-    <div class="row">
-      <div class="col">
-        {% include '../widget/forbidden_content.html' %}
-      </div>
-    </div>
+    {% include '../widget/forbidden_content.html' %}
   </div>
   </div>
 {% endblock %}
 {% endblock %}
 
 

+ 1 - 5
src/server/views/layout-growi/not_creatable.html

@@ -10,11 +10,7 @@
 
 
 {% block content_main %}
 {% block content_main %}
   <div class="container-lg">
   <div class="container-lg">
-    <div class="row">
-      <div class="col">
-        {% include '../widget/not_creatable_content.html' %}
-      </div>
-    </div>
+    {% include '../widget/not_creatable_content.html' %}
   </div>
   </div>
 {% endblock %}
 {% endblock %}
 
 

+ 1 - 5
src/server/views/layout-growi/not_found.html

@@ -10,11 +10,7 @@
 
 
 {% block content_main %}
 {% block content_main %}
   <div class="container-lg">
   <div class="container-lg">
-    <div class="row">
-      <div class="col">
-        {% include '../widget/not_found_content.html' %}
-      </div>
-    </div>
+    {% include '../widget/not_found_content.html' %}
   </div>
   </div>
 {% endblock %}
 {% endblock %}
 
 

+ 1 - 3
src/server/views/layout-growi/page.html

@@ -13,13 +13,11 @@
   </div>
   </div>
 {% endblock %}
 {% endblock %}
 
 
-
-{% block content_main_after %}
+{% block content_footer %}
   {% include 'widget/comments.html' %}
   {% include 'widget/comments.html' %}
   <div id="page-content-footer"></div>
   <div id="page-content-footer"></div>
 {% endblock %}
 {% endblock %}
 
 
-
 {% block body_end %}
 {% block body_end %}
   <div id="presentation-layer" class="fullscreen-layer">
   <div id="presentation-layer" class="fullscreen-layer">
     <div id="presentation-container"></div>
     <div id="presentation-container"></div>

+ 3 - 1
src/server/views/layout-growi/page_list.html

@@ -18,9 +18,11 @@
       <div id="trash-page-list"></div>
       <div id="trash-page-list"></div>
     </div>
     </div>
   {% endif %}
   {% endif %}
-  <div id="page-content-footer"></div>
 {% endblock %}
 {% endblock %}
 
 
+{% block content_footer %}
+  <div id="page-content-footer"></div>
+{% endblock %}
 
 
 {% block body_end %}
 {% block body_end %}
   <div id="presentation-layer" class="fullscreen-layer">
   <div id="presentation-layer" class="fullscreen-layer">

+ 4 - 11
src/server/views/layout-growi/user_page.html

@@ -1,27 +1,21 @@
 {% extends 'page.html' %}
 {% extends 'page.html' %}
 
 
-{% block main_css_class %}
-  {% parent %}
-  user-page
-{% endblock %}
-
 {% block content_main %}
 {% block content_main %}
-  <div class="container-lg">
+  <div class="container-lg user-page">
 
 
     {% include '../widget/page_content.html' %}
     {% include '../widget/page_content.html' %}
 
 
   </div>
   </div>
 {% endblock %}
 {% endblock %}
 
 
-
-{% block content_main_after %}
+{% block content_footer %}
   {% include 'widget/comments.html' %}
   {% include 'widget/comments.html' %}
 
 
   {% if page %}
   {% if page %}
     <div class="container-lg">
     <div class="container-lg">
 
 
       <div class="grw-page-list-m mt-5 pb-5 d-edit-none">
       <div class="grw-page-list-m mt-5 pb-5 d-edit-none">
-        <h2 class="grw-page-list-title-m border-bottom pb-2 mb-3" id="bookmarks-list">
+        <h2 class="grw-user-page-header border-bottom pb-2 mb-3" id="bookmarks-list">
           <i id="user-bookmark-icon"></i>
           <i id="user-bookmark-icon"></i>
           Bookmarks
           Bookmarks
         </h2>
         </h2>
@@ -32,7 +26,7 @@
       </div>
       </div>
 
 
       <div class="grw-page-list-m mt-5 pb-5 d-edit-none">
       <div class="grw-page-list-m mt-5 pb-5 d-edit-none">
-        <h2 class="grw-page-list-title-m border-bottom pb-2 mb-3" id="recently-created-list">
+        <h2 class="grw-user-page-header border-bottom pb-2 mb-3" id="recently-created-list">
           <i id="recent-created-icon"></i>
           <i id="recent-created-icon"></i>
           Recently Created
           Recently Created
         </h2>
         </h2>
@@ -46,5 +40,4 @@
   {% endif %}
   {% endif %}
 
 
   <div id="page-content-footer"></div>
   <div id="page-content-footer"></div>
-
 {% endblock %}
 {% endblock %}

+ 1 - 4
src/server/views/layout/admin.html

@@ -16,7 +16,7 @@
 </header>
 </header>
 {% endblock %}
 {% endblock %}
 
 
-<div id="main" class="main {% block main_css_class %}{% endblock %}">
+<div id="main" class="main">
 
 
   <div class="container-fluid">
   <div class="container-fluid">
     <div class="row">
     <div class="row">
@@ -34,7 +34,4 @@
     </div>
     </div>
   </div>
   </div>
 </div><!-- /.main -->
 </div><!-- /.main -->
-
-<footer class="footer">
-</footer>
 {% endblock %} {# layout_main #}
 {% endblock %} {# layout_main #}

+ 15 - 12
src/server/views/me/drafts.html

@@ -1,18 +1,21 @@
-{% extends '../layout-growi/base/layout.html' %}
+{% extends '../layout/layout.html' %}
 
 
 {% block html_title %}{{ customizeService.generateCustomTitleForFixedPageName(t('My Drafts')) }}{% endblock %}
 {% block html_title %}{{ customizeService.generateCustomTitleForFixedPageName(t('My Drafts')) }}{% endblock %}
 
 
-{% block content_header %}
+{% block layout_main %}
+
+{% block content_header_wrapper %}
+<header class="py-3">
+  <div class="container-fluid">
+    <h1 class="title">{{ t('My Drafts') }}</h1>
+  </div>
+</header>
+<div id="grw-fav-sticky-trigger" class="sticky-top"></div>
 {% endblock %}
 {% endblock %}
 
 
-{% block content_main %}
-<div id="content-main" class="content-main container">
-  <div id="my-drafts"></div>
+<div id="main" class="main">
+  <div id="content-main" class="content-main container-lg">
+    <div id="my-drafts"></div>
+  </div>
 </div>
 </div>
-{% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}
-
-{% block layout_footer %}
-{% endblock layout_footer %}
+{% endblock %}

+ 15 - 12
src/server/views/me/index.html

@@ -1,18 +1,21 @@
-{% extends '../layout-growi/base/layout.html' %}
+{% extends '../layout/layout.html' %}
 
 
 {% block html_title %}{{ customizeService.generateCustomTitleForFixedPageName(t('User Settings')) }}{% endblock %}
 {% block html_title %}{{ customizeService.generateCustomTitleForFixedPageName(t('User Settings')) }}{% endblock %}
 
 
-{% block html_base_css %}user-settings-page{% endblock %}
+{% block layout_main %}
 
 
-{% block content_header %}
+{% block content_header_wrapper %}
+<header class="py-3">
+  <div class="container-fluid">
+    <h1 class="title">{{ t('User Settings') }}</h1>
+  </div>
+</header>
+<div id="grw-fav-sticky-trigger" class="sticky-top"></div>
 {% endblock %}
 {% endblock %}
 
 
-{% block content_main %}
-<div class="content-main container" id="personal-setting"></div>
-{% endblock content_main %}
-
-{% block content_footer %}
-{% endblock content_footer %}
-
-{% block layout_footer %}
-{% endblock layout_footer %}
+<div id="main" class="main">
+  <div id="content-main" class="content-main container-lg">
+    <div class="content-main" id="personal-setting"></div>
+  </div>
+</div>
+{% endblock %}

+ 0 - 3
src/server/views/search.html

@@ -23,7 +23,4 @@
   </div>
   </div>
 
 
 </div><!-- /.container-fluid -->
 </div><!-- /.container-fluid -->
-
-<footer class="footer">
-</footer>
 {% endblock %} {# layout_main #}
 {% endblock %} {# layout_main #}

+ 0 - 3
src/server/views/tags.html

@@ -16,7 +16,4 @@
     </div>
     </div>
   </div>
   </div>
 </div><!-- /.container-fluid -->
 </div><!-- /.container-fluid -->
-
-<footer class="footer">
-</footer>
 {% endblock %} {# layout_main #}
 {% endblock %} {# layout_main #}

+ 2 - 4
src/server/views/widget/page_content.html

@@ -55,12 +55,10 @@
 </div>
 </div>
 
 
 {% if revision %}
 {% if revision %}
-<div class="d-none d-lg-block d-editor-none grw-side-contents-container">
+<div class="d-none d-lg-block d-edit-none grw-side-contents-container">
   <div class="grw-side-contents-sticky-container">
   <div class="grw-side-contents-sticky-container">
     <div id="page-accessories" class="page-accessories"></div>
     <div id="page-accessories" class="page-accessories"></div>
-    <div id="revision-toc" class="revision-toc sps sps--abv" data-sps-offset="123">
-      <div id="revision-toc-content" class="revision-toc-content"></div>
-    </div>
+    <div id="revision-toc" class="revision-toc sps sps--abv" data-sps-offset="123"></div>
     {% if pageUser %}
     {% if pageUser %}
       <div id="grw-user-contents-links"></div>
       <div id="grw-user-contents-links"></div>
     {% endif %}
     {% endif %}