Browse Source

add pagination

itizawa 5 years ago
parent
commit
fd525bba14

+ 11 - 8
src/client/js/components/PageHistory.jsx

@@ -17,8 +17,16 @@ const logger = loggerFactory('growi:PageHistory');
 function PageHistory(props) {
   const { pageHistoryContainer } = props;
 
+  if (pageHistoryContainer.state.errorMessage) {
+    return (
+      <div className="my-5">
+        <div className="text-danger">{pageHistoryContainer.state.errorMessage}</div>
+      </div>
+    );
+  }
+
   if (pageHistoryContainer.state.revisions === pageHistoryContainer.dummyRevisions) {
-    throw new Promise(async() => {
+    throw new Promise(async(resolve, reject) => {
       try {
         await props.pageHistoryContainer.retrieveRevisions(1);
       }
@@ -26,6 +34,7 @@ function PageHistory(props) {
         toastError(err);
         pageHistoryContainer.setState({ errorMessage: err.message });
         logger.error(err);
+        throw new Error();
       }
     });
   }
@@ -48,7 +57,7 @@ function PageHistory(props) {
         <PaginationWrapper
           activePage={pageHistoryContainer.state.activePage}
           changePage={handlePage}
-          totalItemsCount={pageHistoryContainer.state.totalRevisions}
+          totalItemsCount={pageHistoryContainer.state.totalPages}
           pagingLimit={pageHistoryContainer.state.pagingLimit}
         />
       </div>
@@ -58,12 +67,6 @@ function PageHistory(props) {
 
   return (
     <div className="mt-4">
-      {pageHistoryContainer.state.errorMessage && (
-      <div className="my-5">
-        <div className="text-danger">{pageHistoryContainer.state.errorMessage}</div>
-      </div>
-        ) }
-
       {pager()}
       <PageRevisionList
         revisions={pageHistoryContainer.state.revisions}

+ 12 - 5
src/client/js/services/PageHistoryContainer.js

@@ -27,7 +27,7 @@ export default class PageHistoryContainer extends Container {
       revisions: this.dummyRevisions,
       diffOpened: {},
 
-      totalRevisions: 0,
+      totalPages: 0,
       activePage: 1,
       pagingLimit: Infinity,
     };
@@ -51,17 +51,24 @@ export default class PageHistoryContainer extends Container {
    */
   async retrieveRevisions(selectedPage) {
     const { pageId, shareLinkId } = this.pageContainer.state;
-    console.log(selectedPage);
     if (!pageId) {
       return;
     }
 
-    const res = await this.appContainer.apiv3Get('/revisions/list', { pageId, share_link_id: shareLinkId });
-    const rev = res.data.revisions;
+    const res = await this.appContainer.apiv3Get('/revisions/list', { pageId, share_link_id: shareLinkId, selectedPage });
+    const rev = res.data.docs;
+
+    // set Pagination state
+    this.setState({
+      activePage: selectedPage,
+      totalPages: res.data.totalPages,
+      pagingLimit: res.data.limit,
+    });
+
     const diffOpened = {};
     const lastId = rev.length - 1;
 
-    res.data.revisions.forEach((revision, i) => {
+    res.data.docs.forEach((revision, i) => {
       const user = revision.author;
       if (user) {
         rev[i].author = user;

+ 2 - 0
src/server/models/revision.js

@@ -6,6 +6,7 @@ module.exports = function(crowi) {
   const logger = require('@alias/logger')('growi:models:revision');
 
   const mongoose = require('mongoose');
+  const mongoosePaginate = require('mongoose-paginate-v2');
 
   const ObjectId = mongoose.Schema.Types.ObjectId;
   const revisionSchema = new mongoose.Schema({
@@ -24,6 +25,7 @@ module.exports = function(crowi) {
     createdAt: { type: Date, default: Date.now },
     hasDiffToPrev: { type: Boolean },
   });
+  revisionSchema.plugin(mongoosePaginate);
 
   /*
    * preparation for https://github.com/weseek/growi/issues/216

+ 18 - 2
src/server/routes/apiv3/revisions.js

@@ -9,6 +9,8 @@ const ErrorV3 = require('../../models/vo/error-apiv3');
 
 const router = express.Router();
 
+const PAGE_ITEMS = 30;
+
 /**
  * @swagger
  *  tags:
@@ -58,6 +60,8 @@ module.exports = (crowi) => {
     const { pageId } = req.query;
     const { isSharedPage } = req;
 
+    const selectedPage = parseInt(req.query.selectedPage) || 1;
+
     // check whether accessible
     if (!isSharedPage && !(await Page.isAccessiblePageByViewer(pageId, req.user))) {
       return res.apiv3Err(new ErrorV3('Current user is not accessible to this page.', 'forbidden-page'), 403);
@@ -65,8 +69,20 @@ module.exports = (crowi) => {
 
     try {
       const page = await Page.findOne({ _id: pageId });
-      const revisions = await Revision.findRevisionIdList(page.path);
-      return res.apiv3({ revisions });
+
+      const paginateResult = await Revision.paginate(
+        { path: page.path },
+        {
+          page: selectedPage,
+          limit: PAGE_ITEMS,
+          populate: {
+            path: 'author',
+            select: User.USER_PUBLIC_FIELDS,
+          },
+        },
+      );
+
+      return res.apiv3(paginateResult);
     }
     catch (err) {
       const msg = 'Error occurred in getting revisions by poge id';