summaryrefslogtreecommitdiff
path: root/master/src/components
diff options
context:
space:
mode:
Diffstat (limited to 'master/src/components')
-rw-r--r--master/src/components/HelloWorld.vue64
-rw-r--r--master/src/components/MinionStatus.vue110
2 files changed, 110 insertions, 64 deletions
diff --git a/master/src/components/HelloWorld.vue b/master/src/components/HelloWorld.vue
deleted file mode 100644
index f68982b..0000000
--- a/master/src/components/HelloWorld.vue
+++ /dev/null
@@ -1,64 +0,0 @@
-<template>
- <div class="hello">
- <h1>{{ msg }}</h1>
- <p>
- For a guide and recipes on how to configure / customize this project,<br>
- check out the
- <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
- </p>
- <h3>Installed CLI Plugins</h3>
- <ul>
- <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
- <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
- <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
- <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-typescript" target="_blank" rel="noopener">typescript</a></li>
- </ul>
- <h3>Essential Links</h3>
- <ul>
- <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
- <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
- <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
- <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
- <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
- </ul>
- <h3>Ecosystem</h3>
- <ul>
- <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
- <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
- <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
- <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
- <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
- </ul>
- </div>
-</template>
-
-<script lang="ts">
-import { Options, Vue } from 'vue-class-component'
-
-@Options({
- props: {
- msg: String
- }
-})
-export default class HelloWorld extends Vue {
- msg!: string
-}
-</script>
-
-<!-- Add "scoped" attribute to limit CSS to this component only -->
-<style scoped lang="scss">
-h3 {
- margin: 40px 0 0;
-}
-ul {
- list-style-type: none;
- padding: 0;
-}
-li {
- display: inline-block;
- margin: 0 10px;
-}
-a {
- color: #42b983;
-}
-</style>
diff --git a/master/src/components/MinionStatus.vue b/master/src/components/MinionStatus.vue
new file mode 100644
index 0000000..ec2564c
--- /dev/null
+++ b/master/src/components/MinionStatus.vue
@@ -0,0 +1,110 @@
+<template>
+ <div class="minion">
+ <span class="name">{{ name }}</span>
+ <span class="ip">{{ ip }}</span>
+ Temperature: {{ temperature }}
+ </div>
+</template>
+
+<script lang="ts">
+import { ref, defineComponent } from "vue";
+
+interface MinionResponseData {
+ data: { temperature: number } | null,
+ error: string | null
+}
+
+export default defineComponent(
+ {
+ name: "MinionStatus",
+ props: {
+ name: {
+ type: String,
+ required: true
+ },
+ ip: {
+ type: String,
+ required: true
+ }
+ },
+ setup(props) {
+ const temperature = ref("None");
+
+ async function fetch_temperature() {
+ let response: Response;
+
+ try {
+ response = await fetch(`http://${props.ip}`);
+ }
+ catch (err) {
+ const error = err as Error;
+
+ console.error(
+ `Failed to fetch temperature for minion "${props.name}". ` +
+ `${error.message}`
+ );
+ return;
+ }
+
+ const data = await response.json() as MinionResponseData;
+
+ if(!response.ok) {
+ if(data.error !== null) {
+ console.error(
+ `Minion "${props.name}" responded with status ` +
+ `${response.status} and error "${data.error}"`
+ );
+ }
+ else {
+ console.error(
+ `Minion "${props.name}" responded with status ` +
+ `${response.status} and a unknown error`
+ );
+ }
+
+ return;
+ }
+
+ if(data.data == null) {
+ console.error(`Minion "${props.name}" has no data in response`);
+ return;
+ }
+
+ temperature.value = `${data.data.temperature}°C`;
+ }
+
+ return { temperature, fetch_temperature };
+ },
+ created() {
+ this.fetch_temperature();
+ }
+ }
+);
+</script>
+
+<style scoped lang="scss">
+@use "@/scss/colors";
+
+.minion {
+ background-color: lighten(colors.$background, 8%);
+ width: fit-content;
+ padding-top: 1em;
+ padding-bottom: 1.5em;
+ padding-left: 1.5em;
+ padding-right: 3em;
+ border: 1px solid lighten(colors.$background, 14%);
+ border-radius: 8px;
+
+ .name {
+ display: block;
+ font-size: 1.25rem;
+ font-weight: 700;
+ color: colors.$primary;
+ margin-bottom: 0.25em;
+ }
+
+ .ip {
+ display: block;
+ }
+}
+</style>