Add a get started link when no configuration is found

pull/399/head
Bastien Wirtz 2022-03-11 22:47:26 +01:00
parent db2a2af3a4
commit f398006935
5 changed files with 65 additions and 13 deletions

View File

@ -9,7 +9,7 @@
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "^5.15.4", "@fortawesome/fontawesome-free": "^5.15.4",
"bulma": "^0.9.3", "bulma": "^0.9.3",
"core-js": "^3.19.3", "core-js": "^3.21.1",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"lodash.merge": "^4.6.2", "lodash.merge": "^4.6.2",
"register-service-worker": "^1.7.2", "register-service-worker": "^1.7.2",

View File

@ -56,6 +56,9 @@
v-if="config.connectivityCheck" v-if="config.connectivityCheck"
@network-status-update="offline = $event" @network-status-update="offline = $event"
/> />
<GetStarted v-if="loaded && !services" />
<div v-if="!offline"> <div v-if="!offline">
<!-- Optional messages --> <!-- Optional messages -->
<Message :item="config.message" /> <Message :item="config.message" />
@ -130,6 +133,7 @@ const jsyaml = require("js-yaml");
const merge = require("lodash.merge"); const merge = require("lodash.merge");
import Navbar from "./components/Navbar.vue"; import Navbar from "./components/Navbar.vue";
import GetStarted from "./components/GetStarted.vue";
import ConnectivityChecker from "./components/ConnectivityChecker.vue"; import ConnectivityChecker from "./components/ConnectivityChecker.vue";
import Service from "./components/Service.vue"; import Service from "./components/Service.vue";
import Message from "./components/Message.vue"; import Message from "./components/Message.vue";
@ -144,6 +148,7 @@ export default {
name: "App", name: "App",
components: { components: {
Navbar, Navbar,
GetStarted,
ConnectivityChecker, ConnectivityChecker,
Service, Service,
Message, Message,
@ -154,6 +159,7 @@ export default {
}, },
data: function () { data: function () {
return { return {
loaded: false,
config: null, config: null,
services: null, services: null,
offline: false, offline: false,
@ -166,6 +172,7 @@ export default {
created: async function () { created: async function () {
this.buildDashboard(); this.buildDashboard();
window.onhashchange = this.buildDashboard; window.onhashchange = this.buildDashboard;
this.loaded = true;
}, },
methods: { methods: {
searchHotkey() { searchHotkey() {
@ -193,6 +200,7 @@ export default {
} }
this.config = merge(defaults, config); this.config = merge(defaults, config);
this.services = this.config.services; this.services = this.config.services;
document.title = document.title =
this.config.documentTitle || this.config.documentTitle ||
`${this.config.title} | ${this.config.subtitle}`; `${this.config.title} | ${this.config.subtitle}`;

View File

@ -0,0 +1,35 @@
<template>
<article>
<div class="m-6 has-text-centered py-6">
<p class="is-size-5 mb-0">No configured service found!</p>
<p>Check out the documentation to start building your Homer dashboard.</p>
<p>
<a
class="button is-primary mt-5 has-text-weight-bold"
href="https://github.com/bastienwirtz/homer/blob/main/README.md#getting-started"
target="_blank"
>
Get started
</a>
</p>
</div>
</article>
</template>
<script>
export default {
name: "GetStarted",
};
</script>
<style lang="scss" scoped>
p {
color: #4a4a4a;
}
body #app a {
font-weight: 900;
color: #ffffff;
font-family: "Lato", sans-serif;
}
</style>

View File

@ -8,7 +8,11 @@
<strong v-if="dead > 0" class="notif dead" title="Dead"> <strong v-if="dead > 0" class="notif dead" title="Dead">
{{ dead }} {{ dead }}
</strong> </strong>
<strong v-if="misc > 0" class="notif misc" title="Other (creating, paused, exited, etc.)"> <strong
v-if="misc > 0"
class="notif misc"
title="Other (creating, paused, exited, etc.)"
>
{{ misc }} {{ misc }}
</strong> </strong>
</div> </div>
@ -55,7 +59,10 @@ export default {
return ""; return "";
} }
return this.containers.filter((container) => { return this.containers.filter((container) => {
return container.State.toLowerCase() !== "running" && container.State.toLowerCase() !== "dead"; return (
container.State.toLowerCase() !== "running" &&
container.State.toLowerCase() !== "dead"
);
}).length; }).length;
}, },
}, },
@ -68,18 +75,20 @@ export default {
"X-Api-Key": this.item.apikey, "X-Api-Key": this.item.apikey,
}; };
this.endpoints = await this.fetch("/api/endpoints", { headers }) this.endpoints = await this.fetch("/api/endpoints", { headers }).catch(
.catch((e) => { (e) => {
console.error(e); console.error(e);
}); }
);
let containers = []; let containers = [];
for (let endpoint of this.endpoints) { for (let endpoint of this.endpoints) {
const uri = `/api/endpoints/${endpoint.Id}/docker/containers/json?all=1`; const uri = `/api/endpoints/${endpoint.Id}/docker/containers/json?all=1`;
const endpointContainers = await this.fetch(uri, { headers }) const endpointContainers = await this.fetch(uri, { headers }).catch(
.catch((e) => { (e) => {
console.error(e); console.error(e);
}); }
);
containers = containers.concat(endpointContainers); containers = containers.concat(endpointContainers);
} }

View File

@ -2773,10 +2773,10 @@ core-js@^2.4.0:
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-js@^3.19.3: core-js@^3.21.1:
version "3.20.2" version "3.21.1"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.2.tgz#46468d8601eafc8b266bd2dd6bf9dee622779581" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94"
integrity sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw== integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==
core-js@^3.6.5: core-js@^3.6.5:
version "3.15.2" version "3.15.2"