Przeglądaj źródła

Merge pull request #1912 from weseek/support/apply-bootstrap4

Support/apply bootstrap4
Yuki Takei 6 lat temu
rodzic
commit
c2c2684140
42 zmienionych plików z 254 dodań i 95 usunięć
  1. 1 1
      src/client/js/components/Admin/ExportArchiveData/ArchiveFilesTableMenu.jsx
  2. 3 3
      src/client/js/components/Admin/ExportArchiveData/SelectCollectionsModal.jsx
  3. 1 1
      src/client/js/components/Admin/ExportArchiveDataPage.jsx
  4. 1 1
      src/client/js/components/Admin/ImportData/GrowiArchive/ImportCollectionConfigurationModal.jsx
  5. 1 1
      src/client/js/components/Admin/ImportData/GrowiArchive/ImportCollectionItem.jsx
  6. 3 3
      src/client/js/components/Admin/ImportData/GrowiArchive/ImportForm.jsx
  7. 2 2
      src/client/js/components/Admin/ImportDataPage.jsx
  8. 1 1
      src/client/js/components/Admin/ManageExternalAccount.jsx
  9. 1 1
      src/client/js/components/Admin/Notification/GlobalNotification.jsx
  10. 1 1
      src/client/js/components/Admin/Notification/GlobalNotificationList.jsx
  11. 1 1
      src/client/js/components/Admin/Notification/UserNotificationRow.jsx
  12. 1 1
      src/client/js/components/Admin/Security/LdapAuthTest.jsx
  13. 7 2
      src/client/js/components/Admin/Security/LdapSecuritySetting.jsx
  14. 1 1
      src/client/js/components/Admin/Security/LocalSecuritySetting.jsx
  15. 2 2
      src/client/js/components/Admin/Security/SecuritySetting.jsx
  16. 1 1
      src/client/js/components/Admin/UserGroup/UserGroupCreateForm.jsx
  17. 1 1
      src/client/js/components/Admin/UserGroup/UserGroupTable.jsx
  18. 1 1
      src/client/js/components/Admin/UserGroupDetail/UserGroupDetailPage.jsx
  19. 2 2
      src/client/js/components/Admin/UserGroupDetail/UserGroupUserTable.jsx
  20. 1 1
      src/client/js/components/Admin/Users/ExternalAccountTable.jsx
  21. 1 1
      src/client/js/components/Admin/Users/InviteUserControl.jsx
  22. 1 1
      src/client/js/components/Admin/Users/UserMenu.jsx
  23. 31 39
      src/client/js/components/BookmarkButton.jsx
  24. 1 1
      src/client/js/components/Me/DisassociateModal.jsx
  25. 1 1
      src/client/js/components/Me/ExternalAccountLinkedMe.jsx
  26. 1 1
      src/client/js/components/Me/ExternalAccountRow.jsx
  27. 1 1
      src/client/js/components/MyDraftList/MyDraftList.jsx
  28. 1 1
      src/client/js/components/Navbar/GrowiSubNavigationForUserPage.jsx
  29. 1 1
      src/client/js/components/Page/RevisionPath.jsx
  30. 2 2
      src/client/js/components/PageEditor/Editor.jsx
  31. 2 2
      src/client/js/components/PageEditor/OptionsSelector.jsx
  32. 1 1
      src/client/js/components/PageEditorByHackmd.jsx
  33. 1 1
      src/client/js/components/SearchPage/SearchPageForm.jsx
  34. 2 2
      src/client/js/components/SearchPage/SearchResult.jsx
  35. 3 1
      src/client/styles/scss/_comment_growi.scss
  36. 1 0
      src/client/styles/scss/_layout_kibela.scss
  37. 157 0
      src/server/routes/apiv3/bookmarks.js
  38. 2 0
      src/server/routes/apiv3/index.js
  39. 1 1
      src/server/views/layout-kibela/base/layout.html
  40. 2 2
      src/server/views/modal/create_template.html
  41. 2 2
      src/server/views/widget/page_alerts.html
  42. 6 6
      src/server/views/widget/page_tabs.html

+ 1 - 1
src/client/js/components/Admin/ExportArchiveData/ArchiveFilesTableMenu.jsx

