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

Get list of all revision IDs and get body when selected.

Ryu Sato 5 лет назад
Родитель
Сommit
5677931907

+ 1 - 7
src/client/js/components/RevisionCompare/RevisionIdForm.jsx

@@ -19,18 +19,12 @@ class RevisionIdForm extends React.Component {
 
   revisionOptions() {
     const { revisionCompareContainer } = this.props;
-    return revisionCompareContainer.state.recentRevisions.map(rev => {
+    return revisionCompareContainer.state.revisions.map(rev => {
       return { label: `${new Date(rev.createdAt)} - ${rev._id}`, value: rev._id };
     });
   }
 
   async loadFilteredRevisionOptions(inputText, callback) {
-    console.log(`loadFilteredRevisionOptions is called`);
-    const { revisionCompareContainer } = this.props;
-
-    // If the RevisionId user entered exists, it is added to the list.
-    await revisionCompareContainer.fetchPageRevisionIfExists(inputText);
-
     // Filter the RevisionId that matches the text user entered.
     const revisionOptions = this.revisionOptions();
     const filteredRevisionOptions = revisionOptions.filter(rev => rev.label.toLowerCase().includes(inputText.toLowerCase()));

+ 44 - 37
src/client/js/services/RevisionCompareContainer.js

@@ -23,13 +23,13 @@ export default class RevisionCompareContainer extends Container {
       fromRevision: null,
       toRevision: null,
 
-      recentRevisions: [],
+      revisions: [],
     }
 
     this.readyRevisions = this.readyRevisions.bind(this);
     this.fetchPageRevisionBody = this.fetchPageRevisionBody.bind(this);
-    this.fetchPageRevisions = this.fetchPageRevisions.bind(this);
-    this.fetchPageRevisionIfExists = this.fetchPageRevisionIfExists.bind(this);
+    this.fetchAllPageRevisions = this.fetchAllPageRevisions.bind(this);
+    this.fetchPageRevision = this.fetchPageRevision.bind(this);
     this.handleFromRevisionChange = this.handleFromRevisionChange.bind(this);
     this.handleToRevisionChange = this.handleToRevisionChange.bind(this);
   }
@@ -44,17 +44,13 @@ export default class RevisionCompareContainer extends Container {
   async readyRevisions() {
     const [fromRevisionIdParam, toRevisionIdParam] = this.pageContainer.state.compareRevisionIds || [];
 
-    await this.fetchPageRevisions();
+    await this.fetchAllPageRevisions();
     if (fromRevisionIdParam) {
-      await this.fetchPageRevisionIfExists(fromRevisionIdParam);
+      await this.handleFromRevisionChange(fromRevisionIdParam);
     }
     if (toRevisionIdParam) {
-      await this.fetchPageRevisionIfExists(toRevisionIdParam);
+      await this.handleToRevisionChange(toRevisionIdParam);
     }
-
-    const fromRevision = this.state.recentRevisions.find(rev => rev._id === fromRevisionIdParam);
-    const toRevision = this.state.recentRevisions.find(rev => rev._id === toRevisionIdParam);
-    this.setState({ fromRevision, toRevision });
   }
 
   /**
@@ -66,7 +62,7 @@ export default class RevisionCompareContainer extends Container {
     try {
       const res = await this.appContainer.apiv3Get(`/revisions/${revisionId}`, { pageId, shareLinkId });
       if (res == null || res.data == undefined || res.data.revision == undefined) {
-        console.log(`cannot get revision: ${res}`);
+        logger.warn(`cannot get revision. revisionId: ${revisionId}`);
         return null;
       }
       return res.data.revision;
@@ -78,38 +74,49 @@ export default class RevisionCompareContainer extends Container {
     }
   }
 
-  async fetchPageRevisions() {
+  async fetchAllPageRevisions() {
     const { pageId, shareLinkId } = this.pageContainer.state;
-    const page = 1; // The pagination start number is fixed to 1.
-    const res = await this.appContainer.apiv3Get('/revisions/list', {
-      pageId, shareLinkId, page, limit: 2, // [TODO] Set limit
-    });
-    const recentRevisions = res.data.docs;
-    this.setState({ recentRevisions });
+
+    // fetch all page revisions that are sorted update day time descending
+    let page = 1;
+    let max = 1000; // Maximum number of loops to avoid infinite loops.
+    let newRevisions = [];
+    let res = null;
+    do {
+      res = await this.appContainer.apiv3Get('/revisions/list', {
+        pageId, shareLinkId, page,
+      });
+      newRevisions = newRevisions.concat(res.data.docs.map(rev => {
+        const { _id, createdAt } = rev;
+        return { _id, createdAt, body: null };
+      }));
+    } while(res.hasNextPage && --max > 0);
+
+    this.setState({ revisions: newRevisions });
   }
 
-  async fetchPageRevisionIfExists(revisionId) {
+  async fetchPageRevision(revisionId) {
     try {
-      const revision = await this.fetchPageRevisionBody(revisionId);
-      if (revision == null || this.state.recentRevisions.map(rev => rev._id).includes(revision._id)) {
+      const compactRevision = this.state.revisions.find(rev => rev._id === revisionId);
+      if (this.state.revisions.find(rev => rev._id === revisionId) === undefined) {
         return null;
       }
-
-      const newRecentRevisions = this.state.recentRevisions;
-      newRecentRevisions.push(revision);
-      // Update day time descending
-      newRecentRevisions.sort((a, b) => {
-        return new Date(b.createdAt) - new Date(a.createdAt);
-      });
-      this.setState({ recentRevisions: newRecentRevisions });
-      return revision;
+      if (compactRevision.body == null) {
+        const fullRevision = await this.fetchPageRevisionBody(revisionId);
+        compactRevision.body = fullRevision.body;
+
+        // cache revision body
+        const newRevisions = this.state.revisions.map(rev => {
+          if (rev._id === revisionId) {
+            return { ...rev, body: fullRevision.body };
+          }
+          return rev;
+        });
+        this.setState( { revisions: newRevisions });
+      }
+      return compactRevision;
     }
     catch (err) {
-      // If the RevisionId being entered is not correct, no special action will be taken.
-      // [TODO] ignore default error handling of apiv3ErrorHandler
-      if (err.length === 1 && err[0].code === 'validation_failed') {
-        return;
-      }
       toastError(err);
       this.setState({ errorMessage: err.message });
       logger.error(err);
@@ -117,12 +124,12 @@ export default class RevisionCompareContainer extends Container {
   }
 
   async handleFromRevisionChange(revisionId) {
-    const fromRevision = await this.fetchPageRevisionBody(revisionId);
+    const fromRevision = await this.fetchPageRevision(revisionId);
     this.setState({ fromRevision })
   }
 
   async handleToRevisionChange(revisionId) {
-    const toRevision = await this.fetchPageRevisionBody(revisionId);
+    const toRevision = await this.fetchPageRevision(revisionId);
     this.setState({ toRevision })
   }