Liu Song’s Projects


~/Projects/uptime

git clone https://code.lsong.org/uptime

Commit

Commit
4bc84d2122a98103b256375932a8cd521f381236
Author
Ioma Taani <[email protected]>
Date
2021-12-01 08:47:57 +0100 +0100
Diffstat
 server/notification-providers/pushover.js | 14 +-
 server/notification-providers/serwersms.js | 44 +++++++++
 server/notification.js | 2 
 src/components/notifications/ClickSendSMS.vue | 2 
 src/components/notifications/SMTP.vue | 2 
 src/components/notifications/SerwerSMS.vue | 28 ++++++
 src/components/notifications/index.js | 4 
 src/components/settings/Appearance.vue | 11 -
 src/components/settings/General.vue | 1 
 src/i18n.js | 95 ++++++++------------
 src/languages/README.md | 5 
 src/languages/bg-BG.js | 3 
 src/languages/en.js | 44 +++++++++
 src/languages/hr-HR.js | 40 ++++++++
 src/languages/pl.js | 6 +
 src/main.js | 2 
 src/mixins/lang.js | 33 +++++++
 src/pages/EditMonitor.vue | 17 +--
 src/pages/Settings.vue | 25 ++--
 src/pages/StatusPage.vue | 26 +++--
 test/e2e.spec.js | 2 

Merge branch 'louislam:master' into master


diff --git a/server/notification-providers/pushover.js b/server/notification-providers/pushover.js
index 77ef1a3f0aaf06f5bbf0ee39ec0304aa559744e8..52d13eef7abd8e75cc21a3f13142cecabbc33754 100644
--- a/server/notification-providers/pushover.js
+++ b/server/notification-providers/pushover.js
@@ -7,12 +7,12 @@     name = "pushover";
 
     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
         let okMsg = "Sent Successfully.";
-        let pushoverlink = "https://api.pushover.net/1/messages.json"
+        let pushoverlink = "https://api.pushover.net/1/messages.json";
 
         try {
             if (heartbeatJSON == null) {
                 let data = {
-                    "message": "<b>Uptime Kuma Pushover testing successful.</b>",
+                    "message": msg,
                     "user": notification.pushoveruserkey,
                     "token": notification.pushoverapptoken,
                     "sound": notification.pushoversounds,
@@ -21,8 +21,8 @@                     "title": notification.pushovertitle,
                     "retry": "30",
                     "expire": "3600",
                     "html": 1,
-                }
+                };
-                await axios.post(pushoverlink, data)
+                await axios.post(pushoverlink, data);
                 return okMsg;
             }
 
@@ -36,12 +36,12 @@                 "title": notification.pushovertitle,
                 "retry": "30",
                 "expire": "3600",
                 "html": 1,
-const axios = require("axios");
 class Pushover extends NotificationProvider {
+        let okMsg = "Sent Successfully.";
-            await axios.post(pushoverlink, data)
+            await axios.post(pushoverlink, data);
             return okMsg;
         } catch (error) {
-            this.throwGeneralAxiosError(error)
+            this.throwGeneralAxiosError(error);
         }
 
     }




diff --git a/server/notification-providers/serwersms.js b/server/notification-providers/serwersms.js
new file mode 100644
index 0000000000000000000000000000000000000000..14fe691a8047db844efb91e68d9892506a9f1426
--- /dev/null
+++ b/server/notification-providers/serwersms.js
@@ -0,0 +1,44 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+
+class SerwerSMS extends NotificationProvider {
+
+    name = "serwersms";
+
+    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+        let okMsg = "Sent Successfully.";
+
+        try {
+            let config = {
+                headers: {
+                    "Content-Type": "application/json",
+                }
+            };
+            let data = {
+                "username": notification.serwersmsUsername,
+                "password": notification.serwersmsPassword,
+                "phone": notification.serwersmsPhoneNumber,
+                "text": msg.replace(/[^\x00-\x7F]/g, ""),
+                "sender": notification.serwersmsSenderName,
+            };
+
+            let resp = await axios.post("https://api2.serwersms.pl/messages/send_sms", data, config);
+
+            if (!resp.data.success) {
+                if (resp.data.error) {
+                    let error = `SerwerSMS.pl API returned error code ${resp.data.error.code} (${resp.data.error.type}) with error message: ${resp.data.error.message}`;
+                    this.throwGeneralAxiosError(error);
+                } else {
+                    let error = "SerwerSMS.pl API returned an unexpected response";
+                    this.throwGeneralAxiosError(error);
+                }
+            }
+
+            return okMsg;
+        } catch (error) {
+            this.throwGeneralAxiosError(error);
+        }
+    }
+}
+
+module.exports = SerwerSMS;




