diff --git a/server/model/monitor.js b/server/model/monitor.js index 2dfe2e65..2732a341 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -1463,6 +1463,17 @@ class Monitor extends BeanModel { return childrenIDs; } + /** + * Unlinks all children of the the group monitor + * @param {number} groupID ID of group to remove children of + * @returns {Promise} + */ + static async unlinkAllChildren(groupID) { + return await R.exec("UPDATE `monitor` SET parent = ? WHERE parent = ? ", [ + null, groupID + ]); + } + /** * Checks recursive if parent (ancestors) are active * @param {number} monitorID ID of the monitor to get diff --git a/server/server.js b/server/server.js index 5e7aaf04..20b2fdfe 100644 --- a/server/server.js +++ b/server/server.js @@ -676,6 +676,7 @@ let needSetup = false; // Edit a monitor socket.on("editMonitor", async (monitor, callback) => { try { + let removeGroupChildren = false; checkLogin(socket); let bean = await R.findOne("monitor", " id = ? ", [ monitor.id ]); @@ -684,7 +685,7 @@ let needSetup = false; throw new Error("Permission denied."); } - // Check if Parent is Decendant (would cause endless loop) + // Check if Parent is Descendant (would cause endless loop) if (monitor.parent !== null) { const childIDs = await Monitor.getAllChildrenIDs(monitor.id); if (childIDs.includes(monitor.parent)) { @@ -692,6 +693,11 @@ let needSetup = false; } } + // Remove children if monitor type has changed (from group to non-group) + if (bean.type === "group" && monitor.type !== bean.type) { + removeGroupChildren = true; + } + bean.name = monitor.name; bean.description = monitor.description; bean.parent = monitor.parent; @@ -752,6 +758,10 @@ let needSetup = false; await R.store(bean); + if (removeGroupChildren) { + await Monitor.unlinkAllChildren(monitor.id); + } + await updateMonitorNotification(bean.id, monitor.notificationIDList); if (bean.isActive()) {