Explorar o código

Merge branch 'GhassenRjab-feature/keep-state-checklist' into devel

Keep state of checklist items when moved to another checklist.
Thanks to GhassenRjab ! Related #876
Lauri Ojansivu %!s(int64=7) %!d(string=hai) anos
pai
achega
d974311d9b

+ 2 - 1
CHANGELOG.md

@@ -7,7 +7,8 @@ This release adds the following new features:
 
 and fixes the following bugs:
 
-* [Checklist items are lost when moving items to another checklist](https://github.com/wekan/wekan/pull/1240).
+* [Checklist items are lost when moving items to another checklist](https://github.com/wekan/wekan/pull/1240);
+* [Keep state of checklist items when moved to another checklist](https://github.com/wekan/wekan/pull/1242).
 
 Thanks to GitHub users GhassenRjab, umbertooo and xet7 for their contributions.
 

+ 1 - 1
client/components/cards/checklists.jade

@@ -47,7 +47,7 @@ template(name="editChecklistItemForm")
 
 template(name="checklistItems")
   .checklist-items.js-checklist-items
-    each item in checklist.getItems
+    each item in checklist.getItemsSorted
       +inlinedForm(classNames="js-edit-checklist-item" item = item checklist = checklist)
         +editChecklistItemForm(type = 'item' item = item checklist = checklist)
       else

+ 13 - 11
client/components/cards/checklists.js

@@ -20,24 +20,26 @@ function initSorting(items) {
       });
       items.sortable('cancel');
       const formerParent = ui.item.parents('.js-checklist-items');
-      let checklist = Blaze.getData(parent.get(0)).checklist;
+      const checklist = Blaze.getData(parent.get(0)).checklist;
       const oldChecklist = Blaze.getData(formerParent.get(0)).checklist;
       if (oldChecklist._id !== checklist._id) {
         const currentItem = Blaze.getData(ui.item.get(0)).item;
         for (let i = 0; i < orderedItems.length; i++) {
-          let itemId = orderedItems[i];
+          const itemId = orderedItems[i];
           if (itemId !== currentItem._id) continue;
-          checklist.addItem(currentItem.title);
-          checklist = Checklists.findOne({_id: checklist._id});
-          itemId = checklist._id + (checklist.newItemIndex - 1);
-          if (currentItem.finished) {
-            checklist.finishItem(itemId);
-          }
-          orderedItems[i] = itemId;
-          oldChecklist.removeItem(currentItem._id);
+          const newItem = {
+            _id: checklist.getNewItemId(),
+            title: currentItem.title,
+            sort: i,
+            isFinished: currentItem.isFinished,
+          };
+          checklist.addFullItem(newItem);
+          orderedItems[i] = currentItem._id;
+          oldChecklist.removeItem(itemId);
         }
+      } else {
+        checklist.sortItems(orderedItems);
       }
-      checklist.sortItems(orderedItems);
     },
   });
 }

+ 44 - 21
models/checklists.js

@@ -44,11 +44,6 @@ Checklists.attachSchema(new SimpleSchema({
     type: Number,
     decimal: true,
   },
-  newItemIndex: {
-    type: Number,
-    decimal: true,
-    defaultValue: 0,
-  },
 }));
 
 const self = Checklists;
@@ -57,16 +52,8 @@ Checklists.helpers({
   itemCount() {
     return this.items.length;
   },
-  getItems() {
-    return this.items.sort(function (itemA, itemB) {
-      if (itemA.sort < itemB.sort) {
-        return -1;
-      }
-      if (itemA.sort > itemB.sort) {
-        return 1;
-      }
-      return 0;
-    });
+  getItemsSorted() {
+    return _.sortBy(this.items, 'sort');
   },
   finishedCount() {
     return this.items.filter((item) => {
@@ -83,6 +70,16 @@ Checklists.helpers({
     const items = self.findOne({_id : this._id}).items;
     return _.pluck(items, '_id').indexOf(itemId);
   },
+  getNewItemId() {
+    const itemCount = this.itemCount();
+    let idx = 0;
+    if (itemCount > 0) {
+      const lastId = this.items[itemCount - 1]._id;
+      const lastIdSuffix = lastId.substr(this._id.length);
+      idx = parseInt(lastIdSuffix, 10) + 1;
+    }
+    return `${this._id}${idx}`;
+  },
 });
 
 Checklists.allow({
@@ -112,14 +109,40 @@ Checklists.mutations({
   },
   //for items in checklist
   addItem(title) {
-    const itemCount = this.itemCount();
-    const _id = `${this._id}${this.newItemIndex}`;
+    const _id = this.getNewItemId();
     return {
-      $addToSet: { items: { _id, title, isFinished: false, sort: itemCount } },
-      $set: { newItemIndex: this.newItemIndex + 1},
+      $addToSet: {
+        items: {
+          _id, title,
+          isFinished: false,
+          sort: this.itemCount(),
+        },
+      },
     };
   },
+  addFullItem(item) {
+    const itemsUpdate = {};
+    this.items.forEach(function(iterItem, index) {
+      if (iterItem.sort >= item.sort) {
+        itemsUpdate[`items.${index}.sort`] = iterItem.sort + 1;
+      }
+    });
+    if (!_.isEmpty(itemsUpdate)) {
+      self.direct.update({ _id: this._id }, { $set: itemsUpdate });
+    }
+    return { $addToSet: { items: item } };
+  },
   removeItem(itemId) {
+    const item = this.getItem(itemId);
+    const itemsUpdate = {};
+    this.items.forEach(function(iterItem, index) {
+      if (iterItem.sort > item.sort) {
+        itemsUpdate[`items.${index}.sort`] = iterItem.sort - 1;
+      }
+    });
+    if (!_.isEmpty(itemsUpdate)) {
+      self.direct.update({ _id: this._id }, { $set: itemsUpdate });
+    }
     return { $pull: { items: { _id: itemId } } };
   },
   editItem(itemId, title) {
@@ -169,11 +192,11 @@ Checklists.mutations({
   },
   sortItems(itemIDs) {
     const validItems = [];
-    for (const itemID of itemIDs) {
+    itemIDs.forEach((itemID) => {
       if (this.getItem(itemID)) {
         validItems.push(this.itemIndex(itemID));
       }
-    }
+    });
     const modifiedValues = {};
     for (let i = 0; i < validItems.length; i++) {
       modifiedValues[`items.${validItems[i]}.sort`] = i;

+ 1 - 6
server/migrations.js

@@ -136,12 +136,7 @@ Migrations.add('add-sort-checklists', () => {
     if (!checklist.hasOwnProperty('sort')) {
       Checklists.direct.update(
         checklist._id,
-        {
-          $set: {
-            sort: index,
-            newItemIndex: checklist.items.length,
-          },
-        },
+        { $set: { sort: index } },
         noValidate
       );
     }