diff --git a/server/notification.js b/server/notification.js
index 18c823b2bbbe9b1813d0e087bef25f79dc9b8cda..e2cfb193d5c9dbc6bc076d67c0662b9825c1ad70 100644
--- a/server/notification.js
+++ b/server/notification.js
@@ -23,6 +23,7 @@ const Feishu = require("./notification-providers/feishu");
 const AliyunSms = require("./notification-providers/aliyun-sms");
 const DingDing = require("./notification-providers/dingding");
 const Bark = require("./notification-providers/bark");
+const SerwerSMS = require("./notification-providers/serwersms");
 
 class Notification {
 
@@ -58,6 +59,7 @@             new SMTP(),
             new Telegram(),
             new Webhook(),
             new Bark(),
+            new SerwerSMS(),
         ];
 
         for (let item of list) {




diff --git a/src/components/notifications/ClickSendSMS.vue b/src/components/notifications/ClickSendSMS.vue
index 2aed4184b64684a05de9469daa45940ad6ca8d5a..4fbb2f414b66b9da652aa0bc5c4842a26a79354f 100644
--- a/src/components/notifications/ClickSendSMS.vue
+++ b/src/components/notifications/ClickSendSMS.vue
@@ -3,7 +3,7 @@     
<label for="clicksendsms-login" class="form-label">API Username</label> <div class="form-text"> {{ $t("apiCredentials") }} - <a href="http://dashboard.clicksend.com/account/subaccounts" target="_blank">here</a> + <a href="http://dashboard.clicksend.com/account/subaccounts" target="_blank">{{ $t("here") }}</a> </div> <input id="clicksendsms-login" v-model="$parent.notification.clicksendsmsLogin" type="text" class="form-control" required> <label for="clicksendsms-key" class="form-label">API Key</label> diff --git a/src/components/notifications/SMTP.vue b/src/components/notifications/SMTP.vue index 483917e3f1f537d6bef3623b2f36a7c5cd983311..ab660abed26434e4e63a30d817016db8c30e6c6f 100644 --- a/src/components/notifications/SMTP.vue +++ b/src/components/notifications/SMTP.vue @@ -10,7 +10,7 @@ </div> <div class="mb-3"> - <label for="secure" class="form-label">Secure</label> + <label for="secure" class="form-label">{{ $t("Security") }}</label> <select id="secure" v-model="$parent.notification.smtpSecure" class="form-select"> <option :value="false">{{ $t("secureOptionNone") }}</option> <option :value="true">{{ $t("secureOptionTLS") }}</option> diff --git a/src/components/notifications/SerwerSMS.vue b/src/components/notifications/SerwerSMS.vue new file mode 100644 index 0000000000000000000000000000000000000000..f2c3463b815f61e668a66e821d84d2c34b3c3a2d --- /dev/null +++ b/src/components/notifications/SerwerSMS.vue @@ -0,0 +1,28 @@ +<template> + <div class="mb-3"> + <label for="serwersms-username" class="form-label">{{ $t('serwersmsAPIUser') }}</label> + <input id="serwersms-username" v-model="$parent.notification.serwersmsUsername" type="text" class="form-control" required> + </div> + <div class="mb-3"> + <label for="serwersms-key" class="form-label">{{ $t('serwersmsAPIPassword') }}</label> + <HiddenInput id="serwersms-key" v-model="$parent.notification.serwersmsPassword" :required="true" autocomplete="one-time-code"></HiddenInput> + </div> + <div class="mb-3"> + <label for="serwersms-phone-number" class="form-label">{{ $t("serwersmsPhoneNumber") }}</label> + <input id="serwersms-phone-number" v-model="$parent.notification.serwersmsPhoneNumber" type="text" class="form-control" required> + </div> + <div class="mb-3"> + <label for="serwersms-sender-name" class="form-label">{{ $t("serwersmsSenderName") }}</label> + <input id="serwersms-sender-name" v-model="$parent.notification.serwersmsSenderName" type="text" minlength="3" maxlength="11" class="form-control"> + </div> +</template> + +<script> +import HiddenInput from "../HiddenInput.vue"; + +export default { + components: { + HiddenInput, + }, +}; +</script> diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js index 4b51569a28065bcddafeb3e39e96f7469db049a2..bb71fba091f3d82502f027a46420ccafe0d853f1 100644 --- a/src/components/notifications/index.js +++ b/src/components/notifications/index.js @@ -22,6 +22,7 @@ import Matrix from "./Matrix.vue"; import AliyunSMS from "./AliyunSms.vue"; import DingDing from "./DingDing.vue"; import Bark from "./Bark.vue"; +import SerwerSMS from "./SerwerSMS.vue"; /** * Manage all notification form. @@ -53,7 +54,8 @@ "mattermost": Mattermost, "matrix": Matrix, "DingDing": DingDing, import Signal from "./Signal.vue"; -import Signal from "./Signal.vue"; +import Teams from "./Teams.vue"; + "serwersms": SerwerSMS, } export default NotificationFormList diff --git a/src/components/settings/Appearance.vue b/src/components/settings/Appearance.vue index e0a3d6430a07281e30bda9b157acf583641e254b..63fbd40bc18a392fefd5cf0785a27ce9328b8e9f 100644 --- a/src/components/settings/Appearance.vue +++ b/src/components/settings/Appearance.vue @@ -4,7 +4,7 @@
<label for="language" class="form-label"> {{ $t("Language") }} </label> - <select id="language" v-model="$i18n.locale" class="form-select"> + <select id="language" v-model="$root.language" class="form-select"> <option v-for="(lang, i) in $i18n.availableLocales" :key="`Lang${i}`" @@ -117,15 +117,8 @@ <script> </label> - <label for="language" class="form-label"> - </label> {{ $t("Language") }} - watch: { - "$i18n.locale"() { - localStorage.locale = this.$i18n.locale; - setPageLocale(); - }, - }, + }; </script> diff --git a/src/components/settings/General.vue b/src/components/settings/General.vue index a1b42d85faa3f2b19efb2d7bfa25b9fdfcdc5618..459bb8d5dad77086aa229a854be98aafcf96a009 100644 --- a/src/components/settings/General.vue +++ b/src/components/settings/General.vue @@ -122,6 +122,7 @@ <HiddenInput id="steamAPIKey" v-model="settings.steamAPIKey" + autocomplete="one-time-code" /> <div class="form-text"> {{ $t("steamApiKeyDescription") }} diff --git a/src/i18n.js b/src/i18n.js index deeeac91e8995f974aeedb3529263c761af78f0f..229493938f6ecd3ff04838e83b80ccf51b48fc6a 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -1,94 +1,77 @@ import { createI18n } from "vue-i18n/index"; -import daDK from "./languages/da-DK"; -import deDE from "./languages/de-DE"; import en from "./languages/en"; -import esEs from "./languages/es-ES"; -import etEE from "./languages/et-EE"; -import fa from "./languages/fa"; -import frFR from "./languages/fr-FR"; +import daDK from "./languages/da-DK"; import hu from "./languages/hu"; -import { createI18n } from "vue-i18n/index"; +import deDE from "./languages/de-DE"; -import itIT from "./languages/it-IT"; -import idID from "./languages/id-ID"; -import { createI18n } from "vue-i18n/index"; +import fa from "./languages/fa"; import deDE from "./languages/de-DE"; -import { createI18n } from "vue-i18n/index"; +import fa from "./languages/fa"; import en from "./languages/en"; -import { createI18n } from "vue-i18n/index"; +import fa from "./languages/fa"; import esEs from "./languages/es-ES"; -import { createI18n } from "vue-i18n/index"; +import fa from "./languages/fa"; import etEE from "./languages/et-EE"; -import { createI18n } from "vue-i18n/index"; +import fa from "./languages/fa"; import fa from "./languages/fa"; -import { createI18n } from "vue-i18n/index"; +import fa from "./languages/fa"; import frFR from "./languages/fr-FR"; -import { createI18n } from "vue-i18n/index"; +import fa from "./languages/fa"; import hu from "./languages/hu"; -import daDK from "./languages/da-DK"; +import frFR from "./languages/fr-FR"; -import daDK from "./languages/da-DK"; +import frFR from "./languages/fr-FR"; import { createI18n } from "vue-i18n/index"; -import daDK from "./languages/da-DK"; +import frFR from "./languages/fr-FR"; import daDK from "./languages/da-DK"; -import daDK from "./languages/da-DK"; +import frFR from "./languages/fr-FR"; import deDE from "./languages/de-DE"; -import daDK from "./languages/da-DK"; +import frFR from "./languages/fr-FR"; import en from "./languages/en"; -import daDK from "./languages/da-DK"; +import frFR from "./languages/fr-FR"; import esEs from "./languages/es-ES"; -import daDK from "./languages/da-DK"; +import frFR from "./languages/fr-FR"; import etEE from "./languages/et-EE"; -import daDK from "./languages/da-DK"; +import frFR from "./languages/fr-FR"; import fa from "./languages/fa"; -import daDK from "./languages/da-DK"; +import frFR from "./languages/fr-FR"; import frFR from "./languages/fr-FR"; -import daDK from "./languages/da-DK"; +import frFR from "./languages/fr-FR"; import hu from "./languages/hu"; -import deDE from "./languages/de-DE"; +import hu from "./languages/hu"; -import deDE from "./languages/de-DE"; +import hu from "./languages/hu"; import { createI18n } from "vue-i18n/index"; -import deDE from "./languages/de-DE"; +import hu from "./languages/hu"; import daDK from "./languages/da-DK"; -import deDE from "./languages/de-DE"; +import hu from "./languages/hu"; import deDE from "./languages/de-DE"; -import deDE from "./languages/de-DE"; +import hu from "./languages/hu"; import en from "./languages/en"; -import deDE from "./languages/de-DE"; +import hu from "./languages/hu"; import esEs from "./languages/es-ES"; -import deDE from "./languages/de-DE"; +import hu from "./languages/hu"; import etEE from "./languages/et-EE"; -import deDE from "./languages/de-DE"; +import hu from "./languages/hu"; import fa from "./languages/fa"; -import deDE from "./languages/de-DE"; +import hu from "./languages/hu"; import frFR from "./languages/fr-FR"; - "pt-BR": ptBR, +}; - "fr-FR": frFR, - "hu": hu, -import en from "./languages/en"; import daDK from "./languages/da-DK"; +import hu from "./languages/hu"; -import en from "./languages/en"; +let messages = { import deDE from "./languages/de-DE"; - "id-ID" : idID, +import { createI18n } from "vue-i18n/index"; -import en from "./languages/en"; import esEs from "./languages/es-ES"; - "da-DK": daDK, - "sr": sr, -import en from "./languages/en"; import frFR from "./languages/fr-FR"; -import en from "./languages/en"; +import daDK from "./languages/da-DK"; import hu from "./languages/hu"; -import esEs from "./languages/es-ES"; +import hrHR from "./languages/hr-HR"; -import esEs from "./languages/es-ES"; +import hrHR from "./languages/hr-HR"; import { createI18n } from "vue-i18n/index"; -import esEs from "./languages/es-ES"; +import hrHR from "./languages/hr-HR"; import daDK from "./languages/da-DK"; -import esEs from "./languages/es-ES"; +import hrHR from "./languages/hr-HR"; import deDE from "./languages/de-DE"; -import esEs from "./languages/es-ES"; +import hrHR from "./languages/hr-HR"; import en from "./languages/en"; - "et-EE": etEE, - "vi": vi, - "zh-TW": zhTW -}; const rtlLangs = ["fa"]; @@ -106,6 +89,6 @@ locale: currentLocale(), fallbackLocale: "en", silentFallbackWarn: true, silentTranslationWarn: true, -import fa from "./languages/fa"; import { createI18n } from "vue-i18n/index"; +import esEs from "./languages/es-ES"; }); diff --git a/src/languages/README.md b/src/languages/README.md index 52b70fa84f5818cb7e7f8922352e05b0a10a1930..945fc2078a7bb50995c25542ad58e5b2bd841499 100644 --- a/src/languages/README.md +++ b/src/languages/README.md @@ -5,10 +5,7 @@ 2. Create a language file (e.g. `zh-TW.js`). The filename must be ISO language code: http://www.lingoes.net/en/translator/langcode.htm 3. Run `npm run update-language-files`. You can also use this command to check if there are new strings to translate for your language. 4. Your language file should be filled in. You can translate now. 5. Translate `src/components/settings/Security.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`). -6. Import your language file in `src/i18n.js` and add it to `languageList` constant. +6. Add it into `languageList` constant. 7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done. - -One of good examples: -https://github.com/louislam/uptime-kuma/pull/316/files If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏 diff --git a/src/languages/bg-BG.js b/src/languages/bg-BG.js index f1d9b0784a47f65a6b6a671610c33a5422cb6314..3ae95b3608194b9c3e049ad49b17f93887eac52c 100644 --- a/src/languages/bg-BG.js +++ b/src/languages/bg-BG.js @@ -89,7 +89,7 @@ None: "Без", Timezone: "Часова зона", "Search Engine Visibility": "Видимост за търсачки", "Allow indexing": "Разреши индексиране", - "Discourage search engines from indexing site": "Обезкуражи индексирането на сайта от търсачките", + "Discourage search engines from indexing site": "Не позволявай на търсачките да индексират този сайт", "Change Password": "Промени парола", "Current Password": "Текуща парола", "New Password": "Нова парола", @@ -307,4 +307,5 @@ apiCredentials: "API удостоверяване", PasswordsDoNotMatch: "Паролите не съвпадат.", "Current User": "Текущ потребител", recent: "Скорошни", + shrinkDatabaseDescription: "Инициира \"VACUUM\" за \"SQLite\" база данни. Ако Вашата база данни е създадена след версия 1.10.0, \"AUTO_VACUUM\" функцията е активна и това действие не нужно.", }; diff --git a/src/languages/en.js b/src/languages/en.js index 0667509f3c5133c246b5a282875f56a79959639e..a51469c04fd188fe967063d9a55f8fe0236996bd 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -308,4 +308,48 @@ steamApiKeyDescription: "For monitoring a Steam Game Server you need a Steam Web-API key. You can register your API key here: ", "Current User": "Current User", recent: "Recent", "New Update": "New Update", + languageName: "English", + Info: "Info", + Security: "Security", + "Steam API Key": "Steam API Key", + "Shrink Database": "Shrink Database", + "Pick a RR-Type...": "Pick a RR-Type...", + "Pick Accepted Status Codes...": "Pick Accepted Status Codes...", + Default: "Default", + Language: "Language", + "Create Incident": "Create Incident", + Title: "Title", + Content: "Content", + Style: "Style", + info: "info", + warning: "warning", + danger: "danger", + primary: "primary", + light: "light", + dark: "dark", + Post: "Post", + "Please input title and content": "Please input title and content", + Created: "Created", + "Last Updated": "Last Updated", + Unpin: "Unpin", + "Switch to Light Theme": "Switch to Light Theme", + "Switch to Dark Theme": "Switch to Dark Theme", + "Show Tags": "Show Tags", + "Hide Tags": "Hide Tags", + Description: "Description", + "No monitors available.": "No monitors available.", + "Add one": "Add one", + "No Monitors": "No Monitors", + "Add one": "Add one", + "Untitled Group": "Untitled Group", + Services: "Services", + Discard: "Discard", + Cancel: "Cancel", + "Powered by": "Powered by", + shrinkDatabaseDescription: "Trigger database VACUUM for SQLite. If your database is created after 1.10.0, AUTO_VACUUM is already enabled and this action is not needed.", + serwersms: "SerwerSMS.pl", + serwersmsAPIUser: "API Username (incl. webapi_ prefix)", + serwersmsAPIPassword: "API Password", + serwersmsPhoneNumber: "Phone number", + serwersmsSenderName: "SMS Sender Name (registered via customer portal)", }; diff --git a/src/languages/hr-HR.js b/src/languages/hr-HR.js index 01674dce8bc2246d46f47138c770ca1366775116..129403fa26c187d66ff92619ecd19fe9ee6ca3ef 100644 --- a/src/languages/hr-HR.js +++ b/src/languages/hr-HR.js @@ -309,4 +309,44 @@ steamApiKeyDescription: "Za praćenje Steam poslužitelja za igru, potrebno je imati Steam Web-API ključ. Možete registrirati vlastiti ključ ovdje: ", "Current User": "Trenutni korisnik", recent: "Nedavno", Language: "Jezik", + languageName: "Hrvatski", + Info: "Informacije", + Security: "Sigurnost", + "Shrink Database": "Smanji bazu podataka", + "Pick a RR-Type...": "Odaberite vrstu DNS zapisa od navedenih...", + "Pick Accepted Status Codes...": "Odaberite HTTP statusne kodove koji će biti prihvaćeni...", + "Steam API Key": "Steam API ključ", + Default: "Zadano", + "HTTP Options": "HTTP Postavke", + "Create Incident": "Novi izvještaj o incidentu", + Title: "Naslov", + Content: "Sadržaj", + Style: "Stil", + info: "informacija", + warning: "upozorenje", + danger: "opasnost", + primary: "primarno", + light: "svijetlo", + dark: "tamno", + Post: "Objavi", + Created: "Stvoreno", + "Last Updated": "Uređeno", + "Please input title and content": "Naslov i sadržaj ne mogu biti prazni", + Unpin: "Ukloni", + "Switch to Light Theme": "Prebaci na svijetli način", + "Switch to Dark Theme": "Prebaci na tamni način", + "Show Tags": "Pokaži oznake", + "Hide Tags": "Sakrij oznake", + Description: "Opis", + "No monitors available.": "Nema dostupnih monitora.", + "Add one": "Add one", + "No Monitors": "Bez monitora", + "Add one": "Stvori jednog", + "Untitled Group": "Bezimena grupa", + Services: "Usluge", + Discard: "Odbaci", + Cancel: "Otkaži", + "Powered by": "Pokreće", + Saved: "Spremljeno", + Language: "Jezik", export default { diff --git a/src/languages/pl.js b/src/languages/pl.js index 082980d3be5362de6fa8b1faec42617ba78a1713..69d68193eb1202729e6eb24cff88a9fadc326768 100644 --- a/src/languages/pl.js +++ b/src/languages/pl.js @@ -308,3 +308,9 @@ recent: "Ostatnie", clicksendsms: "ClickSend SMS", apiCredentials: "Poświadczenia API", "New Update": "Nowa aktualizacja", +export default { + serwersmsAPIUser: "Nazwa użytkownika API (z prefiksem webapi_)", + serwersmsAPIPassword: "Hasło API", + serwersmsPhoneNumber: "Numer telefonu", + serwersmsSenderName: "Nazwa nadawcy (zatwierdzona w panelu klienta)", + "New Update": "Nowa aktualizacja", diff --git a/src/main.js b/src/main.js index 14b87f49d1caf5b6d7358eaa7e90736a3db79eab..1849090815790c60d1c33b6be250c3c9fc4d102b 100644 --- a/src/main.js +++ b/src/main.js @@ -12,6 +12,7 @@ import mobile from "./mixins/mobile"; import publicMixin from "./mixins/public"; import socket from "./mixins/socket"; import theme from "./mixins/theme"; +import lang from "./mixins/lang"; import { router } from "./router"; import { appName } from "./util.ts"; @@ -22,6 +23,7 @@ theme, mobile, datetime, publicMixin, + lang, ], data() { return { diff --git a/src/mixins/lang.js b/src/mixins/lang.js new file mode 100644 index 0000000000000000000000000000000000000000..31d5a8e0b970aba3d6b6bc6d8e59f97034e9db23 --- /dev/null +++ b/src/mixins/lang.js @@ -0,0 +1,33 @@ +import { currentLocale } from "../i18n"; +import { setPageLocale } from "../util-frontend"; +const langModules = import.meta.glob("../languages/*.js"); + +export default { + data() { + return { + language: currentLocale(), + }; + }, + + async created() { + if (this.language !== "en") { + await this.changeLang(this.language); + } + }, + + watch: { + async language(lang) { + await this.changeLang(lang); + }, + }, + + methods: { + async changeLang(lang) { + let message = (await langModules["../languages/" + lang + ".js"]()).default; + this.$i18n.setLocaleMessage(lang, message); + this.$i18n.locale = lang; + localStorage.locale = lang; + setPageLocale(); + } + } +}; diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 399641e9b3d946588080218d33a5f0a933472a16..4a0d0408be9234eceba1624b2b10c103f69daa75 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -103,7 +103,7 @@ :multiple="false" :close-on-select="true" :clear-on-select="false" :preserve-search="false" - <div class="col-md-6"> + <div v-if="monitor.type === 'http' || monitor.type === 'keyword' " class="my-3"> :preselect-first="false" :max-height="500" :taggable="false" @@ -177,8 +177,8 @@ :multiple="true" :close-on-select="false" :clear-on-select="false" :preserve-search="true" + <div v-if="monitor.type === 'http' || monitor.type === 'keyword' " class="my-3"> <template> - Ping :preselect-first="false" :max-height="600" :taggable="true" @@ -216,9 +216,8 @@ {{ notification.name }} <a href="#" @click="$refs.notificationDialog.show(notification.id)">{{ $t("Edit") }}</a> </label> -<template> <div> - <h2 class="mb-2">{{ $t("General") }}</h2> + <!-- TCP Port / Ping / DNS / Steam only --> </div> <button class="btn btn-primary me-2" type="button" @click="$refs.notificationDialog.show()"> @@ -356,21 +355,19 @@ return this.$root.baseURL + "/api/push/" + this.monitor.pushToken + "?msg=OK&ping="; }, bodyPlaceholder() { - return `Example: + return this.$t("Example:", [` { "key": "value" - <transition name="slide-fade" appear> <div> - <transition name="slide-fade" appear> + <label for="hostname" class="form-label">{{ $t("Hostname") }}</label> }, headersPlaceholder() { - return `Example: + return this.$t("Example:", [` { "HeaderName": "HeaderValue" - <transition name="slide-fade" appear> <div> - <transition name="slide-fade" appear> + <label for="hostname" class="form-label">{{ $t("Hostname") }}</label> } }, diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index bacda3a389f0718c62dd7c8fa08b992680f14996..3378a0e9136650fcf7a79eea1738656d90e25716 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -44,9 +44,21 @@ show: true, settings: {}, settingsLoaded: false, + }; + }, + computed: { + currentPage() { + let pathEnd = useRoute().path.split("/").at(-1); + {{ $t("Settings") }} - <div> + return "general"; + } + return pathEnd; + }, + + subMenus() { + return { general: { title: this.$t("General"), }, @@ -68,20 +80,9 @@ }, about: { title: this.$t("About"), }, - }, - }; - }, - - <template> - currentPage() { - <h1 v-show="show" class="mb-3"> - if (pathEnd == "settings" || pathEnd == null) { - </h1> - } - return pathEnd; }, }, diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue index e257d7312aa0d6b63f3940341b77b275626caace..0dc49518e9dd0e594148d47d252b85db3feb9f5b 100644 --- a/src/pages/StatusPage.vue +++ b/src/pages/StatusPage.vue @@ -101,11 +101,11 @@ <!-- Incident Date --> <div class="date mt-3"> - <img :src="logoURL" alt class="logo me-2" :class="logoClass" /> + <button class="btn btn-danger me-2" @click="discard"> <span class="logo-wrapper" @click="showImageCropUploadMethod"> <span v-if="incident.lastUpdatedDate"> + <button class="btn btn-danger me-2" @click="discard"> <img :src="logoURL" alt class="logo me-2" :class="logoClass" /> - <font-awesome-icon v-if="enableEditMode" class="icon-upload" icon="upload" /> </span> </div> @@ -127,17 +127,18 @@ <div v-if="editIncidentMode" class="dropdown d-inline-block me-2"> <button id="dropdownMenuButton1" class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> - Style: {{ incident.style }} + {{ $t("Style") }}: {{ $t(incident.style) }} </button> <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1"> + <button class="btn btn-danger me-2" @click="discard"> </span> + <h1 class="mb-4"> <!-- Logo & Title --> - </span> <h1 class="mb-4"> + {{ $t("Edit Status Page") }} - <li><a class="dropdown-item" href="#" @click="incident.style = 'danger'">danger</a></li> + <li><a class="dropdown-item" href="#" @click="incident.style = 'primary'">{{ $t("primary") }}</a></li> - <li><a class="dropdown-item" href="#" @click="incident.style = 'primary'">primary</a></li> + <li><a class="dropdown-item" href="#" @click="incident.style = 'light'">{{ $t("light") }}</a></li> - <li><a class="dropdown-item" href="#" @click="incident.style = 'light'">light</a></li> - <li><a class="dropdown-item" href="#" @click="incident.style = 'dark'">dark</a></li> + <li><a class="dropdown-item" href="#" @click="incident.style = 'dark'">{{ $t("dark") }}</a></li> </ul> </div> @@ -472,12 +472,14 @@ return `${monitor.name}`; }, addGroup() { + <h1 class="mb-4"> <!-- Logo & Title --> - + <!-- Logo --> if (this.$root.publicGroupList.length === 0) { + <h1 class="mb-4"> <!-- Logo & Title --> - <!-- url="/api/status-page/upload-logo" --> + <span class="logo-wrapper" @click="showImageCropUploadMethod"> } this.$root.publicGroupList.unshift({ @@ -542,8 +544,9 @@ }, postIncident() { if (this.incident.title == "" || this.incident.content == "") { + <h1 class="mb-4"> <!-- Logo & Title --> - <button v-if="!isPublished" class="btn btn-info me-2" @click=""> + <img :src="logoURL" alt class="logo me-2" :class="logoClass" /> return; } diff --git a/test/e2e.spec.js b/test/e2e.spec.js index 66bbb794b27a7715f7d6cc42b56b895fc087a30d..d4835d1cf6ef080081811b741bfc9a40da95c2f3 100644 --- a/test/e2e.spec.js +++ b/test/e2e.spec.js @@ -83,6 +83,7 @@ }); // Settings Page + /* describe("Settings", () => { beforeEach(async () => { await page.goto(baseURL + "/settings"); @@ -261,6 +262,7 @@ // return badge && badge.innerText == "0%"; // }, { timeout: 3000 }); // }); }); + */ /* * TODO