mizozobu 7 лет назад
Родитель
Сommit
eb118ddf19

+ 19 - 5
src/client/js/components/MyDraftList/MyDraftList.jsx

@@ -29,17 +29,22 @@ export default class MyDraftList extends React.Component {
 
   async getDraftsFromLocalStorage() {
     const draftsAsObj = JSON.parse(this.props.crowi.localStorage.getItem('draft') || '{}');
+
+    const res = await this.props.crowi.apiGet('/pages.exist', {
+      pages: draftsAsObj,
+    });
+
     // {'/a': '#a', '/b': '#b'} => [{path: '/a', markdown: '#a'}, {path: '/b', markdown: '#b'}]
     const drafts = Object.entries(draftsAsObj).map((d) => {
+      const path = d[0];
       return {
-        path: d[0],
+        path,
         markdown: d[1],
+        isExist: res.pages[path],
       };
     });
 
-    this.setState({
-      drafts,
-    });
+    this.setState({ drafts });
   }
 
   getCurrentDrafts(selectPageNumber) {
@@ -91,7 +96,16 @@ export default class MyDraftList extends React.Component {
    */
   generateDraftList(drafts) {
     return drafts.map((draft) => {
-      return <Draft key={draft.path} crowi={this.props.crowi} draft={draft} clearDraft={this.clearDraft} />;
+      return (
+        <Draft
+          key={draft.path}
+          crowi={this.props.crowi}
+          path={draft.path}
+          markdown={draft.markdown}
+          isExist={draft.isExist}
+          clearDraft={this.clearDraft}
+        />
+      );
     });
   }
 

+ 7 - 5
src/client/js/components/PageList/Draft.jsx

@@ -6,16 +6,16 @@ export default class Draft extends React.Component {
   render() {
     return (
       <li className="page-list-li d-flex align-items-center">
-        <a href={`${this.props.draft.path}#edit`} target="_blank" rel="noopener noreferrer">
+        <a href={`${this.props.path}#edit`} target="_blank" rel="noopener noreferrer">
           <button type="button" className="btn-primary p-0">
             <span className="icon-note"></span>
           </button>
         </a>
-        <button type="button" className="btn-danger p-0" onClick={() => { return this.props.clearDraft(this.props.draft.path) }}>
+        <button type="button" className="btn-danger p-0" onClick={() => { return this.props.clearDraft(this.props.path) }}>
           <span className="icon-trash"></span>
         </button>
-        <a className="page-list-link px-3" href={this.props.draft.path}>
-          {this.props.draft.path}
+        <a className="page-list-link px-3" href={this.props.path}>
+          {this.props.path} {this.props.markdown} {this.props.isExist ? 'exists' : ''}
         </a>
       </li>
     );
@@ -25,6 +25,8 @@ export default class Draft extends React.Component {
 
 Draft.propTypes = {
   crowi: PropTypes.object.isRequired,
-  draft: PropTypes.object.isRequired,
+  path: PropTypes.string.isRequired,
+  markdown: PropTypes.string.isRequired,
+  isExist: PropTypes.bool.isRequired,
   clearDraft: PropTypes.func.isRequired,
 };

+ 1 - 0
src/server/routes/index.js

@@ -193,6 +193,7 @@ module.exports = function(crowi, app) {
   app.post('/_api/pages.create'       , accessTokenParser , loginRequired(crowi, app) , csrf, page.api.create);
   app.post('/_api/pages.update'       , accessTokenParser , loginRequired(crowi, app) , csrf, page.api.update);
   app.get('/_api/pages.get'           , accessTokenParser , loginRequired(crowi, app, false) , page.api.get);
+  app.get('/_api/pages.exist'         , accessTokenParser , loginRequired(crowi, app, false) , page.api.exist);
   app.get('/_api/pages.updatePost', accessTokenParser, loginRequired(crowi, app, false), page.api.getUpdatePost);
   app.get('/_api/pages.getPageTag'    , accessTokenParser , loginRequired(crowi, app, false) , page.api.getPageTag);
   // allow posting to guests because the client doesn't know whether the user logged in

+ 23 - 0
src/server/routes/page.js

@@ -722,6 +722,29 @@ module.exports = function(crowi, app) {
     return res.json(ApiResponse.success(result));
   };
 
+  /**
+   * @api {get} /pages.exist Get if page exists
+   * @apiName GetPage
+   * @apiGroup Page
+   *
+   * @apiParam {String} pages (stringified JSON)
+   */
+  api.exist = async function(req, res) {
+    const pagesAsObj = JSON.parse(req.query.pages || '{}');
+    const pagePaths = Object.keys(pagesAsObj);
+
+    await Promise.all(pagePaths.map(async(path) => {
+      // check page existence
+      const isExist = await Page.count({ path }) > 0;
+      pagesAsObj[path] = isExist;
+      return;
+    }));
+
+    const result = { pages: pagesAsObj };
+
+    return res.json(ApiResponse.success(result));
+  };
+
   /**
    * @api {get} /pages.getPageTag get page tags
    * @apiName GetPageTag