From 28eca2a11fd789b280b140bebf87c61a3e63f4f4 Mon Sep 17 00:00:00 2001 From: Ghassen Rjab Date: Sun, 24 Sep 2017 02:14:23 +0100 Subject: Update Checklist model to keep checklist item state when moved - Remove newItemIndex field (no longer needed) - Use Underscore.js to sort checklist items - Add helper method to generate new Items Ids so we can use it in model and in client - Add addFullItem method to add an item from object - Update sort when items are being added or removed --- models/checklists.js | 65 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 21 deletions(-) (limited to 'models/checklists.js') diff --git a/models/checklists.js b/models/checklists.js index 35ef8ae1..b90656e4 100644 --- a/models/checklists.js +++ b/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; -- cgit v1.2.3-1-g7c22