Fixed a bug where moving documents around deleted docs breaks the ordering
This commit is contained in:
@@ -61,6 +61,8 @@ export function setDocToLastOrder({collection, doc}){
|
|||||||
}) + 1;
|
}) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update the order of a doc, and shift the siblings around to suit the new
|
||||||
|
// order
|
||||||
export function updateDocOrder({docRef, order}){
|
export function updateDocOrder({docRef, order}){
|
||||||
let doc = fetchDocByRef(docRef, {fields: {
|
let doc = fetchDocByRef(docRef, {fields: {
|
||||||
order: 1,
|
order: 1,
|
||||||
@@ -116,7 +118,7 @@ export function removedDocAtOrder({collection, doc}){
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function insertedDocAtOrder({collection, parentId, order}){
|
export function insertedDocAtOrder({collection, parentId, order}){
|
||||||
// Decrement the order of all docs after the removed doc
|
// Increment the order of all docs after the inserted doc
|
||||||
collection.update({
|
collection.update({
|
||||||
'parent.id': parentId,
|
'parent.id': parentId,
|
||||||
order: {$gte: order},
|
order: {$gte: order},
|
||||||
@@ -128,6 +130,46 @@ export function insertedDocAtOrder({collection, parentId, order}){
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update the order a single doc and re-order the entire sibling list
|
||||||
|
// with the change
|
||||||
|
export function safeUpdateDocOrder({docRef, order}){
|
||||||
|
let collection = getCollectionByName(docRef.collection);
|
||||||
|
let movedDoc = fetchDocByRef(docRef, {fields: {
|
||||||
|
parent: 1, name: 1
|
||||||
|
}});
|
||||||
|
let parentId = movedDoc.parent.id;
|
||||||
|
let bulkWrite = [];
|
||||||
|
let docs = collection.find({
|
||||||
|
'parent.id': parentId,
|
||||||
|
'_id': {$ne: movedDoc._id},
|
||||||
|
}, {
|
||||||
|
fields: {order: 1, name: 1},
|
||||||
|
sort: {order: 1}
|
||||||
|
}).fetch();
|
||||||
|
docs.splice(order, 0, movedDoc);
|
||||||
|
docs.forEach((doc, index) => {
|
||||||
|
if (doc.order !== index){
|
||||||
|
bulkWrite.push({
|
||||||
|
updateOne: {
|
||||||
|
filter: {_id: doc._id},
|
||||||
|
update: {$set: {order: index}},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (Meteor.isServer){
|
||||||
|
collection.rawCollection().bulkWrite(bulkWrite);
|
||||||
|
} else {
|
||||||
|
bulkWrite.forEach(op => {
|
||||||
|
collection.update(
|
||||||
|
op.updateOne.filter,
|
||||||
|
op.updateOne.update,
|
||||||
|
{selector: {type: 'any'}}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export function reorderDocs({collection, parentId}){
|
export function reorderDocs({collection, parentId}){
|
||||||
let bulkWrite = [];
|
let bulkWrite = [];
|
||||||
collection.find({
|
collection.find({
|
||||||
@@ -137,7 +179,7 @@ export function reorderDocs({collection, parentId}){
|
|||||||
sort: {order: 1}
|
sort: {order: 1}
|
||||||
}).forEach((doc, index) => {
|
}).forEach((doc, index) => {
|
||||||
if (doc.order !== index){
|
if (doc.order !== index){
|
||||||
bulkwrite.push({
|
bulkWrite.push({
|
||||||
updateOne : {
|
updateOne : {
|
||||||
filter: {_id: doc._id},
|
filter: {_id: doc._id},
|
||||||
update: {$set: {order: index}},
|
update: {$set: {order: index}},
|
||||||
@@ -149,7 +191,7 @@ export function reorderDocs({collection, parentId}){
|
|||||||
collection.rawCollection().bulkWrite(bulkWrite);
|
collection.rawCollection().bulkWrite(bulkWrite);
|
||||||
} else {
|
} else {
|
||||||
bulkWrite.forEach(op => {
|
bulkWrite.forEach(op => {
|
||||||
collection.update(op.filter, op.update);
|
collection.update(op.updateOne.filter, op.updateOne.update);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import SimpleSchema from 'simpl-schema';
|
import SimpleSchema from 'simpl-schema';
|
||||||
import { updateParent } from '/imports/api/parenting/parenting.js';
|
import { updateParent } from '/imports/api/parenting/parenting.js';
|
||||||
import { insertedDocAtOrder, removedDocAtOrder, updateDocOrder } from '/imports/api/parenting/order.js';
|
import { insertedDocAtOrder, removedDocAtOrder, safeUpdateDocOrder } from '/imports/api/parenting/order.js';
|
||||||
import { RefSchema } from '/imports/api/parenting/ChildSchema.js';
|
import { RefSchema } from '/imports/api/parenting/ChildSchema.js';
|
||||||
import { assertDocEditPermission } from '/imports/api/sharing/sharingPermissions.js';
|
import { assertDocEditPermission } from '/imports/api/sharing/sharingPermissions.js';
|
||||||
import fetchDocByRef from '/imports/api/parenting/fetchDocByRef.js';
|
import fetchDocByRef from '/imports/api/parenting/fetchDocByRef.js';
|
||||||
@@ -48,7 +48,7 @@ const reorderDoc = new ValidatedMethod({
|
|||||||
run({docRef, order}) {
|
run({docRef, order}) {
|
||||||
let doc = fetchDocByRef(docRef);
|
let doc = fetchDocByRef(docRef);
|
||||||
assertDocEditPermission(doc, this.userId);
|
assertDocEditPermission(doc, this.userId);
|
||||||
updateDocOrder({docRef, order})
|
safeUpdateDocOrder({docRef, order})
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -64,8 +64,8 @@
|
|||||||
methods: {
|
methods: {
|
||||||
change({added, moved}){
|
change({added, moved}){
|
||||||
let event = moved || added;
|
let event = moved || added;
|
||||||
|
let newIndex = this.children[event.newIndex].node.order;
|
||||||
if (event){
|
if (event){
|
||||||
let newIndex = event.newIndex;
|
|
||||||
let doc = event.element.node;
|
let doc = event.element.node;
|
||||||
if (moved){
|
if (moved){
|
||||||
this.$emit('reordered', {doc, newIndex});
|
this.$emit('reordered', {doc, newIndex});
|
||||||
|
|||||||
Reference in New Issue
Block a user