fix:redirect /list on mobile to /dashboard when shrinking on computer

This commit is contained in:
logorrheique 2024-10-27 11:36:46 +01:00
parent a6cb8584fc
commit 5f67a868cb
31 changed files with 42517 additions and 42498 deletions

View file

@ -1,27 +1,27 @@
name: json-yaml-validate name: json-yaml-validate
on: on:
push: push:
branches: branches:
- master - master
pull_request: pull_request:
branches: branches:
- master - master
- 1.23.X - 1.23.X
workflow_dispatch: workflow_dispatch:
permissions: permissions:
contents: read contents: read
pull-requests: write # enable write permissions for pull request comments pull-requests: write # enable write permissions for pull request comments
jobs: jobs:
json-yaml-validate: json-yaml-validate:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: json-yaml-validate - name: json-yaml-validate
id: json-yaml-validate id: json-yaml-validate
uses: GrantBirki/json-yaml-validate@v2.4.0 uses: GrantBirki/json-yaml-validate@v2.4.0
with: with:
comment: "true" # enable comment mode comment: "true" # enable comment mode
exclude_file: ".github/config/exclude.txt" # gitignore style file for exclusions exclude_file: ".github/config/exclude.txt" # gitignore style file for exclusions

View file

@ -1,61 +1,61 @@
# If the image changed, the second stage image should be changed too # If the image changed, the second stage image should be changed too
FROM node:20-bookworm-slim AS base2-slim FROM node:20-bookworm-slim AS base2-slim
ARG TARGETPLATFORM ARG TARGETPLATFORM
# Specify --no-install-recommends to skip unused dependencies, make the base much smaller! # Specify --no-install-recommends to skip unused dependencies, make the base much smaller!
# sqlite3 = for debugging # sqlite3 = for debugging
# iputils-ping = for ping # iputils-ping = for ping
# util-linux = for setpriv (Should be dropped in 2.0.0?) # util-linux = for setpriv (Should be dropped in 2.0.0?)
# dumb-init = avoid zombie processes (#480) # dumb-init = avoid zombie processes (#480)
# curl = for debugging # curl = for debugging
# ca-certificates = keep the cert up-to-date # ca-certificates = keep the cert up-to-date
# sudo = for start service nscd with non-root user # sudo = for start service nscd with non-root user
# nscd = for better DNS caching # nscd = for better DNS caching
RUN apt update && \ RUN apt update && \
apt --yes --no-install-recommends install \ apt --yes --no-install-recommends install \
sqlite3 \ sqlite3 \
ca-certificates \ ca-certificates \
iputils-ping \ iputils-ping \
util-linux \ util-linux \
dumb-init \ dumb-init \
curl \ curl \
sudo \ sudo \
nscd && \ nscd && \
rm -rf /var/lib/apt/lists/* && \ rm -rf /var/lib/apt/lists/* && \
apt --yes autoremove apt --yes autoremove
# apprise = for notifications (Install from the deb package, as the stable one is too old) (workaround for #4867) # apprise = for notifications (Install from the deb package, as the stable one is too old) (workaround for #4867)
# Switching to testing repo is no longer working, as the testing repo is not bookworm anymore. # Switching to testing repo is no longer working, as the testing repo is not bookworm anymore.
# python3-paho-mqtt (#4859) # python3-paho-mqtt (#4859)
RUN curl http://ftp.debian.org/debian/pool/main/a/apprise/apprise_1.8.0-2_all.deb --output apprise.deb && \ RUN curl http://ftp.debian.org/debian/pool/main/a/apprise/apprise_1.8.0-2_all.deb --output apprise.deb && \
apt update && \ apt update && \
apt --yes --no-install-recommends install ./apprise.deb python3-paho-mqtt && \ apt --yes --no-install-recommends install ./apprise.deb python3-paho-mqtt && \
rm -rf /var/lib/apt/lists/* && \ rm -rf /var/lib/apt/lists/* && \
rm -f apprise.deb && \ rm -f apprise.deb && \
apt --yes autoremove apt --yes autoremove
# Install cloudflared # Install cloudflared
RUN curl https://pkg.cloudflare.com/cloudflare-main.gpg --output /usr/share/keyrings/cloudflare-main.gpg && \ RUN curl https://pkg.cloudflare.com/cloudflare-main.gpg --output /usr/share/keyrings/cloudflare-main.gpg && \
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bullseye main' | tee /etc/apt/sources.list.d/cloudflared.list && \ echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bullseye main' | tee /etc/apt/sources.list.d/cloudflared.list && \
apt update && \ apt update && \
apt install --yes --no-install-recommends -t stable cloudflared && \ apt install --yes --no-install-recommends -t stable cloudflared && \
cloudflared version && \ cloudflared version && \
rm -rf /var/lib/apt/lists/* && \ rm -rf /var/lib/apt/lists/* && \
apt --yes autoremove apt --yes autoremove
# For nscd # For nscd
COPY ./docker/etc/nscd.conf /etc/nscd.conf COPY ./docker/etc/nscd.conf /etc/nscd.conf
COPY ./docker/etc/sudoers /etc/sudoers COPY ./docker/etc/sudoers /etc/sudoers
# Full Base Image # Full Base Image
# MariaDB, Chromium and fonts # MariaDB, Chromium and fonts
# Make sure to reuse the slim image here. Uncomment the above line if you want to build it from scratch. # Make sure to reuse the slim image here. Uncomment the above line if you want to build it from scratch.
# FROM base2-slim AS base2 # FROM base2-slim AS base2
FROM louislam/uptime-kuma:base2-slim AS base2 FROM louislam/uptime-kuma:base2-slim AS base2
ENV UPTIME_KUMA_ENABLE_EMBEDDED_MARIADB=1 ENV UPTIME_KUMA_ENABLE_EMBEDDED_MARIADB=1
RUN apt update && \ RUN apt update && \
apt --yes --no-install-recommends install chromium fonts-indic fonts-noto fonts-noto-cjk mariadb-server && \ apt --yes --no-install-recommends install chromium fonts-indic fonts-noto fonts-noto-cjk mariadb-server && \
rm -rf /var/lib/apt/lists/* && \ rm -rf /var/lib/apt/lists/* && \
apt --yes autoremove && \ apt --yes autoremove && \
chown -R node:node /var/lib/mysql chown -R node:node /var/lib/mysql

35380
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,214 +1,214 @@
{ {
"name": "uptime-kuma", "name": "uptime-kuma",
"version": "2.0.0-dev", "version": "2.0.0-dev",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/louislam/uptime-kuma.git" "url": "https://github.com/louislam/uptime-kuma.git"
}, },
"engines": { "engines": {
"node": "18 || >= 20.4.0" "node": "18 || >= 20.4.0"
}, },
"scripts": { "scripts": {
"lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .", "lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .",
"lint:js-prod": "npm run lint:js -- --max-warnings 0", "lint:js-prod": "npm run lint:js -- --max-warnings 0",
"lint-fix:js": "eslint --ext \".js,.vue\" --fix --ignore-path .gitignore .", "lint-fix:js": "eslint --ext \".js,.vue\" --fix --ignore-path .gitignore .",
"lint:style": "stylelint \"**/*.{vue,css,scss}\" --ignore-path .gitignore", "lint:style": "stylelint \"**/*.{vue,css,scss}\" --ignore-path .gitignore",
"lint-fix:style": "stylelint \"**/*.{vue,css,scss}\" --fix --ignore-path .gitignore", "lint-fix:style": "stylelint \"**/*.{vue,css,scss}\" --fix --ignore-path .gitignore",
"lint": "npm run lint:js && npm run lint:style", "lint": "npm run lint:js && npm run lint:style",
"lint:prod": "npm run lint:js-prod && npm run lint:style", "lint:prod": "npm run lint:js-prod && npm run lint:style",
"dev": "concurrently -k -r \"wait-on tcp:3000 && npm run start-server-dev \" \"npm run start-frontend-dev\"", "dev": "concurrently -k -r \"wait-on tcp:3000 && npm run start-server-dev \" \"npm run start-frontend-dev\"",
"start-frontend-dev": "cross-env NODE_ENV=development vite --host --config ./config/vite.config.js", "start-frontend-dev": "cross-env NODE_ENV=development vite --host --config ./config/vite.config.js",
"start-frontend-devcontainer": "cross-env NODE_ENV=development DEVCONTAINER=1 vite --host --config ./config/vite.config.js", "start-frontend-devcontainer": "cross-env NODE_ENV=development DEVCONTAINER=1 vite --host --config ./config/vite.config.js",
"start": "npm run start-server", "start": "npm run start-server",
"start-server": "node server/server.js", "start-server": "node server/server.js",
"start-server-dev": "cross-env NODE_ENV=development node server/server.js", "start-server-dev": "cross-env NODE_ENV=development node server/server.js",
"start-server-dev:watch": "cross-env NODE_ENV=development node --watch server/server.js", "start-server-dev:watch": "cross-env NODE_ENV=development node --watch server/server.js",
"build": "vite build --config ./config/vite.config.js", "build": "vite build --config ./config/vite.config.js",
"test": "npm run test-backend && npm run test-e2e", "test": "npm run test-backend && npm run test-e2e",
"test-with-build": "npm run build && npm test", "test-with-build": "npm run build && npm test",
"test-backend": "cross-env TEST_BACKEND=1 node --test test/backend-test", "test-backend": "cross-env TEST_BACKEND=1 node --test test/backend-test",
"test-e2e": "playwright test --config ./config/playwright.config.js", "test-e2e": "playwright test --config ./config/playwright.config.js",
"test-e2e-ui": "playwright test --config ./config/playwright.config.js --ui --ui-port=51063", "test-e2e-ui": "playwright test --config ./config/playwright.config.js --ui --ui-port=51063",
"playwright-codegen": "playwright codegen localhost:3000 --save-storage=./private/e2e-auth.json", "playwright-codegen": "playwright codegen localhost:3000 --save-storage=./private/e2e-auth.json",
"playwright-show-report": "playwright show-report ./private/playwright-report", "playwright-show-report": "playwright show-report ./private/playwright-report",
"tsc": "tsc", "tsc": "tsc",
"vite-preview-dist": "vite preview --host --config ./config/vite.config.js", "vite-preview-dist": "vite preview --host --config ./config/vite.config.js",
"build-docker": "npm run build && npm run build-docker-full && npm run build-docker-slim", "build-docker": "npm run build && npm run build-docker-full && npm run build-docker-slim",
"build-docker-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base2 --target base2 . --push", "build-docker-base": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base2 --target base2 . --push",
"build-docker-base-slim": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base2-slim --target base2-slim . --push", "build-docker-base-slim": "docker buildx build -f docker/debian-base.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:base2-slim --target base2-slim . --push",
"build-docker-builder-go": "docker buildx build -f docker/builder-go.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:builder-go . --push", "build-docker-builder-go": "docker buildx build -f docker/builder-go.dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:builder-go . --push",
"build-docker-slim": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-slim -t louislam/uptime-kuma:$VERSION-slim --target release --build-arg BASE_IMAGE=louislam/uptime-kuma:base2-slim . --push", "build-docker-slim": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-slim -t louislam/uptime-kuma:$VERSION-slim --target release --build-arg BASE_IMAGE=louislam/uptime-kuma:base2-slim . --push",
"build-docker-full": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2 -t louislam/uptime-kuma:$VERSION --target release . --push", "build-docker-full": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2 -t louislam/uptime-kuma:$VERSION --target release . --push",
"build-docker-nightly": "node ./extra/test-docker.js && npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly2 --target nightly . --push", "build-docker-nightly": "node ./extra/test-docker.js && npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly2 --target nightly . --push",
"build-docker-slim-rootless": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-slim-rootless -t louislam/uptime-kuma:$VERSION-slim-rootless --target rootless --build-arg BASE_IMAGE=louislam/uptime-kuma:base2-slim . --push", "build-docker-slim-rootless": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-slim-rootless -t louislam/uptime-kuma:$VERSION-slim-rootless --target rootless --build-arg BASE_IMAGE=louislam/uptime-kuma:base2-slim . --push",
"build-docker-full-rootless": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-rootless -t louislam/uptime-kuma:$VERSION-rootless --target rootless . --push", "build-docker-full-rootless": "node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:2-rootless -t louislam/uptime-kuma:$VERSION-rootless --target rootless . --push",
"build-docker-nightly-rootless": "node ./extra/test-docker.js && npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly2-rootless --target nightly-rootless . --push", "build-docker-nightly-rootless": "node ./extra/test-docker.js && npm run build && docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly2-rootless --target nightly-rootless . --push",
"build-docker-nightly-local": "npm run build && docker build -f docker/dockerfile -t louislam/uptime-kuma:nightly2 --target nightly .", "build-docker-nightly-local": "npm run build && docker build -f docker/dockerfile -t louislam/uptime-kuma:nightly2 --target nightly .",
"build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test2 --target pr-test2 . --push", "build-docker-pr-test": "docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64 -t louislam/uptime-kuma:pr-test2 --target pr-test2 . --push",
"upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain", "upload-artifacts": "docker buildx build -f docker/dockerfile --platform linux/amd64 -t louislam/uptime-kuma:upload-artifact --build-arg VERSION --build-arg GITHUB_TOKEN --target upload-artifact . --progress plain",
"setup": "git checkout 1.23.14 && npm ci --production && npm run download-dist", "setup": "git checkout 1.23.14 && npm ci --production && npm run download-dist",
"download-dist": "node extra/download-dist.js", "download-dist": "node extra/download-dist.js",
"mark-as-nightly": "node extra/mark-as-nightly.js", "mark-as-nightly": "node extra/mark-as-nightly.js",
"reset-password": "node extra/reset-password.js", "reset-password": "node extra/reset-password.js",
"remove-2fa": "node extra/remove-2fa.js", "remove-2fa": "node extra/remove-2fa.js",
"simple-dns-server": "node extra/simple-dns-server.js", "simple-dns-server": "node extra/simple-dns-server.js",
"simple-mqtt-server": "node extra/simple-mqtt-server.js", "simple-mqtt-server": "node extra/simple-mqtt-server.js",
"simple-mongo": "docker run --rm -p 27017:27017 mongo", "simple-mongo": "docker run --rm -p 27017:27017 mongo",
"simple-postgres": "docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres", "simple-postgres": "docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres",
"simple-mariadb": "docker run --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mariadb# mariadb", "simple-mariadb": "docker run --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mariadb# mariadb",
"update-language-files": "cd extra/update-language-files && node index.js && cross-env-shell eslint ../../src/languages/$npm_config_language.js --fix", "update-language-files": "cd extra/update-language-files && node index.js && cross-env-shell eslint ../../src/languages/$npm_config_language.js --fix",
"release-final": "node ./extra/test-docker.js && node extra/update-version.js && npm run build-docker && node ./extra/press-any-key.js && npm run upload-artifacts && node ./extra/update-wiki-version.js", "release-final": "node ./extra/test-docker.js && node extra/update-version.js && npm run build-docker && node ./extra/press-any-key.js && npm run upload-artifacts && node ./extra/update-wiki-version.js",
"release-beta": "node ./extra/test-docker.js && node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta . --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts", "release-beta": "node ./extra/test-docker.js && node extra/beta/update-version.js && npm run build && node ./extra/env2arg.js docker buildx build -f docker/dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:$VERSION -t louislam/uptime-kuma:beta . --target release --push && node ./extra/press-any-key.js && npm run upload-artifacts",
"git-remove-tag": "git tag -d", "git-remove-tag": "git tag -d",
"build-dist-and-restart": "npm run build && npm run start-server-dev", "build-dist-and-restart": "npm run build && npm run start-server-dev",
"start-pr-test": "node extra/checkout-pr.js && npm install && npm run dev", "start-pr-test": "node extra/checkout-pr.js && npm install && npm run dev",
"build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go", "build-healthcheck-armv7": "cross-env GOOS=linux GOARCH=arm GOARM=7 go build -x -o ./extra/healthcheck-armv7 ./extra/healthcheck.go",
"deploy-demo-server": "node extra/deploy-demo-server.js", "deploy-demo-server": "node extra/deploy-demo-server.js",
"sort-contributors": "node extra/sort-contributors.js", "sort-contributors": "node extra/sort-contributors.js",
"quick-run-nightly": "docker run --rm --env NODE_ENV=development -p 3001:3001 louislam/uptime-kuma:nightly2", "quick-run-nightly": "docker run --rm --env NODE_ENV=development -p 3001:3001 louislam/uptime-kuma:nightly2",
"start-dev-container": "cd docker && docker-compose -f docker-compose-dev.yml up --force-recreate", "start-dev-container": "cd docker && docker-compose -f docker-compose-dev.yml up --force-recreate",
"rebase-pr-to-1.23.X": "node extra/rebase-pr.js 1.23.X" "rebase-pr-to-1.23.X": "node extra/rebase-pr.js 1.23.X"
}, },
"dependencies": { "dependencies": {
"@grpc/grpc-js": "~1.8.22", "@grpc/grpc-js": "~1.8.22",
"@louislam/ping": "~0.4.4-mod.1", "@louislam/ping": "~0.4.4-mod.1",
"@louislam/sqlite3": "15.1.6", "@louislam/sqlite3": "15.1.6",
"@vvo/tzdb": "^6.125.0", "@vvo/tzdb": "^6.125.0",
"args-parser": "~1.3.0", "args-parser": "~1.3.0",
"axios": "~0.28.1", "axios": "~0.28.1",
"badge-maker": "~3.3.1", "badge-maker": "~3.3.1",
"bcryptjs": "~2.4.3", "bcryptjs": "~2.4.3",
"chardet": "~1.4.0", "chardet": "~1.4.0",
"check-password-strength": "^2.0.5", "check-password-strength": "^2.0.5",
"cheerio": "~1.0.0-rc.12", "cheerio": "~1.0.0-rc.12",
"chroma-js": "~2.4.2", "chroma-js": "~2.4.2",
"command-exists": "~1.2.9", "command-exists": "~1.2.9",
"compare-versions": "~3.6.0", "compare-versions": "~3.6.0",
"compression": "~1.7.4", "compression": "~1.7.4",
"croner": "~8.1.0", "croner": "~8.1.0",
"dayjs": "~1.11.5", "dayjs": "~1.11.5",
"dev-null": "^0.1.1", "dev-null": "^0.1.1",
"dotenv": "~16.0.3", "dotenv": "~16.0.3",
"express": "~4.21.0", "express": "~4.21.0",
"express-basic-auth": "~1.2.1", "express-basic-auth": "~1.2.1",
"express-static-gzip": "~2.1.7", "express-static-gzip": "~2.1.7",
"feed": "^4.2.2", "feed": "^4.2.2",
"form-data": "~4.0.0", "form-data": "~4.0.0",
"gamedig": "^4.2.0", "gamedig": "^4.2.0",
"html-escaper": "^3.0.3", "html-escaper": "^3.0.3",
"http-cookie-agent": "~5.0.4", "http-cookie-agent": "~5.0.4",
"http-graceful-shutdown": "~3.1.7", "http-graceful-shutdown": "~3.1.7",
"http-proxy-agent": "~5.0.0", "http-proxy-agent": "~5.0.0",
"https-proxy-agent": "~5.0.1", "https-proxy-agent": "~5.0.1",
"iconv-lite": "~0.6.3", "iconv-lite": "~0.6.3",
"isomorphic-ws": "^5.0.0", "isomorphic-ws": "^5.0.0",
"jsesc": "~3.0.2", "jsesc": "~3.0.2",
"jsonata": "^2.0.3", "jsonata": "^2.0.3",
"jsonwebtoken": "~9.0.0", "jsonwebtoken": "~9.0.0",
"jwt-decode": "~3.1.2", "jwt-decode": "~3.1.2",
"kafkajs": "^2.2.4", "kafkajs": "^2.2.4",
"knex": "^2.4.2", "knex": "^2.4.2",
"limiter": "~2.1.0", "limiter": "~2.1.0",
"liquidjs": "^10.7.0", "liquidjs": "^10.7.0",
"marked": "^14.0.0", "marked": "^14.0.0",
"mitt": "~3.0.1", "mitt": "~3.0.1",
"mongodb": "~4.17.1", "mongodb": "~4.17.1",
"mqtt": "~4.3.7", "mqtt": "~4.3.7",
"mssql": "~11.0.0", "mssql": "~11.0.0",
"mysql2": "~3.9.6", "mysql2": "~3.9.6",
"nanoid": "~3.3.4", "nanoid": "~3.3.4",
"net-snmp": "^3.11.2", "net-snmp": "^3.11.2",
"node-cloudflared-tunnel": "~1.0.9", "node-cloudflared-tunnel": "~1.0.9",
"node-radius-client": "~1.0.0", "node-radius-client": "~1.0.0",
"nodemailer": "~6.9.13", "nodemailer": "~6.9.13",
"nostr-tools": "^1.13.1", "nostr-tools": "^1.13.1",
"notp": "~2.0.3", "notp": "~2.0.3",
"openid-client": "^5.4.2", "openid-client": "^5.4.2",
"password-hash": "~1.2.2", "password-hash": "~1.2.2",
"pg": "~8.11.3", "pg": "~8.11.3",
"pg-connection-string": "~2.6.2", "pg-connection-string": "~2.6.2",
"playwright-core": "~1.39.0", "playwright-core": "~1.39.0",
"prom-client": "~13.2.0", "prom-client": "~13.2.0",
"prometheus-api-metrics": "~3.2.1", "prometheus-api-metrics": "~3.2.1",
"promisify-child-process": "~4.1.2", "promisify-child-process": "~4.1.2",
"protobufjs": "~7.2.4", "protobufjs": "~7.2.4",
"qs": "~6.10.4", "qs": "~6.10.4",
"redbean-node": "~0.3.0", "redbean-node": "~0.3.0",
"redis": "~4.5.1", "redis": "~4.5.1",
"semver": "~7.5.4", "semver": "~7.5.4",
"socket.io": "~4.8.0", "socket.io": "~4.8.0",
"socket.io-client": "~4.8.0", "socket.io-client": "~4.8.0",
"socks-proxy-agent": "6.1.1", "socks-proxy-agent": "6.1.1",
"tar": "~6.2.1", "tar": "~6.2.1",
"tcp-ping": "~0.1.1", "tcp-ping": "~0.1.1",
"thirty-two": "~1.0.2", "thirty-two": "~1.0.2",
"tough-cookie": "~4.1.3", "tough-cookie": "~4.1.3",
"ws": "^8.13.0" "ws": "^8.13.0"
}, },
"devDependencies": { "devDependencies": {
"@actions/github": "~5.1.1", "@actions/github": "~5.1.1",
"@fortawesome/fontawesome-svg-core": "~1.2.36", "@fortawesome/fontawesome-svg-core": "~1.2.36",
"@fortawesome/free-regular-svg-icons": "~5.15.4", "@fortawesome/free-regular-svg-icons": "~5.15.4",
"@fortawesome/free-solid-svg-icons": "~5.15.4", "@fortawesome/free-solid-svg-icons": "~5.15.4",
"@fortawesome/vue-fontawesome": "~3.0.0-5", "@fortawesome/vue-fontawesome": "~3.0.0-5",
"@playwright/test": "~1.39.0", "@playwright/test": "~1.39.0",
"@popperjs/core": "~2.10.2", "@popperjs/core": "~2.10.2",
"@testcontainers/hivemq": "^10.13.1", "@testcontainers/hivemq": "^10.13.1",
"@types/bootstrap": "~5.1.9", "@types/bootstrap": "~5.1.9",
"@types/node": "^20.8.6", "@types/node": "^20.8.6",
"@typescript-eslint/eslint-plugin": "^6.7.5", "@typescript-eslint/eslint-plugin": "^6.7.5",
"@typescript-eslint/parser": "^6.7.5", "@typescript-eslint/parser": "^6.7.5",
"@vitejs/plugin-vue": "~5.0.1", "@vitejs/plugin-vue": "~5.0.1",
"@vue/compiler-sfc": "~3.4.2", "@vue/compiler-sfc": "~3.4.2",
"@vuepic/vue-datepicker": "~3.4.8", "@vuepic/vue-datepicker": "~3.4.8",
"aedes": "^0.46.3", "aedes": "^0.46.3",
"bootstrap": "5.1.3", "bootstrap": "5.1.3",
"chart.js": "~4.2.1", "chart.js": "~4.2.1",
"chartjs-adapter-dayjs-4": "~1.0.4", "chartjs-adapter-dayjs-4": "~1.0.4",
"concurrently": "^7.1.0", "concurrently": "^7.1.0",
"core-js": "~3.26.1", "core-js": "~3.26.1",
"cronstrue": "~2.24.0", "cronstrue": "~2.24.0",
"cross-env": "~7.0.3", "cross-env": "~7.0.3",
"delay": "^5.0.0", "delay": "^5.0.0",
"dns2": "~2.0.1", "dns2": "~2.0.1",
"dompurify": "~3.1.7", "dompurify": "~3.1.7",
"eslint": "~8.14.0", "eslint": "~8.14.0",
"eslint-plugin-jsdoc": "~46.4.6", "eslint-plugin-jsdoc": "~46.4.6",
"eslint-plugin-vue": "~8.7.1", "eslint-plugin-vue": "~8.7.1",
"favico.js": "~0.3.10", "favico.js": "~0.3.10",
"get-port-please": "^3.1.1", "get-port-please": "^3.1.1",
"node-ssh": "~13.1.0", "node-ssh": "~13.1.0",
"postcss-html": "~1.5.0", "postcss-html": "~1.5.0",
"postcss-rtlcss": "~3.7.2", "postcss-rtlcss": "~3.7.2",
"postcss-scss": "~4.0.4", "postcss-scss": "~4.0.4",
"prismjs": "~1.29.0", "prismjs": "~1.29.0",
"qrcode": "~1.5.0", "qrcode": "~1.5.0",
"rollup-plugin-visualizer": "^5.6.0", "rollup-plugin-visualizer": "^5.6.0",
"sass": "~1.42.1", "sass": "~1.42.1",
"stylelint": "^15.10.1", "stylelint": "^15.10.1",
"stylelint-config-standard": "~25.0.0", "stylelint-config-standard": "~25.0.0",
"terser": "~5.15.0", "terser": "~5.15.0",
"test": "~3.3.0", "test": "~3.3.0",
"testcontainers": "^10.13.1", "testcontainers": "^10.13.1",
"typescript": "~4.4.4", "typescript": "~4.4.4",
"v-pagination-3": "~0.1.7", "v-pagination-3": "~0.1.7",
"vite": "~5.2.8", "vite": "~5.2.8",
"vite-plugin-compression": "^0.5.1", "vite-plugin-compression": "^0.5.1",
"vite-plugin-vue-devtools": "^7.0.15", "vite-plugin-vue-devtools": "^7.0.15",
"vue": "~3.4.2", "vue": "~3.4.2",
"vue-chartjs": "~5.2.0", "vue-chartjs": "~5.2.0",
"vue-confirm-dialog": "~1.0.2", "vue-confirm-dialog": "~1.0.2",
"vue-contenteditable": "~3.0.4", "vue-contenteditable": "~3.0.4",
"vue-i18n": "~9.2.2", "vue-i18n": "~9.2.2",
"vue-image-crop-upload": "~3.0.3", "vue-image-crop-upload": "~3.0.3",
"vue-multiselect": "~3.0.0-alpha.2", "vue-multiselect": "~3.0.0-alpha.2",
"vue-prism-editor": "~2.0.0-alpha.2", "vue-prism-editor": "~2.0.0-alpha.2",
"vue-qrcode": "~1.0.0", "vue-qrcode": "~1.0.0",
"vue-router": "~4.2.5", "vue-router": "~4.2.5",
"vue-toastification": "~2.0.0-rc.5", "vue-toastification": "~2.0.0-rc.5",
"vuedraggable": "~4.1.0", "vuedraggable": "~4.1.0",
"wait-on": "^7.2.0", "wait-on": "^7.2.0",
"whatwg-url": "~12.0.1" "whatwg-url": "~12.0.1"
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -1,57 +1,57 @@
const { R } = require("redbean-node"); const { R } = require("redbean-node");
const { log } = require("../../src/util"); const { log } = require("../../src/util");
const { setSetting, setting } = require("../util-server"); const { setSetting, setting } = require("../util-server");
const Database = require("../database"); const Database = require("../database");
const DEFAULT_KEEP_PERIOD = 180; const DEFAULT_KEEP_PERIOD = 180;
/** /**
* Clears old data from the heartbeat table of the database. * Clears old data from the heartbeat table of the database.
* @returns {Promise<void>} A promise that resolves when the data has been cleared. * @returns {Promise<void>} A promise that resolves when the data has been cleared.
*/ */
const clearOldData = async () => { const clearOldData = async () => {
let period = await setting("keepDataPeriodDays"); let period = await setting("keepDataPeriodDays");
// Set Default Period // Set Default Period
if (period == null) { if (period == null) {
await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general"); await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general");
period = DEFAULT_KEEP_PERIOD; period = DEFAULT_KEEP_PERIOD;
} }
// Try parse setting // Try parse setting
let parsedPeriod; let parsedPeriod;
try { try {
parsedPeriod = parseInt(period); parsedPeriod = parseInt(period);
} catch (_) { } catch (_) {
log.warn("clearOldData", "Failed to parse setting, resetting to default.."); log.warn("clearOldData", "Failed to parse setting, resetting to default..");
await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general"); await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general");
parsedPeriod = DEFAULT_KEEP_PERIOD; parsedPeriod = DEFAULT_KEEP_PERIOD;
} }
if (parsedPeriod < 1) { if (parsedPeriod < 1) {
log.info("clearOldData", `Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`); log.info("clearOldData", `Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`);
} else { } else {
log.debug("clearOldData", `Clearing Data older than ${parsedPeriod} days...`); log.debug("clearOldData", `Clearing Data older than ${parsedPeriod} days...`);
const sqlHourOffset = Database.sqlHourOffset(); const sqlHourOffset = Database.sqlHourOffset();
try { try {
await R.exec( await R.exec(
"DELETE FROM heartbeat WHERE time < " + sqlHourOffset, "DELETE FROM heartbeat WHERE time < " + sqlHourOffset,
[ parsedPeriod * -24 ] [ parsedPeriod * -24 ]
); );
if (Database.dbConfig.type === "sqlite") { if (Database.dbConfig.type === "sqlite") {
await R.exec("PRAGMA optimize;"); await R.exec("PRAGMA optimize;");
} }
} catch (e) { } catch (e) {
log.error("clearOldData", `Failed to clear old data: ${e.message}`); log.error("clearOldData", `Failed to clear old data: ${e.message}`);
} }
} }
}; };
module.exports = { module.exports = {
clearOldData, clearOldData,
}; };

