فهرست منبع

Merge pull request #2087 from weseek/feat/remove-delete-pages

Feat/remove delete pages
itizawa 6 سال پیش
والد
کامیت
827d8f691d

+ 21 - 1
src/client/js/legacy/crowi.js

@@ -360,8 +360,28 @@ $(() => {
   });
   });
 
 
   // empty trash
   // empty trash
+  $('#emptyTrash').on('shown.bs.modal', (e) => {
+    $('#emptyTrash .msg').hide();
+  });
   $('#empty-trash-form').submit((e) => {
   $('#empty-trash-form').submit((e) => {
-    // TODO GW-2060 create api
+    // create name-value map
+    const nameValueMap = {};
+    $('#empty-trash-form').serializeArray().forEach((obj) => {
+      nameValueMap[obj.name] = obj.value;
+    });
+    $.ajax({
+      type: 'DELETE',
+      url: '/_api/v3/pages/empty-trash',
+      data: nameValueMap,
+      dataType: 'json',
+    }).done((res) => {
+      window.location.href = '/trash';
+    }).fail((jqXHR, textStatus, errorThrown) => {
+      $('#emptyTrash .msg').hide();
+      $('#emptyTrash .msg-unknown').show();
+    });
+
+    return false;
   });
   });
   // delete
   // delete
   $('#deletePage').on('shown.bs.modal', (e) => {
   $('#deletePage').on('shown.bs.modal', (e) => {

+ 2 - 0
src/server/routes/apiv3/index.js

@@ -39,5 +39,7 @@ module.exports = (crowi) => {
 
 
   router.use('/search', require('./search')(crowi));
   router.use('/search', require('./search')(crowi));
 
 
+  router.use('/pages', require('./pages')(crowi));
+
   return router;
   return router;
 };
 };

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

@@ -0,0 +1,48 @@
+const loggerFactory = require('@alias/logger');
+
+const logger = loggerFactory('growi:routes:apiv3:pages'); // eslint-disable-line no-unused-vars
+
+const express = require('express');
+
+
+const router = express.Router();
+
+/**
+ * @swagger
+ *  tags:
+ *    name: Pages
+ */
+module.exports = (crowi) => {
+  const loginRequired = require('../../middleware/login-required')(crowi);
+  const adminRequired = require('../../middleware/admin-required')(crowi);
+  const csrf = require('../../middleware/csrf')(crowi);
+
+  const Page = crowi.model('Page');
+
+  /**
+  * @swagger
+  *
+  *    /pages/empty-trash:
+  *      delete:
+  *        tags: [Pages]
+  *        description: empty trash
+  *        responses:
+  *          200:
+  *            description: Succeeded to remove all trash pages
+  */
+  router.delete('/empty-trash', loginRequired, adminRequired, csrf, async(req, res) => {
+    try {
+      const pages = await Page.deleteMany({
+        path: { $in: /^\/trash/ },
+      });
+      return res.apiv3({ pages });
+    }
+    catch (err) {
+      res.code = 'unknown';
+      logger.error('Failed to delete trash pages', err);
+      return res.apiv3Err(err, 500);
+    }
+  });
+
+  return router;
+};

+ 1 - 0
src/server/views/modal/empty_trash.html

@@ -30,6 +30,7 @@
       </div>
       </div>
       <div class="modal-footer">
       <div class="modal-footer">
         <div class="d-flex justify-content-end">
         <div class="d-flex justify-content-end">
+          {% include '../widget/modal/page-api-error-messages.html' %}
           <div>
           <div>
             <input type="hidden" name="_csrf" value="{{ csrf() }}">
             <input type="hidden" name="_csrf" value="{{ csrf() }}">
             <button type="submit" class="m-l-10 btn btn-danger delete-button">
             <button type="submit" class="m-l-10 btn btn-danger delete-button">

+ 1 - 1
src/server/views/widget/page_alerts.html

@@ -89,7 +89,7 @@
         {% endif %}
         {% endif %}
       </div>
       </div>
       <ul class="list-inline">
       <ul class="list-inline">
-        {% if user and user.admin and req.path == '/trash' %}
+        {% if user and user.admin and req.path == '/trash' and pages.length > 0 %}
         <li>
         <li>
           <button href="#" class="btn btn-danger btn-rounded btn-sm" data-target="#emptyTrash" data-toggle="modal"><i class="icon-trash" aria-hidden="true"></i>{{ t('modal_empty.empty_the_trash') }}</button>
           <button href="#" class="btn btn-danger btn-rounded btn-sm" data-target="#emptyTrash" data-toggle="modal"><i class="icon-trash" aria-hidden="true"></i>{{ t('modal_empty.empty_the_trash') }}</button>
         </li>
         </li>