Explorar el Código

Merge branch 'master' into feat/integrate-with-hackmd

# Conflicts:
#	resource/js/components/SearchPage/SearchResult.js
Yuki Takei hace 7 años
padre
commit
03ba0e0afa

+ 15 - 0
lib/models/page.js

@@ -1060,8 +1060,14 @@ module.exports = function(crowi) {
   pageSchema.statics.deletePage = function(pageData, user, options) {
   pageSchema.statics.deletePage = function(pageData, user, options) {
     var Page = this
     var Page = this
       , newPath = Page.getDeletedPageName(pageData.path)
       , newPath = Page.getDeletedPageName(pageData.path)
+      , isTrashed = checkIfTrashed(pageData.path)
       ;
       ;
+
     if (Page.isDeletableName(pageData.path)) {
     if (Page.isDeletableName(pageData.path)) {
+      if (isTrashed) {
+        return Page.completelyDeletePage(pageData, user, options);
+      }
+
       return Page.rename(pageData, newPath, user, {createRedirectPage: true})
       return Page.rename(pageData, newPath, user, {createRedirectPage: true})
         .then((updatedPageData) => {
         .then((updatedPageData) => {
           return Page.updatePageProperty(updatedPageData, {status: STATUS_DELETED, lastUpdateUser: user});
           return Page.updatePageProperty(updatedPageData, {status: STATUS_DELETED, lastUpdateUser: user});
@@ -1075,12 +1081,21 @@ module.exports = function(crowi) {
     }
     }
   };
   };
 
 
+  const checkIfTrashed = (path) => {
+    return (path.search(/^\/trash/) !== -1);
+  };
+
   pageSchema.statics.deletePageRecursively = function(pageData, user, options) {
   pageSchema.statics.deletePageRecursively = function(pageData, user, options) {
     var Page = this
     var Page = this
       , path = pageData.path
       , path = pageData.path
       , options = options || {}
       , options = options || {}
+      , isTrashed = checkIfTrashed(pageData.path);
       ;
       ;
 
 
+    if (isTrashed) {
+      return Page.completelyDeletePageRecursively(pageData, user, options);
+    }
+
     return Page.generateQueryToListWithDescendants(path, user, options)
     return Page.generateQueryToListWithDescendants(path, user, options)
       .then(function(pages) {
       .then(function(pages) {
         return Promise.all(pages.map(function(page) {
         return Promise.all(pages.map(function(page) {

+ 1 - 1
lib/models/revision.js

@@ -11,7 +11,7 @@ module.exports = function(crowi) {
     body: { type: String, required: true, get: (data) => {
     body: { type: String, required: true, get: (data) => {
       // replace CR/CRLF to LF above v3.1.5
       // replace CR/CRLF to LF above v3.1.5
       // see https://github.com/weseek/growi/issues/463
       // see https://github.com/weseek/growi/issues/463
-      return data.replace(/\r\n?/g, '\n');
+      return data ? data.replace(/\r\n?/g, '\n') : '';
     }},
     }},
     format: { type: String, default: 'markdown' },
     format: { type: String, default: 'markdown' },
     author: { type: ObjectId, ref: 'User' },
     author: { type: ObjectId, ref: 'User' },

+ 2 - 2
lib/routes/page.js

@@ -1039,9 +1039,9 @@ module.exports = function(crowi, app) {
     const previousRevision = req.body.revision_id || null;
     const previousRevision = req.body.revision_id || null;
 
 
     // get completely flag
     // get completely flag
-    const isCompletely = (req.body.completely !== undefined);
+    const isCompletely = (req.body.completely != null);
     // get recursively flag
     // get recursively flag
-    const isRecursively = (req.body.recursively !== undefined);
+    const isRecursively = (req.body.recursively != null);
 
 
     Page.findPageByIdAndGrantedUser(pageId, req.user)
     Page.findPageByIdAndGrantedUser(pageId, req.user)
       .then(function(pageData) {
       .then(function(pageData) {

+ 33 - 21
resource/js/components/SearchPage/SearchResult.js

@@ -1,5 +1,6 @@
 import React from 'react';
 import React from 'react';
 import PropTypes from 'prop-types';
 import PropTypes from 'prop-types';
+import * as toastr from 'toastr';
 
 
 import Page from '../PageList/Page';
 import Page from '../PageList/Page';
 import SearchResultList from './SearchResultList';
 import SearchResultList from './SearchResultList';
@@ -106,30 +107,41 @@ export default class SearchResult extends React.Component {
    * @memberof SearchResult
    * @memberof SearchResult
    */
    */
   deleteSelectedPages() {
   deleteSelectedPages() {
-    let isDeleted = true;
     let deleteCompletely = this.state.isDeleteCompletely;
     let deleteCompletely = this.state.isDeleteCompletely;
-    Array.from(this.state.selectedPages).map((page) => {
-      const pageId = page._id;
-      const revisionId = page.revision._id;
-      this.props.crowi.apiPost('/pages.remove',
-        {page_id: pageId, revision_id: revisionId, completely: deleteCompletely})
-      .then(res => {
-        if (res.ok) {
-          this.state.selectedPages.delete(page);
-        }
-        else {
-          isDeleted = false;
-        }
-      }).catch(err => {
-        console.error(err.message);   // eslint-disable-line no-console
-        isDeleted = false;
-        this.setState({errorMessageForDeleting: err.message});
+    Promise.all(Array.from(this.state.selectedPages).map((page) => {
+      return new Promise((resolve, reject) => {
+        const pageId = page._id;
+        const revisionId = page.revision._id;
+        this.props.crowi.apiPost('/pages.remove', {page_id: pageId, revision_id: revisionId, completely: deleteCompletely})
+          .then(res => {
+            if (res.ok) {
+              this.state.selectedPages.delete(page);
+              return resolve();
+            }
+            else {
+              return reject();
+            }
+          })
+          .catch(err => {
+            console.log(err.message);   // eslint-disable-line no-console
+            this.setState({errorMessageForDeleting: err.message});
+            return reject();
+          });
       });
       });
-    });
-
-    if ( isDeleted ) {
+    }))
+    .then(() => {
       window.location.reload();
       window.location.reload();
-    }
+    })
+    .catch(err => {
+      toastr.error(err, 'Error occured', {
+        closeButton: true,
+        progressBar: true,
+        newestOnTop: false,
+        showDuration: '100',
+        hideDuration: '100',
+        timeOut: '3000',
+      });
+    });
   }
   }
 
 
   /**
   /**