Library updates and clean up
Some checks failed
/ build (push) Has been cancelled

- upgrade react router to v7
- migrate imports from react-router-dom to react-router
- add i18next-json-sync tasks
- clean up Dockerfile
This commit is contained in:
Varakh 2024-11-29 22:13:37 +01:00
parent 3bc2cd20eb
commit cb9e1fdec5
37 changed files with 1787 additions and 8773 deletions

View file

@ -6,7 +6,6 @@ on:
- master
env:
IMAGE_TAG: varakh/upda
REVISION: ${{ github.sha }}
jobs:
build:
runs-on: docker

View file

@ -11,7 +11,6 @@ env:
FORGEJO_URL: https://git.myservermanager.com
FORGEJO_FQDN: git.myservermanager.com
FORGEJO_REPO: varakh/upda
REVISION: ${{ github.sha }}
jobs:
release:
runs-on: docker

View file

@ -4,7 +4,7 @@ Changes adhere to [semantic versioning](https://semver.org).
## [4.0.1] - UNRELEASED
* ...
* Library updates
## [4.0.0] - 2024/10/25

View file

@ -23,7 +23,6 @@ FROM alpine:3.20
LABEL maintainer="Varakh <varakh@varakh.de>" \
description="upda" \
org.opencontainers.image.authors="Varakh" \
org.opencontainers.image.revision="${REVISION}" \
org.opencontainers.image.vendor="Varakh" \
org.opencontainers.image.title="upda" \
org.opencontainers.image.description="upda" \

View file

@ -35,6 +35,24 @@ There's also a [embedded frontend](#embedded-frontend).
* Consider reading [Effective Go](https://go.dev/doc/effective_go)
* Consider reading [100 Go Mistakes and How to Avoid Them](https://100go.co/)
### Translation files
Pipeline checks for existing i18n keys, if you need to manually sync any language file, run `npm run i18n-sync`.
### Dependencies
To track unused dependencies
```shell
# install (if not yet present)
npm install -g depcheck typescript
# run
depcheck
```
Be aware that some are false positives and actually required.
## Embedded Frontend
_upda_ includes a frontend in a monorepo fashion inside `server/web/`. For production (binary and OCI), it's

12
go.mod
View file

@ -6,24 +6,24 @@ toolchain go1.22.3
require (
github.com/Depado/ginprom v1.8.1
github.com/adrg/xdg v0.5.1
github.com/adrg/xdg v0.5.3
github.com/containrrr/shoutrrr v0.8.0
github.com/gin-contrib/cors v1.7.2
github.com/gin-contrib/static v1.1.2
github.com/gin-contrib/zap v1.1.4
github.com/gin-gonic/gin v1.10.0
github.com/go-co-op/gocron-redis-lock/v2 v2.0.1
github.com/go-co-op/gocron/v2 v2.12.1
github.com/go-playground/validator/v10 v10.22.1
github.com/go-co-op/gocron/v2 v2.12.4
github.com/go-playground/validator/v10 v10.23.0
github.com/go-redsync/redsync/v4 v4.13.0
github.com/go-resty/resty/v2 v2.15.3
github.com/go-resty/resty/v2 v2.16.2
github.com/google/uuid v1.6.0
github.com/redis/go-redis/v9 v9.7.0
github.com/stretchr/testify v1.9.0
github.com/stretchr/testify v1.10.0
github.com/urfave/cli/v2 v2.27.5
go.uber.org/automaxprocs v1.6.0
go.uber.org/zap v1.27.0
gorm.io/driver/postgres v1.5.9
gorm.io/driver/postgres v1.5.10
gorm.io/driver/sqlite v1.5.6
gorm.io/gorm v1.25.12
moul.io/zapgorm2 v1.3.0

12
go.sum
View file

@ -10,6 +10,8 @@ github.com/Microsoft/hcsshim v0.11.1 h1:hJ3s7GbWlGK4YVV92sO88BQSyF4ZLVy7/awqOlPx
github.com/Microsoft/hcsshim v0.11.1/go.mod h1:nFJmaO4Zr5Y7eADdFOpYswDDlNVbvcIJJNJLECr5JQg=
github.com/adrg/xdg v0.5.1 h1:Im8iDbEFARltY09yOJlSGu4Asjk2vF85+3Dyru8uJ0U=
github.com/adrg/xdg v0.5.1/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ=
github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78=
github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ=
github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4=
github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@ -73,6 +75,8 @@ github.com/go-co-op/gocron-redis-lock/v2 v2.0.1 h1:xM+mzO88L+kODvY4vIUVLlZuyWazK
github.com/go-co-op/gocron-redis-lock/v2 v2.0.1/go.mod h1:FSHZ13f4bfH37RpJi9l3vl2GTiJRUI6xTDbUvXLoqrY=
github.com/go-co-op/gocron/v2 v2.12.1 h1:dCIIBFbzhWKdgXeEifBjHPzgQ1hoWhjS4289Hjjy1uw=
github.com/go-co-op/gocron/v2 v2.12.1/go.mod h1:xY7bJxGazKam1cz04EebrlP4S9q4iWdiAylMGP3jY9w=
github.com/go-co-op/gocron/v2 v2.12.4 h1:h1HWApo3T+61UrZqEY2qG1LUpDnB7tkYITxf6YIK354=
github.com/go-co-op/gocron/v2 v2.12.4/go.mod h1:xY7bJxGazKam1cz04EebrlP4S9q4iWdiAylMGP3jY9w=
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
@ -85,6 +89,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA=
github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o=
github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI=
@ -95,6 +101,8 @@ github.com/go-redsync/redsync/v4 v4.13.0 h1:49X6GJfnbLGaIpBBREM/zA4uIMDXKAh1NDkv
github.com/go-redsync/redsync/v4 v4.13.0/go.mod h1:HMW4Q224GZQz6x1Xc7040Yfgacukdzu7ifTDAKiyErQ=
github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8=
github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU=
github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg=
github.com/go-resty/resty/v2 v2.16.2/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
@ -234,6 +242,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM=
github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8=
github.com/testcontainers/testcontainers-go v0.26.0 h1:uqcYdoOHBy1ca7gKODfBd9uTHVK3a7UL848z09MVZ0c=
@ -333,6 +343,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8=
gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
gorm.io/driver/postgres v1.5.10 h1:7Lggqempgy496c0WfHXsYWxk3Th+ZcW66/21QhVFdeE=
gorm.io/driver/postgres v1.5.10/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
gorm.io/driver/sqlite v1.5.6 h1:fO/X46qn5NUEEOZtnjJRWRzZMe8nqJiQ9E+0hi+hKQE=
gorm.io/driver/sqlite v1.5.6/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4=
gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=

File diff suppressed because it is too large Load diff

View file

@ -22,84 +22,74 @@
"lintfix": "eslint --fix \"./src/**/*.{tsx,ts}\"",
"lint:style": "stylelint \"./src/**/*.less\"",
"lint-style-fix": "stylelint \"./src/**/*.less\" --fix",
"checkstyle": "npm run checkstyle:ts && npm run checkstyle:less && npm run checkstyle:format",
"checkstyle": "npm run checkstyle:ts && npm run checkstyle:less && npm run checkstyle:format && npm run checkstyle:i18n",
"checkstyle:format": "npm run format:check",
"checkstyle:ts": "eslint \"./src/**/*.{ts,tsx}\" -f checkstyle > ci/eslint.xml",
"checkstyle:less": "stylelint \"./src/**/*.less\"",
"checkstyle:i18n": "sync-i18n --check --files '**/translations/*.json' --primary en --space 2 --lineendings LF",
"i18n-sync": "sync-i18n --files '**/translations/*.json' --primary en --space 2 --lineendings LF",
"clean": "npx --quiet rimraf build && npx --quiet rimraf node_modules"
},
"dependencies": {
"@ant-design/icons": "^5.5.1",
"@ant-design/pro-layout": "^7.21.1",
"@reduxjs/toolkit": "^2.3.0",
"@testing-library/react": "^16.0.1",
"@testing-library/user-event": "^14.5.2",
"@ant-design/icons": "^5.5.2",
"@ant-design/pro-layout": "^7.21.2",
"@reduxjs/toolkit": "^2.4.0",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@uiw/react-md-editor": "^4.0.4",
"antd": "^5.21.5",
"antd": "^5.22.2",
"file-saver": "^2.0.5",
"html-react-parser": "^5.1.18",
"i18next": "^23.16.3",
"i18next": "^24.0.2",
"i18next-browser-languagedetector": "^8.0.0",
"linkify-html": "^4.1.3",
"linkifyjs": "^4.1.3",
"linkify-html": "^4.1.4",
"linkifyjs": "^4.1.4",
"lodash": "^4.17.21",
"moment-timezone": "^0.5.46",
"react": "^18.3.1",
"react-copy-to-clipboard": "^5.1.0",
"react-dom": "^18.3.1",
"react-i18next": "^15.1.0",
"react-i18next": "^15.1.3",
"react-redux": "^9.1.2",
"react-router-dom": "^6.27.0",
"react-virtualized": "^9.22.5",
"typescript": "^5.6.3"
"react-router": "^7.0.1",
"typescript": "^5.7.2"
},
"devDependencies": {
"@babel/register": "^7.25.9",
"@eslint/compat": "^1.2.1",
"@eslint/js": "^9.13.0",
"@eslint/compat": "^1.2.3",
"@eslint/js": "^9.16.0",
"@types/file-saver": "^2.0.7",
"@types/lodash": "^4.17.12",
"@types/node": "^20.16.5",
"@types/react-copy-to-clipboard": "^5.0.7",
"@types/react-virtualized": "^9.21.30",
"@typescript-eslint/eslint-plugin": "^8.11.0",
"@typescript-eslint/parser": "^8.11.0",
"@vitejs/plugin-react": "^4.3.3",
"@vitest/coverage-v8": "^2.1.3",
"babel-plugin-import": "^1.13.8",
"c8": "^10.1.2",
"eslint": "^9.13.0",
"@types/lodash": "^4.17.13",
"@types/node": "^20.16.15",
"@typescript-eslint/eslint-plugin": "^8.16.0",
"@typescript-eslint/parser": "^8.16.0",
"@vitejs/plugin-react": "^4.3.4",
"@vitest/coverage-v8": "^2.1.6",
"eslint": "^9.16.0",
"eslint-config-prettier": "^9.1.0",
"eslint-formatter-checkstyle": "^8.40.0",
"eslint-import-resolver-typescript": "^3.6.3",
"eslint-plugin-disable": "^2.0.3",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.1",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-sonarjs": "^2.0.4",
"eslint-plugin-testing-library": "^6.4.0",
"eslint-plugin-testing-library": "^7.0.0",
"i18next-json-sync": "^3.1.2",
"jsdom": "^25.0.1",
"less": "^4.2.0",
"less-loader": "^12.2.0",
"less": "^4.2.1",
"postcss-less": "^6.0.0",
"postcss-markdown": "^1.2.0",
"prettier": "^3.3.3",
"prettier": "^3.4.1",
"rimraf": "^6.0.1",
"stylelint": "^16.10.0",
"stylelint": "^16.11.0",
"stylelint-config-standard": "^36.0.1",
"stylelint-declaration-block-no-ignored-properties": "^2.8.0",
"stylelint-order": "^6.0.4",
"stylelint-prettier": "^5.0.2",
"vite": "^5.4.10",
"vite-plugin-eslint2": "^5.0.1",
"vite": "^5.4.11",
"vite-plugin-eslint2": "^5.0.3",
"vite-plugin-stylelint": "^5.3.1",
"vite-plugin-svgr": "^4.2.0",
"vite-tsconfig-paths": "^5.0.1",
"vitest": "^2.1.3"
"vite-plugin-svgr": "^4.3.0",
"vite-tsconfig-paths": "^5.1.3",
"vitest": "^2.1.6"
},
"browserslist": {
"production": [

View file

@ -4,4 +4,5 @@ enum ApiErrorCodes {
CONFLICT = 'Conflict',
ILLEGAL_ARGUMENT = 'IllegalArgument'
}
export default ApiErrorCodes;

View file

@ -8,4 +8,5 @@ enum ApiTags {
ActionInvocations = 'ActionInvocations',
Events = 'Events'
}
export default ApiTags;

View file

@ -4,4 +4,5 @@ enum HttpStatusCode {
STATUS_403 = 403,
STATUS_404 = 404
}
export default HttpStatusCode;

View file

@ -3,6 +3,7 @@ import LanguageDetector from 'i18next-browser-languagedetector';
import { initReactI18next } from 'react-i18next';
import en from './translations/en.json';
import { isDevelopment } from '../utils/envHelper';
const resources = {
en: {
@ -18,7 +19,7 @@ i18next
resources,
lng: 'en',
fallbackLng: 'en',
debug: import.meta.env.DEV,
debug: isDevelopment(),
interpolation: {
escapeValue: false // not needed for react as it escapes by default
},

View file

@ -1,464 +1,464 @@
{
"version": {
"version": "Version",
"number": "4.0.1"
},
"common": {
"404_title": "Not found.",
"404": "The page you've requested doesn't exist.",
"back_home": "Go back",
"home": "Home",
"login": "Login",
"updates": "Updates",
"webhooks": "Webhooks",
"actions": "Actions",
"action_invocations": "Action History",
"secrets": "Secrets",
"events": "Events",
"logout": "Logout"
},
"auth": {
"loading": "Loading..."
},
"health": {
"reload": "Reload",
"generic_error_title": "Services unhealthy",
"generic_error_content": "Health check failed, please try again later."
},
"login": {
"title": "Login",
"username": "Username",
"password": "Password",
"username_required": "Username is required",
"password_required": "Password is required",
"submit": "Submit",
"reset": "Reset",
"unauthorized": "Username or password are incorrect.",
"default_message": "Error while logging in."
},
"update": {
"handle_pending": "Recently updated",
"created_at": "Created on {{created}}",
"created_at_diff": "Updated on {{updated}}, but initially submitted on {{created}}",
"help_approve": "Approve",
"help_ignore": "Ignore",
"help_pending": "Reset to pending",
"help_details": "Show details",
"help_delete": "Delete",
"version": "Version",
"provider": "Provider",
"host": "Host",
"metadata": "Metadata",
"state": "State",
"created": "Created",
"updated": "Updated",
"delete_title": "Are you sure to delete? Cannot be undone.",
"delete": "Delete",
"cancel": "Cancel",
"error_default_delete": "Unable to delete update. Please make sure your device has network connection.",
"error_default_modify_state": "Unable to modify update. Please make sure your device has network connection.",
"error_unable_delete": "Resource cannot be found. Unable to delete update. Please refresh the page.",
"error_unable_modify_state": "Resource cannot be found. Unable to modify update. Please refresh the page.",
"error_unauthorized_delete": "Unable to delete update. Please refresh this page.",
"error_unauthorized_modify_state": "Unable to modify update. Please refresh this page.",
"error_forbidden_delete": "Forbidden to delete update.",
"error_forbidden_modify_state": "Forbidden to modify update."
},
"update_state_tag": {
"state_pending": "Pending",
"state_ignored": "Ignored",
"state_approved": "Approved"
},
"updates_single": {
"default_loading_error_message": "Unable to load update. Please make sure your device has network connection.",
"no_update": "No update found.",
"title_parent": "Updates",
"title": "Update Details",
"state": "State",
"application": "Application",
"version": "Version",
"host": "Host",
"provider": "Provider",
"metadata": "Metadata",
"created": "Created",
"updated": "Updated"
},
"updates": {
"title": "Updates",
"help": "<b>Updates</b> track information about externally reported data regarding an application, host, provider and a version attribute. You can manage an <b>Update</b>'s status by transitioning it through different states like pending or ignored. On arrival of new information through <b>Webhooks</b>, an <b>Update</b> changes its version property or attached metadata attribute and creates an <b>Event</b>. In case identical information is submitted, an <b>Event</b> is still produced. When an <b>Update</b>'s state is not pending, such a modification resets the update's state to pending again. If an <b>Update</b> is set to be ignored, no information is updated.",
"auto_refresh": "Auto Refresh",
"on": "On",
"off": "Off",
"reload_tooltip": "Reload all updates",
"reload": "Reload",
"no_updates": "No updates found.",
"error_default_loading": "Unable to load updates. Please make sure your device has network connection."
},
"updates_filters": {
"filters": "Filters",
"state": "State",
"state_placeholder": "Select state(s)",
"state_pending": "Pending",
"state_ignored": "Ignored",
"state_approved": "Approved",
"order_by": "Order by",
"order_by_id": "ID",
"order_by_created_at": "Created",
"order_by_updated_at": "Updated",
"order_by_application": "Application",
"order_by_provider": "Provider",
"order_by_host": "Host",
"order_asc": "Ascending",
"order_desc": "Descending",
"search_term": "Search",
"search_term_placeholder": "What are you looking for?",
"search_in": "Search in",
"search_in_application": "Application",
"search_in_provider": "Provider",
"search_in_host": "Host"
},
"webhook": {
"created_at": "Created on {{created}}",
"created_at_diff": "Updated on {{updated}}, but initially submitted on {{created}}",
"delete_title": "Are you sure to delete? Cannot be undone.",
"delete": "Delete",
"cancel": "Cancel",
"url": "URL",
"label": "Label",
"help_delete": "Delete",
"ignore_host": "Ignore host",
"type": "Type",
"type_generic": "Generic",
"type_diun": "Diun",
"created": "Created",
"updated": "Updated",
"error_default_delete": "Unable to delete webhook. Please make sure your device has network connection.",
"error_default_update_label": "Unable to update webhook label. Please make sure your device has network connection.",
"error_default_update_ignore_host": "Unable to update webhook ignore host. Please make sure your device has network connection.",
"error_unable_delete": "Resource cannot be found. Unable to delete webhook. Please refresh the page.",
"error_unable_update_label": "Resource cannot be found. Unable to update webhook label. Please refresh this page.",
"error_unable_update_ignore_host": "Resource cannot be found. Unable to update webhook ignore host. Please refresh this page.",
"error_forbidden_delete": "Forbidden to delete webhook.",
"error_forbidden_update_label": "Forbidden to update label.",
"error_forbidden_update_ignore_host": "Forbidden to update ignore host.",
"error_unauthorized_delete": "Unable to delete webhook. Please refresh this page.",
"error_unauthorized_update_label": "Unable to update webhook label. Please refresh this page.",
"error_unauthorized_update_ignore_host": "Unable to update webhook ignore host. Please refresh this page."
},
"webhooks": {
"title": "Webhooks",
"help": "<b>Webhooks</b> allow to submit new or modify existing <b>Updates</b> from an external source such as a commandline tool or another application with the help of a unique URL. On submission of new information via <b>Webhook</b>, <i>upda</i> keeps track of changes. By creating multiple <b>Webhooks</b>, you can submit information from separate applications into <i>upda</i>.",
"auto_refresh": "Auto Refresh",
"on": "On",
"off": "Off",
"no_webhooks": "No webhooks yet. Create one?",
"reload_tooltip": "Reload all webhooks",
"error_default_loading": "Unable to load webhooks. Please make sure your device has network connection."
},
"webhooks_filters": {
"order_by": "Order by",
"order_by_id": "ID",
"order_by_created_at": "Created",
"order_by_updated_at": "Updated",
"order_by_label": "Label",
"order_by_type": "Type",
"order_asc": "Ascending",
"order_desc": "Descending"
},
"webhook_create": {
"create": "Create new webhook",
"label": "Label",
"label_placeholder": "A label",
"type": "Type",
"type_generic": "Generic",
"type_diun": "Diun",
"ignore_host": "Ignore host",
"label_required": "Label is required",
"label_size": "Label must be at least 1 and at most 255 characters long",
"submit": "Submit",
"created_title": "Webhook created",
"created_message": "Webhook is ready to use. Write down the token, you'll not see it again:<br/><br/>{{token}}",
"error_unable": "Unable to create webhook. Please refresh this page.",
"error_unauthorized": "Unable to create webhook. Please refresh this page.",
"error_forbidden": "Forbidden to create webhook.",
"error_bad_request": "Invalid input. Unable to create webhook.",
"error_default": "Unable to create webhook. Please make sure your device has network connection."
},
"secrets": {
"title": "Secrets",
"help": "<b>Secrets</b> protect sensitive information. They can be used when managing <b>Actions</b> and are automatically injected when defined <b>Actions</b> are executed.",
"no_secrets": "No secrets yet. Create one?",
"reload_tooltip": "Reload all secrets",
"error_default_loading": "Unable to load secrets. Please make sure your device has network connection.",
"col_key": "Key",
"col_value": "Value",
"col_created_at": "Created",
"col_updated_at": "Updated",
"actions": "Actions"
},
"secret_create": {
"create": "Create new secret",
"key": "Key",
"key_placeholder": "Unique identifier",
"key_required": "Key is required",
"key_size": "Key must be at least 1 and at most 255 characters long",
"value": "Value",
"value_placeholder": "A secret value",
"value_required": "Value is required",
"value_size": "Value must be at least 1 character long",
"submit": "Submit",
"created_title": "Secret created or updated",
"created_message": "Secret is ready to use. Remember its value, you'll not see it again:<br/><br/>{{value}}",
"error_unable": "Unable to create secret. Please refresh this page.",
"error_unauthorized": "Unable to create secret. Please refresh this page.",
"error_forbidden": "Forbidden to create secret.",
"error_bad_request": "Invalid input. Unable to create secret.",
"error_default": "Unable to create secret. Please make sure your device has network connection."
},
"secret_update_value": {
"placeholder": "***REDACTED***",
"error_default_update_value": "Unable to update secret value. Please make sure your device has network connection.",
"error_unable_update_value": "Resource cannot be found. Unable to update secret value. Please refresh this page.",
"error_forbidden_update_value": "Forbidden to update value.",
"error_unauthorized_update_value": "Unable to update secret value. Please refresh this page."
},
"secret_delete": {
"delete_title": "Are you sure to delete? Cannot be undone.",
"delete": "Delete",
"cancel": "Cancel",
"help_delete": "Delete",
"error_default_delete": "Unable to delete secret. Please make sure your device has network connection.",
"error_unable_delete": "Resource cannot be found. Unable to delete secret. Please refresh the page.",
"error_forbidden_delete": "Forbidden to delete secret.",
"error_unauthorized_delete": "Unable to delete secret. Please refresh this page."
},
"action_invocations": {
"title": "Action History",
"help": "Shows enqueued (created), running and past invocations of <b>Actions</b>.",
"auto_refresh": "Auto Refresh",
"on": "On",
"off": "Off",
"no_action_invocations": "No action history yet.",
"reload_tooltip": "Reload action history",
"error_default_loading": "Unable to load action history. Please make sure your device has network connection.",
"col_state": "State",
"col_retry_count": "Attempt(s)",
"col_created_at": "Created",
"col_updated_at": "Updated",
"state_success": "Success",
"state_error": "Error",
"state_created": "Created",
"state_retrying": "Retrying",
"state_running": "Running",
"state_success_description": "This action has run successfully.",
"state_error_description": "This action produced an error. It won't be retried again.",
"state_created_description": "This action has been enqueued and is going to be processed in order.",
"state_running_description": "This action is currently running.",
"state_retrying_description": "This action failed previously, but is going to be retried until maximum attempts are exceeded."
},
"action_invocation_delete": {
"delete_title": "Are you sure to delete? Cannot be undone.",
"delete": "Delete",
"cancel": "Cancel",
"help_delete": "Delete",
"error_default_delete": "Unable to delete action history item. Please make sure your device has network connection.",
"error_unable_delete": "Resource cannot be found. Unable to delete action history item. Please refresh the page.",
"error_forbidden_delete": "Forbidden to delete action history item.",
"error_unauthorized_delete": "Unable to delete action history item. Please refresh this page."
},
"action_invocation_item": {
"message": "Message",
"action": "Action",
"label": "Label",
"type": "Type",
"event": "Event",
"name": "Name",
"error_default_loading_action": "Cannot load referenced action",
"error_default_loading_event": "Cannot load referenced event",
"reload_tooltip": "Reload",
"reload_text": "Try again"
},
"actions": {
"title": "Actions",
"help": "<b>Actions</b> are used to take action, e.g., call an external tool when an <b>Event</b> occurs. It can also be as simple as sending a notification to a service.",
"auto_refresh": "Auto Refresh",
"on": "On",
"off": "Off",
"no_actions": "No actions yet. Create one?",
"reload_tooltip": "Reload all actions",
"error_default_loading": "Unable to load actions. Please make sure your device has network connection.",
"col_label": "Label",
"col_enabled": "Enabled",
"col_type": "Type",
"col_created_at": "Created",
"col_updated_at": "Updated"
},
"action_item": {
"match_event": "Event",
"match_application": "Application",
"match_host": "Host",
"match_provider": "Provider",
"payload": "Configuration"
},
"action_create": {
"all": "all",
"create": "Create new action",
"enabled_help": "Disabled actions won't run, even for new incoming events. This mechanism allows you can to configure and test an action before putting it live.",
"enabled_label": "Enabled",
"error_bad_request": "Invalid input. Unable to create action.",
"error_default": "Unable to create action. Please make sure your device has network connection.",
"error_forbidden": "Forbidden to create action.",
"error_unable": "Unable to create action. Please refresh this page.",
"error_unauthorized": "Unable to create action. Please refresh this page.",
"label": "Label",
"label_help": "A label for you to identify",
"label_placeholder": "A label",
"label_required": "Label is required",
"label_size": "Label must be at least 1 and at most 255 characters long",
"match_event": "Event",
"match_event_help": "The action is triggered, when the event matches. If left blank, any event runs the action.",
"match_application": "Application",
"match_application_help": "The action is triggered, when the application matches. If left blank, any application runs the action.",
"match_provider": "Provider",
"match_provider_help": "The action is triggered, when the provider matches. If left blank, any provider runs the action.",
"match_event": "Event",
"match_event_help": "The action is triggered, when the event matches. If left blank, any event runs the action.",
"match_host": "Host",
"match_host_help": "The action is triggered, when the host matches. If left blank, any host runs the action.",
"enabled_label": "Enabled",
"enabled_help": "Disabled actions won't run, even for new incoming events. This mechanism allows you can to configure and test an action before putting it live.",
"yes": "Yes",
"match_provider": "Provider",
"match_provider_help": "The action is triggered, when the provider matches. If left blank, any provider runs the action.",
"no": "No",
"submit": "Submit",
"error_unable": "Unable to create action. Please refresh this page.",
"error_unauthorized": "Unable to create action. Please refresh this page.",
"error_forbidden": "Forbidden to create action.",
"error_bad_request": "Invalid input. Unable to create action.",
"error_default": "Unable to create action. Please make sure your device has network connection."
"yes": "Yes"
},
"action_form_type": {
"type_label": "Type",
"type_help": "Changing the action's type also changes the required configuration",
"shoutrrr": "shoutrrr"
"action_delete": {
"cancel": "Cancel",
"delete": "Delete",
"delete_title": "Are you sure to delete? Cannot be undone.",
"error_default_delete": "Unable to delete action. Please make sure your device has network connection.",
"error_forbidden_delete": "Forbidden to delete action.",
"error_unable_delete": "Resource cannot be found. Unable to delete action. Please refresh the page.",
"error_unauthorized_delete": "Unable to delete action. Please refresh this page.",
"help_delete": "Delete"
},
"action_form_shoutrrrr": {
"url": "URL",
"url_help": "shoutrrr URL according to https://containrrr.dev/shoutrrr/latest/services/overview/",
"urls_placeholder": "shoutrrr URL",
"urls_validate_minimum": "At least one URL is required",
"urls_validate_not_blank": "Provide an URL or delete this URL field",
"urls_new": "New URL",
"type_label": "Type",
"body_label": "Body",
"body_help": "Define the message which is being delivered. You can use the <VAR>...</VAR> and <SECRET>...</SECRET> syntax to inject dynamic content.",
"body_label": "Body",
"body_placeholder": "Update arrived on <VAR>HOST</VAR>.",
"body_required": "Body is required",
"body_size": "Body must be at least one character long"
"body_size": "Body must be at least one character long",
"type_label": "Type",
"url": "URL",
"url_help": "shoutrrr URL according to https://containrrr.dev/shoutrrr/latest/services/overview/",
"urls_new": "New URL",
"urls_placeholder": "shoutrrr URL",
"urls_validate_minimum": "At least one URL is required",
"urls_validate_not_blank": "Provide an URL or delete this URL field"
},
"action_update_match_event": {
"error_default_update_value": "Unable to update match event. Please make sure your device has network connection.",
"error_unable_update_value": "Resource cannot be found. Unable to update match event. Please refresh this page.",
"error_forbidden_update_value": "Forbidden to update match event.",
"error_unauthorized_update_value": "Unable to update match event. Please refresh this page."
"action_form_type": {
"shoutrrr": "shoutrrr",
"type_help": "Changing the action's type also changes the required configuration",
"type_label": "Type"
},
"action_invocation_delete": {
"cancel": "Cancel",
"delete": "Delete",
"delete_title": "Are you sure to delete? Cannot be undone.",
"error_default_delete": "Unable to delete action history item. Please make sure your device has network connection.",
"error_forbidden_delete": "Forbidden to delete action history item.",
"error_unable_delete": "Resource cannot be found. Unable to delete action history item. Please refresh the page.",
"error_unauthorized_delete": "Unable to delete action history item. Please refresh this page.",
"help_delete": "Delete"
},
"action_invocation_item": {
"action": "Action",
"error_default_loading_action": "Cannot load referenced action",
"error_default_loading_event": "Cannot load referenced event",
"event": "Event",
"label": "Label",
"message": "Message",
"name": "Name",
"reload_text": "Try again",
"reload_tooltip": "Reload",
"type": "Type"
},
"action_invocations": {
"auto_refresh": "Auto Refresh",
"col_created_at": "Created",
"col_retry_count": "Attempt(s)",
"col_state": "State",
"col_updated_at": "Updated",
"error_default_loading": "Unable to load action history. Please make sure your device has network connection.",
"help": "Shows enqueued (created), running and past invocations of <b>Actions</b>.",
"no_action_invocations": "No action history yet.",
"off": "Off",
"on": "On",
"reload_tooltip": "Reload action history",
"state_created": "Created",
"state_created_description": "This action has been enqueued and is going to be processed in order.",
"state_error": "Error",
"state_error_description": "This action produced an error. It won't be retried again.",
"state_retrying": "Retrying",
"state_retrying_description": "This action failed previously, but is going to be retried until maximum attempts are exceeded.",
"state_running": "Running",
"state_running_description": "This action is currently running.",
"state_success": "Success",
"state_success_description": "This action has run successfully.",
"title": "Action History"
},
"action_item": {
"match_application": "Application",
"match_event": "Event",
"match_host": "Host",
"match_provider": "Provider",
"payload": "Configuration"
},
"action_select_event": {
"all": "all",
"update_created": "Update created",
"update_deleted": "Update deleted",
"update_updated": "Update changed",
"update_updated_state": "Update's state changed",
"update_updated_version": "Update's version changed",
"update_deleted": "Update deleted"
"update_updated_version": "Update's version changed"
},
"action_update_label": {
"error_default_update_value": "Unable to update label. Please make sure your device has network connection.",
"error_unable_update_value": "Resource cannot be found. Unable to update label. Please refresh this page.",
"error_forbidden_update_value": "Forbidden to update label.",
"error_unauthorized_update_value": "Unable to update label. Please refresh this page."
"action_test": {
"application": "Test Application",
"error_bad_request": "Invalid input. Unable to test action.",
"error_default": "Unable to test action. Please make sure your device has network connection.",
"error_forbidden": "Forbidden to test action.",
"error_unable": "Unable to test action. Please refresh this page.",
"error_unauthorized": "Unable to test action. Please refresh this page.",
"host": "Test Host",
"provider": "Test Provider",
"state": "Test State",
"test": "Test",
"tested_message_error": "Action failed to run. Reason: {{reason}}",
"tested_message_success": "Action ran successfully.",
"tested_title_error": "Error",
"tested_title_success": "Success",
"version": "Test Version"
},
"action_text_type": {
"shoutrrr": "shoutrrr"
},
"action_update_enabled": {
"error_default_update_value": "Unable to update enabled flag. Please make sure your device has network connection.",
"error_unable_update_value": "Resource cannot be found. Unable to update enabled flag. Please refresh this page.",
"error_forbidden_update_value": "Forbidden to update enabled flag.",
"error_unable_update_value": "Resource cannot be found. Unable to update enabled flag. Please refresh this page.",
"error_unauthorized_update_value": "Unable to update enabled flag. Please refresh this page."
},
"action_update_label": {
"error_default_update_value": "Unable to update label. Please make sure your device has network connection.",
"error_forbidden_update_value": "Forbidden to update label.",
"error_unable_update_value": "Resource cannot be found. Unable to update label. Please refresh this page.",
"error_unauthorized_update_value": "Unable to update label. Please refresh this page."
},
"action_update_match_application": {
"all": "all match",
"error_default_update_value": "Unable to update match application. Please make sure your device has network connection.",
"error_unable_update_value": "Resource cannot be found. Unable to update match application. Please refresh this page.",
"error_forbidden_update_value": "Forbidden to update match application.",
"error_unable_update_value": "Resource cannot be found. Unable to update match application. Please refresh this page.",
"error_unauthorized_update_value": "Unable to update match application. Please refresh this page."
},
"action_update_match_event": {
"error_default_update_value": "Unable to update match event. Please make sure your device has network connection.",
"error_forbidden_update_value": "Forbidden to update match event.",
"error_unable_update_value": "Resource cannot be found. Unable to update match event. Please refresh this page.",
"error_unauthorized_update_value": "Unable to update match event. Please refresh this page."
},
"action_update_match_host": {
"all": "all match",
"error_default_update_value": "Unable to update match host. Please make sure your device has network connection.",
"error_unable_update_value": "Resource cannot be found. Unable to update match host. Please refresh this page.",
"error_forbidden_update_value": "Forbidden to update match host.",
"error_unable_update_value": "Resource cannot be found. Unable to update match host. Please refresh this page.",
"error_unauthorized_update_value": "Unable to update match host. Please refresh this page."
},
"action_update_match_provider": {
"all": "all match",
"error_default_update_value": "Unable to update match provider. Please make sure your device has network connection.",
"error_unable_update_value": "Resource cannot be found. Unable to update match provider. Please refresh this page.",
"error_forbidden_update_value": "Forbidden to update match provider.",
"error_unable_update_value": "Resource cannot be found. Unable to update match provider. Please refresh this page.",
"error_unauthorized_update_value": "Unable to update match provider. Please refresh this page."
},
"action_update_payload": {
"update_type_and_payload": "Advanced configuration",
"submit": "Save",
"error_default_update_value": "Unable to update advanced configuration. Please make sure your device has network connection.",
"error_unable_update_value": "Resource cannot be found. Unable to update advanced configuration. Please refresh this page.",
"error_forbidden_update_value": "Forbidden to update value.",
"error_unauthorized_update_value": "Unable to update advanced configuration. Please refresh this page."
"error_unable_update_value": "Resource cannot be found. Unable to update advanced configuration. Please refresh this page.",
"error_unauthorized_update_value": "Unable to update advanced configuration. Please refresh this page.",
"submit": "Save",
"update_type_and_payload": "Advanced configuration"
},
"action_delete": {
"delete_title": "Are you sure to delete? Cannot be undone.",
"delete": "Delete",
"cancel": "Cancel",
"help_delete": "Delete",
"error_default_delete": "Unable to delete action. Please make sure your device has network connection.",
"error_unable_delete": "Resource cannot be found. Unable to delete action. Please refresh the page.",
"error_forbidden_delete": "Forbidden to delete action.",
"error_unauthorized_delete": "Unable to delete action. Please refresh this page."
},
"action_test": {
"test": "Test",
"application": "Test Application",
"host": "Test Host",
"provider": "Test Provider",
"version": "Test Version",
"state": "Test State",
"tested_title_success": "Success",
"tested_message_success": "Action ran successfully.",
"tested_title_error": "Error",
"tested_message_error": "Action failed to run. Reason: {{reason}}",
"error_unable": "Unable to test action. Please refresh this page.",
"error_unauthorized": "Unable to test action. Please refresh this page.",
"error_forbidden": "Forbidden to test action.",
"error_bad_request": "Invalid input. Unable to test action.",
"error_default": "Unable to test action. Please make sure your device has network connection."
},
"action_text_type": {
"shoutrrr": "shoutrrr"
},
"events": {
"title": "Events",
"help": "Events represent the chronological order of what is going on in the system. You can see when and how an <b>Update</b> has changed.",
"actions": {
"auto_refresh": "Auto Refresh",
"on": "On",
"col_created_at": "Created",
"col_enabled": "Enabled",
"col_label": "Label",
"col_type": "Type",
"col_updated_at": "Updated",
"error_default_loading": "Unable to load actions. Please make sure your device has network connection.",
"help": "<b>Actions</b> are used to take action, e.g., call an external tool when an <b>Event</b> occurs. It can also be as simple as sending a notification to a service.",
"no_actions": "No actions yet. Create one?",
"off": "Off",
"reload": "Reload",
"reload_tooltip": "Reload all updates",
"load_more": "Load more",
"no_events": "No events yet.",
"error_default_loading": "Unable to load events. Please make sure your device has network connection."
"on": "On",
"reload_tooltip": "Reload all actions",
"title": "Actions"
},
"auth": {
"loading": "Loading..."
},
"common": {
"404": "The page you've requested doesn't exist.",
"404_title": "Not found.",
"action_invocations": "Action History",
"actions": "Actions",
"back_home": "Go back",
"events": "Events",
"home": "Home",
"login": "Login",
"logout": "Logout",
"secrets": "Secrets",
"updates": "Updates",
"webhooks": "Webhooks"
},
"event": {
"name": "Name",
"help_delete": "Delete",
"delete_title": "Are you sure to delete? Cannot be undone.",
"delete": "Delete",
"cancel": "Cancel",
"delete": "Delete",
"delete_title": "Are you sure to delete? Cannot be undone.",
"error_default_delete": "Unable to delete event. Please make sure your device has network connection.",
"error_unable_delete": "Resource cannot be found. Unable to delete event. Please refresh the page.",
"error_forbidden_delete": "Forbidden to delete event.",
"error_unauthorized_delete": "Unable to delete event. Please refresh this page."
"error_unable_delete": "Resource cannot be found. Unable to delete event. Please refresh the page.",
"error_unauthorized_delete": "Unable to delete event. Please refresh this page.",
"help_delete": "Delete",
"name": "Name"
},
"event_text": {
"update_created": "Update of application <b>{{application}}</b> on host <b>{{host}}</b> for provider <b>{{provider}}</b> with version <b>{{version}}</b> has been created.",
"update_deleted": "Update of application <b>{{application}}</b> on host <b>{{host}}</b> for provider <b>{{provider}}</b> with version <b>{{version}}</b> has been deleted.",
"update_updated": "Update of application <b>{{application}}</b> on host <b>{{host}}</b> for provider <b>{{provider}}</b> has been changed (version or metadata). Version: <b>{{version}}</b> (was <b>{{versionPrior}}</b>).",
"update_updated_state": "Update of application <b>{{application}}</b> on host <b>{{host}}</b> for provider <b>{{provider}}</b> changed its state to <b>{{state}}</b> (was <b>{{statePrior}}</b>).",
"update_updated_version": "Update of application <b>{{application}}</b> on host <b>{{host}}</b> for provider <b>{{provider}}</b> has been changed its version to <b>{{version}}</b> (was <b>{{versionPrior}}</b>).",
"update_deleted": "Update of application <b>{{application}}</b> on host <b>{{host}}</b> for provider <b>{{provider}}</b> with version <b>{{version}}</b> has been deleted."
"update_updated_version": "Update of application <b>{{application}}</b> on host <b>{{host}}</b> for provider <b>{{provider}}</b> has been changed its version to <b>{{version}}</b> (was <b>{{versionPrior}}</b>)."
},
"events": {
"auto_refresh": "Auto Refresh",
"error_default_loading": "Unable to load events. Please make sure your device has network connection.",
"help": "Events represent the chronological order of what is going on in the system. You can see when and how an <b>Update</b> has changed.",
"load_more": "Load more",
"no_events": "No events yet.",
"off": "Off",
"on": "On",
"reload": "Reload",
"reload_tooltip": "Reload all updates",
"title": "Events"
},
"health": {
"generic_error_content": "Health check failed, please try again later.",
"generic_error_title": "Services unhealthy",
"reload": "Reload"
},
"login": {
"default_message": "Error while logging in.",
"password": "Password",
"password_required": "Password is required",
"reset": "Reset",
"submit": "Submit",
"title": "Login",
"unauthorized": "Username or password are incorrect.",
"username": "Username",
"username_required": "Username is required"
},
"secret_create": {
"create": "Create new secret",
"created_message": "Secret is ready to use. Remember its value, you'll not see it again:<br/><br/>{{value}}",
"created_title": "Secret created or updated",
"error_bad_request": "Invalid input. Unable to create secret.",
"error_default": "Unable to create secret. Please make sure your device has network connection.",
"error_forbidden": "Forbidden to create secret.",
"error_unable": "Unable to create secret. Please refresh this page.",
"error_unauthorized": "Unable to create secret. Please refresh this page.",
"key": "Key",
"key_placeholder": "Unique identifier",
"key_required": "Key is required",
"key_size": "Key must be at least 1 and at most 255 characters long",
"submit": "Submit",
"value": "Value",
"value_placeholder": "A secret value",
"value_required": "Value is required",
"value_size": "Value must be at least 1 character long"
},
"secret_delete": {
"cancel": "Cancel",
"delete": "Delete",
"delete_title": "Are you sure to delete? Cannot be undone.",
"error_default_delete": "Unable to delete secret. Please make sure your device has network connection.",
"error_forbidden_delete": "Forbidden to delete secret.",
"error_unable_delete": "Resource cannot be found. Unable to delete secret. Please refresh the page.",
"error_unauthorized_delete": "Unable to delete secret. Please refresh this page.",
"help_delete": "Delete"
},
"secret_update_value": {
"error_default_update_value": "Unable to update secret value. Please make sure your device has network connection.",
"error_forbidden_update_value": "Forbidden to update value.",
"error_unable_update_value": "Resource cannot be found. Unable to update secret value. Please refresh this page.",
"error_unauthorized_update_value": "Unable to update secret value. Please refresh this page.",
"placeholder": "***REDACTED***"
},
"secrets": {
"actions": "Actions",
"col_created_at": "Created",
"col_key": "Key",
"col_updated_at": "Updated",
"col_value": "Value",
"error_default_loading": "Unable to load secrets. Please make sure your device has network connection.",
"help": "<b>Secrets</b> protect sensitive information. They can be used when managing <b>Actions</b> and are automatically injected when defined <b>Actions</b> are executed.",
"no_secrets": "No secrets yet. Create one?",
"reload_tooltip": "Reload all secrets",
"title": "Secrets"
},
"update": {
"cancel": "Cancel",
"created": "Created",
"created_at": "Created on {{created}}",
"created_at_diff": "Updated on {{updated}}, but initially submitted on {{created}}",
"delete": "Delete",
"delete_title": "Are you sure to delete? Cannot be undone.",
"error_default_delete": "Unable to delete update. Please make sure your device has network connection.",
"error_default_modify_state": "Unable to modify update. Please make sure your device has network connection.",
"error_forbidden_delete": "Forbidden to delete update.",
"error_forbidden_modify_state": "Forbidden to modify update.",
"error_unable_delete": "Resource cannot be found. Unable to delete update. Please refresh the page.",
"error_unable_modify_state": "Resource cannot be found. Unable to modify update. Please refresh the page.",
"error_unauthorized_delete": "Unable to delete update. Please refresh this page.",
"error_unauthorized_modify_state": "Unable to modify update. Please refresh this page.",
"handle_pending": "Recently updated",
"help_approve": "Approve",
"help_delete": "Delete",
"help_details": "Show details",
"help_ignore": "Ignore",
"help_pending": "Reset to pending",
"host": "Host",
"metadata": "Metadata",
"provider": "Provider",
"state": "State",
"updated": "Updated",
"version": "Version"
},
"update_state_tag": {
"state_approved": "Approved",
"state_ignored": "Ignored",
"state_pending": "Pending"
},
"updates": {
"auto_refresh": "Auto Refresh",
"error_default_loading": "Unable to load updates. Please make sure your device has network connection.",
"help": "<b>Updates</b> track information about externally reported data regarding an application, host, provider and a version attribute. You can manage an <b>Update</b>'s status by transitioning it through different states like pending or ignored. On arrival of new information through <b>Webhooks</b>, an <b>Update</b> changes its version property or attached metadata attribute and creates an <b>Event</b>. In case identical information is submitted, an <b>Event</b> is still produced. When an <b>Update</b>'s state is not pending, such a modification resets the update's state to pending again. If an <b>Update</b> is set to be ignored, no information is updated.",
"no_updates": "No updates found.",
"off": "Off",
"on": "On",
"reload": "Reload",
"reload_tooltip": "Reload all updates",
"title": "Updates"
},
"updates_filters": {
"filters": "Filters",
"order_asc": "Ascending",
"order_by": "Order by",
"order_by_application": "Application",
"order_by_created_at": "Created",
"order_by_host": "Host",
"order_by_id": "ID",
"order_by_provider": "Provider",
"order_by_updated_at": "Updated",
"order_desc": "Descending",
"search_in": "Search in",
"search_in_application": "Application",
"search_in_host": "Host",
"search_in_provider": "Provider",
"search_term": "Search",
"search_term_placeholder": "What are you looking for?",
"state": "State",
"state_approved": "Approved",
"state_ignored": "Ignored",
"state_pending": "Pending",
"state_placeholder": "Select state(s)"
},
"updates_single": {
"application": "Application",
"created": "Created",
"default_loading_error_message": "Unable to load update. Please make sure your device has network connection.",
"host": "Host",
"metadata": "Metadata",
"no_update": "No update found.",
"provider": "Provider",
"state": "State",
"title": "Update Details",
"title_parent": "Updates",
"updated": "Updated",
"version": "Version"
},
"version": {
"number": "4.0.1",
"version": "Version"
},
"webhook": {
"cancel": "Cancel",
"created": "Created",
"created_at": "Created on {{created}}",
"created_at_diff": "Updated on {{updated}}, but initially submitted on {{created}}",
"delete": "Delete",
"delete_title": "Are you sure to delete? Cannot be undone.",
"error_default_delete": "Unable to delete webhook. Please make sure your device has network connection.",
"error_default_update_ignore_host": "Unable to update webhook ignore host. Please make sure your device has network connection.",
"error_default_update_label": "Unable to update webhook label. Please make sure your device has network connection.",
"error_forbidden_delete": "Forbidden to delete webhook.",
"error_forbidden_update_ignore_host": "Forbidden to update ignore host.",
"error_forbidden_update_label": "Forbidden to update label.",
"error_unable_delete": "Resource cannot be found. Unable to delete webhook. Please refresh the page.",
"error_unable_update_ignore_host": "Resource cannot be found. Unable to update webhook ignore host. Please refresh this page.",
"error_unable_update_label": "Resource cannot be found. Unable to update webhook label. Please refresh this page.",
"error_unauthorized_delete": "Unable to delete webhook. Please refresh this page.",
"error_unauthorized_update_ignore_host": "Unable to update webhook ignore host. Please refresh this page.",
"error_unauthorized_update_label": "Unable to update webhook label. Please refresh this page.",
"help_delete": "Delete",
"ignore_host": "Ignore host",
"label": "Label",
"type": "Type",
"type_diun": "Diun",
"type_generic": "Generic",
"updated": "Updated",
"url": "URL"
},
"webhook_create": {
"create": "Create new webhook",
"created_message": "Webhook is ready to use. Write down the token, you'll not see it again:<br/><br/>{{token}}",
"created_title": "Webhook created",
"error_bad_request": "Invalid input. Unable to create webhook.",
"error_default": "Unable to create webhook. Please make sure your device has network connection.",
"error_forbidden": "Forbidden to create webhook.",
"error_unable": "Unable to create webhook. Please refresh this page.",
"error_unauthorized": "Unable to create webhook. Please refresh this page.",
"ignore_host": "Ignore host",
"label": "Label",
"label_placeholder": "A label",
"label_required": "Label is required",
"label_size": "Label must be at least 1 and at most 255 characters long",
"submit": "Submit",
"type": "Type",
"type_diun": "Diun",
"type_generic": "Generic"
},
"webhooks": {
"auto_refresh": "Auto Refresh",
"error_default_loading": "Unable to load webhooks. Please make sure your device has network connection.",
"help": "<b>Webhooks</b> allow to submit new or modify existing <b>Updates</b> from an external source such as a commandline tool or another application with the help of a unique URL. On submission of new information via <b>Webhook</b>, <i>upda</i> keeps track of changes. By creating multiple <b>Webhooks</b>, you can submit information from separate applications into <i>upda</i>.",
"no_webhooks": "No webhooks yet. Create one?",
"off": "Off",
"on": "On",
"reload_tooltip": "Reload all webhooks",
"title": "Webhooks"
},
"webhooks_filters": {
"order_asc": "Ascending",
"order_by": "Order by",
"order_by_created_at": "Created",
"order_by_id": "ID",
"order_by_label": "Label",
"order_by_type": "Type",
"order_by_updated_at": "Updated",
"order_desc": "Descending"
}
}

View file

@ -3,7 +3,7 @@ import App from './App';
import store from './store';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import { HashRouter as Router } from 'react-router-dom';
import { HashRouter as Router } from 'react-router';
import './style/app-theme.less';
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);

View file

@ -3,7 +3,7 @@ import HealthHandler from './HealthHandler';
import Menu from './Menu';
import { Layout } from 'antd';
import { FC } from 'react';
import { Outlet } from 'react-router-dom';
import { Outlet } from 'react-router';
const AppLayout: FC = () => {
return (

View file

@ -18,7 +18,7 @@ import { Menu, Typography } from 'antd';
import { TFunction } from 'i18next';
import { forEach } from 'lodash';
import { FC, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { useNavigate } from 'react-router';
export type PrimaryMenuProps = {
t: TFunction;

View file

@ -24,7 +24,7 @@ import { FilterValue, SorterResult } from 'antd/es/table/interface';
import parse from 'html-react-parser';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
const DEFAULT_POLLING_INTERVAL = 5000;

View file

@ -21,7 +21,7 @@ import { FilterValue, SorterResult } from 'antd/es/table/interface';
import parse from 'html-react-parser';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
const DEFAULT_POLLING_INTERVAL = 5000;

View file

@ -4,7 +4,7 @@ import { HomeOutlined } from '@ant-design/icons';
import { Breadcrumb, Typography } from 'antd';
import { forEach } from 'lodash';
import { FC } from 'react';
import { Link } from 'react-router-dom';
import { Link } from 'react-router';
export interface AppBreadcrumbProps {
items: { label: string; path: string; active?: boolean }[];

View file

@ -2,7 +2,7 @@ import AppPaths from '../../constants/appPaths';
import { getPageFullPath } from '../../utils/urlHelper';
import { Button, Result } from 'antd';
import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router-dom';
import { useNavigate } from 'react-router';
const ErrorPage404 = () => {
const [t] = useTranslation('common');

View file

@ -1,6 +1,6 @@
import AppPaths from '../../constants/appPaths';
import { getPageFullPath } from '../../utils/urlHelper';
import { Navigate } from 'react-router-dom';
import { Navigate } from 'react-router';
const Home = () => {
return <Navigate to={getPageFullPath(AppPaths.UPDATES)} replace={true} />;

View file

@ -9,7 +9,7 @@ import AppBreadcrumb from '../common/AppBreadcrumb';
import { Button, Card, Flex, Form, Input, Space } from 'antd';
import { useCallback, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router-dom';
import { useNavigate } from 'react-router';
const Login = () => {
const [t] = useTranslation('login');

View file

@ -18,7 +18,7 @@ import {
import { Badge, Button, Card, Col, Popconfirm, Row, Space, Tooltip, Typography } from 'antd';
import { FC, useCallback, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router-dom';
import { useNavigate } from 'react-router';
const { Text } = Typography;

View file

@ -9,7 +9,7 @@ import { Badge, Button, Collapse, Divider, Form, Input, Select } from 'antd';
import { compact, forEach, uniq } from 'lodash';
import { FC, useCallback, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
const COLLAPSE_KEY = 'filter';

View file

@ -11,7 +11,7 @@ import { PageHeader } from '@ant-design/pro-layout';
import { Descriptions, Result, Skeleton, Typography } from 'antd';
import { FC } from 'react';
import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router-dom';
import { useParams } from 'react-router';
const { Text } = Typography;

View file

@ -13,7 +13,7 @@ import { Button, Col, List, Result, Row, Skeleton, Space, Switch, Tooltip, Typog
import parse from 'html-react-parser';
import { FC, useCallback, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
const DEFAULT_POLLING_INTERVAL = 10000;

View file

@ -5,7 +5,7 @@ import useWebhooksFilterQueryParams from '../../use/useWebhooksFilterQueryParams
import { Form, Select } from 'antd';
import { FC, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
const WebhookPageFilter: FC = () => {
const [t] = useTranslation('webhooks_filters');

View file

@ -14,7 +14,7 @@ import { Button, Col, List, Result, Row, Skeleton, Space, Switch, Tooltip, Typog
import parse from 'html-react-parser';
import { FC, useCallback, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
const DEFAULT_POLLING_INTERVAL = 10000;

View file

@ -14,7 +14,7 @@ import UpdatesPage from '../pages/updates/UpdatesPage';
import WebhooksPage from '../pages/webhooks/WebhooksPage';
import { getAppBasePath } from '../utils/urlHelper';
import React from 'react';
import { Route, Routes } from 'react-router-dom';
import { Route, Routes } from 'react-router';
const AppRouter = () => {
return (

View file

@ -2,7 +2,7 @@ import AppPaths from '../constants/appPaths';
import { useAuthenticatedSelector } from '../selectors/authSelectors';
import { getPageFullPath } from '../utils/urlHelper';
import { FC, ReactNode } from 'react';
import { Navigate } from 'react-router-dom';
import { Navigate } from 'react-router';
export const RequireAuth: FC<{ children: ReactNode | ReactNode[] }> = ({ children }): JSX.Element => {
const isAuthenticated = useAuthenticatedSelector();

View file

@ -1,7 +1,7 @@
import ActionInvocationFilterQueryParamNames from '../constants/api/actionInvocationFilterQueryParamNames';
import { PAGE_DEFAULT, PAGE_SIZE_DEFAULT } from '../constants/pagination';
import { useCallback } from 'react';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
const useActionInvocationsFilterQueryParams = () => {
const [queryParams] = useSearchParams();

View file

@ -1,7 +1,7 @@
import ActionFilterQueryParamNames from '../constants/api/actionFilterQueryParamNames';
import { PAGE_DEFAULT, PAGE_SIZE_DEFAULT } from '../constants/pagination';
import { useCallback } from 'react';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
const useActionsFilterQueryParams = () => {
const [queryParams] = useSearchParams();

View file

@ -4,7 +4,7 @@ import { updateAuth } from '../slices/authSlice';
import { useAppDispatch } from '../store';
import { getPageFullPath } from '../utils/urlHelper';
import { useCallback } from 'react';
import { useNavigate } from 'react-router-dom';
import { useNavigate } from 'react-router';
export interface AuthHook {
logout: () => void;

View file

@ -1,7 +1,7 @@
import EventFilterQueryParamNames from '../constants/api/eventFilterQueryParamNames';
import { SIZE_DEFAULT, SKIP_DEFAULT } from '../constants/pagination';
import { useCallback } from 'react';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
const useEventsFilterQueryParams = () => {
const [queryParams] = useSearchParams();

View file

@ -2,7 +2,7 @@ import UpdateFilterQueryParamNames from '../constants/api/updateFilterQueryParam
import { PAGE_DEFAULT, PAGE_SIZE_DEFAULT } from '../constants/pagination';
import { compact, isEmpty, parseInt, uniq } from 'lodash';
import { useCallback } from 'react';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
export interface UseUpdatesFilterQueryParams {
searchTerm: string | undefined | number;

View file

@ -1,7 +1,7 @@
import WebhookFilterQueryParamNames from '../constants/api/webhookFilterQueryParamNames';
import { PAGE_DEFAULT, PAGE_SIZE_DEFAULT } from '../constants/pagination';
import { useCallback } from 'react';
import { useSearchParams } from 'react-router-dom';
import { useSearchParams } from 'react-router';
const useWebhooksFilterQueryParams = () => {
const [queryParams] = useSearchParams();