diff --git a/api/tacticalrmm/agents/models.py b/api/tacticalrmm/agents/models.py
index 50de1b6c..1661a170 100644
--- a/api/tacticalrmm/agents/models.py
+++ b/api/tacticalrmm/agents/models.py
@@ -187,7 +187,7 @@ class Agent(BaseAuditModel):
"failing": failing,
"warning": warning,
"info": info,
- "has_failing_checks": failing > 0,
+ "has_failing_checks": failing > 0 or warning > 0,
}
return ret
diff --git a/api/tacticalrmm/checks/views.py b/api/tacticalrmm/checks/views.py
index 1c9680de..e52f062b 100644
--- a/api/tacticalrmm/checks/views.py
+++ b/api/tacticalrmm/checks/views.py
@@ -113,7 +113,8 @@ class GetUpdateDeleteCheck(APIView):
# resolve any alerts that are open
if "check_reset" in request.data.keys():
- obj.alert.filter(resolved=False).get().resolve()
+ if obj.alert.filter(resolved=False).exists():
+ obj.alert.get(resolved=False).resolve()
return Response(f"{obj.readable_desc} was edited!")
diff --git a/api/tacticalrmm/clients/models.py b/api/tacticalrmm/clients/models.py
index 2afe9e9b..facaa2c9 100644
--- a/api/tacticalrmm/clients/models.py
+++ b/api/tacticalrmm/clients/models.py
@@ -86,16 +86,24 @@ class Client(BaseAuditModel):
.prefetch_related("agentchecks")
)
- failing = 0
+ data = {"error": False, "warning": False}
+
for agent in agents:
if agent.checks["has_failing_checks"]:
- failing += 1
+
+ if agent.checks["warning"]:
+ data["warning"] = True
+
+ if agent.checks["failing"]:
+ data["error"] = True
+ break
if agent.overdue_email_alert or agent.overdue_text_alert:
if agent.status == "overdue":
- failing += 1
+ data["error"] = True
+ break
- return failing > 0
+ return data
@staticmethod
def serialize(client):
@@ -184,16 +192,24 @@ class Site(BaseAuditModel):
.prefetch_related("agentchecks")
)
- failing = 0
+ data = {"error": False, "warning": False}
+
for agent in agents:
+
if agent.checks["has_failing_checks"]:
- failing += 1
+ if agent.checks["warning"]:
+ data["warning"] = True
+
+ if agent.checks["failing"]:
+ data["error"] = True
+ break
if agent.overdue_email_alert or agent.overdue_text_alert:
if agent.status == "overdue":
- failing += 1
+ data["error"] = True
+ break
- return failing > 0
+ return data
@staticmethod
def serialize(site):
diff --git a/api/tacticalrmm/clients/serializers.py b/api/tacticalrmm/clients/serializers.py
index 52044c57..7244be11 100644
--- a/api/tacticalrmm/clients/serializers.py
+++ b/api/tacticalrmm/clients/serializers.py
@@ -95,7 +95,6 @@ class SiteTreeSerializer(ModelSerializer):
class Meta:
model = Site
fields = "__all__"
- ordering = ("failing_checks",)
class ClientTreeSerializer(ModelSerializer):
@@ -106,7 +105,6 @@ class ClientTreeSerializer(ModelSerializer):
class Meta:
model = Client
fields = "__all__"
- ordering = ("failing_checks",)
class DeploymentSerializer(ModelSerializer):
diff --git a/web/src/components/AgentTable.vue b/web/src/components/AgentTable.vue
index 0702b036..a6716986 100644
--- a/web/src/components/AgentTable.vue
+++ b/web/src/components/AgentTable.vue
@@ -306,14 +306,15 @@
Maintenance Mode Enabled
-
+
Checks failing
+
+ Checks warning
+
+
+ Checks info
+
Checks passing
diff --git a/web/src/components/ChecksTab.vue b/web/src/components/ChecksTab.vue
index 957d19ec..bd9d3b2b 100644
--- a/web/src/components/ChecksTab.vue
+++ b/web/src/components/ChecksTab.vue
@@ -447,6 +447,7 @@ export default {
axios
.patch(`/checks/${check}/check/`, data)
.then(r => {
+ this.$emit("refreshEdit");
this.$store.dispatch("loadChecks", this.selectedAgentPk);
this.notifySuccess("The check was reset");
})
@@ -455,6 +456,7 @@ export default {
});
},
onRefresh(id) {
+ this.$emit("refreshEdit");
this.$store.dispatch("loadChecks", id);
this.$store.dispatch("loadAutomatedTasks", id);
},
diff --git a/web/src/components/SubTableTabs.vue b/web/src/components/SubTableTabs.vue
index 943f48c1..befbd6ab 100644
--- a/web/src/components/SubTableTabs.vue
+++ b/web/src/components/SubTableTabs.vue
@@ -25,7 +25,7 @@
-
+
diff --git a/web/src/store/index.js b/web/src/store/index.js
index 223d20cd..21c10a23 100644
--- a/web/src/store/index.js
+++ b/web/src/store/index.js
@@ -257,7 +257,8 @@ export default function () {
}
if (site.maintenance_mode) { siteNode["color"] = "green" }
- else if (site.failing_checks) { siteNode["color"] = "negative" }
+ else if (site.failing_checks.error) { siteNode["color"] = "negative" }
+ else if (site.failing_checks.warning) { siteNode["color"] = "warning" }
childSites.push(siteNode);
}
@@ -275,7 +276,8 @@ export default function () {
}
if (client.maintenance_mode) clientNode["color"] = "green"
- else if (client.failing_checks) clientNode["color"] = "negative"
+ else if (client.failing_checks.error) { clientNode["color"] = "negative" }
+ else if (client.failing_checks.warning) { clientNode["color"] = "warning" }
output.push(clientNode);
}
diff --git a/web/src/views/Dashboard.vue b/web/src/views/Dashboard.vue
index 6a1d1773..50070074 100644
--- a/web/src/views/Dashboard.vue
+++ b/web/src/views/Dashboard.vue
@@ -343,7 +343,7 @@
-
+
@@ -727,7 +727,7 @@ export default {
let data = {
id: node.id,
type: node.raw.split("|")[0],
- action: node.color === "warning" ? false : true,
+ action: node.color === "green" ? false : true,
};
const text = node.color === "warning" ? "Maintenance mode was disabled" : "Maintenance mode was enabled";
@@ -742,7 +742,7 @@ export default {
});
},
menuMaintenanceText(node) {
- return node.color === "warning" ? "Disable Maintenance Mode" : "Enable Maintenance Mode";
+ return node.color === "green" ? "Disable Maintenance Mode" : "Enable Maintenance Mode";
},
clearFilter() {
this.filterTextLength = 0;