Răsfoiți Sursa

Merge pull request #2377 from weseek/feat/export-page-button

Feat/export page button
N1koge 5 ani în urmă
părinte
comite
1b8cf9326b

+ 3 - 0
resource/locales/en-US/translation.json

@@ -685,5 +685,8 @@
     "Sign in error": "Login error",
     "Sign in error": "Login error",
     "Registration successful": "Registration successful",
     "Registration successful": "Registration successful",
     "Setup": "Setup"
     "Setup": "Setup"
+  },
+  "export_bulk": {
+    "failed_to_export": "Failed to export"
   }
   }
 }
 }

+ 3 - 0
resource/locales/ja/translation.json

@@ -674,5 +674,8 @@
     "Sign in error": "ログインエラー",
     "Sign in error": "ログインエラー",
     "Registration successful": "登録完了",
     "Registration successful": "登録完了",
     "Setup": "セットアップ"
     "Setup": "セットアップ"
+  },
+  "export_bulk": {
+    "failed_to_export": "ファイルのエクスポートに失敗しました"
   }
   }
 }
 }

+ 29 - 0
src/client/js/components/Page/PageShareManagement.jsx

@@ -8,6 +8,8 @@ import AppContainer from '../../services/AppContainer';
 import PageContainer from '../../services/PageContainer';
 import PageContainer from '../../services/PageContainer';
 import OutsideShareLinkModal from '../OutsideShareLinkModal';
 import OutsideShareLinkModal from '../OutsideShareLinkModal';
 
 
+import { toastError } from '../../util/apiNotification';
+
 
 
 const PageShareManagement = (props) => {
 const PageShareManagement = (props) => {
   const { t, appContainer, pageContainer } = props;
   const { t, appContainer, pageContainer } = props;
@@ -24,6 +26,27 @@ const PageShareManagement = (props) => {
     setIsOutsideShareLinkModalShown(false);
     setIsOutsideShareLinkModalShown(false);
   }
   }
 
 
+
+  async function getExportPageFile(type) {
+    const pageId = pageContainer.state.pageId;
+    try {
+      const res = await appContainer.apiv3Get('/pages/export', { pageId, type });
+      return res;
+    }
+    catch (err) {
+      toastError(Error(t('export_bulk.failed_to_export')));
+    }
+  }
+
+  function exportPage(exportPageFile) {
+    // TODO implement
+  }
+
+  function exportPageHundler(type) {
+    const exportPageFile = getExportPageFile(type);
+    exportPage(exportPageFile);
+  }
+
   function renderModals() {
   function renderModals() {
     return (
     return (
       <>
       <>
@@ -75,6 +98,12 @@ const PageShareManagement = (props) => {
           <i className="icon-fw icon-link"></i>{t('Shere this page link to public')}
           <i className="icon-fw icon-link"></i>{t('Shere this page link to public')}
           <span className="ml-2 badge badge-info badge-pill">{pageContainer.state.shareLinksNumber}</span>
           <span className="ml-2 badge badge-info badge-pill">{pageContainer.state.shareLinksNumber}</span>
         </button>
         </button>
+        <button type="button" className="dropdown-item" onClick={() => { exportPageHundler('markdown') }}>
+          <span>Export page as Markdown</span>
+        </button>
+        <button type="button" className="dropdown-item" onClick={() => { exportPageHundler('pdf') }}>
+          <span>Export page as PDF</span>
+        </button>
       </div>
       </div>
       {renderModals()}
       {renderModals()}
     </>
     </>

+ 16 - 0
src/server/routes/apiv3/pages.js

@@ -84,5 +84,21 @@ module.exports = (crowi) => {
     }
     }
   });
   });
 
 
+  /**
+  * @swagger
+  *
+  *    /pages/export:
+  *      get:
+  *        tags: [Export]
+  *        description: get currently page file as md or pdf
+  *        responses:
+  *          200:
+  *            description: Return currently page file
+  */
+  router.get('/export', async(req, res) => {
+    // TODO use res.apiv3
+    return res.json({ ok: true });
+  });
+
   return router;
   return router;
 };
 };