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

Merge branch 'support/apply-bootstrap4' into support/create-apiV3-for-update-bokkmark-status

itizawa 6 лет назад
Родитель
Сommit
2a71fb038d

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

@@ -19,10 +19,10 @@ class LikeButton extends React.Component {
 
 
   async handleClick() {
   async handleClick() {
     const { appContainer, pageId } = this.props;
     const { appContainer, pageId } = this.props;
-    const { isLiked } = this.state;
+    const bool = !this.state.isLiked;
     try {
     try {
-      this.setState({ isLiked: !isLiked });
-      await appContainer.apiv3.put('/page/likes', { pageId, isLiked });
+      await appContainer.apiv3.put('/page/likes', { pageId, bool });
+      this.setState({ isLiked: bool });
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);

+ 8 - 12
src/client/js/components/Me/ImageCropModal.jsx

@@ -94,19 +94,15 @@ class ImageCropModal extends React.Component {
           <ReactCrop circularCrop src={this.props.src} crop={this.state.crop} onImageLoaded={this.onImageLoaded} onChange={this.onCropChange} />
           <ReactCrop circularCrop src={this.props.src} crop={this.state.crop} onImageLoaded={this.onImageLoaded} onChange={this.onCropChange} />
         </ModalBody>
         </ModalBody>
         <ModalFooter>
         <ModalFooter>
-          <div className="d-flex justify-content-between">
-            <button type="button" className="btn btn-sm bg-danger" onClick={this.reset}>
+          <button type="button" className="btn btn-outline-danger rounded-pill mr-auto" onClick={this.reset}>
               Reset
               Reset
-            </button>
-            <div className="d-flex">
-              <button type="button" className="btn btn-sm bg-light" onClick={this.props.onModalClose}>
-                Cancel
-              </button>
-              <button type="button" className="btn btn-sm bg-primary" onClick={this.crop}>
-                Crop
-              </button>
-            </div>
-          </div>
+          </button>
+          <button type="button" className="btn btn-outline-secondary rounded-pill mr-2" onClick={this.props.onModalClose}>
+                  Cancel
+          </button>
+          <button type="button" className="btn btn-outline-primary rounded-pill" onClick={this.crop}>
+                  Crop
+          </button>
         </ModalFooter>
         </ModalFooter>
       </Modal>
       </Modal>
     );
     );

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

@@ -339,7 +339,7 @@ export default class Editor extends AbstractEditor {
           && (
           && (
           <button
           <button
             type="button"
             type="button"
-            className="btn btn-default btn-block btn-open-dropzone"
+            className="btn btn-light 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;

+ 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-default btn-lg waves-effect waves-light"
+              className="btn btn-light btn-lg waves-effect waves-light"
               type="button"
               type="button"
               onClick={() => { return this.discardChanges() }}
               onClick={() => { return this.discardChanges() }}
             >
             >

+ 16 - 6
src/client/js/components/SearchPage/DeletePageListModal.jsx

@@ -41,19 +41,24 @@ export default class DeletePageListModal extends React.Component {
           <div className="d-flex justify-content-between">
           <div className="d-flex justify-content-between">
             <span className="text-danger">{this.props.errorMessage}</span>
             <span className="text-danger">{this.props.errorMessage}</span>
             <span className="d-flex align-items-center">
             <span className="d-flex align-items-center">
-              <div className="custom-control custom-checkbox custom-checkbox-danger">
-                <input type="checkbox" className="custom-control-input" id="customCheck-delete-completely" />
+              <div className="custom-control custom-checkbox custom-checkbox-danger mr-2">
+                <input
+                  type="checkbox"
+                  className="custom-control-input"
+                  id="customCheck-delete-completely"
+                  checked={this.props.isDeleteCompletely}
+                  onChange={this.props.toggleDeleteCompletely}
+                />
                 <label
                 <label
                   className="custom-control-label text-danger"
                   className="custom-control-label text-danger"
                   htmlFor="customCheck-delete-completely"
                   htmlFor="customCheck-delete-completely"
-                  onClick={this.props.toggleDeleteCompletely}
                 >
                 >
                   Delete completely
                   Delete completely
                 </label>
                 </label>
               </div>
               </div>
-              <span className="ml-2">
-                <Button color="secondary" onClick={this.props.confirmedToDelete}><i className="icon-trash"></i>Delete</Button>
-              </span>
+              <Button color={this.props.isDeleteCompletely ? 'danger' : 'light'} onClick={this.props.confirmedToDelete}>
+                <i className="icon-trash"></i>Delete
+              </Button>
             </span>
             </span>
           </div>
           </div>
         </ModalFooter>
         </ModalFooter>
@@ -63,11 +68,16 @@ export default class DeletePageListModal extends React.Component {
 
 
 }
 }
 
 
+DeletePageListModal.defaultProps = {
+  isDeleteCompletely: false, // for when undefined is passed
+};
+
 DeletePageListModal.propTypes = {
 DeletePageListModal.propTypes = {
   isShown: PropTypes.bool.isRequired,
   isShown: PropTypes.bool.isRequired,
   pages: PropTypes.array,
   pages: PropTypes.array,
   errorMessage: PropTypes.string,
   errorMessage: PropTypes.string,
   cancel: PropTypes.func.isRequired, //                 for cancel evnet handling
   cancel: PropTypes.func.isRequired, //                 for cancel evnet handling
+  isDeleteCompletely: PropTypes.bool,
   confirmedToDelete: PropTypes.func.isRequired, //      for confirmed event handling
   confirmedToDelete: PropTypes.func.isRequired, //      for confirmed event handling
   toggleDeleteCompletely: PropTypes.func.isRequired, // for delete completely check event handling
   toggleDeleteCompletely: PropTypes.func.isRequired, // for delete completely check event handling
 };
 };

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

@@ -202,12 +202,12 @@ 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-rounded btn-light btn-sm" onClick={() => { return this.handleDeletionModeChange() }}>
+          <button type="button" className="btn btn-light btn-sm rounded-pill-weak" onClick={() => { return this.handleDeletionModeChange() }}>
             <i className="icon-ban" /> Cancel
             <i className="icon-ban" /> Cancel
           </button>
           </button>
           <button
           <button
             type="button"
             type="button"
-            className="btn btn-rounded btn-danger btn-sm"
+            className="btn btn-danger btn-sm rounded-pill-weak"
             onClick={() => { return this.showDeleteConfirmModal() }}
             onClick={() => { return this.showDeleteConfirmModal() }}
             disabled={this.state.selectedPages.size === 0}
             disabled={this.state.selectedPages.size === 0}
           >
           >
@@ -305,6 +305,7 @@ class SearchResult extends React.Component {
           errorMessage={this.state.errorMessageForDeleting}
           errorMessage={this.state.errorMessageForDeleting}
           cancel={this.closeDeleteConfirmModal}
           cancel={this.closeDeleteConfirmModal}
           confirmedToDelete={this.deleteSelectedPages}
           confirmedToDelete={this.deleteSelectedPages}
+          isDeleteCompletely={this.state.isDeleteCompletely}
           toggleDeleteCompletely={this.toggleDeleteCompletely}
           toggleDeleteCompletely={this.toggleDeleteCompletely}
         />
         />
       </div> // content-main
       </div> // content-main

+ 5 - 0
src/client/styles/scss/_override-bootstrap.scss

@@ -82,6 +82,11 @@ h6 {
   .dropdown-toggle.btn.disabled {
   .dropdown-toggle.btn.disabled {
     cursor: not-allowed;
     cursor: not-allowed;
   }
   }
+
+  // hide caret
+  .dropdown-toggle.dropdown-toggle-no-caret::after {
+    content: none;
+  }
 }
 }
 
 
 // agile-admin style
 // agile-admin style

+ 4 - 0
src/client/styles/scss/atoms/_buttons.scss

@@ -54,6 +54,10 @@
   }
   }
 }
 }
 
 
+.rounded-pill-weak {
+  border-radius: 60px;
+}
+
 // fill button style
 // fill button style
 .btn-fill {
 .btn-fill {
   position: relative;
   position: relative;

+ 4 - 3
src/server/models/page.js

@@ -2,6 +2,7 @@
 /* eslint-disable no-return-await */
 /* eslint-disable no-return-await */
 
 
 /* eslint-disable no-use-before-define */
 /* eslint-disable no-use-before-define */
+const logger = require('@alias/logger')('growi:models:page');
 
 
 const debug = require('debug')('growi:models:page');
 const debug = require('debug')('growi:models:page');
 const nodePath = require('path');
 const nodePath = require('path');
@@ -367,12 +368,12 @@ module.exports = function(crowi) {
           if (err) {
           if (err) {
             return reject(err);
             return reject(err);
           }
           }
-          debug('liker updated!', added);
+          logger.debug('liker updated!', added);
           return resolve(data);
           return resolve(data);
         });
         });
       }
       }
       else {
       else {
-        debug('liker not updated');
+        logger.debug('liker not updated');
         return reject(self);
         return reject(self);
       }
       }
     }));
     }));
