summaryrefslogtreecommitdiffstats
path: root/src/pages/Setup.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/pages/Setup.vue')
-rw-r--r--src/pages/Setup.vue138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/pages/Setup.vue b/src/pages/Setup.vue
new file mode 100644
index 0000000..f681b7a
--- /dev/null
+++ b/src/pages/Setup.vue
@@ -0,0 +1,138 @@
+<template>
+ <div class="form-container" data-cy="setup-form">
+ <div class="form">
+ <form @submit.prevent="submit">
+ <div>
+ <object width="64" height="64" data="/icon.svg" />
+ <div style="font-size: 28px; font-weight: bold; margin-top: 5px;">
+ Uptime Kuma
+ </div>
+ </div>
+
+ <p class="mt-3">
+ {{ $t("Create your admin account") }}
+ </p>
+
+ <div class="form-floating">
+ <select id="language" v-model="$root.language" class="form-select">
+ <option v-for="(lang, i) in $i18n.availableLocales" :key="`Lang${i}`" :value="lang">
+ {{ $i18n.messages[lang].languageName }}
+ </option>
+ </select>
+ <label for="language" class="form-label">{{ $t("Language") }}</label>
+ </div>
+
+ <div class="form-floating mt-3">
+ <input id="floatingInput" v-model="username" type="text" class="form-control" :placeholder="$t('Username')" required data-cy="username-input">
+ <label for="floatingInput">{{ $t("Username") }}</label>
+ </div>
+
+ <div class="form-floating mt-3">
+ <input id="floatingPassword" v-model="password" type="password" class="form-control" :placeholder="$t('Password')" required data-cy="password-input">
+ <label for="floatingPassword">{{ $t("Password") }}</label>
+ </div>
+
+ <div class="form-floating mt-3">
+ <input id="repeat" v-model="repeatPassword" type="password" class="form-control" :placeholder="$t('Repeat Password')" required data-cy="password-repeat-input">
+ <label for="repeat">{{ $t("Repeat Password") }}</label>
+ </div>
+
+ <button class="w-100 btn btn-primary mt-3" type="submit" :disabled="processing" data-cy="submit-setup-form">
+ {{ $t("Create") }}
+ </button>
+ </form>
+ </div>
+ </div>
+</template>
+
+<script>
+export default {
+ data() {
+ return {
+ processing: false,
+ username: "",
+ password: "",
+ repeatPassword: "",
+ };
+ },
+ watch: {
+
+ },
+ mounted() {
+ // TODO: Check if it is a database setup
+
+ this.$root.getSocket().emit("needSetup", (needSetup) => {
+ if (! needSetup) {
+ this.$router.push("/");
+ }
+ });
+ },
+ methods: {
+ /**
+ * Submit form data for processing
+ * @returns {void}
+ */
+ submit() {
+ this.processing = true;
+
+ if (this.password !== this.repeatPassword) {
+ this.$root.toastError("PasswordsDoNotMatch");
+ this.processing = false;
+ return;
+ }
+
+ this.$root.getSocket().emit("setup", this.username, this.password, (res) => {
+ this.processing = false;
+ this.$root.toastRes(res);
+
+ if (res.ok) {
+ this.processing = true;
+
+ this.$root.login(this.username, this.password, "", () => {
+ this.processing = false;
+ this.$router.push("/");
+ });
+ }
+ });
+ },
+ },
+};
+</script>
+
+<style lang="scss" scoped>
+.form-container {
+ display: flex;
+ align-items: center;
+ padding-top: 40px;
+ padding-bottom: 40px;
+}
+
+.form-floating {
+ > .form-select {
+ padding-left: 1.3rem;
+ padding-top: 1.525rem;
+ line-height: 1.35;
+
+ ~ label {
+ padding-left: 1.3rem;
+ }
+ }
+
+ > label {
+ padding-left: 1.3rem;
+ }
+
+ > .form-control {
+ padding-left: 1.3rem;
+ }
+}
+
+.form {
+
+ width: 100%;
+ max-width: 330px;
+ padding: 15px;
+ margin: auto;
+ text-align: center;
+}
+</style>