diff --git a/server/api/documents.js b/server/api/documents.js index 36770588..47bcd3af 100644 --- a/server/api/documents.js +++ b/server/api/documents.js @@ -149,22 +149,26 @@ router.post('documents.delete', auth(), async (ctx) => { if (!document) throw httpErrors.BadRequest(); - // TODO: handle sub documents - - // Don't allow deletion of root docs - if (atlas.type === 'atlas' && !document.parentDocumentId) { - throw httpErrors.BadRequest('Unable to delete atlas\'s root document'); - } - - try { - await document.destroy(); - - if (atlas.type === 'atlas') { - await atlas.updateNavigationTree(); + if (atlas.type === 'atlas') { + // Don't allow deletion of root docs + if(!document.parentDocumentId) { + throw httpErrors.BadRequest('Unable to delete atlas\'s root document'); } - } catch (e) { - throw httpErrors.BadRequest('Error while deleting'); - }; + + // Delete all chilren + try { + await atlas.deleteDocument(document); + await atlas.save(); + } catch (e) { + throw httpErrors.BadRequest('Error while deleting'); + }; + } else { + try { + await document.destroy(); + } catch (e) { + throw httpErrors.BadRequest('Error while deleting'); + }; + } ctx.body = { ok: true, diff --git a/server/models/Atlas.js b/server/models/Atlas.js index 98405fa5..39b5c6d5 100644 --- a/server/models/Atlas.js +++ b/server/models/Atlas.js @@ -148,6 +148,30 @@ const Atlas = sequelize.define('atlas', { }; this.navigationTree = insertNode(this.navigationTree); + }, + async deleteDocument(document) { + const deleteNodeAndDocument = async (node, documentId, shouldDelete = false) => { + if (document.id === node.id) { + shouldDelete = true; + } + const newChildren = []; + node.children.map(async childNode => { + const child = await deleteNodeAndDocument(childNode, documentId, shouldDelete); + if (child) { + newChildren.push(child); + } + }); + node.children = newChildren; + + if (shouldDelete) { + const document = await Document.findById(node.id); + await document.destroy(); + } + + return shouldDelete ? null : node; + }; + + this.navigationTree = await deleteNodeAndDocument(this.navigationTree, document.id); } } }); diff --git a/src/scenes/DocumentScene/DocumentScene.js b/src/scenes/DocumentScene/DocumentScene.js index 30a5ae31..cfbf5f33 100644 --- a/src/scenes/DocumentScene/DocumentScene.js +++ b/src/scenes/DocumentScene/DocumentScene.js @@ -66,7 +66,14 @@ class DocumentScene extends React.Component { } onDelete = () => { - if (confirm("Are you sure you want to delete this document?")) { + let msg; + if (this.store.document.atlas.type === 'atlas') { + msg = 'Are you sure you want to delete this document and all it\'s child documents (if any)?' + } else { + msg = "Are you sure you want to delete this document?"; + } + + if (confirm(msg)) { this.store.deleteDocument(); }; }