@@ -393,7 +394,7 @@ module.exports = function(crowi) {
         });
         });
       }
       }
       else {
       else {
-        debug('liker not updated');
+        logger.debug('liker not updated');
         return reject(self);
         return reject(self);
       }
       }
     }));
     }));

+ 7 - 6
src/server/routes/apiv3/page.js

@@ -106,8 +106,9 @@ const router = express.Router();
  *            type: string
  *            type: string
  *            description: page ID
  *            description: page ID
  *            example: 5e07345972560e001761fa63
  *            example: 5e07345972560e001761fa63
- *          isLiked:
+ *          bool:
  *            type: boolean
  *            type: boolean
+ *            description: boolean for like status
  */
  */
 module.exports = (crowi) => {
 module.exports = (crowi) => {
   const accessTokenParser = require('../../middleware/access-token-parser')(crowi);
   const accessTokenParser = require('../../middleware/access-token-parser')(crowi);
@@ -122,7 +123,7 @@ module.exports = (crowi) => {
   const validator = {
   const validator = {
     likes: [
     likes: [
       body('pageId').isString(),
       body('pageId').isString(),
-      body('isLiked').isBoolean(),
+      body('bool').isBoolean(),
     ],
     ],
   };
   };
 
 
@@ -149,7 +150,7 @@ module.exports = (crowi) => {
    *                  $ref: '#/components/schemas/Page'
    *                  $ref: '#/components/schemas/Page'
    */
    */
   router.put('/likes', accessTokenParser, loginRequired, csrf, validator.likes, ApiV3FormValidator, async(req, res) => {
   router.put('/likes', accessTokenParser, loginRequired, csrf, validator.likes, ApiV3FormValidator, async(req, res) => {
-    const { pageId, isLiked } = req.body;
+    const { pageId, bool } = req.body;
 
 
     let page;
     let page;
     try {
     try {
@@ -157,11 +158,11 @@ module.exports = (crowi) => {
       if (page == null) {
       if (page == null) {
         return res.apiv3Err(`Page '${pageId}' is not found or forbidden`);
         return res.apiv3Err(`Page '${pageId}' is not found or forbidden`);
       }
       }
-      if (isLiked) {
-        page = await page.unlike(req.user);
+      if (bool) {
+        page = await page.like(req.user);
       }
       }
       else {
       else {
-        page = await page.like(req.user);
+        page = await page.unlike(req.user);
       }
       }
     }
     }
     catch (err) {
     catch (err) {

+ 1 - 1
src/server/views/modal/duplicate.html

@@ -20,7 +20,7 @@
                 <span class="input-group-text">{{ baseUrl }}</span>
                 <span class="input-group-text">{{ baseUrl }}</span>
               </div>
               </div>
                 {% if isSearchServiceConfigured() %}
                 {% if isSearchServiceConfigured() %}
-                <div id="duplicate-page-name-input" class="page-name-input"></div>
+                <div id="duplicate-page-name-input" class="page-name-input flex-fill"></div>
                 {% else %}
                 {% else %}
                 <input type="text" class="form-control" name="new_path" id="duplicatePageName" value="{{ page.path }}">
                 <input type="text" class="form-control" name="new_path" id="duplicatePageName" value="{{ page.path }}">
                 {% endif %}
                 {% endif %}

+ 49 - 41
src/server/views/widget/page_tabs_kibela.html

@@ -1,21 +1,21 @@
 {% if page %}
 {% if page %}
-<ul class="nav nav-tabs hidden-print">
+<ul class="nav nav-tabs d-print-none">
 
 
   {#
   {#
     Left Tabs
     Left Tabs
   #}
   #}
-  <li class="nav-item grw-nav-main-left-tab active">
+  <li class="nav-item active">
     <a class="nav-link active" href="#revision-body" data-toggle="tab">
     <a class="nav-link active" href="#revision-body" data-toggle="tab">
       <i class="icon-control-play"></i> View
       <i class="icon-control-play"></i> View
     </a>
     </a>
   </li>
   </li>
 
 
   {% if !isTrashPage() %}
   {% if !isTrashPage() %}
-  <li class="grw-nav-main-left-tab nav-tab-edit">
+  <li class="nav-item nav-tab-edit">
     <a
     <a
-      {% if user %} href="#edit" data-toggle="tab" class="edit-button" {% endif %}
+      {% if user %} href="#edit" data-toggle="tab" class="nav-link edit-button" {% endif %}
       {% if not user %}
       {% if not user %}
-        class="edit-button edit-button-disabled"
+        class="nav-link edit-button edit-button-disabled"
         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 %}
     >
     >
@@ -23,11 +23,11 @@
     </a>
     </a>
   </li>
   </li>
   {% if isHackmdSetup() %}
   {% if isHackmdSetup() %}
-  <li class="grw-nav-main-left-tab nav-tab-hackmd">
+  <li class="nav-item nav-tab-hackmd">
     <a
     <a
-      {% if user %} href="#hackmd" data-toggle="tab" class="edit-button" {% endif %}
+      {% if user %} href="#hackmd" data-toggle="tab" class="nav-link edit-button" {% endif %}
       {% if not user %}
       {% if not user %}
-        class="edit-button edit-button-disabled"
+        class="nav-link edit-button edit-button-disabled"
         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 %}
     >
     >
@@ -40,77 +40,85 @@
   {#
   {#
     Right Tabs
     Right Tabs
   #}
   #}
+  {# to place right side #}
+  <div class="mr-auto"></div>
+
+  {% if not page.isPortal() %}
+  <li class="nav-item">
+    <a href="?presentation=1" class="nav-link toggle-presentation">
+      <i class="icon-film"></i><span class="d-none d-sm-inline"> {{ t('Presentation Mode') }}</span>
+    </a>
+  </li>
+  {% endif %}
+
+  <li class="nav-item">
+    <a href="#revision-history" class="nav-link" data-toggle="tab">
+      <i class="icon-layers"></i><span class="d-none d-sm-inline"> {{ t('History') }}</span>
+    </a>
+  </li>
+  
   {% if !isTrashPage() %}
   {% if !isTrashPage() %}
     {% if page.isPortal() %}
     {% if page.isPortal() %}
-    <li class="float-right dropdown">
+    <li class="nav-item dropdown">
       <a
       <a
-        {% if user %} role="button" class="dropdown-toggle" 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 %}
       >
       >
         <i class="icon-options-vertical"></i>
         <i class="icon-options-vertical"></i>
       </a>
       </a>
-      <ul class="dropdown-menu">
-        <li><a href="#" data-target="#create-template" data-toggle="modal"><i class="icon-fw icon-magic-wand"></i> {{ t('template.option_label.create/edit') }}</a></li>
+      <ul class="dropdown-menu dropdown-menu-right">
+        <li class="dropdown-item">
+          <a href="#" data-target="#create-template" data-toggle="modal"><i class="icon-fw icon-magic-wand"></i> {{ t('template.option_label.create/edit') }}</a>
+        </li>
         {% if ('/' !== path) %}
         {% if ('/' !== path) %}
-        <li class="divider"></li>
-        <li><a href="#" data-target="#unportalize" data-toggle="modal"><i class="fa fa-share"></i> {{ t('Unportalize') }}</a></li>
+        <li class="dropdown-divider"></li>
+        <li class="dropdown-item"><a href="#" data-target="#unportalize" data-toggle="modal"><i class="fa fa-share"></i> {{ t('Unportalize') }}</a></li>
         {% endif %}
         {% endif %}
       </ul>
       </ul>
     </li>
     </li>
     {% else %}
     {% else %}
-    <li class="dropdown float-right">
+    <li class="nav-item dropdown">
       <a
       <a
-        {% if user %} role="button" class="dropdown-toggle" 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 %}
       >
       >
         <i class="icon-options-vertical"></i>
         <i class="icon-options-vertical"></i>
       </a>
       </a>
-      <ul class="dropdown-menu">
-        <li><a href="#" data-target="#renamePage" data-toggle="modal"><i class="icon-fw icon-action-redo"></i> {{ t('Move/Rename') }}</a></li>
-        <li><a href="#" data-target="#duplicatePage" data-toggle="modal"><i class="icon-fw icon-docs"></i> {{ t('Duplicate') }}</a></li>
-        <li class="divider"></li>
-        <li><a href="#" data-target="#create-template" data-toggle="modal"><i class="icon-fw icon-magic-wand"></i> {{ t('template.option_label.create/edit') }}</a></li>
+      <ul class="dropdown-menu dropdown-menu-right">
+        <li class="dropdown-item"><a href="#" data-target="#renamePage" data-toggle="modal"><i class="icon-fw icon-action-redo"></i> {{ t('Move/Rename') }}</a></li>
+        <li class="dropdown-item"><a href="#" data-target="#duplicatePage" data-toggle="modal"><i class="icon-fw icon-docs"></i> {{ t('Duplicate') }}</a></li>
+        <li class="dropdown-divider"></li>
+        <li class="dropdown-item">
+          <a href="#" data-target="#create-template" data-toggle="modal"><i class="icon-fw icon-magic-wand"></i> {{ t('template.option_label.create/edit') }}</a>
+        </li>
         {% if isDeletablePage() %}
         {% if isDeletablePage() %}
-        <li class="divider"></li>
-        <li><a href="#" data-target="#deletePage" data-toggle="modal"><i class="icon-fw icon-fire text-danger"></i> {{ t('Delete') }}</a></li>
+        <li class="dropdown-divider"></li>
+        <li class="dropdown-item"><a href="#" data-target="#deletePage" data-toggle="modal"><i class="icon-fw icon-fire text-danger"></i> {{ t('Delete') }}</a></li>
         {% endif %}
         {% endif %}
       </ul>
       </ul>
     </li>
     </li>
     {% endif %}
     {% endif %}
   {% endif %}
   {% endif %}
 
 
-  <li class="float-right">
-    <a href="#revision-history" data-toggle="tab">
-      <i class="icon-layers"></i><span class="hidden-xs"> {{ t('History') }}</span>
-    </a>
-  </li>
-  {% if not page.isPortal() %}
-    <li class="float-right">
-      <a href="?presentation=1" class="toggle-presentation">
-        <i class="icon-film"></i><span class="hidden-xs"> {{ t('Presentation Mode') }}</span>
-      </a>
-    </li>
-  {% endif %}
-
 </ul>
 </ul>
 
 
 {% else %} {# for creating portal #}
 {% else %} {# for creating portal #}
 
 
-<ul class="nav nav-tabs nav-tabs-create-portal hidden-print">
+<ul class="nav nav-tabs nav-tabs-create-portal d-print-none">
 
 
-  <li class="nav-item grw-nav-main-left-tab">
+  <li class="nav-item ">
     <a id="portal-form-close" class="nav-link" href="#" data-toggle="tab">
     <a id="portal-form-close" class="nav-link" href="#" data-toggle="tab">
       <i class="icon-action-undo"></i> {{ t('Cancel') }}
       <i class="icon-action-undo"></i> {{ t('Cancel') }}
     </a>
     </a>
   </li>
   </li>
 
 
-  <li class="nav-item grw-nav-main-left-tab active">
+  <li class="nav-item  active">
     <a class="nav-link">
     <a class="nav-link">
       <i class="icon-note"></i> {{ t('Create') }}
       <i class="icon-note"></i> {{ t('Create') }}
     </a>
     </a>

+ 0 - 3
src/server/views/widget/user_page_header.html

@@ -27,8 +27,5 @@
         </ul>
         </ul>
       </div>
       </div>
     </div>
     </div>
-    <div class="d-flex">
-      {% include 'header-buttons-lg.html' %}
-    </div>
   </div>
   </div>
 </header>
 </header>