summaryrefslogtreecommitdiffstats
path: root/src/pages/ManageStatusPage.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/pages/ManageStatusPage.vue')
-rw-r--r--src/pages/ManageStatusPage.vue123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/pages/ManageStatusPage.vue b/src/pages/ManageStatusPage.vue
new file mode 100644
index 0000000..e9d5863
--- /dev/null
+++ b/src/pages/ManageStatusPage.vue
@@ -0,0 +1,123 @@
+<template>
+ <transition name="slide-fade" appear>
+ <div>
+ <h1 class="mb-3">
+ {{ $t("Status Pages") }}
+ </h1>
+
+ <div>
+ <router-link to="/add-status-page" class="btn btn-primary mb-3"><font-awesome-icon icon="plus" /> {{ $t("New Status Page") }}</router-link>
+ </div>
+
+ <div class="shadow-box">
+ <template v-if="$root.statusPageListLoaded">
+ <span v-if="Object.keys($root.statusPageList).length === 0" class="d-flex align-items-center justify-content-center my-3">
+ {{ $t("No status pages") }}
+ </span>
+
+ <!-- use <a> instead of <router-link>, because the heartbeat won't load. -->
+ <a v-for="statusPage in $root.statusPageList" :key="statusPage.slug" :href="'/status/' + statusPage.slug" class="item">
+ <img :src="icon(statusPage.icon)" alt class="logo me-2" />
+ <div class="info">
+ <div class="title">{{ statusPage.title }}</div>
+ <div class="slug">/status/{{ statusPage.slug }}</div>
+ </div>
+ </a>
+ </template>
+ <div v-else class="d-flex align-items-center justify-content-center my-3 spinner">
+ <font-awesome-icon icon="spinner" size="2x" spin />
+ </div>
+ </div>
+ </div>
+ </transition>
+</template>
+
+<script>
+
+import { getResBaseURL } from "../util-frontend";
+
+export default {
+ components: {
+
+ },
+ data() {
+ return {
+ };
+ },
+ computed: {
+
+ },
+ mounted() {
+
+ },
+ methods: {
+ /**
+ * Get the correct URL for the icon
+ * @param {string} icon Path for icon
+ * @returns {string} Correctly formatted path including port numbers
+ */
+ icon(icon) {
+ if (icon === "/icon.svg") {
+ return icon;
+ } else {
+ return getResBaseURL() + icon;
+ }
+ }
+ },
+};
+</script>
+
+<style lang="scss" scoped>
+ @import "../assets/vars.scss";
+
+ .item {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ text-decoration: none;
+ border-radius: 10px;
+ transition: all ease-in-out 0.15s;
+ padding: 10px;
+
+ &:hover {
+ background-color: $highlight-white;
+ }
+
+ &.active {
+ background-color: #cdf8f4;
+ }
+
+ $logo-width: 70px;
+
+ .logo {
+ width: $logo-width;
+ height: $logo-width;
+
+ // Better when the image is loading
+ min-height: 1px;
+ }
+
+ .info {
+ .title {
+ font-weight: bold;
+ font-size: 20px;
+ }
+
+ .slug {
+ font-size: 14px;
+ }
+ }
+ }
+
+ .dark {
+ .item {
+ &:hover {
+ background-color: $dark-bg2;
+ }
+
+ &.active {
+ background-color: $dark-bg2;
+ }
+ }
+ }
+</style>