feat: add ability to group monitors in dashboard

This commit is contained in:
Peace
2023-01-28 02:58:03 +01:00
parent d99d37898e
commit 645fd94bba
11 changed files with 411 additions and 44 deletions

View File

@@ -12,6 +12,9 @@
<label for="type" class="form-label">{{ $t("Monitor Type") }}</label>
<select id="type" v-model="monitor.type" class="form-select">
<optgroup :label="$t('General Monitor Type')">
<option value="group">
{{ $t("Group") }}
</option>
<option value="http">
HTTP(s)
</option>
@@ -79,6 +82,15 @@
<input id="name" v-model="monitor.name" type="text" class="form-control" required>
</div>
<!-- Parent Monitor -->
<div class="my-3">
<label for="parent" class="form-label">{{ $t("Monitor Group") }}</label>
<select v-model="monitor.parent" class="form-select" :disabled="sortedMonitorList.length === 0">
<option :value="null" selected>{{ $t("None") }}</option>
<option v-for="parentMonitor in sortedMonitorList" :key="parentMonitor.id" :value="parentMonitor.id">{{ parentMonitor.pathName }}</option>
</select>
</div>
<!-- URL -->
<div v-if="monitor.type === 'http' || monitor.type === 'keyword' " class="my-3">
<label for="url" class="form-label">{{ $t("URL") }}</label>
@@ -737,6 +749,49 @@ message HealthCheckResponse {
return null;
},
sortedMonitorList() {
// return Object.values(this.$root.monitorList).filter(monitor => {
// // Only return monitors which aren't related to the current selected
// if (monitor.id === this.monitor.id || monitor.parent === this.monitor.id) {
// return false;
// }
// return true;
// });
let result = Object.values(this.$root.monitorList);
console.log(this.monitor.childrenIDs);
result = result.filter(monitor => monitor.type === "group");
result = result.filter(monitor => monitor.id !== this.monitor.id);
result = result.filter(monitor => !this.monitor.childrenIDs?.includes(monitor.id));
result.sort((m1, m2) => {
if (m1.active !== m2.active) {
if (m1.active === 0) {
return 1;
}
if (m2.active === 0) {
return -1;
}
}
if (m1.weight !== m2.weight) {
if (m1.weight > m2.weight) {
return -1;
}
if (m1.weight < m2.weight) {
return 1;
}
}
return m1.pathName.localeCompare(m2.pathName);
});
return result;
},
},
watch: {
"$root.proxyList"() {
@@ -839,6 +894,7 @@ message HealthCheckResponse {
this.monitor = {
type: "http",
name: "",
parent: null,
url: "https://",
method: "GET",
interval: 60,