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

# Feature/45 duplicate page
* Add duplicate-page button to page pulldown menu.

Tatsuya Ise 8 лет назад
Родитель
Сommit
767c94cf65

+ 9 - 0
lib/locales/en-US/translation.json

@@ -2,6 +2,7 @@
   "Help": "Help",
   "Edit": "Edit",
   "Delete": "Delete",
+  "Duplicate": "Duplicate",
   "Move": "Move",
   "Moved": "Moved",
   "Unlinked": "Unlinked",
@@ -172,6 +173,14 @@
     }
   },
 
+  "modal_duplicate": {
+    "label": {
+      "Duplicate page": "Duplicate page",
+      "New page name": "New page name",
+      "Current page name": "Current page name"
+    }
+  },
+
   "modal_putBack": {
     "label": {
       "Put Back Page": "Put Back Page",

+ 9 - 0
lib/locales/ja/translation.json

@@ -2,6 +2,7 @@
   "Help": "ヘルプ",
   "Edit": "編集",
   "Delete": "削除",
+  "Duplicate": "複製",
   "Move": "移動",
   "Moved": "移動しました",
   "Unlinked": "リダイレクト削除",
@@ -171,6 +172,14 @@
     }
   },
 
+  "modal_duplicate": {
+    "label": {
+      "Duplicate page": "ページを複製する",
+      "New page name": "複製後のページ名",
+      "Current page name": "現在のページ名"
+    }
+  },
+
   "modal_putBack": {
     "label": {
       "Put Back Page": "ページを元に戻す",

+ 3 - 0
lib/views/page.html

@@ -120,6 +120,8 @@
       </a>
       <ul class="dropdown-menu">
        <li><a href="#" data-target="#renamePage" data-toggle="modal"><i class="fa fa-share"></i> {{ t('Move') }}</a></li>
+       <li class="divider"></li>
+       <li><a href="#" data-target="#duplicatePage" data-toggle="modal"><i class="fa fa-share"></i> {{ t('Duplicate') }}</a></li>
        {% if isDeletablePage() %}
        <li class="divider"></li>
        <li class=""><a href="#" data-target="#deletePage" data-toggle="modal"><i class="fa fa-trash-o text-danger"></i> {{ t('Delete') }}</a></li>
@@ -265,6 +267,7 @@
 <div id="crowi-modals">
   {% include 'modal/rename.html' %}
   {% include 'modal/delete.html' %}
+  {% include 'modal/duplicate.html' %}
   {% include 'modal/put_back.html' %}
   {% include 'modal/page_name_warning.html' %}
 </div>

+ 39 - 0
resource/js/legacy/crowi.js

@@ -312,6 +312,45 @@ $(function() {
     return false;
   });
 
+  // duplicate
+  $('#duplicatePage').on('shown.bs.modal', function (e) {
+    $('#newPageName').focus();
+  });
+  $('#duplicatePageForm, #unportalize-form').submit(function (e) {
+    // create name-value map
+    let nameValueMap = {};
+    $(this).serializeArray().forEach((obj) => {
+      nameValueMap[obj.name] = obj.value;
+    })
+
+    $.ajax({
+      type: 'POST',
+      url: '/_api/pages.duplicate',
+      data: $(this).serialize(),
+      dataType: 'json'
+    }).done(function (res) {
+      if (!res.ok) {
+        // if already exists
+        $('#newPageNameCheck').html('<i class="fa fa-times-circle"></i> ' + res.error);
+        $('#newPageNameCheck').addClass('alert-danger');
+        $('#linkToNewPage').html(`
+          <i class="fa fa-fw fa-arrow-right"></i><a href="${nameValueMap.new_path}">${nameValueMap.new_path}</a>
+        `);
+      } else {
+        var page = res.page;
+
+        $('#newPageNameCheck').removeClass('alert-danger');
+        $('#newPageNameCheck').html('<img src="/images/loading_s.gif"> Page duplicated! Redirecting to new page location.');
+
+        setTimeout(function () {
+          top.location.href = page.path + '?duplicated=' + pagePath;
+        }, 1000);
+      }
+    });
+
+    return false;
+  });
+
   // delete
   $('#delete-page-form').submit(function(e) {
     $.ajax({