File diff suppressed because it is too large Load diff

View file

@ -1,50 +1,50 @@
const NotificationProvider = require("./notification-provider"); const NotificationProvider = require("./notification-provider");
const axios = require("axios"); const axios = require("axios");
const { DOWN, UP } = require("../../src/util"); const { DOWN, UP } = require("../../src/util");
class ServerChan extends NotificationProvider { class ServerChan extends NotificationProvider {
name = "ServerChan"; name = "ServerChan";
/** /**
* @inheritdoc * @inheritdoc
*/ */
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
const okMsg = "Sent Successfully."; const okMsg = "Sent Successfully.";
// serverchan3 requires sending via ft07.com // serverchan3 requires sending via ft07.com
const url = String(notification.serverChanSendKey).startsWith("sctp") const url = String(notification.serverChanSendKey).startsWith("sctp")
? `https://${notification.serverChanSendKey}.push.ft07.com/send` ? `https://${notification.serverChanSendKey}.push.ft07.com/send`
: `https://sctapi.ftqq.com/${notification.serverChanSendKey}.send`; : `https://sctapi.ftqq.com/${notification.serverChanSendKey}.send`;
try { try {
await axios.post(url, { await axios.post(url, {
"title": this.checkStatus(heartbeatJSON, monitorJSON), "title": this.checkStatus(heartbeatJSON, monitorJSON),
"desp": msg, "desp": msg,
}); });
return okMsg; return okMsg;
} catch (error) { } catch (error) {
this.throwGeneralAxiosError(error); this.throwGeneralAxiosError(error);
} }
} }
/** /**
* Get the formatted title for message * Get the formatted title for message
* @param {?object} heartbeatJSON Heartbeat details (For Up/Down only) * @param {?object} heartbeatJSON Heartbeat details (For Up/Down only)
* @param {?object} monitorJSON Monitor details (For Up/Down only) * @param {?object} monitorJSON Monitor details (For Up/Down only)
* @returns {string} Formatted title * @returns {string} Formatted title
*/ */
checkStatus(heartbeatJSON, monitorJSON) { checkStatus(heartbeatJSON, monitorJSON) {
let title = "UptimeKuma Message"; let title = "UptimeKuma Message";
if (heartbeatJSON != null && heartbeatJSON["status"] === UP) { if (heartbeatJSON != null && heartbeatJSON["status"] === UP) {
title = "UptimeKuma Monitor Up " + monitorJSON["name"]; title = "UptimeKuma Monitor Up " + monitorJSON["name"];
} }
if (heartbeatJSON != null && heartbeatJSON["status"] === DOWN) { if (heartbeatJSON != null && heartbeatJSON["status"] === DOWN) {
title = "UptimeKuma Monitor Down " + monitorJSON["name"]; title = "UptimeKuma Monitor Down " + monitorJSON["name"];
} }
return title; return title;
} }
} }
module.exports = ServerChan; module.exports = ServerChan;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,328 +1,328 @@
<template> <template>
<div ref="wrap" class="wrap" :style="wrapStyle"> <div ref="wrap" class="wrap" :style="wrapStyle">
<div class="hp-bar-big" :style="barStyle"> <div class="hp-bar-big" :style="barStyle">
<div <div
v-for="(beat, index) in shortBeatList" v-for="(beat, index) in shortBeatList"
:key="index" :key="index"
class="beat" class="beat"
:class="{ 'empty': (beat === 0), 'down': (beat.status === 0), 'pending': (beat.status === 2), 'maintenance': (beat.status === 3) }" :class="{ 'empty': (beat === 0), 'down': (beat.status === 0), 'pending': (beat.status === 2), 'maintenance': (beat.status === 3) }"
:style="beatStyle" :style="beatStyle"
:title="getBeatTitle(beat)" :title="getBeatTitle(beat)"
/> />
</div> </div>
<div <div
v-if="!$root.isMobile && size !== 'small' && beatList.length > 4 && $root.styleElapsedTime !== 'none'" v-if="!$root.isMobile && size !== 'small' && beatList.length > 4 && $root.styleElapsedTime !== 'none'"
class="d-flex justify-content-between align-items-center word" :style="timeStyle" class="d-flex justify-content-between align-items-center word" :style="timeStyle"
> >
<div>{{ timeSinceFirstBeat }}</div> <div>{{ timeSinceFirstBeat }}</div>
<div v-if="$root.styleElapsedTime === 'with-line'" class="connecting-line"></div> <div v-if="$root.styleElapsedTime === 'with-line'" class="connecting-line"></div>
<div>{{ timeSinceLastBeat }}</div> <div>{{ timeSinceLastBeat }}</div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import dayjs from "dayjs"; import dayjs from "dayjs";
export default { export default {
props: { props: {
/** Size of the heartbeat bar */ /** Size of the heartbeat bar */
size: { size: {
type: String, type: String,
default: "big", default: "big",
}, },
/** ID of the monitor */ /** ID of the monitor */
monitorId: { monitorId: {
type: Number, type: Number,
required: true, required: true,
}, },
/** Array of the monitors heartbeats */ /** Array of the monitors heartbeats */
heartbeatList: { heartbeatList: {
type: Array, type: Array,
default: null, default: null,
} }
}, },
data() { data() {
return { return {
beatWidth: 10, beatWidth: 10,
beatHeight: 30, beatHeight: 30,
hoverScale: 1.5, hoverScale: 1.5,
beatMargin: 4, beatMargin: 4,
move: false, move: false,
maxBeat: -1, maxBeat: -1,
}; };
}, },
computed: { computed: {
/** /**
* If heartbeatList is null, get it from $root.heartbeatList * If heartbeatList is null, get it from $root.heartbeatList
* @returns {object} Heartbeat list * @returns {object} Heartbeat list
*/ */
beatList() { beatList() {
if (this.heartbeatList === null) { if (this.heartbeatList === null) {
return this.$root.heartbeatList[this.monitorId]; return this.$root.heartbeatList[this.monitorId];
} else { } else {
return this.heartbeatList; return this.heartbeatList;
} }
}, },
/** /**
* Calculates the amount of beats of padding needed to fill the length of shortBeatList. * Calculates the amount of beats of padding needed to fill the length of shortBeatList.
* @returns {number} The amount of beats of padding needed to fill the length of shortBeatList. * @returns {number} The amount of beats of padding needed to fill the length of shortBeatList.
*/ */
numPadding() { numPadding() {
if (!this.beatList) { if (!this.beatList) {
return 0; return 0;
} }
let num = this.beatList.length - this.maxBeat; let num = this.beatList.length - this.maxBeat;
if (this.move) { if (this.move) {
num = num - 1; num = num - 1;
} }
if (num > 0) { if (num > 0) {
return 0; return 0;
} }
return -1 * num; return -1 * num;
}, },
shortBeatList() { shortBeatList() {
if (!this.beatList) { if (!this.beatList) {
return []; return [];
} }
let placeholders = []; let placeholders = [];
let start = this.beatList.length - this.maxBeat; let start = this.beatList.length - this.maxBeat;
if (this.move) { if (this.move) {
start = start - 1; start = start - 1;
} }
if (start < 0) { if (start < 0) {
// Add empty placeholder // Add empty placeholder
for (let i = start; i < 0; i++) { for (let i = start; i < 0; i++) {
placeholders.push(0); placeholders.push(0);
} }
start = 0; start = 0;
} }
return placeholders.concat(this.beatList.slice(start)); return placeholders.concat(this.beatList.slice(start));
}, },
wrapStyle() { wrapStyle() {
let topBottom = (((this.beatHeight * this.hoverScale) - this.beatHeight) / 2); let topBottom = (((this.beatHeight * this.hoverScale) - this.beatHeight) / 2);
let leftRight = (((this.beatWidth * this.hoverScale) - this.beatWidth) / 2); let leftRight = (((this.beatWidth * this.hoverScale) - this.beatWidth) / 2);
return { return {
padding: `${topBottom}px ${leftRight}px`, padding: `${topBottom}px ${leftRight}px`,
width: "100%", width: "100%",
}; };
}, },
barStyle() { barStyle() {
if (this.move && this.shortBeatList.length > this.maxBeat) { if (this.move && this.shortBeatList.length > this.maxBeat) {
let width = -(this.beatWidth + this.beatMargin * 2); let width = -(this.beatWidth + this.beatMargin * 2);
return { return {
transition: "all ease-in-out 0.25s", transition: "all ease-in-out 0.25s",
transform: `translateX(${width}px)`, transform: `translateX(${width}px)`,
}; };
} }
return { return {
transform: "translateX(0)", transform: "translateX(0)",
}; };
}, },
beatStyle() { beatStyle() {
return { return {
width: this.beatWidth + "px", width: this.beatWidth + "px",
height: this.beatHeight + "px", height: this.beatHeight + "px",
margin: this.beatMargin + "px", margin: this.beatMargin + "px",
"--hover-scale": this.hoverScale, "--hover-scale": this.hoverScale,
}; };
}, },
/** /**
* Returns the style object for positioning the time element. * Returns the style object for positioning the time element.
* @returns {object} The style object containing the CSS properties for positioning the time element. * @returns {object} The style object containing the CSS properties for positioning the time element.
*/ */
timeStyle() { timeStyle() {
return { return {
"margin-left": this.numPadding * (this.beatWidth + this.beatMargin * 2) + "px", "margin-left": this.numPadding * (this.beatWidth + this.beatMargin * 2) + "px",
}; };
}, },
/** /**
* Calculates the time elapsed since the first valid beat. * Calculates the time elapsed since the first valid beat.
* @returns {string} The time elapsed in minutes or hours. * @returns {string} The time elapsed in minutes or hours.
*/ */
timeSinceFirstBeat() { timeSinceFirstBeat() {
const firstValidBeat = this.shortBeatList.at(this.numPadding); const firstValidBeat = this.shortBeatList.at(this.numPadding);
const minutes = dayjs().diff(dayjs.utc(firstValidBeat?.time), "minutes"); const minutes = dayjs().diff(dayjs.utc(firstValidBeat?.time), "minutes");
if (minutes > 60) { if (minutes > 60) {
return (minutes / 60).toFixed(0) + "h"; return (minutes / 60).toFixed(0) + "h";
} else { } else {
return minutes + "m"; return minutes + "m";
} }
}, },
/** /**
* Calculates the elapsed time since the last valid beat was registered. * Calculates the elapsed time since the last valid beat was registered.
* @returns {string} The elapsed time in a minutes, hours or "now". * @returns {string} The elapsed time in a minutes, hours or "now".
*/ */
timeSinceLastBeat() { timeSinceLastBeat() {
const lastValidBeat = this.shortBeatList.at(-1); const lastValidBeat = this.shortBeatList.at(-1);
const seconds = dayjs().diff(dayjs.utc(lastValidBeat?.time), "seconds"); const seconds = dayjs().diff(dayjs.utc(lastValidBeat?.time), "seconds");
let tolerance = 60 * 2; // default for when monitorList not available let tolerance = 60 * 2; // default for when monitorList not available
if (this.$root.monitorList[this.monitorId] != null) { if (this.$root.monitorList[this.monitorId] != null) {
tolerance = this.$root.monitorList[this.monitorId].interval * 2; tolerance = this.$root.monitorList[this.monitorId].interval * 2;
} }
if (seconds < tolerance) { if (seconds < tolerance) {
return this.$t("now"); return this.$t("now");
} else if (seconds < 60 * 60) { } else if (seconds < 60 * 60) {
return this.$t("time ago", [ (seconds / 60).toFixed(0) + "m" ]); return this.$t("time ago", [ (seconds / 60).toFixed(0) + "m" ]);
} else { } else {
return this.$t("time ago", [ (seconds / 60 / 60).toFixed(0) + "h" ]); return this.$t("time ago", [ (seconds / 60 / 60).toFixed(0) + "h" ]);
} }
} }
}, },
watch: { watch: {
beatList: { beatList: {
handler(val, oldVal) { handler(val, oldVal) {
this.move = true; this.move = true;
setTimeout(() => { setTimeout(() => {
this.move = false; this.move = false;
}, 300); }, 300);
}, },
deep: true, deep: true,
}, },
}, },
unmounted() { unmounted() {
window.removeEventListener("resize", this.resize); window.removeEventListener("resize", this.resize);
}, },
beforeMount() { beforeMount() {
if (this.heartbeatList === null) { if (this.heartbeatList === null) {
if (!(this.monitorId in this.$root.heartbeatList)) { if (!(this.monitorId in this.$root.heartbeatList)) {
this.$root.heartbeatList[this.monitorId] = []; this.$root.heartbeatList[this.monitorId] = [];
} }
} }
}, },
mounted() { mounted() {
if (this.size !== "big") { if (this.size !== "big") {
this.beatWidth = 5; this.beatWidth = 5;
this.beatHeight = 16; this.beatHeight = 16;
this.beatMargin = 2; this.beatMargin = 2;
} }
// Suddenly, have an idea how to handle it universally. // Suddenly, have an idea how to handle it universally.
// If the pixel * ratio != Integer, then it causes render issue, round it to solve it!! // If the pixel * ratio != Integer, then it causes render issue, round it to solve it!!
const actualWidth = this.beatWidth * window.devicePixelRatio; const actualWidth = this.beatWidth * window.devicePixelRatio;
const actualMargin = this.beatMargin * window.devicePixelRatio; const actualMargin = this.beatMargin * window.devicePixelRatio;
if (!Number.isInteger(actualWidth)) { if (!Number.isInteger(actualWidth)) {
this.beatWidth = Math.round(actualWidth) / window.devicePixelRatio; this.beatWidth = Math.round(actualWidth) / window.devicePixelRatio;
} }
if (!Number.isInteger(actualMargin)) { if (!Number.isInteger(actualMargin)) {
this.beatMargin = Math.round(actualMargin) / window.devicePixelRatio; this.beatMargin = Math.round(actualMargin) / window.devicePixelRatio;
} }
window.addEventListener("resize", this.resize); window.addEventListener("resize", this.resize);
this.resize(); this.resize();
}, },
methods: { methods: {
/** /**
* Resize the heartbeat bar * Resize the heartbeat bar
* @returns {void} * @returns {void}
*/ */
resize() { resize() {
if (this.$refs.wrap) { if (this.$refs.wrap) {
this.maxBeat = Math.floor(this.$refs.wrap.clientWidth / (this.beatWidth + this.beatMargin * 2)); this.maxBeat = Math.floor(this.$refs.wrap.clientWidth / (this.beatWidth + this.beatMargin * 2));
} }
}, },
/** /**
* Get the title of the beat. * Get the title of the beat.
* Used as the hover tooltip on the heartbeat bar. * Used as the hover tooltip on the heartbeat bar.
* @param {object} beat Beat to get title from * @param {object} beat Beat to get title from
* @returns {string} Beat title * @returns {string} Beat title
*/ */
getBeatTitle(beat) { getBeatTitle(beat) {
return `${this.$root.datetime(beat.time)}` + ((beat.msg) ? ` - ${beat.msg}` : ""); return `${this.$root.datetime(beat.time)}` + ((beat.msg) ? ` - ${beat.msg}` : "");
}, },
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../assets/vars.scss"; @import "../assets/vars.scss";
.wrap { .wrap {
overflow: hidden; overflow: hidden;
width: 100%; width: 100%;
white-space: nowrap; white-space: nowrap;
} }
.hp-bar-big { .hp-bar-big {
.beat { .beat {
display: inline-block; display: inline-block;
background-color: $primary; background-color: $primary;
border-radius: $border-radius; border-radius: $border-radius;
&.empty { &.empty {
background-color: aliceblue; background-color: aliceblue;
} }
&.down { &.down {
background-color: $danger; background-color: $danger;
} }
&.pending { &.pending {
background-color: $warning; background-color: $warning;
} }
&.maintenance { &.maintenance {
background-color: $maintenance; background-color: $maintenance;
} }
&:not(.empty):hover { &:not(.empty):hover {
transition: all ease-in-out 0.15s; transition: all ease-in-out 0.15s;
opacity: 0.8; opacity: 0.8;
transform: scale(var(--hover-scale)); transform: scale(var(--hover-scale));
} }
} }
} }
.dark { .dark {
.hp-bar-big .beat.empty { .hp-bar-big .beat.empty {
background-color: #848484; background-color: #848484;
} }
} }
.word { .word {
color: $secondary-text; color: $secondary-text;
font-size: 12px; font-size: 12px;
} }
.connecting-line { .connecting-line {
flex-grow: 1; flex-grow: 1;
height: 1px; height: 1px;
background-color: #ededed; background-color: #ededed;
margin-left: 10px; margin-left: 10px;
margin-right: 10px; margin-right: 10px;
margin-top: 2px; margin-top: 2px;
.dark & { .dark & {
background-color: #333; background-color: #333;
} }
} }
</style> </style>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,320 +1,320 @@
{ {
"languageName": "eesti", "languageName": "eesti",
"retryCheckEverySecond": "Kontrolli {0} sekundilise vahega", "retryCheckEverySecond": "Kontrolli {0} sekundilise vahega",
"retriesDescription": "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus", "retriesDescription": "Mitu korda tuleb kontrollida, mille järel märkida 'maas' ja saata välja teavitus",
"ignoreTLSError": "Eira TLS/SSL viga HTTPS veebisaitidel", "ignoreTLSError": "Eira TLS/SSL viga HTTPS veebisaitidel",
"upsideDownModeDescription": "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.", "upsideDownModeDescription": "Käitle teenuse saadavust rikkena, teenuse kättesaamatust töötavaks.",
"maxRedirectDescription": "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi.", "maxRedirectDescription": "Suurim arv ümbersuunamisi, millele järgida. 0 ei luba ühtegi.",
"acceptedStatusCodesDescription": "Vali välja HTTP koodid, mida arvestada kõlblikuks.", "acceptedStatusCodesDescription": "Vali välja HTTP koodid, mida arvestada kõlblikuks.",
"passwordNotMatchMsg": "Salasõnad ei kattu.", "passwordNotMatchMsg": "Salasõnad ei kattu.",
"notificationDescription": "Teavitusteenuse kasutamiseks seo see seirega.", "notificationDescription": "Teavitusteenuse kasutamiseks seo see seirega.",
"keywordDescription": "Jälgi võtmesõna HTML või JSON vastustes. (tõstutundlik)", "keywordDescription": "Jälgi võtmesõna HTML või JSON vastustes. (tõstutundlik)",
"pauseDashboardHome": "Seisatud", "pauseDashboardHome": "Seisatud",
"deleteMonitorMsg": "Kas soovid eemaldada seire?", "deleteMonitorMsg": "Kas soovid eemaldada seire?",
"deleteNotificationMsg": "Kas soovid eemaldada selle teavitusteenuse kõikidelt seiretelt?", "deleteNotificationMsg": "Kas soovid eemaldada selle teavitusteenuse kõikidelt seiretelt?",
"resolverserverDescription": "Cloudflare on vaikimisi pöördserver.", "resolverserverDescription": "Cloudflare on vaikimisi pöördserver.",
"rrtypeDescription": "Vali kirje tüüp, mida soovid jälgida.", "rrtypeDescription": "Vali kirje tüüp, mida soovid jälgida.",
"pauseMonitorMsg": "Kas soovid peatada seire?", "pauseMonitorMsg": "Kas soovid peatada seire?",
"Settings": "Seaded", "Settings": "Seaded",
"Status Page": "Ülevaade", "Status Page": "Ülevaade",
"Status Pages": "Ülevaated", "Status Pages": "Ülevaated",
"Dashboard": "Töölaud", "Dashboard": "Töölaud",
"New Update": "Uuem tarkvara versioon on saadaval", "New Update": "Uuem tarkvara versioon on saadaval",
"Language": "Keel", "Language": "Keel",
"Appearance": "Välimus", "Appearance": "Välimus",
"Theme": "Teema", "Theme": "Teema",
"General": "Üldine", "General": "Üldine",
"Version": "Versioon", "Version": "Versioon",
"Check Update On GitHub": "Otsi uuendusi GitHub'ist", "Check Update On GitHub": "Otsi uuendusi GitHub'ist",
"List": "Nimekiri", "List": "Nimekiri",
"Add": "Lisa", "Add": "Lisa",
"Add New Monitor": "Lisa seire", "Add New Monitor": "Lisa seire",
"Add a monitor": "Lisa seire", "Add a monitor": "Lisa seire",
"Quick Stats": "Ülevaade", "Quick Stats": "Ülevaade",
"Up": "Töökorras", "Up": "Töökorras",
"Down": "Rikkis", "Down": "Rikkis",
"Pending": "Määramisel", "Pending": "Määramisel",
"Unknown": "Kahtlast", "Unknown": "Kahtlast",
"Pause": "Seiska", "Pause": "Seiska",
"Name": "Nimi", "Name": "Nimi",
"Status": "Olek", "Status": "Olek",
"DateTime": "Kuupäev", "DateTime": "Kuupäev",
"Message": "Tulemus", "Message": "Tulemus",
"No important events": "Märkimisväärsed juhtumid puuduvad", "No important events": "Märkimisväärsed juhtumid puuduvad",
"Resume": "Taasta", "Resume": "Taasta",
"Edit": "Muuda", "Edit": "Muuda",
"Delete": "Eemalda", "Delete": "Eemalda",
"Current": "Hetkeseisund", "Current": "Hetkeseisund",
"Uptime": "Eluiga", "Uptime": "Eluiga",
"Cert Exp.": "Sert. aegumine", "Cert Exp.": "Sert. aegumine",
"day": "päev | päeva", "day": "päev | päeva",
"-day": "-päev", "-day": "-päev",
"hour": "tund", "hour": "tund",
"-hour": "-tund", "-hour": "-tund",
"Response": "Reaktsiooniaeg", "Response": "Reaktsiooniaeg",
"Ping": "Ping", "Ping": "Ping",
"Monitor Type": "Seire tüüp", "Monitor Type": "Seire tüüp",
"Keyword": "Võtmesõna", "Keyword": "Võtmesõna",
"Friendly Name": "Sõbralik nimi", "Friendly Name": "Sõbralik nimi",
"URL": "URL", "URL": "URL",
"Hostname": "Hostname", "Hostname": "Hostname",
"Port": "Port", "Port": "Port",
"Heartbeat Interval": "Tukse sagedus", "Heartbeat Interval": "Tukse sagedus",
"Retries": "Korduskatsed", "Retries": "Korduskatsed",
"Advanced": "Rohkem", "Advanced": "Rohkem",
"Upside Down Mode": "Tagurpidi seire", "Upside Down Mode": "Tagurpidi seire",
"Max. Redirects": "Max. ümbersuunamine", "Max. Redirects": "Max. ümbersuunamine",
"Accepted Status Codes": "Kõlblikud HTTP koodid", "Accepted Status Codes": "Kõlblikud HTTP koodid",
"Save": "Salvesta", "Save": "Salvesta",
"Notifications": "Teavitused", "Notifications": "Teavitused",
"Not available, please setup.": "Ühtegi teavitusteenust pole saadaval.", "Not available, please setup.": "Ühtegi teavitusteenust pole saadaval.",
"Setup Notification": "Lisa teavitusteenus", "Setup Notification": "Lisa teavitusteenus",
"Light": "hele", "Light": "hele",
"Dark": "tume", "Dark": "tume",
"Auto": "automaatne", "Auto": "automaatne",
"Theme - Heartbeat Bar": "Teemasäte — tuksete riba", "Theme - Heartbeat Bar": "Teemasäte — tuksete riba",
"Normal": "tavaline", "Normal": "tavaline",
"Bottom": "all", "Bottom": "all",
"None": "puudub", "None": "puudub",
"Timezone": "Ajatsoon", "Timezone": "Ajatsoon",
"Search Engine Visibility": "Otsimootorite ligipääs", "Search Engine Visibility": "Otsimootorite ligipääs",
"Allow indexing": "Luba indekseerimine", "Allow indexing": "Luba indekseerimine",
"Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt", "Discourage search engines from indexing site": "Keela selle saidi indekseerimine otsimootorite poolt",
"Change Password": "Muuda parooli", "Change Password": "Muuda parooli",
"Current Password": "Praegune parool", "Current Password": "Praegune parool",
"New Password": "Uus parool", "New Password": "Uus parool",
"Repeat New Password": "Korda uut parooli", "Repeat New Password": "Korda uut parooli",
"Update Password": "Uuenda parooli", "Update Password": "Uuenda parooli",
"Disable Auth": "Lülita autentimine välja", "Disable Auth": "Lülita autentimine välja",
"Enable Auth": "Lülita autentimine sisse", "Enable Auth": "Lülita autentimine sisse",
"disableauth.message1": "Kas soovid {disableAuth}?", "disableauth.message1": "Kas soovid {disableAuth}?",
"disable authentication": "lülitada autentimise välja", "disable authentication": "lülitada autentimise välja",
"disableauth.message2": "Kastuamiseks {intendThirdPartyAuth}, näiteks Cloudflare Access.", "disableauth.message2": "Kastuamiseks {intendThirdPartyAuth}, näiteks Cloudflare Access.",
"where you intend to implement third-party authentication": "välise autentimispakkujaga", "where you intend to implement third-party authentication": "välise autentimispakkujaga",
"Please use this option carefully!": "Palun kasuta seda valikut vastutustundlikult!", "Please use this option carefully!": "Palun kasuta seda valikut vastutustundlikult!",
"Logout": "Logi välja", "Logout": "Logi välja",
"Leave": "Lahku", "Leave": "Lahku",
"I understand, please disable": "Olen tutvunud riskidega, lülita välja", "I understand, please disable": "Olen tutvunud riskidega, lülita välja",
"Confirm": "Kinnita", "Confirm": "Kinnita",
"Yes": "Jah", "Yes": "Jah",
"No": "Ei", "No": "Ei",
"Username": "Kasutajanimi", "Username": "Kasutajanimi",
"Password": "Parool", "Password": "Parool",
"Remember me": "Mäleta mind", "Remember me": "Mäleta mind",
"Login": "Logi sisse", "Login": "Logi sisse",
"No Monitors, please": "Seired puuduvad, palun", "No Monitors, please": "Seired puuduvad, palun",
"add one": "Lisa esimene", "add one": "Lisa esimene",
"Notification Type": "Teavituse tüüp", "Notification Type": "Teavituse tüüp",
"Email": "e-posti aadress", "Email": "e-posti aadress",
"Test": "Saada prooviteavitus", "Test": "Saada prooviteavitus",
"Certificate Info": "Sertifikaadi teave", "Certificate Info": "Sertifikaadi teave",
"Resolver Server": "Server, mis vastab DNS päringutele.", "Resolver Server": "Server, mis vastab DNS päringutele.",
"Resource Record Type": "DNS kirje tüüp", "Resource Record Type": "DNS kirje tüüp",
"Last Result": "Viimane", "Last Result": "Viimane",
"Create your admin account": "Admininstraatori konto loomine", "Create your admin account": "Admininstraatori konto loomine",
"Repeat Password": "korda salasõna", "Repeat Password": "korda salasõna",
"respTime": "Reageerimisaeg (ms)", "respTime": "Reageerimisaeg (ms)",
"notAvailableShort": "N/A", "notAvailableShort": "N/A",
"enableDefaultNotificationDescription": "Kõik järgnevalt lisatud seired kasutavad seda teavitusteenuset. Seiretelt võib teavitusteenuse ühekaupa eemaldada.", "enableDefaultNotificationDescription": "Kõik järgnevalt lisatud seired kasutavad seda teavitusteenuset. Seiretelt võib teavitusteenuse ühekaupa eemaldada.",
"clearEventsMsg": "Kas soovid seire kõik sündmused kustutada?", "clearEventsMsg": "Kas soovid seire kõik sündmused kustutada?",
"clearHeartbeatsMsg": "Kas soovid seire kõik tuksed kustutada?", "clearHeartbeatsMsg": "Kas soovid seire kõik tuksed kustutada?",
"confirmClearStatisticsMsg": "Kas soovid TERVE ajaloo kustutada?", "confirmClearStatisticsMsg": "Kas soovid TERVE ajaloo kustutada?",
"Export": "Eksport", "Export": "Eksport",
"Import": "Import", "Import": "Import",
"Default enabled": "Kasuta vaikimisi", "Default enabled": "Kasuta vaikimisi",
"Apply on all existing monitors": "Kõik praegused seired hakkavad kasutama seda teavitusteenust", "Apply on all existing monitors": "Kõik praegused seired hakkavad kasutama seda teavitusteenust",
"Create": "Loo konto", "Create": "Loo konto",
"Clear Data": "Eemalda andmed", "Clear Data": "Eemalda andmed",
"Events": "Sündmused", "Events": "Sündmused",
"Heartbeats": "Tuksed", "Heartbeats": "Tuksed",
"Auto Get": "Hangi automaatselt", "Auto Get": "Hangi automaatselt",
"backupDescription": "Varunda kõik seired ja teavitused JSON faili.", "backupDescription": "Varunda kõik seired ja teavitused JSON faili.",
"backupDescription2": "PS: Varukoopia EI sisalda seirete ajalugu ja sündmustikku.", "backupDescription2": "PS: Varukoopia EI sisalda seirete ajalugu ja sündmustikku.",
"backupDescription3": "Varukoopiad sisaldavad teavitusteenusete pääsuvõtmeid.", "backupDescription3": "Varukoopiad sisaldavad teavitusteenusete pääsuvõtmeid.",
"alertNoFile": "Palun lisa fail, mida importida.", "alertNoFile": "Palun lisa fail, mida importida.",
"alertWrongFileType": "Palun lisa JSON-formaadis fail.", "alertWrongFileType": "Palun lisa JSON-formaadis fail.",
"twoFAVerifyLabel": "2FA kinnitamiseks sisesta pääsukood", "twoFAVerifyLabel": "2FA kinnitamiseks sisesta pääsukood",
"tokenValidSettingsMsg": "Kood õige. Akna võib sulgeda.", "tokenValidSettingsMsg": "Kood õige. Akna võib sulgeda.",
"confirmEnableTwoFAMsg": "Kas soovid 2FA sisse lülitada?", "confirmEnableTwoFAMsg": "Kas soovid 2FA sisse lülitada?",
"confirmDisableTwoFAMsg": "Kas soovid 2FA välja lülitada?", "confirmDisableTwoFAMsg": "Kas soovid 2FA välja lülitada?",
"Verify Token": "Kontrolli", "Verify Token": "Kontrolli",
"Setup 2FA": "Kaksikautentimise seadistamine", "Setup 2FA": "Kaksikautentimise seadistamine",
"Enable 2FA": "Seadista 2FA", "Enable 2FA": "Seadista 2FA",
"Disable 2FA": "Lülita 2FA välja", "Disable 2FA": "Lülita 2FA välja",
"2FA Settings": "2FA seaded", "2FA Settings": "2FA seaded",
"Two Factor Authentication": "Kaksikautentimine", "Two Factor Authentication": "Kaksikautentimine",
"Active": "Aktiivne", "Active": "Aktiivne",
"Inactive": "Mitteaktiivne", "Inactive": "Mitteaktiivne",
"Token": "Kaksikautentimise kood", "Token": "Kaksikautentimise kood",
"Show URI": "Näita URId", "Show URI": "Näita URId",
"Clear all statistics": "Tühjenda ajalugu", "Clear all statistics": "Tühjenda ajalugu",
"importHandleDescription": "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.", "importHandleDescription": "'kombineeri' täiendab varukoopiast ja kirjutab üle samanimelised seireid ja teavitusteenused; 'lisa praegustele' jätab olemasolevad puutumata; 'asenda' kustutab ja asendab kõik seired ja teavitusteenused.",
"confirmImportMsg": "Käkerdistest hoidumiseks lae enne taastamist alla uus varukoopia. Kas soovid taastada üles laetud?", "confirmImportMsg": "Käkerdistest hoidumiseks lae enne taastamist alla uus varukoopia. Kas soovid taastada üles laetud?",
"Heartbeat Retry Interval": "Korduskatsete intervall", "Heartbeat Retry Interval": "Korduskatsete intervall",
"Import Backup": "Varukoopia importimine", "Import Backup": "Varukoopia importimine",
"Export Backup": "Varukoopia eksportimine", "Export Backup": "Varukoopia eksportimine",
"Skip existing": "lisa praegustele", "Skip existing": "lisa praegustele",
"Overwrite": "Asenda", "Overwrite": "Asenda",
"Options": "Mestimisviis", "Options": "Mestimisviis",
"Keep both": "Kombineeri", "Keep both": "Kombineeri",
"Tags": "Sildid", "Tags": "Sildid",
"Add New below or Select...": "Leia või lisa all uus…", "Add New below or Select...": "Leia või lisa all uus…",
"Tag with this name already exist.": "Selle nimega silt on juba olemas.", "Tag with this name already exist.": "Selle nimega silt on juba olemas.",
"Tag with this value already exist.": "Selle väärtusega silt on juba olemas.", "Tag with this value already exist.": "Selle väärtusega silt on juba olemas.",
"color": "värvus", "color": "värvus",
"value (optional)": "väärtus (fakultatiivne)", "value (optional)": "väärtus (fakultatiivne)",
"Gray": "hall", "Gray": "hall",
"Red": "punane", "Red": "punane",
"Orange": "oranž", "Orange": "oranž",
"Green": "roheline", "Green": "roheline",
"Blue": "sinine", "Blue": "sinine",
"Indigo": "indigo", "Indigo": "indigo",
"Purple": "lilla", "Purple": "lilla",
"Pink": "roosa", "Pink": "roosa",
"Search...": "Otsi…", "Search...": "Otsi…",
"Avg. Ping": "Keskmine ping", "Avg. Ping": "Keskmine ping",
"Avg. Response": "Keskmine reaktsiooniaeg", "Avg. Response": "Keskmine reaktsiooniaeg",
"Entry Page": "Avaleht", "Entry Page": "Avaleht",
"statusPageNothing": "Kippu ega kõppu; siia saab lisada seireid või -gruppe.", "statusPageNothing": "Kippu ega kõppu; siia saab lisada seireid või -gruppe.",
"No Services": "Teenused puuduvad", "No Services": "Teenused puuduvad",
"All Systems Operational": "Kõik töökorras", "All Systems Operational": "Kõik töökorras",
"Partially Degraded Service": "Teenuse töö osaliselt häiritud", "Partially Degraded Service": "Teenuse töö osaliselt häiritud",
"Degraded Service": "Teenuse töö häiritud", "Degraded Service": "Teenuse töö häiritud",
"Add Group": "Lisa grupp", "Add Group": "Lisa grupp",
"Edit Status Page": "Muuda lehte", "Edit Status Page": "Muuda lehte",
"Go to Dashboard": "Töölauale", "Go to Dashboard": "Töölauale",
"checkEverySecond": "Kontrolli peale tõrget {0} sekundilise vahega", "checkEverySecond": "Kontrolli peale tõrget {0} sekundilise vahega",
"telegram": "Telegram", "telegram": "Telegram",
"webhook": "Webhook", "webhook": "Webhook",
"smtp": "elektronpost (SMTP)", "smtp": "elektronpost (SMTP)",
"discord": "Discord", "discord": "Discord",
"teams": "Microsoft Teams", "teams": "Microsoft Teams",
"signal": "Signal", "signal": "Signal",
"gotify": "Gotify", "gotify": "Gotify",
"slack": "Slack", "slack": "Slack",
"rocket.chat": "Rocket.chat", "rocket.chat": "Rocket.chat",
"pushover": "Pushover", "pushover": "Pushover",
"pushy": "Pushy", "pushy": "Pushy",
"octopush": "Octopush", "octopush": "Octopush",
"promosms": "PromoSMS", "promosms": "PromoSMS",
"lunasea": "LunaSea", "lunasea": "LunaSea",
"apprise": "Apprise (vahendab üle 65 teavitusteenust)", "apprise": "Apprise (vahendab üle 65 teavitusteenust)",
"pushbullet": "Pushbullet", "pushbullet": "Pushbullet",
"line": "LINE", "line": "LINE",
"mattermost": "Mattermost", "mattermost": "Mattermost",
"alerta": "Alerta", "alerta": "Alerta",
"alertaApiEndpoint": "API otsik", "alertaApiEndpoint": "API otsik",
"alertaEnvironment": "Keskkond", "alertaEnvironment": "Keskkond",
"alertaApiKey": "API võti", "alertaApiKey": "API võti",
"alertaAlertState": "Häireseisund", "alertaAlertState": "Häireseisund",
"alertaRecoverState": "Taasta algolek", "alertaRecoverState": "Taasta algolek",
"Game": "Mäng", "Game": "Mäng",
"Primary Base URL": "Peamine baas URL", "Primary Base URL": "Peamine baas URL",
"Passive Monitor Type": "Passiivne monitori tüüp", "Passive Monitor Type": "Passiivne monitori tüüp",
"Specific Monitor Type": "Spetsiifiline monitori tüüp", "Specific Monitor Type": "Spetsiifiline monitori tüüp",
"resendDisabled": "Uuesti saatmine keelatud", "resendDisabled": "Uuesti saatmine keelatud",
"Push URL": "Lükka URL", "Push URL": "Lükka URL",
"needPushEvery": "Sa peaksid kutsuma seda URL-i iga {0} sekundi tagant.", "needPushEvery": "Sa peaksid kutsuma seda URL-i iga {0} sekundi tagant.",
"pushOptionalParams": "Valikulised parameetrid: {0}", "pushOptionalParams": "Valikulised parameetrid: {0}",
"Schedule maintenance": "Planeeri hooldus", "Schedule maintenance": "Planeeri hooldus",
"All Status Pages": "Kõik staatuse lehed", "All Status Pages": "Kõik staatuse lehed",
"Select status pages...": "Vali staatuse lehed…", "Select status pages...": "Vali staatuse lehed…",
"Custom": "Kohandatud", "Custom": "Kohandatud",
"here": "siin", "here": "siin",
"Required": "Nõutud", "Required": "Nõutud",
"Post URL": "Postita URL", "Post URL": "Postita URL",
"Affected Monitors": "Mõjutatud monitorid", "Affected Monitors": "Mõjutatud monitorid",
"Pick Affected Monitors...": "Vali mõjutatud monitorid…", "Pick Affected Monitors...": "Vali mõjutatud monitorid…",
"Start of maintenance": "Hoolduse algus", "Start of maintenance": "Hoolduse algus",
"Content Type": "Sisu tüüp", "Content Type": "Sisu tüüp",
"webhookJsonDesc": "{0} on hea iga modernse HTTP serveri jaoks nagu Express.js", "webhookJsonDesc": "{0} on hea iga modernse HTTP serveri jaoks nagu Express.js",
"webhookAdditionalHeadersTitle": "Täiendavad päised", "webhookAdditionalHeadersTitle": "Täiendavad päised",
"setAsDefault": "Lisa vaikimisi", "setAsDefault": "Lisa vaikimisi",
"deleteProxyMsg": "Kas Sa oled kindel, et soovid kustutada seda puhverserverit kõkidel monitoridel?", "deleteProxyMsg": "Kas Sa oled kindel, et soovid kustutada seda puhverserverit kõkidel monitoridel?",
"proxyDescription": "Puhverserverid tuleb lisada monitorile selle töötamiseks.", "proxyDescription": "Puhverserverid tuleb lisada monitorile selle töötamiseks.",
"setAsDefaultProxyDescription": "See puhverserver aktiveeritakse vaikimisi uutel monitoridel. Sa saad keelata seda puhverserverit igal monitoril eraldi.", "setAsDefaultProxyDescription": "See puhverserver aktiveeritakse vaikimisi uutel monitoridel. Sa saad keelata seda puhverserverit igal monitoril eraldi.",
"Certificate Chain": "Sertifikaadi kett", "Certificate Chain": "Sertifikaadi kett",
"Valid": "Kehtiv", "Valid": "Kehtiv",
"Invalid": "Kehtetu", "Invalid": "Kehtetu",
"User": "Kasutaja", "User": "Kasutaja",
"Installed": "Paigaldatud", "Installed": "Paigaldatud",
"Not installed": "Ei ole installeeritud", "Not installed": "Ei ole installeeritud",
"Running": "Töötab", "Running": "Töötab",
"resendEveryXTimes": "Saada uuesti {0} korda", "resendEveryXTimes": "Saada uuesti {0} korda",
"statusMaintenance": "Hooldus", "statusMaintenance": "Hooldus",
"Webhook URL": "", "Webhook URL": "",
"Server URL": "Serveri URL", "Server URL": "Serveri URL",
"Priority": "Tähtsus", "Priority": "Tähtsus",
"emojiCheatSheet": "Emotikoni spikker: {0}", "emojiCheatSheet": "Emotikoni spikker: {0}",
"appriseInstalled": "Apprise on installitud.", "appriseInstalled": "Apprise on installitud.",
"appriseNotInstalled": "Apprise ei ole installitud. {0}", "appriseNotInstalled": "Apprise ei ole installitud. {0}",
"Method": "Meetod", "Method": "Meetod",
"Body": "Keha", "Body": "Keha",
"Headers": "Päis", "Headers": "Päis",
"PushUrl": "Lükka URL", "PushUrl": "Lükka URL",
"Monitor History": "Monitori ajalugu", "Monitor History": "Monitori ajalugu",
"PasswordsDoNotMatch": "Paroolid ei ühti.", "PasswordsDoNotMatch": "Paroolid ei ühti.",
"records": "", "records": "",
"Current User": "Praegune kasutaja", "Current User": "Praegune kasutaja",
"topic": "Teema", "topic": "Teema",
"successMessage": "Edukas sõnum", "successMessage": "Edukas sõnum",
"recent": "Hiljutine", "recent": "Hiljutine",
"Info": "Info", "Info": "Info",
"Security": "Turvalisus", "Security": "Turvalisus",
"Steam API Key": "Steam API võti", "Steam API Key": "Steam API võti",
"Pick a RR-Type...": "Vali RR-tüüp…", "Pick a RR-Type...": "Vali RR-tüüp…",
"Default": "Vaikimisi", "Default": "Vaikimisi",
"HTTP Options": "HTTP valikud", "HTTP Options": "HTTP valikud",
"Create Incident": "Loo intsident", "Create Incident": "Loo intsident",
"Title": "Pealkiri", "Title": "Pealkiri",
"Content": "Sisu", "Content": "Sisu",
"Style": "Stiil", "Style": "Stiil",
"info": "info", "info": "info",
"warning": "hoiatus", "warning": "hoiatus",
"danger": "oht", "danger": "oht",
"error": "viga", "error": "viga",
"critical": "kriitiline", "critical": "kriitiline",
"primary": "peamine", "primary": "peamine",
"dark": "tume", "dark": "tume",
"light": "hele", "light": "hele",
"Post": "Postita", "Post": "Postita",
"Please input title and content": "Palun lisa pealkiri ja sisu", "Please input title and content": "Palun lisa pealkiri ja sisu",
"Created": "Loodud", "Created": "Loodud",
"Last Updated": "Viimati uuendatud", "Last Updated": "Viimati uuendatud",
"Unpin": "Vabastada", "Unpin": "Vabastada",
"Switch to Dark Theme": "Vaheta tumedale teemale", "Switch to Dark Theme": "Vaheta tumedale teemale",
"Hide Tags": "Peida tagid", "Hide Tags": "Peida tagid",
"Show Tags": "Näita tagid", "Show Tags": "Näita tagid",
"Description": "Kirjeldus", "Description": "Kirjeldus",
"No monitors available.": "Ühtegi monitori ei ole saadaval.", "No monitors available.": "Ühtegi monitori ei ole saadaval.",
"Add one": "Lisa üks", "Add one": "Lisa üks",
"No Monitors": "Ei ole monitore", "No Monitors": "Ei ole monitore",
"Untitled Group": "Nimetamata grupp", "Untitled Group": "Nimetamata grupp",
"Services": "Teenused", "Services": "Teenused",
"Cancel": "Tühista", "Cancel": "Tühista",
"Customize": "Kohanda", "Customize": "Kohanda",
"Custom Footer": "Kohandatud jalus", "Custom Footer": "Kohandatud jalus",
"Custom CSS": "Kohandatud CSS", "Custom CSS": "Kohandatud CSS",
"Proxies": "Puhverserverid", "Proxies": "Puhverserverid",
"default": "Vaikimisi", "default": "Vaikimisi",
"enabled": "Lubatud", "enabled": "Lubatud",
"Not running": "Ei tööta", "Not running": "Ei tööta",
"Start": "Alusta", "Start": "Alusta",
"Stop": "Peata", "Stop": "Peata",
"Add New Status Page": "Lisa uus staatuse leht", "Add New Status Page": "Lisa uus staatuse leht",
"Shrink Database": "Vähenda andmebaasi", "Shrink Database": "Vähenda andmebaasi",
"Help": "Abi", "Help": "Abi",
"Maintenance": "Hooldus", "Maintenance": "Hooldus",
"General Monitor Type": "Üldine monitori tüüp", "General Monitor Type": "Üldine monitori tüüp",
"webhookAdditionalHeadersDesc": "Lisab täiendavad päised saadetud webhookiga.", "webhookAdditionalHeadersDesc": "Lisab täiendavad päised saadetud webhookiga.",
"Read more": "Loe rohkem", "Read more": "Loe rohkem",
"HeadersInvalidFormat": "", "HeadersInvalidFormat": "",
"clearDataOlderThan": "Hoia monitori ajalugu alles {0} päeva.", "clearDataOlderThan": "Hoia monitori ajalugu alles {0} päeva.",
"steamApiKeyDescription": "Steam Game Serveri monitoorimiseks on vaja sul Steam Web-API võtit. Sa saad registreerida enda API võtme siin: ", "steamApiKeyDescription": "Steam Game Serveri monitoorimiseks on vaja sul Steam Web-API võtit. Sa saad registreerida enda API võtme siin: ",
"Done": "Tehtud", "Done": "Tehtud",
"Pick Accepted Status Codes...": "Vali vastu võetud staatuse koodid…", "Pick Accepted Status Codes...": "Vali vastu võetud staatuse koodid…",
"Switch to Light Theme": "Vaheta heledale teemale", "Switch to Light Theme": "Vaheta heledale teemale",
"Discard": "Loobu", "Discard": "Loobu",
"deleteStatusPageMsg": "Kas Sa oled kindel, et soovid kustutada seda staatuse lehte?", "deleteStatusPageMsg": "Kas Sa oled kindel, et soovid kustutada seda staatuse lehte?",
"Resend Notification if Down X times consecutively": "Saada teavitus uuesti kui monitor on rikkis X korda järjest" "Resend Notification if Down X times consecutively": "Saada teavitus uuesti kui monitor on rikkis X korda järjest"
} }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -11,6 +11,18 @@ export default {
components: { components: {
MonitorList, MonitorList,
}, },
mounted() {
if (!this.$root.isMobile && this.$route.path === '/list') {
this.$router.push('/dashboard');
}
},
watch: {
'$root.isMobile'(newVal) {
if (!newVal && this.$route.path === '/list') {
this.$router.push('/dashboard');
}
}
}
}; };
</script> </script>
@ -21,4 +33,11 @@ export default {
padding: 20px; padding: 20px;
} }
.slide-fade-enter-active, .slide-fade-leave-active {
transition: all 0.5s ease;
}
.slide-fade-enter, .slide-fade-leave-to {
transform: translateX(10px);
opacity: 0;
}
</style> </style>