Files
tacticalrmm/web/src/components/AlertsManager.vue

413 lines
12 KiB
Vue

<template>
<q-dialog ref="dialog" @hide="onHide">
<div class="q-dialog-plugin" style="width: 90vw; max-width: 90vw">
<q-card>
<q-bar>
<q-btn
ref="refresh"
@click="refresh"
class="q-mr-sm"
dense
flat
push
icon="refresh"
/>Alerts Manager
<q-space />
<q-btn dense flat icon="close" v-close-popup>
<q-tooltip class="bg-white text-primary">Close</q-tooltip>
</q-btn>
</q-bar>
<div class="q-pa-sm" style="min-height: 65vh; max-height: 65vh">
<div class="q-gutter-sm">
<q-btn
ref="new"
label="New"
dense
flat
push
unelevated
no-caps
icon="add"
@click="showAddTemplateModal"
/>
</div>
<q-table
dense
:rows="templates"
:columns="columns"
v-model:pagination="pagination"
row-key="id"
binary-state-sort
hide-pagination
virtual-scroll
:rows-per-page-options="[0]"
no-data-label="No Alert Templates"
>
<!-- header slots -->
<template v-slot:header-cell-is_active="props">
<q-th :props="props" auto-width>
<q-icon name="power_settings_new" size="1.5em">
<q-tooltip>Enable Template</q-tooltip>
</q-icon>
</q-th>
</template>
<template v-slot:header-cell-agent_settings="props">
<q-th :props="props" auto-width>
<q-icon name="devices" size="1.5em">
<q-tooltip>Has agent alert settings</q-tooltip>
</q-icon>
</q-th>
</template>
<template v-slot:header-cell-check_settings="props">
<q-th :props="props" auto-width>
<q-icon name="fas fa-check-double" size="1.5em">
<q-tooltip>Has check alert settings</q-tooltip>
</q-icon>
</q-th>
</template>
<template v-slot:header-cell-task_settings="props">
<q-th :props="props" auto-width>
<q-icon name="fas fa-tasks" size="1.5em">
<q-tooltip>Has task alert settings</q-tooltip>
</q-icon>
</q-th>
</template>
<!-- body slots -->
<template v-slot:body="props">
<q-tr
:props="props"
class="cursor-pointer"
:class="rowSelectedClass(props.row.id, selectedTemplate)"
@click="selectedTemplate = props.row"
@contextmenu="selectedTemplate = props.row"
@dblclick="showEditTemplateModal(props.row)"
>
<!-- context menu -->
<q-menu context-menu>
<q-list dense style="min-width: 200px">
<q-item
clickable
v-close-popup
@click="showEditTemplateModal(props.row)"
>
<q-item-section side>
<q-icon name="edit" />
</q-item-section>
<q-item-section>Edit</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
@click="deleteTemplate(props.row)"
>
<q-item-section side>
<q-icon name="delete" />
</q-item-section>
<q-item-section>Delete</q-item-section>
</q-item>
<q-separator></q-separator>
<q-item
clickable
v-close-popup
@click="showAlertExclusions(props.row)"
>
<q-item-section side>
<q-icon name="rule" />
</q-item-section>
<q-item-section>Alert Exclusions</q-item-section>
</q-item>
<q-separator></q-separator>
<q-item clickable v-close-popup>
<q-item-section>Close</q-item-section>
</q-item>
</q-list>
</q-menu>
<!-- enabled checkbox -->
<q-td>
<q-checkbox
dense
@update:model-value="toggleEnabled(props.row)"
v-model="props.row.is_active"
/>
</q-td>
<!-- agent settings -->
<q-td>
<q-icon
v-if="props.row.agent_settings"
color="primary"
name="done"
size="sm"
>
<q-tooltip
>Alert template has agent alert settings</q-tooltip
>
</q-icon>
</q-td>
<!-- text settings -->
<q-td>
<q-icon
v-if="props.row.check_settings"
color="primary"
name="done"
size="sm"
>
<q-tooltip
>Alert template has check alert settings</q-tooltip
>
</q-icon>
</q-td>
<!-- dashboard settings -->
<q-td>
<q-icon
v-if="props.row.task_settings"
color="primary"
name="done"
size="sm"
>
<q-tooltip
>Alert template has task alert settings</q-tooltip
>
</q-icon>
</q-td>
<!-- name -->
<q-td
>{{ props.row.name }}
<q-chip
v-if="props.row.default_template"
color="primary"
text-color="white"
size="sm"
>Default</q-chip
>
</q-td>
<!-- applied to -->
<q-td>
<span
style="cursor: pointer; text-decoration: underline"
class="text-primary"
@click="showTemplateApplied(props.row)"
>Show where template is applied ({{
props.row.applied_count
}})</span
></q-td
>
<!-- alert exclusions -->
<q-td>
<span
style="cursor: pointer; text-decoration: underline"
class="text-primary"
@click="showAlertExclusions(props.row)"
>Alert Exclusions ({{
props.row.excluded_agents.length +
props.row.excluded_clients.length +
props.row.excluded_sites.length
}})</span
></q-td
>
<!-- failure action -->
<q-td>{{ props.row.action_name }}</q-td>
<!-- resolve action -->
<q-td>{{ props.row.resolved_action_name }}</q-td>
</q-tr>
</template>
</q-table>
</div>
</q-card>
</div>
</q-dialog>
</template>
<script>
import mixins from "@/mixins/mixins";
import AlertTemplateForm from "@/components/modals/alerts/AlertTemplateForm";
import AlertExclusions from "@/components/modals/alerts/AlertExclusions";
import AlertTemplateRelated from "@/components/modals/alerts/AlertTemplateRelated";
export default {
name: "AlertsManager",
mixins: [mixins],
emits: ["hide", "ok", "cancel"],
data() {
return {
selectedTemplate: null,
templates: [],
columns: [
{
name: "is_active",
label: "Active",
field: "is_active",
align: "left",
},
{
name: "agent_settings",
label: "Agent Settings",
field: "agent_settings",
},
{
name: "check_settings",
label: "Check Settings",
field: "check_settings",
},
{
name: "task_settings",
label: "Task Settings",
field: "task_settings",
},
{ name: "name", label: "Name", field: "name", align: "left" },
{
name: "applied_to",
label: "Applied To",
field: "applied_to",
align: "left",
},
{
name: "alert_exclusions",
label: "Alert Exclusions",
field: "alert_exclusions",
align: "left",
},
{
name: "action_name",
label: "Failure Action",
field: "action_name",
align: "left",
},
{
name: "resolved_action_name",
label: "Resolve Action",
field: "resolved_action_name",
align: "left",
},
],
pagination: {
rowsPerPage: 0,
sortBy: "name",
descending: true,
},
};
},
methods: {
getTemplates() {
this.$q.loading.show();
this.$axios
.get("alerts/templates/")
.then((r) => {
this.templates = r.data;
this.$q.loading.hide();
})
.catch(() => {
this.$q.loading.hide();
});
},
clearRow() {
this.selectedTemplate = null;
},
refresh() {
this.$store.dispatch("refreshDashboard");
this.getTemplates();
this.clearRow();
},
deleteTemplate(template) {
this.$q
.dialog({
title: `Delete alert template ${template.name}?`,
cancel: true,
ok: { label: "Delete", color: "negative" },
})
.onOk(() => {
this.$q.loading.show();
this.$axios
.delete(`alerts/templates/${template.id}/`)
.then(() => {
this.refresh();
this.$q.loading.hide();
this.notifySuccess(
`Alert template ${template.name} was deleted!`
);
})
.catch(() => {
this.$q.loading.hide();
});
});
},
showEditTemplateModal(template) {
this.$q
.dialog({
component: AlertTemplateForm,
componentProps: {
alertTemplate: template,
},
})
.onOk(() => {
this.refresh();
});
},
showAddTemplateModal() {
this.clearRow();
this.$q
.dialog({
component: AlertTemplateForm,
})
.onOk(() => {
this.refresh();
});
},
showAlertExclusions(template) {
this.$q
.dialog({
component: AlertExclusions,
componentProps: {
template: template,
},
})
.onOk(() => {
this.refresh();
});
},
showTemplateApplied(template) {
this.$q.dialog({
component: AlertTemplateRelated,
componentProps: {
template: template,
},
});
},
toggleEnabled(template) {
let text = !template.is_active
? "Template enabled successfully"
: "Template disabled successfully";
const data = {
id: template.id,
is_active: !template.is_active,
};
this.$axios.put(`alerts/templates/${template.id}/`, data).then(() => {
this.notifySuccess(text);
this.$store.dispatch("refreshDashboard");
});
},
rowSelectedClass(id, selectedTemplate) {
if (selectedTemplate && selectedTemplate.id === id)
return this.$q.dark.isActive ? "highlight-dark" : "highlight";
},
show() {
this.$refs.dialog.show();
},
hide() {
this.$refs.dialog.hide();
},
onHide() {
this.$emit("hide");
},
},
mounted() {
this.getTemplates();
},
};
</script>