mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-08-11 09:39:08 +08:00
Merge branch 'master' into master
This commit is contained in:
@@ -34,6 +34,25 @@ textarea.form-control {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// optgroup
|
||||
optgroup {
|
||||
color: #b1b1b1;
|
||||
option {
|
||||
color: #212529;
|
||||
}
|
||||
}
|
||||
|
||||
.dark {
|
||||
optgroup {
|
||||
color: #535864;
|
||||
option {
|
||||
color: $dark-font-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Scrollbar
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: #ccc;
|
||||
border-radius: 20px;
|
||||
@@ -363,6 +382,12 @@ textarea.form-control {
|
||||
overflow-y: auto;
|
||||
height: calc(100% - 65px);
|
||||
}
|
||||
|
||||
@media (max-width: 770px) {
|
||||
&.scrollbar {
|
||||
height: calc(100% - 40px);
|
||||
}
|
||||
}
|
||||
|
||||
.item {
|
||||
display: block;
|
||||
@@ -473,6 +498,14 @@ textarea.form-control {
|
||||
outline: none !important;
|
||||
}
|
||||
|
||||
h5.settings-subheading::after {
|
||||
content: "";
|
||||
display: block;
|
||||
width: 50%;
|
||||
padding-top: 8px;
|
||||
border-bottom: 1px solid $dark-border-color;
|
||||
}
|
||||
|
||||
// Localization
|
||||
|
||||
@import "localization.scss";
|
||||
|
86
src/components/ActionInput.vue
Normal file
86
src/components/ActionInput.vue
Normal file
@@ -0,0 +1,86 @@
|
||||
<template>
|
||||
<div class="input-group mb-3">
|
||||
<input
|
||||
ref="input"
|
||||
v-model="model"
|
||||
class="form-control"
|
||||
:type="type"
|
||||
:placeholder="placeholder"
|
||||
:disabled="!enabled"
|
||||
>
|
||||
<a class="btn btn-outline-primary" @click="action()">
|
||||
<font-awesome-icon :icon="icon" />
|
||||
</a>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
/**
|
||||
* Generic input field with a customizable action on the right.
|
||||
* Action is passed in as a function.
|
||||
*/
|
||||
export default {
|
||||
props: {
|
||||
/**
|
||||
* The value of the input field.
|
||||
*/
|
||||
modelValue: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
/**
|
||||
* Whether the input field is enabled / disabled.
|
||||
*/
|
||||
enabled: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
/**
|
||||
* Placeholder text for the input field.
|
||||
*/
|
||||
placeholder: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
/**
|
||||
* The icon displayed in the right button of the input field.
|
||||
* Accepts a Font Awesome icon string identifier.
|
||||
* @example "plus"
|
||||
*/
|
||||
icon: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
/**
|
||||
* The input type of the input field.
|
||||
* @example "email"
|
||||
*/
|
||||
type: {
|
||||
type: String,
|
||||
default: "text",
|
||||
},
|
||||
/**
|
||||
* The action to be performed when the button is clicked.
|
||||
* Action is passed in as a function.
|
||||
*/
|
||||
action: {
|
||||
type: Function,
|
||||
default: () => {},
|
||||
}
|
||||
},
|
||||
emits: [ "update:modelValue" ],
|
||||
computed: {
|
||||
/**
|
||||
* Send value update to parent on change.
|
||||
*/
|
||||
model: {
|
||||
get() {
|
||||
return this.modelValue;
|
||||
},
|
||||
set(value) {
|
||||
this.$emit("update:modelValue", value);
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
@@ -69,10 +69,22 @@ export default {
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
/**
|
||||
* Improve the sticky appearance of the list by increasing its
|
||||
* height as user scrolls down.
|
||||
* Not used on mobile.
|
||||
*/
|
||||
boxStyle() {
|
||||
return {
|
||||
height: `calc(100vh - 160px + ${this.windowTop}px)`,
|
||||
};
|
||||
if (window.innerWidth > 550) {
|
||||
return {
|
||||
height: `calc(100vh - 160px + ${this.windowTop}px)`,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
height: "calc(100vh - 160px)",
|
||||
};
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
sortedMonitorList() {
|
||||
|
@@ -41,7 +41,7 @@
|
||||
<Uptime :monitor="monitor.element" type="24" :pill="true" />
|
||||
{{ monitor.element.name }}
|
||||
</div>
|
||||
<div v-if="showTag" class="tags">
|
||||
<div v-if="showTags" class="tags">
|
||||
<Tag v-for="tag in monitor.element.tags" :key="tag" :item="tag" :size="'sm'" />
|
||||
</div>
|
||||
</div>
|
||||
|
30
src/components/notifications/Ntfy.vue
Normal file
30
src/components/notifications/Ntfy.vue
Normal file
@@ -0,0 +1,30 @@
|
||||
<template>
|
||||
<div class="mb-3">
|
||||
<label for="ntfy-ntfytopic" class="form-label">{{ $t("ntfy Topic") }}</label>
|
||||
<div class="input-group mb-3">
|
||||
<input id="ntfy-ntfytopic" v-model="$parent.notification.ntfytopic" type="text" class="form-control" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ntfy-server-url" class="form-label">{{ $t("Server URL") }}</label>
|
||||
<div class="input-group mb-3">
|
||||
<input id="ntfy-server-url" v-model="$parent.notification.ntfyserverurl" type="text" class="form-control" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="ntfy-priority" class="form-label">{{ $t("Priority") }}</label>
|
||||
<input id="ntfy-priority" v-model="$parent.notification.ntfyPriority" type="number" class="form-control" required min="1" max="5" step="1">
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
mounted() {
|
||||
if (typeof this.$parent.notification.ntfyPriority === "undefined") {
|
||||
this.$parent.notification.ntfyserverurl = "https://ntfy.sh";
|
||||
this.$parent.notification.ntfyPriority = 5;
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
@@ -1,8 +1,8 @@
|
||||
<template>
|
||||
<div class="mb-3">
|
||||
<label for="promosms-login" class="form-label">{{ $("promosmsLogin") }}</label>
|
||||
<label for="promosms-login" class="form-label">{{ $t("promosmsLogin") }}</label>
|
||||
<input id="promosms-login" v-model="$parent.notification.promosmsLogin" type="text" class="form-control" required>
|
||||
<label for="promosms-key" class="form-label">{{ $("promosmsPassword") }}</label>
|
||||
<label for="promosms-key" class="form-label">{{ $t("promosmsPassword") }}</label>
|
||||
<HiddenInput id="promosms-key" v-model="$parent.notification.promosmsPassword" :required="true" autocomplete="one-time-code"></HiddenInput>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
|
@@ -4,6 +4,7 @@ import Discord from "./Discord.vue";
|
||||
import Webhook from "./Webhook.vue";
|
||||
import Signal from "./Signal.vue";
|
||||
import Gotify from "./Gotify.vue";
|
||||
import Ntfy from "./Ntfy.vue";
|
||||
import Slack from "./Slack.vue";
|
||||
import RocketChat from "./RocketChat.vue";
|
||||
import Teams from "./Teams.vue";
|
||||
@@ -46,6 +47,7 @@ const NotificationFormList = {
|
||||
"teams": Teams,
|
||||
"signal": Signal,
|
||||
"gotify": Gotify,
|
||||
"ntfy": Ntfy,
|
||||
"slack": Slack,
|
||||
"rocket.chat": RocketChat,
|
||||
"pushover": Pushover,
|
||||
|
@@ -20,16 +20,91 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="my-4 pt-4">
|
||||
<h5 class="my-4 settings-subheading">{{ $t("settingsCertificateExpiry") }}</h5>
|
||||
<p>{{ $t("certificationExpiryDescription") }}</p>
|
||||
<div class="mt-1 mb-3 ps-2 cert-exp-days col-12 col-xl-6">
|
||||
<div v-for="day in settings.tlsExpiryNotifyDays" :key="day" class="d-flex align-items-center justify-content-between cert-exp-day-row py-2">
|
||||
<span>{{ day }} {{ $tc("day", day) }}</span>
|
||||
<button type="button" class="btn-rm-expiry btn btn-outline-danger ms-2 py-1" @click="removeExpiryNotifDay(day)">
|
||||
<font-awesome-icon class="" icon="times" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-xl-6">
|
||||
<ActionInput v-model="expiryNotifInput" :type="'number'" :placeholder="$t('day')" :icon="'plus'" :action="() => addExpiryNotifDay(expiryNotifInput)" />
|
||||
</div>
|
||||
<div>
|
||||
<button class="btn btn-primary" type="button" @click="saveSettings()">
|
||||
{{ $t("Save") }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<NotificationDialog ref="notificationDialog" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import NotificationDialog from "../../components/NotificationDialog.vue";
|
||||
import ActionInput from "../ActionInput.vue";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
NotificationDialog
|
||||
NotificationDialog,
|
||||
ActionInput,
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
/**
|
||||
* Variable to store the input for new certificate expiry day.
|
||||
*/
|
||||
expiryNotifInput: null,
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
settings() {
|
||||
return this.$parent.$parent.$parent.settings;
|
||||
},
|
||||
saveSettings() {
|
||||
return this.$parent.$parent.$parent.saveSettings;
|
||||
},
|
||||
settingsLoaded() {
|
||||
return this.$parent.$parent.$parent.settingsLoaded;
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
/**
|
||||
* Remove a day from expiry notification days.
|
||||
* @param {number} day The day to remove.
|
||||
*/
|
||||
removeExpiryNotifDay(day) {
|
||||
this.settings.tlsExpiryNotifyDays = this.settings.tlsExpiryNotifyDays.filter(d => d !== day);
|
||||
},
|
||||
/**
|
||||
* Add a new expiry notification day.
|
||||
* Will verify:
|
||||
* - day is not null or empty string.
|
||||
* - day is a number.
|
||||
* - day is > 0.
|
||||
* - The day is not already in the list.
|
||||
* @param {number} day The day number to add.
|
||||
*/
|
||||
addExpiryNotifDay(day) {
|
||||
if (day != null && day !== "") {
|
||||
const parsedDay = parseInt(day);
|
||||
if (parsedDay != null && !isNaN(parsedDay) && parsedDay > 0) {
|
||||
if (!this.settings.tlsExpiryNotifyDays.includes(parsedDay)) {
|
||||
this.settings.tlsExpiryNotifyDays.push(parseInt(day));
|
||||
this.settings.tlsExpiryNotifyDays.sort((a, b) => a - b);
|
||||
this.expiryNotifInput = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -37,10 +112,27 @@ export default {
|
||||
<style lang="scss" scoped>
|
||||
@import "../../assets/vars.scss";
|
||||
|
||||
.btn-rm-expiry {
|
||||
padding-left: 11px;
|
||||
padding-right: 11px;
|
||||
}
|
||||
|
||||
.dark {
|
||||
.list-group-item {
|
||||
background-color: $dark-bg2;
|
||||
color: $dark-font-color;
|
||||
}
|
||||
}
|
||||
|
||||
.cert-exp-days .cert-exp-day-row {
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
|
||||
|
||||
.dark & {
|
||||
border-bottom: 1px solid $dark-border-color;
|
||||
}
|
||||
}
|
||||
|
||||
.cert-exp-days .cert-exp-day-row:last-child {
|
||||
border: none;
|
||||
}
|
||||
</style>
|
||||
|
@@ -8,7 +8,7 @@
|
||||
<button v-if="! settings.disableAuth" id="logout-btn" class="btn btn-danger ms-4 me-2 mb-2" @click="$root.logout">{{ $t("Logout") }}</button>
|
||||
</p>
|
||||
|
||||
<h5 class="my-4">{{ $t("Change Password") }}</h5>
|
||||
<h5 class="my-4 settings-subheading">{{ $t("Change Password") }}</h5>
|
||||
<form class="mb-3" @submit.prevent="savePassword">
|
||||
<div class="mb-3">
|
||||
<label for="current-password" class="form-label">
|
||||
@@ -62,7 +62,7 @@
|
||||
</template>
|
||||
|
||||
<div v-if="! settings.disableAuth" class="mt-5 mb-3">
|
||||
<h5 class="my-4">
|
||||
<h5 class="my-4 settings-subheading">
|
||||
{{ $t("Two Factor Authentication") }}
|
||||
</h5>
|
||||
<div class="mb-4">
|
||||
@@ -78,7 +78,7 @@
|
||||
|
||||
<div class="my-4">
|
||||
<!-- Advanced -->
|
||||
<h5 class="my-4">{{ $t("Advanced") }}</h5>
|
||||
<h5 class="my-4 settings-subheading">{{ $t("Advanced") }}</h5>
|
||||
|
||||
<div class="mb-4">
|
||||
<button v-if="settings.disableAuth" id="enableAuth-btn" class="btn btn-outline-primary me-2 mb-2" @click="enableAuth">{{ $t("Enable Auth") }}</button>
|
||||
@@ -346,15 +346,3 @@ export default {
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "../../assets/vars.scss";
|
||||
|
||||
h5::after {
|
||||
content: "";
|
||||
display: block;
|
||||
width: 50%;
|
||||
padding-top: 8px;
|
||||
border-bottom: 1px solid $dark-border-color;
|
||||
}
|
||||
</style>
|
||||
|
@@ -55,8 +55,7 @@ export default {
|
||||
Current: "Текущ",
|
||||
Uptime: "Достъпност",
|
||||
"Cert Exp.": "Вал. сертификат",
|
||||
days: "дни",
|
||||
day: "ден",
|
||||
day: "ден | дни",
|
||||
"-day": "-дни",
|
||||
hour: "час",
|
||||
"-hour": "-часa",
|
||||
@@ -515,4 +514,18 @@ export default {
|
||||
"Go back to the previous page.": "Да се върнете към предишната страница.",
|
||||
"Coming Soon": "Очаквайте скоро",
|
||||
wayToGetClickSendSMSToken: "Може да получите API потребителско име и API ключ от {0} .",
|
||||
dnsPortDescription: "DNS порт на сървъра. По подразбиране е 53, но може да бъде променен по всяко време.",
|
||||
error: "грешка",
|
||||
critical: "критична",
|
||||
wayToGetPagerDutyKey: "Може да го получите като посетите Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Тук може да потърсите \"Events API V2\". Повече информация {0}",
|
||||
"Integration Key": "Ключ за интегриране",
|
||||
"Integration URL": "URL адрес за интеграция",
|
||||
"Auto resolve or acknowledged": "Автоматично разрешаване или потвърждаване",
|
||||
"do nothing": "не прави нищо",
|
||||
"auto acknowledged": "автоматично потвърждаване",
|
||||
"auto resolve": "автоматично потвърждаване",
|
||||
"Connection String": "Стринг за връзка",
|
||||
Query: "Заявка",
|
||||
settingsCertificateExpiry: "Изтичане валидността на TLS сертификата",
|
||||
certificationExpiryDescription: "HTTPS мониторите задействат известие при изтичане на TLS сертификата в:",
|
||||
};
|
||||
|
@@ -56,8 +56,7 @@ export default {
|
||||
Current: "Aktuální",
|
||||
Uptime: "Doba provozu",
|
||||
"Cert Exp.": "Platnost certifikátu",
|
||||
days: "dny/í",
|
||||
day: "den",
|
||||
day: "den | dny/í",
|
||||
"-day": "-dní",
|
||||
hour: "hodina",
|
||||
"-hour": "-hodin",
|
||||
|
@@ -30,8 +30,7 @@ export default {
|
||||
Current: "Aktuelt",
|
||||
Uptime: "Oppetid",
|
||||
"Cert Exp.": "Certifikatets udløb",
|
||||
days: "Dage",
|
||||
day: "Dag",
|
||||
day: "Dag | Dage",
|
||||
"-day": "-Dage",
|
||||
hour: "Timer",
|
||||
"-hour": "-Timer",
|
||||
|
@@ -30,8 +30,7 @@ export default {
|
||||
Current: "Aktuell",
|
||||
Uptime: "Verfügbarkeit",
|
||||
"Cert Exp.": "Zertifikatsablauf",
|
||||
days: "Tage",
|
||||
day: "Tag",
|
||||
day: "Tag | Tage",
|
||||
"-day": "-Tage",
|
||||
hour: "Stunde",
|
||||
"-hour": "-Stunden",
|
||||
|
@@ -57,8 +57,7 @@ export default {
|
||||
Current: "Current",
|
||||
Uptime: "Uptime",
|
||||
"Cert Exp.": "Cert Exp.",
|
||||
days: "days",
|
||||
day: "day",
|
||||
day: "day | days",
|
||||
"-day": "-day",
|
||||
hour: "hour",
|
||||
"-hour": "-hour",
|
||||
@@ -531,4 +530,8 @@ export default {
|
||||
"Go back to the previous page.": "Go back to the previous page.",
|
||||
"Coming Soon": "Coming Soon",
|
||||
wayToGetClickSendSMSToken: "You can get API Username and API Key from {0} .",
|
||||
"Connection String": "Connection String",
|
||||
"Query": "Query",
|
||||
settingsCertificateExpiry: "TLS Certificate Expiry",
|
||||
certificationExpiryDescription: "HTTPS Monitors trigger notification when TLS certificate expires in:",
|
||||
};
|
||||
|
@@ -44,8 +44,7 @@ export default {
|
||||
Current: "Actual",
|
||||
Uptime: "Tiempo activo",
|
||||
"Cert Exp.": "Caducidad cert.",
|
||||
days: "días",
|
||||
day: "día",
|
||||
day: "día | días",
|
||||
"-day": "-día",
|
||||
hour: "hora",
|
||||
"-hour": "-hora",
|
||||
|
@@ -47,8 +47,7 @@ export default {
|
||||
Current: "Hetkeseisund",
|
||||
Uptime: "Eluiga",
|
||||
"Cert Exp.": "Sert. aegumine",
|
||||
days: "päeva",
|
||||
day: "päev",
|
||||
day: "päev | päeva",
|
||||
"-day": "-päev",
|
||||
hour: "tund",
|
||||
"-hour": "-tund",
|
||||
|
@@ -55,7 +55,6 @@ export default {
|
||||
Current: "فعلی",
|
||||
Uptime: "آپتایم",
|
||||
"Cert Exp.": "تاریخ انقضای SSL",
|
||||
days: "روز",
|
||||
day: "روز",
|
||||
"-day": "-روز",
|
||||
hour: "ساعت",
|
||||
|
@@ -55,8 +55,7 @@ export default {
|
||||
Current: "Actuellement",
|
||||
Uptime: "Uptime",
|
||||
"Cert Exp.": "Expiration SSL",
|
||||
days: "jours",
|
||||
day: "jour",
|
||||
day: "jour | jours",
|
||||
"-day": "-jours",
|
||||
hour: "-heure",
|
||||
"-hour": "-heures",
|
||||
|
@@ -56,8 +56,7 @@ export default {
|
||||
Current: "Trenutno",
|
||||
Uptime: "Dostupnost",
|
||||
"Cert Exp.": "Istek cert.",
|
||||
days: "dana",
|
||||
day: "dan",
|
||||
day: "dan | dana",
|
||||
"-day": "-dnevno",
|
||||
hour: "sat",
|
||||
"-hour": "-satno",
|
||||
|
@@ -55,7 +55,6 @@ export default {
|
||||
Current: "Aktuális",
|
||||
Uptime: "Uptime",
|
||||
"Cert Exp.": "SSL lejárat",
|
||||
days: "nap",
|
||||
day: "nap",
|
||||
"-day": " nap",
|
||||
hour: "óra",
|
||||
|
@@ -55,8 +55,7 @@ export default {
|
||||
Current: "Saat ini",
|
||||
Uptime: "Waktu aktif",
|
||||
"Cert Exp.": "Cert Exp.",
|
||||
days: "hari-hari",
|
||||
day: "hari",
|
||||
day: "hari | hari-hari",
|
||||
"-day": "-hari",
|
||||
hour: "Jam",
|
||||
"-hour": "-Jam",
|
||||
|
@@ -56,8 +56,7 @@ export default {
|
||||
Current: "Corrente",
|
||||
Uptime: "Tempo di attività",
|
||||
"Cert Exp.": "Scadenza certificato",
|
||||
days: "giorni",
|
||||
day: "giorno",
|
||||
day: "giorno | giorni",
|
||||
"-day": "-giorni",
|
||||
hour: "ora",
|
||||
"-hour": "-ore",
|
||||
|
@@ -44,8 +44,7 @@ export default {
|
||||
Current: "現在",
|
||||
Uptime: "起動時間",
|
||||
"Cert Exp.": "証明書有効期限",
|
||||
days: "日間",
|
||||
day: "日",
|
||||
day: "日 | 日間",
|
||||
"-day": "-日",
|
||||
hour: "時間",
|
||||
"-hour": "-時間",
|
||||
|
@@ -55,7 +55,6 @@ export default {
|
||||
Current: "현재",
|
||||
Uptime: "업타임",
|
||||
"Cert Exp.": "인증서 만료",
|
||||
days: "일",
|
||||
day: "일",
|
||||
"-day": "-일",
|
||||
hour: "시간",
|
||||
@@ -187,9 +186,9 @@ export default {
|
||||
"Bot Token": "봇 토큰",
|
||||
wayToGetTelegramToken: "토큰은 여기서 얻을 수 있어요: {0}.",
|
||||
"Chat ID": "채팅 ID",
|
||||
supportTelegramChatID: "Direct Chat / Group / Channel's Chat ID를 지원해요.",
|
||||
supportTelegramChatID: "개인 채팅 / 그룹 / 채널의 ID를 지원해요.",
|
||||
wayToGetTelegramChatID: "봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.",
|
||||
"YOUR BOT TOKEN HERE": "여기에 BOT 토큰을 적어주세요.",
|
||||
"YOUR BOT TOKEN HERE": "봇 토큰",
|
||||
chatIDNotFound: "채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.",
|
||||
webhook: "Webhook",
|
||||
"Post URL": "Post URL",
|
||||
@@ -305,13 +304,13 @@ export default {
|
||||
PasswordsDoNotMatch: "비밀번호가 일치하지 않아요.",
|
||||
records: "records",
|
||||
"One record": "One record",
|
||||
steamApiKeyDescription: "스팀 게임 서버를 모니터링하려면 Steam Web API 키가 필요해요. API 키는 하단 사이트에서 등록할 수 있어요: ",
|
||||
steamApiKeyDescription: "스팀 게임 서버를 모니터링하려면 Steam Web API 키가 필요해요. API 키는 하단 웹사이트에서 등록할 수 있어요: ",
|
||||
"Current User": "현재 사용자",
|
||||
recent: "최근",
|
||||
Done: "완료",
|
||||
Info: "정보",
|
||||
Security: "보안",
|
||||
"Steam API Key": "Steam API Key",
|
||||
"Steam API Key": "스팀 API 키",
|
||||
"Shrink Database": "데이터베이스 축소",
|
||||
"Pick a RR-Type...": "RR-Type을 골라주세요...",
|
||||
"Pick Accepted Status Codes...": "상태 코드를 골라주세요...",
|
||||
@@ -352,4 +351,177 @@ export default {
|
||||
serwersmsPhoneNumber: "휴대전화 번호",
|
||||
serwersmsSenderName: "보내는 사람 이름 (customer portal를 통해 가입된 정보)",
|
||||
stackfield: "Stackfield",
|
||||
dnsPortDescription: "DNS 서버 포트, 기본값은 53 이에요. 포트는 언제나 변경할 수 있어요.",
|
||||
PushByTechulus: "Push by Techulus",
|
||||
GoogleChat: "Google Chat (Google Workspace only)",
|
||||
topic: "Topic",
|
||||
topicExplanation: "모니터링할 MQTT Topic",
|
||||
successMessage: "성공 메시지",
|
||||
successMessageExplanation: "성공으로 간주되는 MQTT 메시지",
|
||||
error: "error",
|
||||
critical: "critical",
|
||||
Customize: "커스터마이즈",
|
||||
"Custom Footer": "커스텀 Footer",
|
||||
"Custom CSS": "커스텀 CSS",
|
||||
smtpDkimSettings: "DKIM 설정",
|
||||
smtpDkimDesc: "사용 방법은 DKIM {0}를 참조하세요.",
|
||||
documentation: "문서",
|
||||
smtpDkimDomain: "도메인 이름",
|
||||
smtpDkimKeySelector: "Key Selector",
|
||||
smtpDkimPrivateKey: "Private Key",
|
||||
smtpDkimHashAlgo: "해시 알고리즘 (선택)",
|
||||
smtpDkimheaderFieldNames: "서명할 헤더 키 (선택)",
|
||||
smtpDkimskipFields: "서명하지 않을 헤더 키 (선택)",
|
||||
wayToGetPagerDutyKey: "Service -> Service Directory -> (서비스 선택) -> Integrations -> Add integration. 에서 찾을 수 있어요. 자세히 알아보려면 {0}에서 \"Events API V2\"를 검색해봐요.",
|
||||
"Integration Key": "Integration 키",
|
||||
"Integration URL": "Integration URL",
|
||||
"Auto resolve or acknowledged": "자동 해결 혹은 승인",
|
||||
"do nothing": "아무것도 하지 않기",
|
||||
"auto acknowledged": "자동 승인 (acknowledged)",
|
||||
"auto resolve": "자동 해결 (resolve)",
|
||||
gorush: "Gorush",
|
||||
alerta: "Alerta",
|
||||
alertaApiEndpoint: "API Endpoint",
|
||||
alertaEnvironment: "환경변수",
|
||||
alertaApiKey: "API 키",
|
||||
alertaAlertState: "경고 상태",
|
||||
alertaRecoverState: "해결된 상태",
|
||||
deleteStatusPageMsg: "정말 이 상태 페이지를 삭제할까요?",
|
||||
Proxies: "프록시",
|
||||
default: "Default",
|
||||
enabled: "활성화",
|
||||
setAsDefault: "기본 프록시로 설정",
|
||||
deleteProxyMsg: "정말 이 프록시를 모든 모니터링에서 삭제할까요?",
|
||||
proxyDescription: "프록시가 작동하려면 모니터에 할당되어야 해요.",
|
||||
enableProxyDescription: "이 프록시는 활성화될 때까지 영향을 미치지 않아요. 활성화 상태에 따라 모든 모니터에서 프록시를 일시정지할 수 있어요.",
|
||||
setAsDefaultProxyDescription: "새로 추가하는 모든 모니터링에 이 프록시를 기본적으로 활성화해요. 각 모니터에 대해 별도로 프록시를 비활성화할 수 있어요.",
|
||||
"Certificate Chain": "인증서 체인",
|
||||
Valid: "유효",
|
||||
Invalid: "유효하지 않음",
|
||||
AccessKeyId: "AccessKey ID",
|
||||
SecretAccessKey: "AccessKey Secret",
|
||||
PhoneNumbers: "휴대전화 번호",
|
||||
TemplateCode: "템플릿 코드",
|
||||
SignName: "SignName",
|
||||
"Sms template must contain parameters: ": "Sms 템플릿은 다음과 같은 파라미터가 포함되어야 해요:",
|
||||
"Bark Endpoint": "Bark Endpoint",
|
||||
WebHookUrl: "웹훅 URL",
|
||||
SecretKey: "Secret Key",
|
||||
"For safety, must use secret key": "안전을 위해 꼭 Secret Key를 사용하세요.",
|
||||
"Device Token": "기기 Token",
|
||||
Platform: "플랫폼",
|
||||
iOS: "iOS",
|
||||
Android: "Android",
|
||||
Huawei: "Huawei",
|
||||
High: "High",
|
||||
Retry: "재시도",
|
||||
Topic: "Topic",
|
||||
"WeCom Bot Key": "WeCom Bot Key",
|
||||
"Setup Proxy": "프록시 설정",
|
||||
"Proxy Protocol": "프록시 프로토콜",
|
||||
"Proxy Server": "프록시 서버",
|
||||
"Proxy server has authentication": "프록시 서버에 인증 절차가 있음",
|
||||
User: "사용자",
|
||||
Installed: "설치됨",
|
||||
"Not installed": "설치되어 있지 않음",
|
||||
Running: "작동 중",
|
||||
"Not running": "작동하고 있지 않음",
|
||||
"Remove Token": "토큰 삭제",
|
||||
Start: "시작",
|
||||
Stop: "정지",
|
||||
"Uptime Kuma": "Uptime Kuma",
|
||||
"Add New Status Page": "새로운 상태 페이지 만들기",
|
||||
Slug: "주소",
|
||||
"Accept characters:": "허용되는 문자열:",
|
||||
startOrEndWithOnly: "{0}로 시작하거나 끝나야 해요.",
|
||||
"No consecutive dashes": "연속되는 대시는 허용되지 않아요",
|
||||
Next: "다음",
|
||||
"The slug is already taken. Please choose another slug.": "이미 존재하는 주소에요. 다른 주소를 사용해 주세요.",
|
||||
"No Proxy": "프록시 없음",
|
||||
"HTTP Basic Auth": "HTTP 인증",
|
||||
"New Status Page": "새로운 상태 페이지",
|
||||
"Page Not Found": "페이지를 찾을 수 없어요",
|
||||
"Reverse Proxy": "리버스 프록시",
|
||||
Backup: "백업",
|
||||
About: "정보",
|
||||
wayToGetCloudflaredURL: "({0}에서 Cloudflare 다운로드 하기)",
|
||||
cloudflareWebsite: "Cloudflare 웹사이트",
|
||||
"Message:": "메시지:",
|
||||
"Don't know how to get the token? Please read the guide:": "토큰을 얻는 방법은 이 가이드를 확인해주세요:",
|
||||
"The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "Cloudflare Tunnel를 연결하면 현재 연결이 끊길 수 있어요. 정말 중지할까요? 비밀번호를 입력해 확인하세요.",
|
||||
"Other Software": "다른 소프트웨어",
|
||||
"For example: nginx, Apache and Traefik.": "nginx, Apache, Traefik 등을 사용할 수 있어요.",
|
||||
"Please read": "이 문서를 참조하세요:",
|
||||
"Subject:": "Subject:",
|
||||
"Valid To:": "Valid To:",
|
||||
"Days Remaining:": "남은 일수:",
|
||||
"Issuer:": "Issuer:",
|
||||
"Fingerprint:": "Fingerprint:",
|
||||
"No status pages": "상태 페이지 없음",
|
||||
"Domain Name Expiry Notification": "도메인 이름 만료 알림",
|
||||
Proxy: "프록시",
|
||||
"Date Created": "생성된 날짜",
|
||||
onebotHttpAddress: "OneBot HTTP 주소",
|
||||
onebotMessageType: "OneBot 메시지 종류",
|
||||
onebotGroupMessage: "그룹 메시지",
|
||||
onebotPrivateMessage: "개인 메시지",
|
||||
onebotUserOrGroupId: "그룹/사용자 ID",
|
||||
onebotSafetyTips: "안전을 위해 Access 토큰을 설정하세요.",
|
||||
"PushDeer Key": "PushDeer 키",
|
||||
"Footer Text": "Footer 문구",
|
||||
"Show Powered By": "Powered By 문구 표시하기",
|
||||
"Domain Names": "도메인 이름",
|
||||
signedInDisp: "{0} 로그인됨",
|
||||
signedInDispDisabled: "인증 비활성화됨.",
|
||||
"Certificate Expiry Notification": "인증서 만료 알림",
|
||||
"API Username": "API 사용자 이름",
|
||||
"API Key": "API 키",
|
||||
"Recipient Number": "받는 사람 번호",
|
||||
"From Name/Number": "발신자 이름/번호",
|
||||
"Leave blank to use a shared sender number.": "공유 발신자 번호를 사용하려면 공백으로 두세요.",
|
||||
"Octopush API Version": "Octopush API 버전",
|
||||
"Legacy Octopush-DM": "레거시 Octopush-DM",
|
||||
endpoint: "endpoint",
|
||||
octopushAPIKey: "제어판 HTTP API credentials 에서 \"API key\"",
|
||||
octopushLogin: "제어판 HTTP API credentials 에서 \"Login\"",
|
||||
promosmsLogin: "API 로그인 이름",
|
||||
promosmsPassword: "API 비밀번호",
|
||||
"pushoversounds pushover": "Pushover (기본)",
|
||||
"pushoversounds bike": "Bike",
|
||||
"pushoversounds bugle": "Bugle",
|
||||
"pushoversounds cashregister": "Cash Register",
|
||||
"pushoversounds classical": "Classical",
|
||||
"pushoversounds cosmic": "Cosmic",
|
||||
"pushoversounds falling": "Falling",
|
||||
"pushoversounds gamelan": "Gamelan",
|
||||
"pushoversounds incoming": "Incoming",
|
||||
"pushoversounds intermission": "Intermission",
|
||||
"pushoversounds magic": "Magic",
|
||||
"pushoversounds mechanical": "Mechanical",
|
||||
"pushoversounds pianobar": "Piano Bar",
|
||||
"pushoversounds siren": "Siren",
|
||||
"pushoversounds spacealarm": "Space Alarm",
|
||||
"pushoversounds tugboat": "Tug Boat",
|
||||
"pushoversounds alien": "Alien Alarm (long)",
|
||||
"pushoversounds climb": "Climb (long)",
|
||||
"pushoversounds persistent": "Persistent (long)",
|
||||
"pushoversounds echo": "Pushover Echo (long)",
|
||||
"pushoversounds updown": "Up Down (long)",
|
||||
"pushoversounds vibrate": "진동만",
|
||||
"pushoversounds none": "없음 (무음)",
|
||||
pushyAPIKey: "비밀 API 키",
|
||||
pushyToken: "기기 토큰",
|
||||
"Show update if available": "사용 가능한 경우에 업데이트 표시",
|
||||
"Also check beta release": "베타 릴리즈 확인",
|
||||
"Using a Reverse Proxy?": "리버스 프록시를 사용하시나요?",
|
||||
"Check how to config it for WebSocket": "웹소켓에 대한 설정 방법 확인",
|
||||
"Steam Game Server": "스팀 게임 서버",
|
||||
"Most likely causes:": "원인:",
|
||||
"The resource is no longer available.": "더이상 사용할 수 없어요.",
|
||||
"There might be a typing error in the address.": "주소에 오탈자가 있을 수 있어요.",
|
||||
"What you can try:": "해결 방법:",
|
||||
"Retype the address.": "주소 다시 입력하기",
|
||||
"Go back to the previous page.": "이전 페이지로 돌아가기",
|
||||
"Coming Soon": "Coming Soon",
|
||||
wayToGetClickSendSMSToken: "{0}에서 API 사용자 이름과 키를 얻을 수 있어요.",
|
||||
};
|
||||
|
@@ -55,8 +55,7 @@ export default {
|
||||
Current: "Nåværende",
|
||||
Uptime: "Oppetid",
|
||||
"Cert Exp.": "Sertifikat utløper",
|
||||
days: "dager",
|
||||
day: "dag",
|
||||
day: "dag | dager",
|
||||
"-day": "-dag",
|
||||
hour: "time",
|
||||
"-hour": "-time",
|
||||
|
@@ -52,8 +52,7 @@ export default {
|
||||
Current: "Huidig",
|
||||
Uptime: "Uptime",
|
||||
"Cert Exp.": "Cert. verl.",
|
||||
days: "dagen",
|
||||
day: "dag",
|
||||
day: "dag | dagen",
|
||||
"-day": "-dag",
|
||||
hour: "uur",
|
||||
"-hour": "-uur",
|
||||
|
@@ -55,8 +55,7 @@ export default {
|
||||
Current: "Aktualny",
|
||||
Uptime: "Czas pracy",
|
||||
"Cert Exp.": "Certyfikat wygasa",
|
||||
days: "dni",
|
||||
day: "dzień",
|
||||
day: "dzień | dni",
|
||||
"-day": " dni",
|
||||
hour: "godzina",
|
||||
"-hour": " godzin",
|
||||
|
@@ -55,8 +55,7 @@ export default {
|
||||
Current: "Atual",
|
||||
Uptime: "Tempo de atividade",
|
||||
"Cert Exp.": "Cert Exp.",
|
||||
days: "dias",
|
||||
day: "dia",
|
||||
day: "dia | dias",
|
||||
"-day": "-dia",
|
||||
hour: "hora",
|
||||
"-hour": "-hora",
|
||||
|
@@ -44,8 +44,7 @@ export default {
|
||||
Current: "Текущий",
|
||||
Uptime: "Аптайм",
|
||||
"Cert Exp.": "Сертификат истекает",
|
||||
days: "дней",
|
||||
day: "день",
|
||||
day: "день | дней",
|
||||
"-day": " дней",
|
||||
hour: "час",
|
||||
"-hour": " часа",
|
||||
|
@@ -56,8 +56,7 @@ export default {
|
||||
Current: "Trenutno",
|
||||
Uptime: "Uptime",
|
||||
"Cert Exp.": "Potek certifikata",
|
||||
days: "dni",
|
||||
day: "dan",
|
||||
day: "dan | dni",
|
||||
"-day": "-dni",
|
||||
hour: "ura",
|
||||
"-hour": "-ur",
|
||||
|
@@ -44,8 +44,7 @@ export default {
|
||||
Current: "Trenutno",
|
||||
Uptime: "Vreme rada",
|
||||
"Cert Exp.": "Istek sert.",
|
||||
days: "dana",
|
||||
day: "dan",
|
||||
day: "dan | dana",
|
||||
"-day": "-dana",
|
||||
hour: "sat",
|
||||
"-hour": "-sata",
|
||||
|
@@ -44,8 +44,7 @@ export default {
|
||||
Current: "Тренутно",
|
||||
Uptime: "Време рада",
|
||||
"Cert Exp.": "Истек серт.",
|
||||
days: "дана",
|
||||
day: "дан",
|
||||
day: "дан | дана",
|
||||
"-day": "-дана",
|
||||
hour: "сат",
|
||||
"-hour": "-сата",
|
||||
|
@@ -44,8 +44,7 @@ export default {
|
||||
Current: "Nuvarande",
|
||||
Uptime: "Drifttid",
|
||||
"Cert Exp.": "Certifikat utgår",
|
||||
days: "dagar",
|
||||
day: "dag",
|
||||
day: "dag | dagar",
|
||||
"-day": " dagar",
|
||||
hour: "timme",
|
||||
"-hour": " timmar",
|
||||
|
@@ -57,8 +57,7 @@ export default {
|
||||
Current: "Şu anda",
|
||||
Uptime: "Çalışma zamanı",
|
||||
"Cert Exp.": "Sertifika Süresi",
|
||||
days: "günler",
|
||||
day: "gün",
|
||||
day: "gün | günler",
|
||||
"-day": "-gün",
|
||||
hour: "saat",
|
||||
"-hour": "-saat",
|
||||
@@ -516,4 +515,13 @@ export default {
|
||||
"Go back to the previous page.": "Bir önceki sayfaya geri git.",
|
||||
"Coming Soon": "Yakında gelecek",
|
||||
wayToGetClickSendSMSToken: "API Kullanıcı Adı ve API Anahtarını {0} adresinden alabilirsiniz.",
|
||||
error: "hata",
|
||||
critical: "kritik",
|
||||
wayToGetPagerDutyKey: "Bunu şuraya giderek alabilirsiniz: Servis -> Servis Dizini -> (Bir servis seçin) -> Entegrasyonlar -> Entegrasyon ekle. Burada \"Events API V2\" için arama yapabilirsiniz. Daha fazla bilgi {0}",
|
||||
"Integration Key": "Entegrasyon Anahtarı",
|
||||
"Integration URL": "Entegrasyon URL",
|
||||
"Auto resolve or acknowledged": "Otomatik çözümleme veya onaylama",
|
||||
"do nothing": "hiçbir şey yapma",
|
||||
"auto acknowledged": "otomatik onaylama",
|
||||
"auto resolve": "otomatik çözümleme",
|
||||
};
|
||||
|
@@ -44,8 +44,7 @@ export default {
|
||||
Current: "Поточний",
|
||||
Uptime: "Аптайм",
|
||||
"Cert Exp.": "Сертифікат спливає",
|
||||
days: "днів",
|
||||
day: "день",
|
||||
day: "день | днів",
|
||||
"-day": " днів",
|
||||
hour: "година",
|
||||
"-hour": " години",
|
||||
|
@@ -56,7 +56,6 @@ export default {
|
||||
Current: "Hiện tại",
|
||||
Uptime: "Uptime",
|
||||
"Cert Exp.": "Cert hết hạn",
|
||||
days: "ngày",
|
||||
day: "ngày",
|
||||
"-day": "-ngày",
|
||||
hour: "giờ",
|
||||
|
@@ -57,7 +57,6 @@ export default {
|
||||
Current: "当前",
|
||||
Uptime: "在线时间",
|
||||
"Cert Exp.": "证书有效期",
|
||||
days: "天",
|
||||
day: "天",
|
||||
"-day": " 天",
|
||||
hour: "小时",
|
||||
@@ -520,4 +519,14 @@ export default {
|
||||
wayToGetClickSendSMSToken: "您可以从 {0} 获取 API 凭证 Username 和 凭证 Key。",
|
||||
signedInDisp: "当前用户: {0}",
|
||||
signedInDispDisabled: "已禁用身份验证",
|
||||
dnsPortDescription: "DNS 服务器端口,默认为 53,你可以在任何时候更改此端口.",
|
||||
error: "错误",
|
||||
critical: "关键",
|
||||
wayToGetPagerDutyKey: "你可以在 Service -> Service Directory -> (Select a service) -> Integrations -> Add integration 页面中搜索 \"Events API V2\" 以获取此 Integration Key,更多信息请参见 {0}",
|
||||
"Integration Key": "Integration Key",
|
||||
"Integration URL": "Integration URL",
|
||||
"Auto resolve or acknowledged": "自动标记为已解决或已读",
|
||||
"do nothing": "不做任何操作",
|
||||
"auto acknowledged": "自动标记为已读",
|
||||
"auto resolve": "自动标记为已解决",
|
||||
};
|
||||
|
@@ -30,7 +30,6 @@ export default {
|
||||
Current: "目前",
|
||||
Uptime: "上線率",
|
||||
"Cert Exp.": "証書期限",
|
||||
days: "日",
|
||||
day: "日",
|
||||
"-day": "日",
|
||||
hour: "小時",
|
||||
|
@@ -56,7 +56,6 @@ export default {
|
||||
Current: "目前",
|
||||
Uptime: "運作率",
|
||||
"Cert Exp.": "憑證期限",
|
||||
days: "天",
|
||||
day: "天",
|
||||
"-day": "天",
|
||||
hour: "小時",
|
||||
|
@@ -77,7 +77,7 @@
|
||||
<h4>{{ $t("Cert Exp.") }}</h4>
|
||||
<p>(<Datetime :value="tlsInfo.certInfo.validTo" date-only />)</p>
|
||||
<span class="num">
|
||||
<a href="#" @click.prevent="toggleCertInfoBox = !toggleCertInfoBox">{{ tlsInfo.certInfo.daysRemaining }} {{ $t("days") }}</a>
|
||||
<a href="#" @click.prevent="toggleCertInfoBox = !toggleCertInfoBox">{{ tlsInfo.certInfo.daysRemaining }} {{ $tc("day", tlsInfo.certInfo.daysRemaining) }}</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -11,33 +11,44 @@
|
||||
<div class="my-3">
|
||||
<label for="type" class="form-label">{{ $t("Monitor Type") }}</label>
|
||||
<select id="type" v-model="monitor.type" class="form-select">
|
||||
<option value="http">
|
||||
HTTP(s)
|
||||
</option>
|
||||
<option value="port">
|
||||
TCP Port
|
||||
</option>
|
||||
<option value="ping">
|
||||
Ping
|
||||
</option>
|
||||
<option value="keyword">
|
||||
HTTP(s) - {{ $t("Keyword") }}
|
||||
</option>
|
||||
<option value="dns">
|
||||
DNS
|
||||
</option>
|
||||
<option value="push">
|
||||
Push
|
||||
</option>
|
||||
<option value="steam">
|
||||
{{ $t("Steam Game Server") }}
|
||||
</option>
|
||||
<option value="mqtt">
|
||||
MQTT
|
||||
</option>
|
||||
<option value="docker">
|
||||
{{ $t("Docker Container") }}
|
||||
</option>
|
||||
<optgroup label="General Monitor Type">
|
||||
<option value="http">
|
||||
HTTP(s)
|
||||
</option>
|
||||
<option value="port">
|
||||
TCP Port
|
||||
</option>
|
||||
<option value="ping">
|
||||
Ping
|
||||
</option>
|
||||
<option value="keyword">
|
||||
HTTP(s) - {{ $t("Keyword") }}
|
||||
</option>
|
||||
<option value="dns">
|
||||
DNS
|
||||
</option>
|
||||
<option value="docker">
|
||||
{{ $t("Docker Container") }}
|
||||
</option>
|
||||
</optgroup>
|
||||
|
||||
<optgroup label="Passive Monitor Type">
|
||||
<option value="push">
|
||||
Push
|
||||
</option>
|
||||
</optgroup>
|
||||
|
||||
<optgroup label="Specific Monitor Type">
|
||||
<option value="steam">
|
||||
{{ $t("Steam Game Server") }}
|
||||
</option>
|
||||
<option value="mqtt">
|
||||
MQTT
|
||||
</option>
|
||||
<option value="sqlserver">
|
||||
SQL Server
|
||||
</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -188,6 +199,18 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- SQL Server -->
|
||||
<template v-if="monitor.type === 'sqlserver'">
|
||||
<div class="my-3">
|
||||
<label for="sqlserverConnectionString" class="form-label">SQL Server {{ $t("Connection String") }}</label>
|
||||
<input id="sqlserverConnectionString" v-model="monitor.databaseConnectionString" type="text" class="form-control">
|
||||
</div>
|
||||
<div class="my-3">
|
||||
<label for="sqlserverQuery" class="form-label">SQL Server {{ $t("Query") }}</label>
|
||||
<textarea id="sqlserverQuery" v-model="monitor.databaseQuery" class="form-control" placeholder="Example: select getdate()"></textarea>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- Interval -->
|
||||
<div class="my-3">
|
||||
<label for="interval" class="form-label">{{ $t("Heartbeat Interval") }} ({{ $t("checkEverySecond", [ monitor.interval ]) }})</label>
|
||||
@@ -376,18 +399,46 @@
|
||||
<textarea id="headers" v-model="monitor.headers" class="form-control" :placeholder="headersPlaceholder"></textarea>
|
||||
</div>
|
||||
|
||||
<!-- HTTP Basic Auth -->
|
||||
<h4 class="mt-5 mb-2">{{ $t("HTTP Basic Auth") }}</h4>
|
||||
<!-- HTTP Auth -->
|
||||
<h4 class="mt-5 mb-2">{{ $t("HTTP Authentication") }}</h4>
|
||||
|
||||
<!-- Method -->
|
||||
<div class="my-3">
|
||||
<label for="basicauth" class="form-label">{{ $t("Username") }}</label>
|
||||
<input id="basicauth-user" v-model="monitor.basic_auth_user" type="text" class="form-control" :placeholder="$t('Username')">
|
||||
<label for="method" class="form-label">{{ $t("Method") }}</label>
|
||||
<select id="method" v-model="monitor.authMethod" class="form-select">
|
||||
<option :value="null">
|
||||
None
|
||||
</option>
|
||||
<option value="basic">
|
||||
Basic
|
||||
</option>
|
||||
<option value="ntlm">
|
||||
NTLM
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<template v-if="monitor.authMethod && monitor.authMethod !== null ">
|
||||
<div class="my-3">
|
||||
<label for="basicauth" class="form-label">{{ $t("Username") }}</label>
|
||||
<input id="basicauth-user" v-model="monitor.basic_auth_user" type="text" class="form-control" :placeholder="$t('Username')">
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
<label for="basicauth" class="form-label">{{ $t("Password") }}</label>
|
||||
<input id="basicauth-pass" v-model="monitor.basic_auth_pass" type="password" autocomplete="new-password" class="form-control" :placeholder="$t('Password')">
|
||||
</div>
|
||||
<div class="my-3">
|
||||
<label for="basicauth" class="form-label">{{ $t("Password") }}</label>
|
||||
<input id="basicauth-pass" v-model="monitor.basic_auth_pass" type="password" autocomplete="new-password" class="form-control" :placeholder="$t('Password')">
|
||||
</div>
|
||||
<template v-if="monitor.authMethod === 'ntlm' ">
|
||||
<div class="my-3">
|
||||
<label for="basicauth" class="form-label">{{ $t("Domain") }}</label>
|
||||
<input id="basicauth-domain" v-model="monitor.authDomain" type="text" class="form-control" :placeholder="$t('Domain')">
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
<label for="basicauth" class="form-label">{{ $t("Workstation") }}</label>
|
||||
<input id="basicauth-workstation" v-model="monitor.authWorkstation" type="text" class="form-control" :placeholder="$t('Workstation')">
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
@@ -563,6 +614,7 @@ export default {
|
||||
method: "GET",
|
||||
interval: 60,
|
||||
retryInterval: this.interval,
|
||||
databaseConnectionString: "Server=<hostname>,<port>;Database=<your database>;User Id=<your user id>;Password=<your password>;Encrypt=<true/false>;TrustServerCertificate=<Yes/No>;Connection Timeout=<int>",
|
||||
maxretries: 0,
|
||||
notificationIDList: {},
|
||||
ignoreTls: false,
|
||||
@@ -580,6 +632,7 @@ export default {
|
||||
mqttPassword: "",
|
||||
mqttTopic: "",
|
||||
mqttSuccessMessage: "",
|
||||
authMethod: null,
|
||||
};
|
||||
|
||||
if (this.$root.proxyList && !this.monitor.proxyId) {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<transition name="slide-fade" appear>
|
||||
<MonitorList />
|
||||
<MonitorList :scrollbar="true" />
|
||||
</transition>
|
||||
</template>
|
||||
|
||||
@@ -14,3 +14,11 @@ export default {
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import "../assets/vars";
|
||||
|
||||
.shadow-box {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
@@ -32,6 +32,7 @@
|
||||
<ul>
|
||||
<li>{{ $t("Retype the address.") }}</li>
|
||||
<li><a href="#" class="go-back" @click="goBack()">{{ $t("Go back to the previous page.") }}</a></li>
|
||||
<li><a href="/" class="go-back">Go back to home page.</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -145,6 +145,10 @@ export default {
|
||||
this.settings.keepDataPeriodDays = 180;
|
||||
}
|
||||
|
||||
if (this.settings.tlsExpiryNotifyDays === undefined) {
|
||||
this.settings.tlsExpiryNotifyDays = [ 7, 14, 21 ];
|
||||
}
|
||||
|
||||
this.settingsLoaded = true;
|
||||
});
|
||||
},
|
||||
|
@@ -98,7 +98,7 @@
|
||||
<h1 class="mb-4 title-flex">
|
||||
<!-- Logo -->
|
||||
<span class="logo-wrapper" @click="showImageCropUploadMethod">
|
||||
<img :src="logoURL" alt class="logo me-2" :class="logoClass" @load="statusPageLogoLoaded" />
|
||||
<img :src="logoURL" alt class="logo me-2" :class="logoClass" />
|
||||
<font-awesome-icon v-if="enableEditMode" class="icon-upload" icon="upload" />
|
||||
</span>
|
||||
|
||||
@@ -538,7 +538,7 @@ export default {
|
||||
this.slug = "default";
|
||||
}
|
||||
|
||||
axios.get("/api/status-page/" + this.slug).then((res) => {
|
||||
this.getData().then((res) => {
|
||||
this.config = res.data.config;
|
||||
|
||||
if (!this.config.domainNameList) {
|
||||
@@ -551,6 +551,11 @@ export default {
|
||||
|
||||
this.incident = res.data.incident;
|
||||
this.$root.publicGroupList = res.data.publicGroupList;
|
||||
}).catch( function (error) {
|
||||
if (error.response.status === 404) {
|
||||
location.href = "/page-not-found";
|
||||
}
|
||||
console.log(error);
|
||||
});
|
||||
|
||||
// 5mins a loop
|
||||
@@ -567,6 +572,21 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
|
||||
/**
|
||||
* Get status page data
|
||||
* It should be preloaded in window.preloadData
|
||||
* @returns {Promise<any>}
|
||||
*/
|
||||
getData: function () {
|
||||
if (window.preloadData) {
|
||||
return new Promise(resolve => resolve({
|
||||
data: window.preloadData
|
||||
}));
|
||||
} else {
|
||||
return axios.get("/api/status-page/" + this.slug);
|
||||
}
|
||||
},
|
||||
|
||||
highlighter(code) {
|
||||
return highlight(code, languages.css);
|
||||
},
|
||||
@@ -604,6 +624,9 @@ export default {
|
||||
this.$root.initSocketIO(true);
|
||||
this.enableEditMode = true;
|
||||
this.clickedEditButton = true;
|
||||
|
||||
// Try to fix #1658
|
||||
this.loadedData = true;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -687,11 +710,6 @@ export default {
|
||||
}
|
||||
},
|
||||
|
||||
statusPageLogoLoaded(eventPayload) {
|
||||
// Remark: may not work in dev, due to CORS
|
||||
favicon.image(eventPayload.target);
|
||||
},
|
||||
|
||||
createIncident() {
|
||||
this.enableEditIncidentMode = true;
|
||||
|
||||
|
@@ -1,4 +1,5 @@
|
||||
import { createRouter, createWebHistory } from "vue-router";
|
||||
|
||||
import EmptyLayout from "./layouts/EmptyLayout.vue";
|
||||
import Layout from "./layouts/Layout.vue";
|
||||
import Dashboard from "./pages/Dashboard.vue";
|
||||
@@ -8,22 +9,23 @@ import EditMonitor from "./pages/EditMonitor.vue";
|
||||
import List from "./pages/List.vue";
|
||||
const Settings = () => import("./pages/Settings.vue");
|
||||
import Setup from "./pages/Setup.vue";
|
||||
const StatusPage = () => import("./pages/StatusPage.vue");
|
||||
import StatusPage from "./pages/StatusPage.vue";
|
||||
import Entry from "./pages/Entry.vue";
|
||||
|
||||
import Appearance from "./components/settings/Appearance.vue";
|
||||
import General from "./components/settings/General.vue";
|
||||
import Notifications from "./components/settings/Notifications.vue";
|
||||
import ReverseProxy from "./components/settings/ReverseProxy.vue";
|
||||
import MonitorHistory from "./components/settings/MonitorHistory.vue";
|
||||
import Security from "./components/settings/Security.vue";
|
||||
import Proxies from "./components/settings/Proxies.vue";
|
||||
import Backup from "./components/settings/Backup.vue";
|
||||
import About from "./components/settings/About.vue";
|
||||
import ManageStatusPage from "./pages/ManageStatusPage.vue";
|
||||
import AddStatusPage from "./pages/AddStatusPage.vue";
|
||||
import NotFound from "./pages/NotFound.vue";
|
||||
|
||||
// Settings - Sub Pages
|
||||
import Appearance from "./components/settings/Appearance.vue";
|
||||
import General from "./components/settings/General.vue";
|
||||
const Notifications = () => import("./components/settings/Notifications.vue");
|
||||
import ReverseProxy from "./components/settings/ReverseProxy.vue";
|
||||
import MonitorHistory from "./components/settings/MonitorHistory.vue";
|
||||
const Security = () => import("./components/settings/Security.vue");
|
||||
import Proxies from "./components/settings/Proxies.vue";
|
||||
import Backup from "./components/settings/Backup.vue";
|
||||
import About from "./components/settings/About.vue";
|
||||
|
||||
const routes = [
|
||||
{
|
||||
path: "/",
|
||||
@@ -63,12 +65,12 @@ const routes = [
|
||||
path: "/add",
|
||||
component: EditMonitor,
|
||||
},
|
||||
{
|
||||
path: "/list",
|
||||
component: List,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: "/list",
|
||||
component: List,
|
||||
},
|
||||
{
|
||||
path: "/settings",
|
||||
component: Settings,
|
||||
|
Reference in New Issue
Block a user