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
This commit is contained in:
Ghassen Rjab 2017-09-24 02:14:23 +01:00
parent 6e5d9f9bb6
commit 28eca2a11f

View file

@ -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;