]> git.immae.eu Git - github/bastienwirtz/homer.git/commitdiff
Code review fixes 310/head
authorArtur Bauer <bauerart1@gmail.com>
Mon, 11 Oct 2021 16:38:13 +0000 (18:38 +0200)
committerArtur Bauer <bauerart1@gmail.com>
Mon, 11 Oct 2021 16:41:28 +0000 (18:41 +0200)
docs/customservices.md
src/components/services/Prometheus.vue

index 548af9627b4b694ff39170133e20da9460df554c..7a151d13eb5795c8a91be79691cd38be67821d61 100644 (file)
@@ -6,15 +6,16 @@ within Homer.
 
 If you experiencing any issue, please have a look to the [troubleshooting](troubleshooting.md) page.
 
+
 ## Common options
 
 ```yaml
-- name: 'My Service'
-  logo: 'assets/tools/sample.png'
-  url: 'http://my-service-link'
-  endpoint: 'http://my-service-endpoint' # Optional: alternative base URL used to fetch service data is necessary.
+- name: "My Service"
+  logo: "assets/tools/sample.png"
+  url: "http://my-service-link"
+  endpoint: "http://my-service-endpoint" # Optional: alternative base URL used to fetch service data is necessary.
   useCredentials: false # Optional: Override global proxy.useCredentials configuration.
-  type: '<type>'
+  type: "<type>"
 ```
 
 ⚠️🚧 `endpoint` & `useCredentials` new options are not yet supported by all custom services (but will be very soon).
index 25e9ddd700fa4c33bf5134a67f87ad67ba819fb1..6efcb34e8c9e46efe1f6f5ad775112dfd06aa558 100644 (file)
@@ -1,57 +1,41 @@
 <template>
-  <div>
-    <div
-      class="card"
-      :style="`background-color:${item.background};`"
-      :class="item.class"
-    >
-      <a :href="item.url" :target="item.target" rel="noreferrer">
-        <div class="card-content">
-          <div :class="mediaClass">
-            <slot name="icon">
-              <div v-if="item.logo" class="media-left">
-                <figure class="image is-48x48">
-                  <img :src="item.logo" :alt="`${item.name} logo`" />
-                </figure>
-              </div>
-              <div v-if="item.icon" class="media-left">
-                <figure class="image is-48x48">
-                  <i style="font-size: 35px" :class="['fa-fw', item.icon]"></i>
-                </figure>
-              </div>
-            </slot>
-            <div class="media-content">
-              <slot name="content">
-                <p class="title is-4">{{ item.name }}</p>
-                <p class="subtitle is-6">
-                  <template v-if="item.subtitle">
-                    {{ item.subtitle }}
-                  </template>
-                  <template v-else-if="api">
-                    {{ count }} {{ level }} alerts
-                  </template>
-                </p>
-              </slot>
-            </div>
-            <div v-if="api" class="status" :class="level">
-              {{ count }}
-            </div>
-          </div>
-          <div class="tag" :class="item.tagstyle" v-if="item.tag">
-            <strong class="tag-text">#{{ item.tag }}</strong>
-          </div>
-        </div>
-      </a>
-    </div>
-  </div>
+  <Generic :item="item">
+    <template #content>
+      <p class="title is-4">{{ item.name }}</p>
+      <p class="subtitle is-6">
+        <template v-if="item.subtitle">
+          {{ item.subtitle }}
+        </template>
+        <template v-else-if="api"> {{ count }} {{ level }} alerts </template>
+      </p>
+    </template>
+    <template #indicator>
+      <div v-if="api" class="status" :class="level">
+        {{ count }}
+      </div>
+    </template>
+  </Generic>
 </template>
 
 <script>
+import service from "@/mixins/service.js";
+import Generic from "./Generic.vue";
+
+const AlertsStatus = Object.freeze({
+  firing: "firing",
+  pending: "pending",
+  inactive: "inactive",
+});
+
 export default {
   name: "Prometheus",
+  mixins: [service],
   props: {
     item: Object,
   },
+  components: {
+    Generic,
+  },
   data: () => ({
     api: {
       status: "",
@@ -64,9 +48,6 @@ export default {
     },
   }),
   computed: {
-    mediaClass: function () {
-      return { media: true, "no-subtitle": !this.item.subtitle };
-    },
     count: function () {
       return (
         this.countFiring() || this.countPending() || this.countInactive() || 0
@@ -74,11 +55,11 @@ export default {
     },
     level: function () {
       if (this.countFiring()) {
-        return "firing";
+        return AlertsStatus.firing;
       } else if (this.countPending()) {
-        return "pending";
+        return AlertsStatus.pending;
       }
-      return "inactive";
+      return AlertsStatus.inactive;
     },
   },
   created() {
@@ -86,17 +67,12 @@ export default {
   },
   methods: {
     fetchStatus: async function () {
-      const url = `${this.item.url}/api/v1/alerts`;
-      this.api = await fetch(url, { method: "get" })
-        .then((response) => {
-          return response.json();
-        })
-        .catch((e) => console.log(e));
+      this.api = await this.fetch("api/v1/alerts").catch((e) => console.log(e));
     },
     countFiring: function () {
       if (this.api) {
         return this.api.data?.alerts?.filter(
-          (alert) => alert.state === "firing"
+          (alert) => alert.state === AlertsStatus.firing
         ).length;
       }
       return 0;
@@ -104,7 +80,7 @@ export default {
     countPending: function () {
       if (this.api) {
         return this.api.data?.alerts?.filter(
-          (alert) => alert.state === "pending"
+          (alert) => alert.state === AlertsStatus.pending
         ).length;
       }
       return 0;
@@ -112,7 +88,7 @@ export default {
     countInactive: function () {
       if (this.api) {
         return this.api.data?.alerts?.filter(
-          (alert) => alert.state === "inactive"
+          (alert) => alert.state === AlertsStatus.pending
         ).length;
       }
       return 0;