Przeglądaj źródła

Use the copyBoard method to duplicate a board

* Use `copyBoard` instead of `cloneBoard` to duplicate a board
* Give duplicated boards a unique title by appending number
John R. Supplee 4 lat temu
rodzic
commit
b249fcbb2e

+ 6 - 2
client/components/boards/boardsList.js

@@ -124,9 +124,13 @@ BlazeComponent.extendComponent({
         },
         'click .js-clone-board'(evt) {
           Meteor.call(
-            'cloneBoard',
+            'copyBoard',
             this.currentData()._id,
-            Session.get('fromBoard'),
+            {
+              sort: Boards.find({ archived: false }).count(),
+              type: 'board',
+              title: Boards.findOne(this.currentData()._id).copyTitle(),
+            },
             (err, res) => {
               if (err) {
                 this.setError(err.error);

+ 0 - 1
client/components/lists/listBody.js

@@ -687,7 +687,6 @@ BlazeComponent.extendComponent({
                 _id = data;
               },
             );
-            // _id = board.copy();
           }
           Popup.close();
         },

+ 22 - 0
models/boards.js

@@ -562,6 +562,28 @@ Boards.helpers({
       Rules.insert(rule);
     });
   },
+  /**
+   * Return a unique title based on the current title
+   *
+   * @returns {string|null}
+   */
+  copyTitle() {
+    const m = this.title.match(/^(?<title>.*?)\s*(\[(?<num>\d+)]\s*$|\s*$)/);
+    const title = m.groups.title;
+    let num = 0;
+    Boards.find({ title: new RegExp(`^${title}\\s*\\[\\d+]\\s*$`) }).forEach(
+      board => {
+        const m = board.title.match(/^(?<title>.*?)\s*\[(?<num>\d+)]\s*$/);
+        if (m) {
+          const n = parseInt(m.groups.num, 10);
+          num = num < n ? n : num;
+        }
+      },
+    );
+
+    return `${title} [${num + 1}]`;
+  },
+
   /**
    * Is supplied user authorized to view this board?
    */