@@ -13,7 +13,7 @@ class ArchiveFilesTableMenu extends React.Component {
 
 
     return (
     return (
       <div className="btn-group admin-user-menu">
       <div className="btn-group admin-user-menu">
-        <button type="button" className="btn btn-sm btn-light dropdown-toggle" data-toggle="dropdown">
+        <button type="button" className="btn btn-sm btn-outline-secondary dropdown-toggle" data-toggle="dropdown">
           <i className="icon-settings"></i> <span className="caret"></span>
           <i className="icon-settings"></i> <span className="caret"></span>
         </button>
         </button>
         <ul className="dropdown-menu" role="menu">
         <ul className="dropdown-menu" role="menu">

+ 3 - 3
src/client/js/components/Admin/ExportArchiveData/SelectCollectionsModal.jsx

@@ -183,10 +183,10 @@ class SelectCollectionsModal extends React.Component {
           <ModalBody>
           <ModalBody>
             <div className="row">
             <div className="row">
               <div className="col-sm-12">
               <div className="col-sm-12">
-                <button type="button" className="btn btn-sm btn-light mr-2" onClick={this.checkAll}>
+                <button type="button" className="btn btn-sm btn-outline-secondary mr-2" onClick={this.checkAll}>
                   <i className="fa fa-check-square-o"></i> {t('admin:export_management.check_all')}
                   <i className="fa fa-check-square-o"></i> {t('admin:export_management.check_all')}
                 </button>
                 </button>
-                <button type="button" className="btn btn-sm btn-light mr-2" onClick={this.uncheckAll}>
+                <button type="button" className="btn btn-sm btn-outline-secondary mr-2" onClick={this.uncheckAll}>
                   <i className="fa fa-square-o"></i> {t('admin:export_management.uncheck_all')}
                   <i className="fa fa-square-o"></i> {t('admin:export_management.uncheck_all')}
                 </button>
                 </button>
               </div>
               </div>
@@ -219,7 +219,7 @@ class SelectCollectionsModal extends React.Component {
           </ModalBody>
           </ModalBody>
 
 
           <ModalFooter>
           <ModalFooter>
-            <button type="button" className="btn btn-sm btn-light" onClick={this.props.onClose}>{t('export_management.cancel')}</button>
+            <button type="button" className="btn btn-sm btn-outline-secondary" onClick={this.props.onClose}>{t('export_management.cancel')}</button>
             <button type="submit" className="btn btn-sm btn-primary" disabled={!this.validateForm()}>{t('export_management.export')}</button>
             <button type="submit" className="btn btn-sm btn-primary" disabled={!this.validateForm()}>{t('export_management.export')}</button>
           </ModalFooter>
           </ModalFooter>
         </form>
         </form>

+ 1 - 1
src/client/js/components/Admin/ExportArchiveDataPage.jsx

@@ -213,7 +213,7 @@ class ExportArchiveDataPage extends React.Component {
       <Fragment>
       <Fragment>
         <h2>{t('Export Archive Data')}</h2>
         <h2>{t('Export Archive Data')}</h2>
 
 
-        <button type="button" className="btn btn-light" disabled={isExporting} onClick={this.openExportModal}>
+        <button type="button" className="btn btn-outline-secondary" disabled={isExporting} onClick={this.openExportModal}>
           {t('admin:export_management.create_new_archive_data')}
           {t('admin:export_management.create_new_archive_data')}
         </button>
         </button>
 
 

+ 1 - 1
src/client/js/components/Admin/ImportData/GrowiArchive/ImportCollectionConfigurationModal.jsx

@@ -213,7 +213,7 @@ class ImportCollectionConfigurationModal extends React.Component {
         </ModalBody>
         </ModalBody>
 
 
         <ModalFooter>
         <ModalFooter>
-          <button type="button" className="btn btn-sm btn-light" onClick={this.props.onClose}>{t('Cancel')}</button>
+          <button type="button" className="btn btn-sm btn-outline-secondary" onClick={this.props.onClose}>{t('Cancel')}</button>
           <button type="button" className="btn btn-sm btn-primary" onClick={this.updateOption}>{t('Update')}</button>
           <button type="button" className="btn btn-sm btn-primary" onClick={this.updateOption}>{t('Update')}</button>
         </ModalFooter>
         </ModalFooter>
       </Modal>
       </Modal>

+ 1 - 1
src/client/js/components/Admin/ImportData/GrowiArchive/ImportCollectionItem.jsx

@@ -149,7 +149,7 @@ export default class ImportCollectionItem extends React.Component {
     return (
     return (
       <button
       <button
         type="button"
         type="button"
-        className="btn btn-light btn-sm p-1 ml-2"
+        className="btn btn-outline-secondary btn-sm p-1 ml-2"
         disabled={isImporting || !isConfigButtonAvailable}
         disabled={isImporting || !isConfigButtonAvailable}
         onClick={isConfigButtonAvailable ? this.configButtonClickedHandler : null}
         onClick={isConfigButtonAvailable ? this.configButtonClickedHandler : null}
       >
       >

+ 3 - 3
src/client/js/components/Admin/ImportData/GrowiArchive/ImportForm.jsx

@@ -455,12 +455,12 @@ class ImportForm extends React.Component {
       <>
       <>
         <form className="form-inline">
         <form className="form-inline">
           <div className="form-group">
           <div className="form-group">
-            <button type="button" className="btn btn-sm btn-light mr-2" onClick={this.checkAll}>
+            <button type="button" className="btn btn-sm btn-outline-secondary mr-2" onClick={this.checkAll}>
               <i className="fa fa-check-square-o"></i> {t('admin:export_management.check_all')}
               <i className="fa fa-check-square-o"></i> {t('admin:export_management.check_all')}
             </button>
             </button>
           </div>
           </div>
           <div className="form-group">
           <div className="form-group">
-            <button type="button" className="btn btn-sm btn-light mr-2" onClick={this.uncheckAll}>
+            <button type="button" className="btn btn-sm btn-outline-secondary mr-2" onClick={this.uncheckAll}>
               <i className="fa fa-square-o"></i> {t('admin:export_management.uncheck_all')}
               <i className="fa fa-square-o"></i> {t('admin:export_management.uncheck_all')}
             </button>
             </button>
           </div>
           </div>
@@ -472,7 +472,7 @@ class ImportForm extends React.Component {
         {this.renderOthers()}
         {this.renderOthers()}
 
 
         <div className="mt-4 text-center">
         <div className="mt-4 text-center">
-          <button type="button" className="btn btn-light mx-1" onClick={this.props.onDiscard}>
+          <button type="button" className="btn btn-outline-secondary mx-1" onClick={this.props.onDiscard}>
             {t('admin:importer_management.growi_settings.discard')}
             {t('admin:importer_management.growi_settings.discard')}
           </button>
           </button>
           <button type="button" className="btn btn-primary mx-1" onClick={this.import} disabled={!canImport || isImporting}>
           <button type="button" className="btn btn-primary mx-1" onClick={this.import} disabled={!canImport || isImporting}>

+ 2 - 2
src/client/js/components/Admin/ImportDataPage.jsx

@@ -216,7 +216,7 @@ class ImportDataPage extends React.Component {
                     name="Esa"
                     name="Esa"
                     type="button"
                     type="button"
                     id="importFromEsa"
                     id="importFromEsa"
-                    className="btn btn-light btn-esa"
+                    className="btn btn-outline-secondary btn-esa"
                     onClick={this.esaHandleSubmitTest}
                     onClick={this.esaHandleSubmitTest}
                     value={t('admin:importer_management.esa_settings.test_connection')}
                     value={t('admin:importer_management.esa_settings.test_connection')}
                   />
                   />
@@ -309,7 +309,7 @@ class ImportDataPage extends React.Component {
                     name="Qiita"
                     name="Qiita"
                     type="button"
                     type="button"
                     id="importFromQiita"
                     id="importFromQiita"
-                    className="btn btn-light btn-qiita"
+                    className="btn btn-outline-secondary btn-qiita"
                     onClick={this.qiitaHandleSubmitTest}
                     onClick={this.qiitaHandleSubmitTest}
                     value={t('admin:importer_management.qiita_settings.test_connection')}
                     value={t('admin:importer_management.qiita_settings.test_connection')}
                   />
                   />

+ 1 - 1
src/client/js/components/Admin/ManageExternalAccount.jsx

@@ -48,7 +48,7 @@ class ManageExternalAccount extends React.Component {
     return (
     return (
       <Fragment>
       <Fragment>
         <p>
         <p>
-          <a className="btn btn-default" href="/admin/users">
+          <a className="btn btn-outline-secondary" href="/admin/users">
             <i className="icon-fw ti-arrow-left" aria-hidden="true"></i>
             <i className="icon-fw ti-arrow-left" aria-hidden="true"></i>
             {t('admin:user_management.back_to_user_management')}
             {t('admin:user_management.back_to_user_management')}
           </a>
           </a>

+ 1 - 1
src/client/js/components/Admin/Notification/GlobalNotification.jsx

@@ -99,7 +99,7 @@ class GlobalNotification extends React.Component {
 
 
         <h2 className="border-bottom mb-5">{t('notification_setting.notification_list')}
         <h2 className="border-bottom mb-5">{t('notification_setting.notification_list')}
           <a href="/admin/global-notification/new">
           <a href="/admin/global-notification/new">
-            <p className="btn btn-light pull-right">{t('notification_setting.add_notification')}</p>
+            <p className="btn btn-outline-secondary pull-right">{t('notification_setting.add_notification')}</p>
           </a>
           </a>
         </h2>
         </h2>
 
 

+ 1 - 1
src/client/js/components/Admin/Notification/GlobalNotificationList.jsx

@@ -131,7 +131,7 @@ class GlobalNotificationList extends React.Component {
               <td className="td-abs-center">
               <td className="td-abs-center">
                 <div className="dropdown">
                 <div className="dropdown">
                   <button
                   <button
-                    className="btn btn-light dropdown-toggle"
+                    className="btn btn-outline-secondary dropdown-toggle"
                     type="button"
                     type="button"
                     id="dropdownMenuButton"
                     id="dropdownMenuButton"
                     data-toggle="dropdown"
                     data-toggle="dropdown"

+ 1 - 1
src/client/js/components/Admin/Notification/UserNotificationRow.jsx

@@ -22,7 +22,7 @@ class UserNotificationRow extends React.PureComponent {
             {notification.channel}
             {notification.channel}
           </td>
           </td>
           <td>
           <td>
-            <button type="submit" className="btn btn-light" onClick={() => { this.props.onClickDeleteBtn(notification._id) }}>{t('Delete')}</button>
+            <button type="submit" className="btn btn-outline-secondary" onClick={() => { this.props.onClickDeleteBtn(notification._id) }}>{t('Delete')}</button>
           </td>
           </td>
         </tr>
         </tr>
       </React.Fragment>
       </React.Fragment>

+ 1 - 1
src/client/js/components/Admin/Security/LdapAuthTest.jsx

@@ -116,7 +116,7 @@ class LdapAuthTest extends React.Component {
           <textarea id="taLogs" className="col-xs-12" rows="4" value={this.state.logs} readOnly />
           <textarea id="taLogs" className="col-xs-12" rows="4" value={this.state.logs} readOnly />
         </div>
         </div>
 
 
-        <button type="button" className="btn btn-default mt-3 col-xs-offset-5 col-xs-2" onClick={this.testLdapCredentials}>Test</button>
+        <button type="button" className="btn btn-outline-secondary mt-3 col-xs-offset-5 col-xs-2" onClick={this.testLdapCredentials}>Test</button>
 
 
       </React.Fragment>
       </React.Fragment>
 
 

+ 7 - 2
src/client/js/components/Admin/Security/LdapSecuritySetting.jsx

@@ -128,7 +128,7 @@ class LdapSecuritySetting extends React.Component {
               <div className="col-6">
               <div className="col-6">
                 <div className="dropdown">
                 <div className="dropdown">
                   <button
                   <button
-                    className="btn btn-light dropdown-toggle"
+                    className="btn btn-outline-secondary dropdown-toggle"
                     type="button"
                     type="button"
                     id="dropdownMenuButton"
                     id="dropdownMenuButton"
                     data-toggle="dropdown"
                     data-toggle="dropdown"
@@ -425,7 +425,12 @@ class LdapSecuritySetting extends React.Component {
                 >
                 >
                   {t('Update')}
                   {t('Update')}
                 </button>
                 </button>
-                <button type="button" className="btn btn-light ml-2" onClick={this.openLdapAuthTestModal}>{t('security_setting.ldap.test_config')}</button>
+                <button
+                  type="button"
+                  className="btn btn-outline-secondary ml-2"
+                  onClick={this.openLdapAuthTestModal}
+                >{t('security_setting.ldap.test_config')}
+                </button>
               </div>
               </div>
             </div>
             </div>
 
 

+ 1 - 1
src/client/js/components/Admin/Security/LocalSecuritySetting.jsx

@@ -106,7 +106,7 @@ class LocalSecuritySetting extends React.Component {
               <div className="col-6">
               <div className="col-6">
                 <div className="dropdown">
                 <div className="dropdown">
                   <button
                   <button
-                    className="btn btn-light dropdown-toggle"
+                    className="btn btn-outline-secondary dropdown-toggle"
                     type="button"
                     type="button"
                     id="dropdownMenuButton"
                     id="dropdownMenuButton"
                     data-toggle="dropdown"
                     data-toggle="dropdown"

+ 2 - 2
src/client/js/components/Admin/Security/SecuritySetting.jsx

@@ -64,7 +64,7 @@ class SecuritySetting extends React.Component {
           <div className="col-6">
           <div className="col-6">
             <div className="dropdown">
             <div className="dropdown">
               <button
               <button
-                className={`btn btn-light dropdown-toggle ${adminGeneralSecurityContainer.isWikiModeForced && 'disabled'}`}
+                className={`btn btn-outline-secondary dropdown-toggle ${adminGeneralSecurityContainer.isWikiModeForced && 'disabled'}`}
                 type="button"
                 type="button"
                 id="dropdownMenuButton"
                 id="dropdownMenuButton"
                 data-toggle="dropdown"
                 data-toggle="dropdown"
@@ -144,7 +144,7 @@ class SecuritySetting extends React.Component {
           <div className="col-9">
           <div className="col-9">
             <div className="dropdown">
             <div className="dropdown">
               <button
               <button
-                className="btn btn-light dropdown-toggle"
+                className="btn btn-outline-secondary dropdown-toggle"
                 type="button"
                 type="button"
                 id="dropdownMenuButton"
                 id="dropdownMenuButton"
                 data-toggle="dropdown"
                 data-toggle="dropdown"

+ 1 - 1
src/client/js/components/Admin/UserGroup/UserGroupCreateForm.jsx

@@ -70,7 +70,7 @@ class UserGroupCreateForm extends React.Component {
         <p>
         <p>
           {this.props.isAclEnabled
           {this.props.isAclEnabled
             ? (
             ? (
-              <button type="button" data-toggle="collapse" className="btn btn-light" href="#createGroupForm">
+              <button type="button" data-toggle="collapse" className="btn btn-outline-secondary" href="#createGroupForm">
                 {t('admin:user_group_management.create_group')}
                 {t('admin:user_group_management.create_group')}
               </button>
               </button>
             )
             )

+ 1 - 1
src/client/js/components/Admin/UserGroup/UserGroupTable.jsx

@@ -81,7 +81,7 @@ class UserGroupTable extends React.Component {
                           <button
                           <button
                             type="button"
                             type="button"
                             id={`admin-group-menu-button-${group._id}`}
                             id={`admin-group-menu-button-${group._id}`}
-                            className="btn btn-light btn-sm dropdown-toggle"
+                            className="btn btn-outline-secondary btn-sm dropdown-toggle"
                             data-toggle="dropdown"
                             data-toggle="dropdown"
                           >
                           >
                             <i className="icon-settings"></i>
                             <i className="icon-settings"></i>

+ 1 - 1
src/client/js/components/Admin/UserGroupDetail/UserGroupDetailPage.jsx

@@ -16,7 +16,7 @@ class UserGroupDetailPage extends React.Component {
 
 
     return (
     return (
       <div>
       <div>
-        <a href="/admin/user-groups" className="btn btn-light">
+        <a href="/admin/user-groups" className="btn btn-outline-secondary">
           <i className="icon-fw ti-arrow-left" aria-hidden="true"></i>
           <i className="icon-fw ti-arrow-left" aria-hidden="true"></i>
           {t('admin:user_group_management.back_to_list')}
           {t('admin:user_group_management.back_to_list')}
         </a>
         </a>

+ 2 - 2
src/client/js/components/Admin/UserGroupDetail/UserGroupUserTable.jsx

@@ -67,7 +67,7 @@ class UserGroupUserTable extends React.Component {
                     <button
                     <button
                       type="button"
                       type="button"
                       id={`admin-group-menu-button-${relatedUser._id}`}
                       id={`admin-group-menu-button-${relatedUser._id}`}
-                      className="btn btn-light btn-sm dropdown-toggle"
+                      className="btn btn-outline-secondary btn-sm dropdown-toggle"
                       data-toggle="dropdown"
                       data-toggle="dropdown"
                     >
                     >
                       <i className="icon-settings"></i>
                       <i className="icon-settings"></i>
@@ -91,7 +91,7 @@ class UserGroupUserTable extends React.Component {
           <tr>
           <tr>
             <td></td>
             <td></td>
             <td className="text-center">
             <td className="text-center">
-              <button className="btn btn-light" type="button" onClick={adminUserGroupDetailContainer.openUserGroupUserModal}>
+              <button className="btn btn-outline-secondary" type="button" onClick={adminUserGroupDetailContainer.openUserGroupUserModal}>
                 <i className="ti-plus"></i>
                 <i className="ti-plus"></i>
               </button>
               </button>
             </td>
             </td>

+ 1 - 1
src/client/js/components/Admin/Users/ExternalAccountTable.jsx

@@ -94,7 +94,7 @@ class ExternalAccountTable extends React.Component {
                   <td>{dateFnsFormat(new Date(ea.createdAt), 'yyyy-MM-dd')}</td>
                   <td>{dateFnsFormat(new Date(ea.createdAt), 'yyyy-MM-dd')}</td>
                   <td>
                   <td>
                     <div className="btn-group admin-user-menu">
                     <div className="btn-group admin-user-menu">
-                      <button type="button" className="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
+                      <button type="button" className="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown">
                         <i className="icon-settings"></i> <span className="caret"></span>
                         <i className="icon-settings"></i> <span className="caret"></span>
                       </button>
                       </button>
                       <ul className="dropdown-menu" role="menu">
                       <ul className="dropdown-menu" role="menu">

+ 1 - 1
src/client/js/components/Admin/Users/InviteUserControl.jsx

@@ -14,7 +14,7 @@ class InviteUserControl extends React.Component {
 
 
     return (
     return (
       <Fragment>
       <Fragment>
-        <button type="button" className="btn btn-light" onClick={adminUsersContainer.toggleUserInviteModal}>
+        <button type="button" className="btn btn-outline-secondary" onClick={adminUsersContainer.toggleUserInviteModal}>
           {t('admin:user_management.invite_users')}
           {t('admin:user_management.invite_users')}
         </button>
         </button>
         <UserInviteModal />
         <UserInviteModal />

+ 1 - 1
src/client/js/components/Admin/Users/UserMenu.jsx

@@ -81,7 +81,7 @@ class UserMenu extends React.Component {
     return (
     return (
       <Fragment>
       <Fragment>
         <div className="btn-group admin-user-menu" role="group">
         <div className="btn-group admin-user-menu" role="group">
-          <button id="userMenu" type="button" className="btn btn-light btn-sm dropdown-toggle" data-toggle="dropdown">
+          <button id="userMenu" type="button" className="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown">
             <i className="icon-settings"></i>
             <i className="icon-settings"></i>
           </button>
           </button>
           <div className="dropdown-menu" aria-labelledby="userMenu">
           <div className="dropdown-menu" aria-labelledby="userMenu">

+ 31 - 39
src/client/js/components/BookmarkButton.jsx

@@ -1,58 +1,51 @@
 import React from 'react';
 import React from 'react';
 import PropTypes from 'prop-types';
 import PropTypes from 'prop-types';
 
 
-export default class BookmarkButton extends React.Component {
+import { toastError } from '../util/apiNotification';
+
+class BookmarkButton extends React.Component {
 
 
   constructor(props) {
   constructor(props) {
     super(props);
     super(props);
 
 
     this.state = {
     this.state = {
-      bookmarked: false,
+      isBookmarked: false,
     };
     };
 
 
     this.handleClick = this.handleClick.bind(this);
     this.handleClick = this.handleClick.bind(this);
   }
   }
 
 
-  componentDidMount() {
+  async componentDidMount() {
+    const { pageId, crowi } = this.props;
     // if guest user
     // if guest user
     if (!this.isUserLoggedIn()) {
     if (!this.isUserLoggedIn()) {
       // do nothing
       // do nothing
       return;
       return;
     }
     }
 
 
-    this.props.crowi.apiGet('/bookmarks.get', { page_id: this.props.pageId })
-      .then((res) => {
-        if (res.bookmark) {
-          this.markBookmarked();
-        }
-      });
-  }
-
-  handleClick(event) {
-    event.preventDefault();
-
-    const pageId = this.props.pageId;
-
-    if (!this.state.bookmarked) {
-      this.props.crowi.apiPost('/bookmarks.add', { page_id: pageId })
-        .then((res) => {
-          this.markBookmarked();
-        });
+    try {
+      const response = await crowi.apiv3.get('/bookmarks', { pageId });
+      if (response.data.bookmark != null) {
+        this.setState({ isBookmarked: true });
+      }
     }
     }
-    else {
-      this.props.crowi.apiPost('/bookmarks.remove', { page_id: pageId })
-        .then((res) => {
-          this.markUnBookmarked();
-        });
+    catch (err) {
+      toastError(err);
     }
     }
-  }
 
 
-  markBookmarked() {
-    this.setState({ bookmarked: true });
   }
   }
 
 
-  markUnBookmarked() {
-    this.setState({ bookmarked: false });
+  async handleClick() {
+    const { crowi, pageId } = this.props;
+    const bool = !this.state.isBookmarked;
+
+    try {
+      await crowi.apiv3.put('/bookmarks', { pageId, bool });
+      this.setState({ isBookmarked: bool });
+    }
+    catch (err) {
+      toastError(err);
+    }
   }
   }
 
 
   isUserLoggedIn() {
   isUserLoggedIn() {
@@ -65,20 +58,13 @@ export default class BookmarkButton extends React.Component {
       return <div></div>;
       return <div></div>;
     }
     }
 
 
-    const btnSizeClassName = this.props.size ? `btn-${this.props.size}` : 'btn-md';
-    const addedClassNames = [
-      this.state.bookmarked ? 'active' : '',
-      btnSizeClassName,
-    ];
-    const addedClassName = addedClassNames.join(' ');
-
     return (
     return (
       <button
       <button
         type="button"
         type="button"
         href="#"
         href="#"
         title="Bookmark"
         title="Bookmark"
         onClick={this.handleClick}
         onClick={this.handleClick}
-        className={`btn btn-circle btn-outline-warning btn-bookmark border-0 ${addedClassName}`}
+        className={`btn btn-circle btn-outline-warning btn-bookmark border-0 ${`btn-${this.props.size}`} ${this.state.bookmarked && 'active'}`}
       >
       >
         <i className="icon-star"></i>
         <i className="icon-star"></i>
       </button>
       </button>
@@ -92,3 +78,9 @@ BookmarkButton.propTypes = {
   crowi: PropTypes.object.isRequired,
   crowi: PropTypes.object.isRequired,
   size: PropTypes.string,
   size: PropTypes.string,
 };
 };
+
+BookmarkButton.defaultProps = {
+  size: 'md',
+};
+
+export default BookmarkButton;

+ 1 - 1
src/client/js/components/Me/DisassociateModal.jsx

@@ -57,7 +57,7 @@ class DisassociateModal extends React.Component {
           <p dangerouslySetInnerHTML={{ __html: t('personal_settings.disassociate_external_account_desc', { providerType, accountId }) }} />
           <p dangerouslySetInnerHTML={{ __html: t('personal_settings.disassociate_external_account_desc', { providerType, accountId }) }} />
         </ModalBody>
         </ModalBody>
         <ModalFooter>
         <ModalFooter>
-          <button type="button" className="btn btn-sm btn-default" onClick={this.props.onClose}>
+          <button type="button" className="btn btn-sm btn-outline-secondary" onClick={this.props.onClose}>
             { t('Cancel') }
             { t('Cancel') }
           </button>
           </button>
           <button type="button" className="btn btn-sm btn-danger" onClick={this.onClickDisassociateBtn}>
           <button type="button" className="btn btn-sm btn-danger" onClick={this.onClickDisassociateBtn}>

+ 1 - 1
src/client/js/components/Me/ExternalAccountLinkedMe.jsx

@@ -69,7 +69,7 @@ class ExternalAccountLinkedMe extends React.Component {
       <Fragment>
       <Fragment>
         <div className="container-fluid p-0 my-4">
         <div className="container-fluid p-0 my-4">
           <h2 className="border-bottom">
           <h2 className="border-bottom">
-            <button type="button" className="btn btn-light btn-sm pull-right" onClick={this.openAssociateModal}>
+            <button type="button" className="btn btn-outline-secondary btn-sm pull-right" onClick={this.openAssociateModal}>
               <i className="icon-plus" aria-hidden="true" />
               <i className="icon-plus" aria-hidden="true" />
             Add
             Add
             </button>
             </button>

+ 1 - 1
src/client/js/components/Me/ExternalAccountRow.jsx

@@ -18,7 +18,7 @@ const ExternalAccountRow = (props) => {
       <td className="text-center">
       <td className="text-center">
         <button
         <button
           type="button"
           type="button"
-          className="btn btn-default btn-sm btn-danger"
+          className="btn btn-outline-secondary btn-sm btn-danger"
           onClick={() => props.openDisassociateModal(account)}
           onClick={() => props.openDisassociateModal(account)}
         >
         >
           <i className="ti-unlink"></i>
           <i className="ti-unlink"></i>

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

@@ -141,7 +141,7 @@ class MyDraftList extends React.Component {
             <div className="d-flex justify-content-between">
             <div className="d-flex justify-content-between">
               <h4>Total: {totalCount} drafts</h4>
               <h4>Total: {totalCount} drafts</h4>
               <div className="align-self-center">
               <div className="align-self-center">
-                <button type="button" className="btn btn-sm btn-default" onClick={this.clearAllDrafts}>
+                <button type="button" className="btn btn-sm btn-outline-secondary" onClick={this.clearAllDrafts}>
                   <i className="icon-fw icon-fire text-danger"></i>
                   <i className="icon-fw icon-fire text-danger"></i>
                   {t('Delete All')}
                   {t('Delete All')}
                 </button>
                 </button>

+ 1 - 1
src/client/js/components/Navbar/GrowiSubNavigationForUserPage.jsx

@@ -57,7 +57,7 @@ const GrowiSubNavigationForUserPage = (props) => {
         </div>
         </div>
 
 
         {/* Header Button */}
         {/* Header Button */}
-        <BookmarkButton pageId={pageId} crowi={appContainer} />
+        <BookmarkButton pageId={pageId} crowi={appContainer} size="lg" />
       </div>
       </div>
 
 
 
 

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

@@ -159,7 +159,7 @@ class RevisionPath extends React.Component {
 
 
         <CopyDropdown t={this.props.t} pagePath={this.props.pagePath} pageId={this.props.pageId} buttonStyle={buttonStyle}></CopyDropdown>
         <CopyDropdown t={this.props.t} pagePath={this.props.pagePath} pageId={this.props.pageId} buttonStyle={buttonStyle}></CopyDropdown>
 
 
-        <a href="#edit" className="d-block btn btn-default btn-edit text-muted" style={buttonStyle}>
+        <a href="#edit" className="d-block btn btn-outline-secondary btn-edit text-muted" style={buttonStyle}>
           <i className="icon-note" />
           <i className="icon-note" />
         </a>
         </a>
       </span>
       </span>

+ 2 - 2
src/client/js/components/PageEditor/Editor.jsx

@@ -259,7 +259,7 @@ export default class Editor extends AbstractEditor {
     };
     };
 
 
     return (
     return (
-      <Modal isOpen={this.state.isCheatsheetModalShown} toggle={hideCheatsheetModal} className="modal modal-gfm-cheatsheet">
+      <Modal isOpen={this.state.isCheatsheetModalShown} toggle={hideCheatsheetModal} className="modal-gfm-cheatsheet">
         <ModalHeader tag="h4" toggle={hideCheatsheetModal} className="bg-primary">
         <ModalHeader tag="h4" toggle={hideCheatsheetModal} className="bg-primary">
           <span className="text-white"><i className="icon-fw icon-question" />Markdown Help</span>
           <span className="text-white"><i className="icon-fw icon-question" />Markdown Help</span>
         </ModalHeader>
         </ModalHeader>
@@ -339,7 +339,7 @@ export default class Editor extends AbstractEditor {
           && (
           && (
           <button
           <button
             type="button"
             type="button"
-            className="btn btn-light btn-block btn-open-dropzone"
+            className="btn btn-outline-secondary btn-block btn-open-dropzone"
             onClick={() => { this.dropzone.open() }}
             onClick={() => { this.dropzone.open() }}
           >
           >
             <i className="icon-paper-clip" aria-hidden="true"></i>&nbsp;
             <i className="icon-paper-clip" aria-hidden="true"></i>&nbsp;

+ 2 - 2
src/client/js/components/PageEditor/OptionsSelector.jsx

@@ -112,7 +112,7 @@ class OptionsSelector extends React.Component {
       <div className="my-0 form-group">
       <div className="my-0 form-group">
         <label>Theme:</label>
         <label>Theme:</label>
         <div className="btn-group btn-group-sm dropup">
         <div className="btn-group btn-group-sm dropup">
-          <button className="btn btn-light dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+          <button className="btn btn-outline-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
             {selectedTheme}
             {selectedTheme}
           </button>
           </button>
           <div className="dropdown-menu" aria-labelledby="dropdownMenuLink">
           <div className="dropdown-menu" aria-labelledby="dropdownMenuLink">
@@ -139,7 +139,7 @@ class OptionsSelector extends React.Component {
       <div className="my-0 form-group">
       <div className="my-0 form-group">
         <label>Keymap:</label>
         <label>Keymap:</label>
         <div className="btn-group btn-group-sm dropup">
         <div className="btn-group btn-group-sm dropup">
-          <button className="btn btn-light dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+          <button className="btn btn-outline-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
             {selectedKeymapMode}
             {selectedKeymapMode}
           </button>
           </button>
           <div className="dropdown-menu" aria-labelledby="dropdownMenuLink">
           <div className="dropdown-menu" aria-labelledby="dropdownMenuLink">

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

@@ -294,7 +294,7 @@ class PageEditorByHackmd extends React.Component {
 
 
           <div className="text-center hackmd-discard-button-container mb-3">
           <div className="text-center hackmd-discard-button-container mb-3">
             <button
             <button
-              className="btn btn-light btn-lg waves-effect waves-light"
+              className="btn btn-outline-secondary btn-lg waves-effect waves-light"
               type="button"
               type="button"
               onClick={() => { return this.discardChanges() }}
               onClick={() => { return this.discardChanges() }}
             >
             >

+ 1 - 1
src/client/js/components/SearchPage/SearchPageForm.jsx

@@ -42,7 +42,7 @@ class SearchPageForm extends React.Component {
           />
           />
         </div>
         </div>
         <div className="input-group-append">
         <div className="input-group-append">
-          <button className="btn btn-light" type="button" id="button-addon2" onClick={this.search}>
+          <button className="btn btn-outline-secondary" type="button" id="button-addon2" onClick={this.search}>
             <i className="icon-magnifier"></i>
             <i className="icon-magnifier"></i>
           </button>
           </button>
         </div>
         </div>

+ 2 - 2
src/client/js/components/SearchPage/SearchResult.jsx

@@ -202,7 +202,7 @@ class SearchResult extends React.Component {
     if (this.state.deletionMode) {
     if (this.state.deletionMode) {
       deletionModeButtons = (
       deletionModeButtons = (
         <div className="btn-group">
         <div className="btn-group">
-          <button type="button" className="btn btn-light btn-sm rounded-pill-weak" onClick={() => { return this.handleDeletionModeChange() }}>
+          <button type="button" className="btn btn-outline-secondary btn-sm rounded-pill-weak" onClick={() => { return this.handleDeletionModeChange() }}>
             <i className="icon-ban" /> Cancel
             <i className="icon-ban" /> Cancel
           </button>
           </button>
           <button
           <button
@@ -231,7 +231,7 @@ class SearchResult extends React.Component {
     else {
     else {
       deletionModeButtons = (
       deletionModeButtons = (
         <div className="btn-group">
         <div className="btn-group">
-          <button type="button" className="btn btn-light rounded-pill btn-sm" onClick={() => { return this.handleDeletionModeChange() }}>
+          <button type="button" className="btn btn-outline-secondary rounded-pill btn-sm" onClick={() => { return this.handleDeletionModeChange() }}>
             <i className="ti-check-box" /> DeletionMode
             <i className="ti-check-box" /> DeletionMode
           </button>
           </button>
         </div>
         </div>

+ 3 - 1
src/client/styles/scss/_comment_growi.scss

@@ -56,6 +56,8 @@
 
 
   .page-comment {
   .page-comment {
     position: relative;
     position: relative;
+    padding-top: 70px;
+    margin-top: -70px;
 
 
     // ユーザー名
     // ユーザー名
     .page-comment-creator {
     .page-comment-creator {
@@ -72,7 +74,7 @@
     // コメントセクション
     // コメントセクション
     .page-comment-main {
     .page-comment-main {
       @extend %comment-section;
       @extend %comment-section;
-      @include media-breakpoint-up(sm){
+      @include media-breakpoint-up(sm) {
         margin-left: 4.5em !important;
         margin-left: 4.5em !important;
       }
       }
       @include media-breakpoint-down(xs) {
       @include media-breakpoint-down(xs) {

+ 1 - 0
src/client/styles/scss/_layout_kibela.scss

@@ -87,6 +87,7 @@ body.kibela {
     left: 0px;
     left: 0px;
     z-index: absolute;
     z-index: absolute;
     height: 11em;
     height: 11em;
+    max-width: 840px;
     margin: auto;
     margin: auto;
     border-top: solid 0.4em #5584e1;
     border-top: solid 0.4em #5584e1;
     border-radius: 0.35em;
     border-radius: 0.35em;

+ 157 - 0
src/server/routes/apiv3/bookmarks.js

@@ -0,0 +1,157 @@
+const loggerFactory = require('@alias/logger');
+
+const logger = loggerFactory('growi:routes:apiv3:bookmark'); // eslint-disable-line no-unused-vars
+
+const express = require('express');
+const { body } = require('express-validator');
+
+const router = express.Router();
+
+/**
+ * @swagger
+ *  tags:
+ *    name: Bookmarks
+ */
+
+/**
+ * @swagger
+ *
+ *  components:
+ *    schemas:
+ *      Bookmark:
+ *        description: Bookmark
+ *        type: object
+ *        properties:
+ *          _id:
+ *            type: string
+ *            description: page ID
+ *            example: 5e07345972560e001761fa63
+ *          __v:
+ *            type: number
+ *            description: DB record version
+ *            example: 0
+ *          createdAt:
+ *            type: string
+ *            description: date created at
+ *            example: 2010-01-01T00:00:00.000Z
+ *          page:
+ *            $ref: '#/components/schemas/Page/properties/_id'
+ *          user:
+ *            $ref: '#/components/schemas/User/properties/_id'
+ *
+ *      BookmarkParams:
+ *        description: BookmarkParams
+ *        type: object
+ *        properties:
+ *          pageId:
+ *            type: string
+ *            description: page ID
+ *            example: 5e07345972560e001761fa63
+ *          bool:
+ *            type: boolean
+ *            description: boolean for bookmark status
+ */
+
+module.exports = (crowi) => {
+  const accessTokenParser = require('../../middleware/access-token-parser')(crowi);
+  const loginRequired = require('../../middleware/login-required')(crowi);
+  const csrf = require('../../middleware/csrf')(crowi);
+
+  const { Page, Bookmark } = crowi.models;
+  const { ApiV3FormValidator } = crowi.middlewares;
+
+  const validator = {
+    bookmarks: [
+      body('pageId').isString(),
+      body('bool').isBoolean(),
+    ],
+  };
+
+  /**
+   * @swagger
+   *
+   *    /bookmarks:
+   *      get:
+   *        tags: [Bookmarks]
+   *        summary: /bookmarks
+   *        description: Get bookmarked status
+   *        operationId: getBookmarkedStatus
+   *        parameters:
+   *          - name: pageId
+   *            in: query
+   *            description: page id
+   *            schema:
+   *              type: string
+   *        responses:
+   *          200:
+   *            description: Succeeded to get bookmarked status.
+   *            content:
+   *              application/json:
+   *                schema:
+   *                  $ref: '#/components/schemas/Bookmark'
+   */
+  router.get('/', accessTokenParser, loginRequired, async(req, res) => {
+    const { pageId } = req.query;
+
+    try {
+      const bookmark = await Bookmark.findByPageIdAndUserId(pageId, req.user);
+      return res.apiv3({ bookmark });
+    }
+    catch (err) {
+      logger.error('get-bookmark-failed', err);
+      return res.apiv3Err(err, 500);
+    }
+  });
+
+
+  /**
+   * @swagger
+   *
+   *    /bookmarks:
+   *      put:
+   *        tags: [Bookmarks]
+   *        summary: /bookmarks
+   *        description: Update bookmarked status
+   *        operationId: updateBookmarkedStatus
+   *        requestBody:
+   *          content:
+   *            application/json:
+   *              schema:
+   *                $ref: '#/components/schemas/BookmarkParams'
+   *        responses:
+   *          200:
+   *            description: Succeeded to update bookmarked status.
+   *            content:
+   *              application/json:
+   *                schema:
+   *                  $ref: '#/components/schemas/Bookmark'
+   */
+  router.put('/', accessTokenParser, loginRequired, csrf, validator.bookmarks, ApiV3FormValidator, async(req, res) => {
+    const { pageId, bool } = req.body;
+
+    let bookmark;
+    try {
+      const page = await Page.findByIdAndViewer(pageId, req.user);
+      if (page == null) {
+        return res.apiv3Err(`Page '${pageId}' is not found or forbidden`);
+      }
+      if (bool) {
+        bookmark = await Bookmark.add(page, req.user);
+      }
+      else {
+        bookmark = await Bookmark.removeBookmark(page, req.user);
+      }
+    }
+    catch (err) {
+      logger.error('update-bookmark-failed', err);
+      return res.apiv3Err(err, 500);
+    }
+
+    bookmark.depopulate('page');
+    bookmark.depopulate('user');
+
+    return res.apiv3({ bookmark });
+  });
+
+  return router;
+};

+ 2 - 0
src/server/routes/apiv3/index.js

@@ -39,5 +39,7 @@ module.exports = (crowi) => {
 
 
   router.use('/page', require('./page')(crowi));
   router.use('/page', require('./page')(crowi));
 
 
+  router.use('/bookmarks', require('./bookmarks')(crowi));
+
   return router;
   return router;
 };
 };

+ 1 - 1
src/server/views/layout-kibela/base/layout.html

@@ -11,7 +11,7 @@
 
 
   <div class="row body m-0 p-0">
   <div class="row body m-0 p-0">
 
 
-    <div id="main" class="main col-md-7 col-12 kibela-block bg-white round-corner {% if page %}{{ css.grant(page) }}{% endif %}{% block main_css_class %}{% endblock %}">
+    <div id="main" class="main col-12 kibela-block bg-white round-corner {% if page %}{{ css.grant(page) }}{% endif %}{% block main_css_class %}{% endblock %}">
       <div class="row grw-subnav">
       <div class="row grw-subnav">
         <div class="col-12 grw-title-bar">
         <div class="col-12 grw-title-bar">
           {% block content_header %} {% endblock %}
           {% block content_header %} {% endblock %}

+ 2 - 2
src/server/views/modal/create_template.html

@@ -19,7 +19,7 @@
                   <p class="text-center"><code>_template</code></p>
                   <p class="text-center"><code>_template</code></p>
                   <p class="form-text text-muted text-center"><small>{{ t('template.children.desc') }}</small></p>
                   <p class="form-text text-muted text-center"><small>{{ t('template.children.desc') }}</small></p>
                 </div>
                 </div>
-                <div class="card-footer text-center">
+                <div class="card-footer text-center bg-white">
                   <a href="{{templateParentPath}}_template#edit"
                   <a href="{{templateParentPath}}_template#edit"
                       class="btn btn-sm btn-primary" id="template-button-children">
                       class="btn btn-sm btn-primary" id="template-button-children">
                       {{ t("Edit") }}
                       {{ t("Edit") }}
@@ -34,7 +34,7 @@
                   <p class="text-center"><code>__template</code></p>
                   <p class="text-center"><code>__template</code></p>
                   <p class="form-text text-muted text-center"><small>{{ t('template.decendants.desc') }}</small></p>
                   <p class="form-text text-muted text-center"><small>{{ t('template.decendants.desc') }}</small></p>
                 </div>
                 </div>
-                <div class="card-footer text-center">
+                <div class="card-footer text-center bg-white">
                   <a href="{{templateParentPath}}__template#edit"
                   <a href="{{templateParentPath}}__template#edit"
                       class="btn btn-sm btn-primary" id="template-button-decendants">
                       class="btn btn-sm btn-primary" id="template-button-decendants">
                       {{ t("Edit") }}
                       {{ t("Edit") }}

+ 2 - 2
src/server/views/widget/page_alerts.html

@@ -43,7 +43,7 @@
       <form role="form" id="unlink-page-form" onsubmit="return false;">
       <form role="form" id="unlink-page-form" onsubmit="return false;">
         <input type="hidden" name="_csrf" value="{{ csrf() }}">
         <input type="hidden" name="_csrf" value="{{ csrf() }}">
         <input type="hidden" name="path" value="{{ path }}">
         <input type="hidden" name="path" value="{{ path }}">
-        <button type="submit" class="btn btn-light btn-sm float-right">
+        <button type="submit" class="btn btn-outline-secondary btn-sm float-right">
           <i class="ti-unlink" aria-hidden="true"></i>
           <i class="ti-unlink" aria-hidden="true"></i>
           Unlink
           Unlink
         </button>
         </button>
@@ -90,7 +90,7 @@
       </div>
       </div>
       {% if page.isDeleted() and user %}
       {% if page.isDeleted() and user %}
       <div>
       <div>
-        <button href="#" class="btn btn-light rounded-pill btn-sm mr-2" data-target="#putBackPage" data-toggle="modal"><i class="icon-action-undo" aria-hidden="true"></i> {{ t('Put Back') }}</button>
+        <button href="#" class="btn btn-outline-secondary rounded-pill btn-sm mr-2" data-target="#putBackPage" data-toggle="modal"><i class="icon-action-undo" aria-hidden="true"></i> {{ t('Put Back') }}</button>
         <button href="#" class="btn btn-danger rounded-pill btn-sm mr-2" {% if !user.canDeleteCompletely(page.creator._id) %} disabled="disabled" {% endif %} data-target="#deletePage" data-toggle="modal"><i class="icon-fire" aria-hidden="true"></i> {{ t('Delete Completely') }}</button>
         <button href="#" class="btn btn-danger rounded-pill btn-sm mr-2" {% if !user.canDeleteCompletely(page.creator._id) %} disabled="disabled" {% endif %} data-target="#deletePage" data-toggle="modal"><i class="icon-fire" aria-hidden="true"></i> {{ t('Delete Completely') }}</button>
       {# /.float-right #}
       {# /.float-right #}
       </div>
       </div>

+ 6 - 6
src/server/views/widget/page_tabs.html

@@ -68,11 +68,11 @@
   <!-- icon-options-vertical -->
   <!-- icon-options-vertical -->
   {% if !isTrashPage() %}
   {% if !isTrashPage() %}
     {% if page.isPortal() %}
     {% if page.isPortal() %}
-    <li class="nav-item">
+    <li class="nav-item dropdown">
       <a
       <a
-        {% if user %} role="button" class="nav-link" data-toggle="dropdown" {% endif %}
+        {% if user %} role="button" class="nav-link dropdown-toggle dropdown-toggle-no-caret" data-toggle="dropdown" {% endif %}
         {% if not user %}
         {% if not user %}
-          class="dropdown-toggle dropdown-toggle-disabled"
+          class="nav-link dropdown-toggle dropdown-toggle-disabled dropdown-toggle-no-caret"
           data-toggle="tooltip" data-placement="top" data-container="body" title="{{ t('Not available for guest') }}"
           data-toggle="tooltip" data-placement="top" data-container="body" title="{{ t('Not available for guest') }}"
         {% endif %}
         {% endif %}
       >
       >
@@ -90,11 +90,11 @@
       </div>
       </div>
     </li>
     </li>
     {% else %}
     {% else %}
-    <li class="nav-item dropdown d-flex align-items-center">
+    <li class="nav-item dropdown">
       <a
       <a
-        {% if user %} role="button" data-toggle="dropdown" {% endif %}
+        {% if user %} role="button" class="nav-link dropdown-toggle dropdown-toggle-no-caret" data-toggle="dropdown" {% endif %}
         {% if not user %}
         {% if not user %}
-          class="dropdown-toggle dropdown-toggle-disabled"
+          class="nav-link dropdown-toggle dropdown-toggle-disabled dropdown-toggle-no-caret"
           data-toggle="tooltip" data-placement="top" data-container="body" title="{{ t('Not available for guest') }}"
           data-toggle="tooltip" data-placement="top" data-container="body" title="{{ t('Not available for guest') }}"
         {% endif %}
         {% endif %}
       >
       >