mirror of
				https://github.com/louislam/uptime-kuma.git
				synced 2025-11-04 13:46:13 +08:00 
			
		
		
		
	Merge branch 'master' into bulgarian
This commit is contained in:
		@@ -27,7 +27,7 @@ CNAME
 | 
			
		||||
install.sh
 | 
			
		||||
SECURITY.md
 | 
			
		||||
tsconfig.json
 | 
			
		||||
 | 
			
		||||
.env
 | 
			
		||||
 | 
			
		||||
### .gitignore content (commented rules are duplicated)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -12,3 +12,4 @@ dist-ssr
 | 
			
		||||
/private
 | 
			
		||||
/out
 | 
			
		||||
/tmp
 | 
			
		||||
.env
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										184
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										184
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -13,7 +13,7 @@
 | 
			
		||||
                "@fortawesome/free-regular-svg-icons": "~5.15.4",
 | 
			
		||||
                "@fortawesome/free-solid-svg-icons": "~5.15.4",
 | 
			
		||||
                "@fortawesome/vue-fontawesome": "~3.0.0-4",
 | 
			
		||||
                "@louislam/sqlite3": "~5.0.6",
 | 
			
		||||
                "@louislam/sqlite3": "~6.0.0",
 | 
			
		||||
                "@popperjs/core": "~2.10.2",
 | 
			
		||||
                "args-parser": "~1.3.0",
 | 
			
		||||
                "axios": "~0.21.4",
 | 
			
		||||
@@ -48,7 +48,7 @@
 | 
			
		||||
                "vue-chart-3": "~0.5.8",
 | 
			
		||||
                "vue-confirm-dialog": "~1.0.2",
 | 
			
		||||
                "vue-contenteditable": "~3.0.4",
 | 
			
		||||
                "vue-i18n": "~9.1.8",
 | 
			
		||||
                "vue-i18n": "~9.1.9",
 | 
			
		||||
                "vue-image-crop-upload": "~3.0.3",
 | 
			
		||||
                "vue-multiselect": "~3.0.0-alpha.2",
 | 
			
		||||
                "vue-qrcode": "~1.0.0",
 | 
			
		||||
@@ -844,39 +844,39 @@
 | 
			
		||||
            "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@intlify/core-base": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-k+q6nUOD9HPTMr8AKEn4d/EgoNSCMVuc/dG97tFXrifT4+QbxoLNRjXovyC60rb4q+7D/cGF+5R6Tjby4t5gng==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==",
 | 
			
		||||
            "dependencies": {
 | 
			
		||||
                "@intlify/devtools-if": "9.1.8",
 | 
			
		||||
                "@intlify/message-compiler": "9.1.8",
 | 
			
		||||
                "@intlify/message-resolver": "9.1.8",
 | 
			
		||||
                "@intlify/runtime": "9.1.8",
 | 
			
		||||
                "@intlify/shared": "9.1.8",
 | 
			
		||||
                "@intlify/vue-devtools": "9.1.8"
 | 
			
		||||
                "@intlify/devtools-if": "9.1.9",
 | 
			
		||||
                "@intlify/message-compiler": "9.1.9",
 | 
			
		||||
                "@intlify/message-resolver": "9.1.9",
 | 
			
		||||
                "@intlify/runtime": "9.1.9",
 | 
			
		||||
                "@intlify/shared": "9.1.9",
 | 
			
		||||
                "@intlify/vue-devtools": "9.1.9"
 | 
			
		||||
            },
 | 
			
		||||
            "engines": {
 | 
			
		||||
                "node": ">= 10"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@intlify/devtools-if": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-17REiNoQ5dWnYECbKgkMHtX8GnNCkMNxfImXrJNnUhSH3GitheNkYn0o14AZmZWk7Fw/1IOdV5v7K0QVnYx5fw==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==",
 | 
			
		||||
            "dependencies": {
 | 
			
		||||
                "@intlify/shared": "9.1.8"
 | 
			
		||||
                "@intlify/shared": "9.1.9"
 | 
			
		||||
            },
 | 
			
		||||
            "engines": {
 | 
			
		||||
                "node": ">= 10"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@intlify/message-compiler": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-x/vfvHqz2v/ngE0slaD/QnJORHzrlKt6p6TdoY+/1zBQ/TOH+6BlkdtrSIrSfwJfP+3Qe6C8uw6yJknQ6cpabA==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==",
 | 
			
		||||
            "dependencies": {
 | 
			
		||||
                "@intlify/message-resolver": "9.1.8",
 | 
			
		||||
                "@intlify/shared": "9.1.8",
 | 
			
		||||
                "@intlify/message-resolver": "9.1.9",
 | 
			
		||||
                "@intlify/shared": "9.1.9",
 | 
			
		||||
                "source-map": "0.6.1"
 | 
			
		||||
            },
 | 
			
		||||
            "engines": {
 | 
			
		||||
@@ -884,42 +884,42 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@intlify/message-resolver": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-4tHBo5U2/oDG85tNv9z8bS/5ThMw+wADPLyBVOLplUqw8Q+N5tkrTL23Pa8hg5Ekd2crvyIxFHFwt1gbT8TT6w==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==",
 | 
			
		||||
            "engines": {
 | 
			
		||||
                "node": ">= 10"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@intlify/runtime": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-Q9WvSjRFhxxCen5cj3jOZEKAYlXjYZ+wZbTEfBQhDtcBwrS7xd9tyFos4ZRNNvF7G0H0sNDzXmSdZkoCpoU0iA==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==",
 | 
			
		||||
            "dependencies": {
 | 
			
		||||
                "@intlify/message-compiler": "9.1.8",
 | 
			
		||||
                "@intlify/message-resolver": "9.1.8",
 | 
			
		||||
                "@intlify/shared": "9.1.8"
 | 
			
		||||
                "@intlify/message-compiler": "9.1.9",
 | 
			
		||||
                "@intlify/message-resolver": "9.1.9",
 | 
			
		||||
                "@intlify/shared": "9.1.9"
 | 
			
		||||
            },
 | 
			
		||||
            "engines": {
 | 
			
		||||
                "node": ">= 10"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@intlify/shared": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-o9nksOx3yIMDNvYzcPv87NR+U62ka775/Ufjl3U2g4NsMORN8+VacbVJ/oAF6CYfzZALpArBBZdk5jafzcLkvw==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==",
 | 
			
		||||
            "engines": {
 | 
			
		||||
                "node": ">= 10"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@intlify/vue-devtools": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-SypF7tpWFxIQzKrqv6O8JIk5xrU53E0/xNVR5LFCHLIDIKe62uMTrzXvjW5zoYcJjRTZ87BZLXEM1n2CaLSBsg==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==",
 | 
			
		||||
            "dependencies": {
 | 
			
		||||
                "@intlify/message-resolver": "9.1.8",
 | 
			
		||||
                "@intlify/runtime": "9.1.8",
 | 
			
		||||
                "@intlify/shared": "9.1.8"
 | 
			
		||||
                "@intlify/message-resolver": "9.1.9",
 | 
			
		||||
                "@intlify/runtime": "9.1.9",
 | 
			
		||||
                "@intlify/shared": "9.1.9"
 | 
			
		||||
            },
 | 
			
		||||
            "engines": {
 | 
			
		||||
                "node": ">= 10"
 | 
			
		||||
@@ -1199,9 +1199,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/@louislam/sqlite3": {
 | 
			
		||||
            "version": "5.0.6",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-5.0.6.tgz",
 | 
			
		||||
            "integrity": "sha512-uitL0jdbki5XSrmGKGgvHVMHEe00O6GAMoPrVOnh4KTcFOJ1T8SWypbnyqSxBr7PrjAVfgnIGu3kzYCCqIxd4g==",
 | 
			
		||||
            "version": "6.0.0",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-6.0.0.tgz",
 | 
			
		||||
            "integrity": "sha512-jKNkg7olyL4vM0yqVBiyPrtHALfWkCLAASASDJpghBE5Ri6qOh9bXmzaKyTrYH5cSsFB7R39XGC4O9XdAmTe4Q==",
 | 
			
		||||
            "hasInstallScript": true,
 | 
			
		||||
            "dependencies": {
 | 
			
		||||
                "@mapbox/node-pre-gyp": "^1.0.0",
 | 
			
		||||
@@ -10207,13 +10207,13 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/vue-i18n": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-Gmjkt/4ZQtKyCLTjJNGVp+w/dhMpuwuPtgW/Xm9DY0ppSwHRgqMRR6GspnCIYWBxQjzsTT8tIWLPc3SUfKifLA==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-JeRdNVxS2OGp1E+pye5XB6+M6BBkHwAv9C80Q7+kzoMdUDGRna06tjC0vCB/jDX9aWrl5swxOMFcyAr7or8XTA==",
 | 
			
		||||
            "dependencies": {
 | 
			
		||||
                "@intlify/core-base": "9.1.8",
 | 
			
		||||
                "@intlify/shared": "9.1.8",
 | 
			
		||||
                "@intlify/vue-devtools": "9.1.8",
 | 
			
		||||
                "@intlify/core-base": "9.1.9",
 | 
			
		||||
                "@intlify/shared": "9.1.9",
 | 
			
		||||
                "@intlify/vue-devtools": "9.1.9",
 | 
			
		||||
                "@vue/devtools-api": "^6.0.0-beta.7"
 | 
			
		||||
            },
 | 
			
		||||
            "engines": {
 | 
			
		||||
@@ -11229,64 +11229,64 @@
 | 
			
		||||
            "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "@intlify/core-base": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-k+q6nUOD9HPTMr8AKEn4d/EgoNSCMVuc/dG97tFXrifT4+QbxoLNRjXovyC60rb4q+7D/cGF+5R6Tjby4t5gng==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==",
 | 
			
		||||
            "requires": {
 | 
			
		||||
                "@intlify/devtools-if": "9.1.8",
 | 
			
		||||
                "@intlify/message-compiler": "9.1.8",
 | 
			
		||||
                "@intlify/message-resolver": "9.1.8",
 | 
			
		||||
                "@intlify/runtime": "9.1.8",
 | 
			
		||||
                "@intlify/shared": "9.1.8",
 | 
			
		||||
                "@intlify/vue-devtools": "9.1.8"
 | 
			
		||||
                "@intlify/devtools-if": "9.1.9",
 | 
			
		||||
                "@intlify/message-compiler": "9.1.9",
 | 
			
		||||
                "@intlify/message-resolver": "9.1.9",
 | 
			
		||||
                "@intlify/runtime": "9.1.9",
 | 
			
		||||
                "@intlify/shared": "9.1.9",
 | 
			
		||||
                "@intlify/vue-devtools": "9.1.9"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "@intlify/devtools-if": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-17REiNoQ5dWnYECbKgkMHtX8GnNCkMNxfImXrJNnUhSH3GitheNkYn0o14AZmZWk7Fw/1IOdV5v7K0QVnYx5fw==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==",
 | 
			
		||||
            "requires": {
 | 
			
		||||
                "@intlify/shared": "9.1.8"
 | 
			
		||||
                "@intlify/shared": "9.1.9"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "@intlify/message-compiler": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-x/vfvHqz2v/ngE0slaD/QnJORHzrlKt6p6TdoY+/1zBQ/TOH+6BlkdtrSIrSfwJfP+3Qe6C8uw6yJknQ6cpabA==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==",
 | 
			
		||||
            "requires": {
 | 
			
		||||
                "@intlify/message-resolver": "9.1.8",
 | 
			
		||||
                "@intlify/shared": "9.1.8",
 | 
			
		||||
                "@intlify/message-resolver": "9.1.9",
 | 
			
		||||
                "@intlify/shared": "9.1.9",
 | 
			
		||||
                "source-map": "0.6.1"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "@intlify/message-resolver": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-4tHBo5U2/oDG85tNv9z8bS/5ThMw+wADPLyBVOLplUqw8Q+N5tkrTL23Pa8hg5Ekd2crvyIxFHFwt1gbT8TT6w=="
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA=="
 | 
			
		||||
        },
 | 
			
		||||
        "@intlify/runtime": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-Q9WvSjRFhxxCen5cj3jOZEKAYlXjYZ+wZbTEfBQhDtcBwrS7xd9tyFos4ZRNNvF7G0H0sNDzXmSdZkoCpoU0iA==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==",
 | 
			
		||||
            "requires": {
 | 
			
		||||
                "@intlify/message-compiler": "9.1.8",
 | 
			
		||||
                "@intlify/message-resolver": "9.1.8",
 | 
			
		||||
                "@intlify/shared": "9.1.8"
 | 
			
		||||
                "@intlify/message-compiler": "9.1.9",
 | 
			
		||||
                "@intlify/message-resolver": "9.1.9",
 | 
			
		||||
                "@intlify/shared": "9.1.9"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "@intlify/shared": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-o9nksOx3yIMDNvYzcPv87NR+U62ka775/Ufjl3U2g4NsMORN8+VacbVJ/oAF6CYfzZALpArBBZdk5jafzcLkvw=="
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw=="
 | 
			
		||||
        },
 | 
			
		||||
        "@intlify/vue-devtools": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-SypF7tpWFxIQzKrqv6O8JIk5xrU53E0/xNVR5LFCHLIDIKe62uMTrzXvjW5zoYcJjRTZ87BZLXEM1n2CaLSBsg==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==",
 | 
			
		||||
            "requires": {
 | 
			
		||||
                "@intlify/message-resolver": "9.1.8",
 | 
			
		||||
                "@intlify/runtime": "9.1.8",
 | 
			
		||||
                "@intlify/shared": "9.1.8"
 | 
			
		||||
                "@intlify/message-resolver": "9.1.9",
 | 
			
		||||
                "@intlify/runtime": "9.1.9",
 | 
			
		||||
                "@intlify/shared": "9.1.9"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "@istanbuljs/load-nyc-config": {
 | 
			
		||||
@@ -11507,9 +11507,9 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "@louislam/sqlite3": {
 | 
			
		||||
            "version": "5.0.6",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-5.0.6.tgz",
 | 
			
		||||
            "integrity": "sha512-uitL0jdbki5XSrmGKGgvHVMHEe00O6GAMoPrVOnh4KTcFOJ1T8SWypbnyqSxBr7PrjAVfgnIGu3kzYCCqIxd4g==",
 | 
			
		||||
            "version": "6.0.0",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/@louislam/sqlite3/-/sqlite3-6.0.0.tgz",
 | 
			
		||||
            "integrity": "sha512-jKNkg7olyL4vM0yqVBiyPrtHALfWkCLAASASDJpghBE5Ri6qOh9bXmzaKyTrYH5cSsFB7R39XGC4O9XdAmTe4Q==",
 | 
			
		||||
            "requires": {
 | 
			
		||||
                "@mapbox/node-pre-gyp": "^1.0.0",
 | 
			
		||||
                "node-addon-api": "^3.0.0",
 | 
			
		||||
@@ -18469,13 +18469,13 @@
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "vue-i18n": {
 | 
			
		||||
            "version": "9.1.8",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.1.8.tgz",
 | 
			
		||||
            "integrity": "sha512-Gmjkt/4ZQtKyCLTjJNGVp+w/dhMpuwuPtgW/Xm9DY0ppSwHRgqMRR6GspnCIYWBxQjzsTT8tIWLPc3SUfKifLA==",
 | 
			
		||||
            "version": "9.1.9",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.1.9.tgz",
 | 
			
		||||
            "integrity": "sha512-JeRdNVxS2OGp1E+pye5XB6+M6BBkHwAv9C80Q7+kzoMdUDGRna06tjC0vCB/jDX9aWrl5swxOMFcyAr7or8XTA==",
 | 
			
		||||
            "requires": {
 | 
			
		||||
                "@intlify/core-base": "9.1.8",
 | 
			
		||||
                "@intlify/shared": "9.1.8",
 | 
			
		||||
                "@intlify/vue-devtools": "9.1.8",
 | 
			
		||||
                "@intlify/core-base": "9.1.9",
 | 
			
		||||
                "@intlify/shared": "9.1.9",
 | 
			
		||||
                "@intlify/vue-devtools": "9.1.9",
 | 
			
		||||
                "@vue/devtools-api": "^6.0.0-beta.7"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,7 @@
 | 
			
		||||
        "@fortawesome/free-regular-svg-icons": "~5.15.4",
 | 
			
		||||
        "@fortawesome/free-solid-svg-icons": "~5.15.4",
 | 
			
		||||
        "@fortawesome/vue-fontawesome": "~3.0.0-4",
 | 
			
		||||
        "@louislam/sqlite3": "~5.0.6",
 | 
			
		||||
        "@louislam/sqlite3": "~6.0.0",
 | 
			
		||||
        "@popperjs/core": "~2.10.2",
 | 
			
		||||
        "args-parser": "~1.3.0",
 | 
			
		||||
        "axios": "~0.21.4",
 | 
			
		||||
@@ -87,7 +87,7 @@
 | 
			
		||||
        "vue-chart-3": "~0.5.8",
 | 
			
		||||
        "vue-confirm-dialog": "~1.0.2",
 | 
			
		||||
        "vue-contenteditable": "~3.0.4",
 | 
			
		||||
        "vue-i18n": "~9.1.8",
 | 
			
		||||
        "vue-i18n": "~9.1.9",
 | 
			
		||||
        "vue-image-crop-upload": "~3.0.3",
 | 
			
		||||
        "vue-multiselect": "~3.0.0-alpha.2",
 | 
			
		||||
        "vue-qrcode": "~1.0.0",
 | 
			
		||||
 
 | 
			
		||||
@@ -68,11 +68,11 @@
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import { Modal } from "bootstrap"
 | 
			
		||||
import { ucfirst } from "../util.ts"
 | 
			
		||||
import { Modal } from "bootstrap";
 | 
			
		||||
import { ucfirst } from "../util.ts";
 | 
			
		||||
 | 
			
		||||
import Confirm from "./Confirm.vue";
 | 
			
		||||
import NotificationFormList from "./notifications"
 | 
			
		||||
import NotificationFormList from "./notifications";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    components: {
 | 
			
		||||
@@ -93,41 +93,40 @@ export default {
 | 
			
		||||
                isDefault: false,
 | 
			
		||||
                // Do not set default value here, please scroll to show()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    computed: {
 | 
			
		||||
        currentForm() {
 | 
			
		||||
            if (!this.notification.type) {
 | 
			
		||||
                return null
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
            return NotificationFormList[this.notification.type]
 | 
			
		||||
            return NotificationFormList[this.notification.type];
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    watch: {
 | 
			
		||||
        "notification.type"(to, from) {
 | 
			
		||||
            let oldName;
 | 
			
		||||
 | 
			
		||||
            if (from) {
 | 
			
		||||
                oldName = `My ${ucfirst(from)} Alert (1)`;
 | 
			
		||||
                oldName = this.getUniqueDefaultName(from);
 | 
			
		||||
            } else {
 | 
			
		||||
                oldName = "";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (! this.notification.name || this.notification.name === oldName) {
 | 
			
		||||
                this.notification.name = `My ${ucfirst(to)} Alert (1)`
 | 
			
		||||
                this.notification.name = this.getUniqueDefaultName(to);
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    mounted() {
 | 
			
		||||
        this.modal = new Modal(this.$refs.modal)
 | 
			
		||||
        this.modal = new Modal(this.$refs.modal);
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
 | 
			
		||||
        deleteConfirm() {
 | 
			
		||||
            this.modal.hide();
 | 
			
		||||
            this.$refs.confirmDelete.show()
 | 
			
		||||
            this.$refs.confirmDelete.show();
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        show(notificationID) {
 | 
			
		||||
@@ -146,19 +145,19 @@ export default {
 | 
			
		||||
                    name: "",
 | 
			
		||||
                    type: null,
 | 
			
		||||
                    isDefault: false,
 | 
			
		||||
                }
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                // Set Default value here
 | 
			
		||||
                this.notification.type = this.notificationTypes[0];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.modal.show()
 | 
			
		||||
            this.modal.show();
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        submit() {
 | 
			
		||||
            this.processing = true;
 | 
			
		||||
            this.$root.getSocket().emit("addNotification", this.notification, this.id, (res) => {
 | 
			
		||||
                this.$root.toastRes(res)
 | 
			
		||||
                this.$root.toastRes(res);
 | 
			
		||||
                this.processing = false;
 | 
			
		||||
 | 
			
		||||
                if (res.ok) {
 | 
			
		||||
@@ -170,30 +169,45 @@ export default {
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
            });
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        test() {
 | 
			
		||||
            this.processing = true;
 | 
			
		||||
            this.$root.getSocket().emit("testNotification", this.notification, (res) => {
 | 
			
		||||
                this.$root.toastRes(res)
 | 
			
		||||
                this.$root.toastRes(res);
 | 
			
		||||
                this.processing = false;
 | 
			
		||||
            })
 | 
			
		||||
            });
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        deleteNotification() {
 | 
			
		||||
            this.processing = true;
 | 
			
		||||
            this.$root.getSocket().emit("deleteNotification", this.id, (res) => {
 | 
			
		||||
                this.$root.toastRes(res)
 | 
			
		||||
                this.$root.toastRes(res);
 | 
			
		||||
                this.processing = false;
 | 
			
		||||
 | 
			
		||||
                if (res.ok) {
 | 
			
		||||
                    this.modal.hide()
 | 
			
		||||
                    this.modal.hide();
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
            });
 | 
			
		||||
        },
 | 
			
		||||
        /**
 | 
			
		||||
         * @param {keyof NotificationFormList} notificationKey
 | 
			
		||||
         * @return {string}
 | 
			
		||||
         */
 | 
			
		||||
        getUniqueDefaultName(notificationKey) {
 | 
			
		||||
            let index = 1;
 | 
			
		||||
            let name = "";
 | 
			
		||||
            do {
 | 
			
		||||
                name = this.$t("defaultNotificationName", {
 | 
			
		||||
                    notification: this.$t(notificationKey).replace(/\(.+\)/, "").trim(),
 | 
			
		||||
                    number: index++
 | 
			
		||||
                });
 | 
			
		||||
            } while (this.$root.notificationList.find(it => it.name === name));
 | 
			
		||||
            return name;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,21 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="apprise-url" class="form-label">Apprise URL</label>
 | 
			
		||||
        <label for="apprise-url" class="form-label">{{ $t("Apprise URL") }}</label>
 | 
			
		||||
        <input id="apprise-url" v-model="$parent.notification.appriseURL" type="text" class="form-control" required>
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            <p>Example: twilio://AccountSid:AuthToken@FromPhoneNo</p>
 | 
			
		||||
            <p>
 | 
			
		||||
                Read more: <a href="https://github.com/caronc/apprise/wiki#notification-services" target="_blank">https://github.com/caronc/apprise/wiki#notification-services</a>
 | 
			
		||||
            </p>
 | 
			
		||||
            <p>{{ $t("Example:", ["twilio://AccountSid:AuthToken@FromPhoneNo"]) }}</p>
 | 
			
		||||
            <i18n-t tag="p" keypath="Read more:">
 | 
			
		||||
                <a href="https://github.com/caronc/apprise/wiki#notification-services" target="_blank">https://github.com/caronc/apprise/wiki#notification-services</a>
 | 
			
		||||
            </i18n-t>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <p>
 | 
			
		||||
            Status:
 | 
			
		||||
            <span v-if="appriseInstalled" class="text-primary">Apprise is installed</span>
 | 
			
		||||
            <span v-else class="text-danger">Apprise is not installed. <a href="https://github.com/caronc/apprise" target="_blank">Read more</a></span>
 | 
			
		||||
        </p>
 | 
			
		||||
        <i18n-t tag="p" keypath="Status:">
 | 
			
		||||
            <span v-if="appriseInstalled" class="text-primary">{{ $t("appriseInstalled") }}</span>
 | 
			
		||||
            <i18n-t v-else tag="span" keypath="appriseNotInstalled" class="text-danger">
 | 
			
		||||
                <a href="https://github.com/caronc/apprise" target="_blank">{{ $t("Read more") }}</a>
 | 
			
		||||
            </i18n-t>
 | 
			
		||||
        </i18n-t>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@@ -23,12 +24,12 @@ export default {
 | 
			
		||||
    data() {
 | 
			
		||||
        return {
 | 
			
		||||
            appriseInstalled: false
 | 
			
		||||
        }
 | 
			
		||||
        };
 | 
			
		||||
    },
 | 
			
		||||
    mounted() {
 | 
			
		||||
        this.$root.getSocket().emit("checkApprise", (installed) => {
 | 
			
		||||
            this.appriseInstalled = installed;
 | 
			
		||||
        })
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,19 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="discord-webhook-url" class="form-label">Discord Webhook URL</label>
 | 
			
		||||
        <label for="discord-webhook-url" class="form-label">{{ $t("Discord Webhook URL") }}</label>
 | 
			
		||||
        <input id="discord-webhook-url" v-model="$parent.notification.discordWebhookUrl" type="text" class="form-control" required autocomplete="false">
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            You can get this by going to Server Settings -> Integrations -> Create Webhook
 | 
			
		||||
            {{ $t("wayToGetDiscordURL") }}
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="discord-username" class="form-label">Bot Display Name</label>
 | 
			
		||||
        <label for="discord-username" class="form-label">{{ $t("Bot Display Name") }}</label>
 | 
			
		||||
        <input id="discord-username" v-model="$parent.notification.discordUsername" type="text" class="form-control" autocomplete="false" :placeholder="$root.appName">
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="discord-prefix-message" class="form-label">Prefix Custom Message</label>
 | 
			
		||||
        <input id="discord-prefix-message" v-model="$parent.notification.discordPrefixMessage" type="text" class="form-control" autocomplete="false" placeholder="Hello @everyone is...">
 | 
			
		||||
        <label for="discord-prefix-message" class="form-label">{{ $t("Prefix Custom Message") }}</label>
 | 
			
		||||
        <input id="discord-prefix-message" v-model="$parent.notification.discordPrefixMessage" type="text" class="form-control" autocomplete="false" :placeholder="$t('Hello @everyone is...')">
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,17 +1,17 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="gotify-application-token" class="form-label">Application Token</label>
 | 
			
		||||
        <label for="gotify-application-token" class="form-label">{{ $t("Application Token") }}</label>
 | 
			
		||||
        <HiddenInput id="gotify-application-token" v-model="$parent.notification.gotifyapplicationToken" :required="true" autocomplete="one-time-code"></HiddenInput>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="gotify-server-url" class="form-label">Server URL</label>
 | 
			
		||||
        <label for="gotify-server-url" class="form-label">{{ $t("Server URL") }}</label>
 | 
			
		||||
        <div class="input-group mb-3">
 | 
			
		||||
            <input id="gotify-server-url" v-model="$parent.notification.gotifyserverurl" type="text" class="form-control" required>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="gotify-priority" class="form-label">Priority</label>
 | 
			
		||||
        <label for="gotify-priority" class="form-label">{{ $t("Priority") }}</label>
 | 
			
		||||
        <input id="gotify-priority" v-model="$parent.notification.gotifyPriority" type="number" class="form-control" required min="0" max="10" step="1">
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,21 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="line-channel-access-token" class="form-label">Channel access token</label>
 | 
			
		||||
        <label for="line-channel-access-token" class="form-label">{{ $t("Channel access token") }}</label>
 | 
			
		||||
        <HiddenInput id="line-channel-access-token" v-model="$parent.notification.lineChannelAccessToken" :required="true" autocomplete="one-time-code"></HiddenInput>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-text">
 | 
			
		||||
        Line Developers Console - <b>Basic Settings</b>
 | 
			
		||||
    </div>
 | 
			
		||||
    <i18n-t tag="div" keypath="lineDevConsoleTo" class="form-text">
 | 
			
		||||
        <b>{{ $t("Basic Settings") }}</b>
 | 
			
		||||
    </i18n-t>
 | 
			
		||||
    <div class="mb-3" style="margin-top: 12px;">
 | 
			
		||||
        <label for="line-user-id" class="form-label">User ID</label>
 | 
			
		||||
        <input id="line-user-id" v-model="$parent.notification.lineUserID" type="text" class="form-control" required>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-text">
 | 
			
		||||
        Line Developers Console - <b>Messaging API</b>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-text" style="margin-top: 8px;">
 | 
			
		||||
        First access the <a href="https://developers.line.biz/console/" target="_blank">Line Developers Console</a>, create a provider and channel (Messaging API), then you can get the channel access token and user id from the above mentioned menu items.
 | 
			
		||||
    </div>
 | 
			
		||||
    <i18n-t tag="div" keypath="lineDevConsoleTo" class="form-text">
 | 
			
		||||
        <b>{{ $t("Messaging API") }}</b>
 | 
			
		||||
    </i18n-t>
 | 
			
		||||
    <i18n-t tag="div" keypath="wayToGetLineChannelToken" class="form-text" style="margin-top: 8px;">
 | 
			
		||||
        <a href="https://developers.line.biz/console/" target="_blank">{{ $t("Line Developers Console") }}</a>
 | 
			
		||||
    </i18n-t>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
@@ -25,5 +25,5 @@ export default {
 | 
			
		||||
    components: {
 | 
			
		||||
        HiddenInput,
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="lunasea-device" class="form-label">LunaSea Device ID<span style="color: red;"><sup>*</sup></span></label>
 | 
			
		||||
        <label for="lunasea-device" class="form-label">{{ $t("LunaSea Device ID") }}<span style="color: red;"><sup>*</sup></span></label>
 | 
			
		||||
        <input id="lunasea-device" v-model="$parent.notification.lunaseaDevice" type="text" class="form-control" required>
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            <p><span style="color: red;"><sup>*</sup></span>Required</p>
 | 
			
		||||
            <p><span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}</p>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,32 +1,32 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="mattermost-webhook-url" class="form-label">Webhook URL<span style="color:red;"><sup>*</sup></span></label>
 | 
			
		||||
        <label for="mattermost-webhook-url" class="form-label">{{ $t("Webhook URL") }}<span style="color:red;"><sup>*</sup></span></label>
 | 
			
		||||
        <input id="mattermost-webhook-url" v-model="$parent.notification.mattermostWebhookUrl" type="text" class="form-control" required>
 | 
			
		||||
        <label for="mattermost-username" class="form-label">Username</label>
 | 
			
		||||
        <label for="mattermost-username" class="form-label">{{ $t("Username") }}</label>
 | 
			
		||||
        <input id="mattermost-username" v-model="$parent.notification.mattermostusername" type="text" class="form-control">
 | 
			
		||||
        <label for="mattermost-iconurl" class="form-label">Icon URL</label>
 | 
			
		||||
        <label for="mattermost-iconurl" class="form-label">{{ $t("Icon URL") }}</label>
 | 
			
		||||
        <input id="mattermost-iconurl" v-model="$parent.notification.mattermosticonurl" type="text" class="form-control">
 | 
			
		||||
        <label for="mattermost-iconemo" class="form-label">Icon Emoji</label>
 | 
			
		||||
        <label for="mattermost-iconemo" class="form-label">{{ $t("Icon Emoji") }}</label>
 | 
			
		||||
        <input id="mattermost-iconemo" v-model="$parent.notification.mattermosticonemo" type="text" class="form-control">
 | 
			
		||||
        <label for="mattermost-channel" class="form-label">Channel Name</label>
 | 
			
		||||
        <label for="mattermost-channel" class="form-label">{{ $t("Channel Name") }}</label>
 | 
			
		||||
        <input id="mattermost-channel-name" v-model="$parent.notification.mattermostchannel" type="text" class="form-control">
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            <span style="color:red;"><sup>*</sup></span>Required
 | 
			
		||||
            <span style="color:red;"><sup>*</sup></span>{{ $t("Required") }}
 | 
			
		||||
            <i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
 | 
			
		||||
                <a href="https://docs.mattermost.com/developer/webhooks-incoming.html" target="_blank">https://docs.mattermost.com/developer/webhooks-incoming.html</a>
 | 
			
		||||
            </i18n-t>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                More info about webhooks on: <a href="https://docs.mattermost.com/developer/webhooks-incoming.html" target="_blank">https://docs.mattermost.com/developer/webhooks-incoming.html</a>
 | 
			
		||||
                {{ $t("aboutMattermostChannelName") }}
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                You can override the default channel that webhook posts to by entering the channel name into "Channel Name" field. This needs to be enabled in Mattermost webhook settings. Ex: #other-channel
 | 
			
		||||
                {{ $t("aboutKumaURL") }}
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                If you leave the Uptime Kuma URL field blank, it will default to the Project Github page.
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                You can provide a link to a picture in "Icon URL" to override the default profile picture. Will not be used if Icon Emoji is set.
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                Emoji cheat sheet: <a href="https://www.webfx.com/tools/emoji-cheat-sheet/" target="_blank">https://www.webfx.com/tools/emoji-cheat-sheet/</a> Note: emoji takes preference over Icon URL.
 | 
			
		||||
                {{ $t("aboutIconURL") }}
 | 
			
		||||
            </p>
 | 
			
		||||
            <i18n-t tag="p" keypath="emojiCheatSheet" style="margin-top: 8px;">
 | 
			
		||||
                <a href="https://www.webfx.com/tools/emoji-cheat-sheet/" target="_blank">https://www.webfx.com/tools/emoji-cheat-sheet/</a>
 | 
			
		||||
            </i18n-t>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -6,27 +6,27 @@
 | 
			
		||||
        <input id="octopush-login" v-model="$parent.notification.octopushLogin" type="text" class="form-control" required>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="octopush-type-sms" class="form-label">SMS Type</label>
 | 
			
		||||
        <label for="octopush-type-sms" class="form-label">{{ $t("SMS Type") }}</label>
 | 
			
		||||
        <select id="octopush-type-sms" v-model="$parent.notification.octopushSMSType" class="form-select">
 | 
			
		||||
            <option value="sms_premium">Premium (Fast - recommended for alerting)</option>
 | 
			
		||||
            <option value="sms_low_cost">Low Cost (Slow, sometimes blocked by operator)</option>
 | 
			
		||||
            <option value="sms_premium">{{ $t("octopushTypePremium") }}</option>
 | 
			
		||||
            <option value="sms_low_cost">{{ $t("octopushTypeLowCost") }}</option>
 | 
			
		||||
        </select>
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            Check octopush prices <a href="https://octopush.com/tarifs-sms-international/" target="_blank">https://octopush.com/tarifs-sms-international/</a>.
 | 
			
		||||
        </div>
 | 
			
		||||
        <i18n-t tag="div" keypath="Check octopush prices" class="form-text">
 | 
			
		||||
            <a href="https://octopush.com/tarifs-sms-international/" target="_blank">https://octopush.com/tarifs-sms-international/</a>
 | 
			
		||||
        </i18n-t>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="octopush-phone-number" class="form-label">Phone number (intl format, eg : +33612345678) </label>
 | 
			
		||||
        <label for="octopush-phone-number" class="form-label">{{ $t("octopushPhoneNumber") }}</label>
 | 
			
		||||
        <input id="octopush-phone-number" v-model="$parent.notification.octopushPhoneNumber" type="text" class="form-control" required>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="octopush-sender-name" class="form-label">SMS Sender Name : 3-11 alphanumeric characters and space (a-zA-Z0-9)</label>
 | 
			
		||||
        <label for="octopush-sender-name" class="form-label">{{ $t("octopushSMSSender") }}</label>
 | 
			
		||||
        <input id="octopush-sender-name" v-model="$parent.notification.octopushSenderName" type="text" minlength="3" maxlength="11" class="form-control">
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <p style="margin-top: 8px;">
 | 
			
		||||
        More info on: <a href="https://octopush.com/api-sms-documentation/envoi-de-sms/" target="_blank">https://octopush.com/api-sms-documentation/envoi-de-sms/</a>
 | 
			
		||||
    </p>
 | 
			
		||||
    <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
 | 
			
		||||
        <a href="https://octopush.com/api-sms-documentation/envoi-de-sms/" target="_blank">https://octopush.com/api-sms-documentation/envoi-de-sms/</a>
 | 
			
		||||
    </i18n-t>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
@@ -36,5 +36,5 @@ export default {
 | 
			
		||||
    components: {
 | 
			
		||||
        HiddenInput,
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="pushbullet-access-token" class="form-label">Access Token</label>
 | 
			
		||||
        <label for="pushbullet-access-token" class="form-label">{{ $t("Access Token") }}</label>
 | 
			
		||||
        <HiddenInput id="pushbullet-access-token" v-model="$parent.notification.pushbulletAccessToken" :required="true" autocomplete="one-time-code"></HiddenInput>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <p style="margin-top: 8px;">
 | 
			
		||||
        More info on: <a href="https://docs.pushbullet.com" target="_blank">https://docs.pushbullet.com</a>
 | 
			
		||||
    </p>
 | 
			
		||||
    <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
 | 
			
		||||
        <a href="https://docs.pushbullet.com" target="_blank">https://docs.pushbullet.com</a>
 | 
			
		||||
    </i18n-t>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
@@ -16,5 +16,5 @@ export default {
 | 
			
		||||
    components: {
 | 
			
		||||
        HiddenInput,
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,14 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="pushover-user" class="form-label">User Key<span style="color: red;"><sup>*</sup></span></label>
 | 
			
		||||
        <label for="pushover-user" class="form-label">{{ $t("User Key") }}<span style="color: red;"><sup>*</sup></span></label>
 | 
			
		||||
        <HiddenInput id="pushover-user" v-model="$parent.notification.pushoveruserkey" :required="true" autocomplete="one-time-code"></HiddenInput>
 | 
			
		||||
        <label for="pushover-app-token" class="form-label">Application Token<span style="color: red;"><sup>*</sup></span></label>
 | 
			
		||||
        <label for="pushover-app-token" class="form-label">{{ $t("Application Token") }}<span style="color: red;"><sup>*</sup></span></label>
 | 
			
		||||
        <HiddenInput id="pushover-app-token" v-model="$parent.notification.pushoverapptoken" :required="true" autocomplete="one-time-code"></HiddenInput>
 | 
			
		||||
        <label for="pushover-device" class="form-label">Device</label>
 | 
			
		||||
        <label for="pushover-device" class="form-label">{{ $t("Device") }}</label>
 | 
			
		||||
        <input id="pushover-device" v-model="$parent.notification.pushoverdevice" type="text" class="form-control">
 | 
			
		||||
        <label for="pushover-device" class="form-label">Message Title</label>
 | 
			
		||||
        <label for="pushover-device" class="form-label">{{ $t("Message Title") }}</label>
 | 
			
		||||
        <input id="pushover-title" v-model="$parent.notification.pushovertitle" type="text" class="form-control">
 | 
			
		||||
        <label for="pushover-priority" class="form-label">Priority</label>
 | 
			
		||||
        <label for="pushover-priority" class="form-label">{{ $t("Priority") }}</label>
 | 
			
		||||
        <select id="pushover-priority" v-model="$parent.notification.pushoverpriority" class="form-select">
 | 
			
		||||
            <option>-2</option>
 | 
			
		||||
            <option>-1</option>
 | 
			
		||||
@@ -16,7 +16,7 @@
 | 
			
		||||
            <option>1</option>
 | 
			
		||||
            <option>2</option>
 | 
			
		||||
        </select>
 | 
			
		||||
        <label for="pushover-sound" class="form-label">Notification Sound</label>
 | 
			
		||||
        <label for="pushover-sound" class="form-label">{{ $t("Notification Sound") }}</label>
 | 
			
		||||
        <select id="pushover-sound" v-model="$parent.notification.pushoversounds" class="form-select">
 | 
			
		||||
            <option>pushover</option>
 | 
			
		||||
            <option>bike</option>
 | 
			
		||||
@@ -42,15 +42,15 @@
 | 
			
		||||
            <option>none</option>
 | 
			
		||||
        </select>
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            <span style="color: red;"><sup>*</sup></span>Required
 | 
			
		||||
            <span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
 | 
			
		||||
            <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
 | 
			
		||||
                <a href="https://pushover.net/api" target="_blank">https://pushover.net/api</a>
 | 
			
		||||
            </i18n-t>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                More info on: <a href="https://pushover.net/api" target="_blank">https://pushover.net/api</a>
 | 
			
		||||
                {{ $t("pushoverDesc1") }}
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                Emergency priority (2) has default 30 second timeout between retries and will expire after 1 hour.
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                If you want to send notifications to different devices, fill out Device field.
 | 
			
		||||
                {{ $t("pushoverDesc2") }}
 | 
			
		||||
            </p>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,9 +10,9 @@
 | 
			
		||||
            <HiddenInput id="pushy-user-key" v-model="$parent.notification.pushyToken" :required="true" autocomplete="one-time-code"></HiddenInput>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <p style="margin-top: 8px;">
 | 
			
		||||
        More info on: <a href="https://pushy.me/docs/api/send-notifications" target="_blank">https://pushy.me/docs/api/send-notifications</a>
 | 
			
		||||
    </p>
 | 
			
		||||
    <i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
 | 
			
		||||
        <a href="https://pushy.me/docs/api/send-notifications" target="_blank">https://pushy.me/docs/api/send-notifications</a>
 | 
			
		||||
    </i18n-t>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
@@ -22,5 +22,5 @@ export default {
 | 
			
		||||
    components: {
 | 
			
		||||
        HiddenInput,
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,29 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="rocket-webhook-url" class="form-label">Webhook URL<span style="color: red;"><sup>*</sup></span></label>
 | 
			
		||||
        <label for="rocket-webhook-url" class="form-label">{{ $t("Webhook URL") }}<span style="color: red;"><sup>*</sup></span></label>
 | 
			
		||||
        <input id="rocket-webhook-url" v-model="$parent.notification.rocketwebhookURL" type="text" class="form-control" required>
 | 
			
		||||
        <label for="rocket-username" class="form-label">Username</label>
 | 
			
		||||
        <label for="rocket-username" class="form-label">{{ $t("Username") }}</label>
 | 
			
		||||
        <input id="rocket-username" v-model="$parent.notification.rocketusername" type="text" class="form-control">
 | 
			
		||||
        <label for="rocket-iconemo" class="form-label">Icon Emoji</label>
 | 
			
		||||
        <label for="rocket-iconemo" class="form-label">{{ $t("Icon Emoji") }}</label>
 | 
			
		||||
        <input id="rocket-iconemo" v-model="$parent.notification.rocketiconemo" type="text" class="form-control">
 | 
			
		||||
        <label for="rocket-channel" class="form-label">Channel Name</label>
 | 
			
		||||
        <label for="rocket-channel" class="form-label">{{ $t("Channel Name") }}</label>
 | 
			
		||||
        <input id="rocket-channel-name" v-model="$parent.notification.rocketchannel" type="text" class="form-control">
 | 
			
		||||
        <label for="rocket-button-url" class="form-label">Uptime Kuma URL</label>
 | 
			
		||||
        <label for="rocket-button-url" class="form-label">{{ $t("Uptime Kuma URL") }}</label>
 | 
			
		||||
        <input id="rocket-button" v-model="$parent.notification.rocketbutton" type="text" class="form-control">
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            <span style="color: red;"><sup>*</sup></span>Required
 | 
			
		||||
            <span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
 | 
			
		||||
            <i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
 | 
			
		||||
                <a href="https://docs.rocket.chat/guides/administration/administration/integrations" target="_blank">https://api.slack.com/messaging/webhooks</a>
 | 
			
		||||
            </i18n-t>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                More info about webhooks on: <a href="https://docs.rocket.chat/guides/administration/administration/integrations" target="_blank">https://api.slack.com/messaging/webhooks</a>
 | 
			
		||||
                {{ $t("aboutChannelName", [$t("rocket.chat")]) }}
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                Enter the channel name on Rocket.chat Channel Name field if you want to bypass the webhook channel. Ex: #other-channel
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                If you leave the Uptime Kuma URL field blank, it will default to the Project Github page.
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                Emoji cheat sheet: <a href="https://www.webfx.com/tools/emoji-cheat-sheet/" target="_blank">https://www.webfx.com/tools/emoji-cheat-sheet/</a>
 | 
			
		||||
                {{ $t("aboutKumaURL") }}
 | 
			
		||||
            </p>
 | 
			
		||||
            <i18n-t tag="p" keypath="emojiCheatSheet" style="margin-top: 8px;">
 | 
			
		||||
                <a href="https://www.webfx.com/tools/emoji-cheat-sheet/" target="_blank">https://www.webfx.com/tools/emoji-cheat-sheet/</a>
 | 
			
		||||
            </i18n-t>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -12,8 +12,8 @@
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="secure" class="form-label">Secure</label>
 | 
			
		||||
        <select id="secure" v-model="$parent.notification.smtpSecure" class="form-select">
 | 
			
		||||
            <option :value="false">None / STARTTLS (25, 587)</option>
 | 
			
		||||
            <option :value="true">TLS (465)</option>
 | 
			
		||||
            <option :value="false">{{ $t("secureOptionNone") }}</option>
 | 
			
		||||
            <option :value="true">{{ $t("secureOptionTLS") }}</option>
 | 
			
		||||
        </select>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
        <div class="form-check">
 | 
			
		||||
            <input id="ignore-tls-error" v-model="$parent.notification.smtpIgnoreTLSError" class="form-check-input" type="checkbox" value="">
 | 
			
		||||
            <label class="form-check-label" for="ignore-tls-error">
 | 
			
		||||
                Ignore TLS Error
 | 
			
		||||
                {{ $t("Ignore TLS Error") }}
 | 
			
		||||
            </label>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
@@ -37,24 +37,24 @@
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="from-email" class="form-label">From Email</label>
 | 
			
		||||
        <label for="from-email" class="form-label">{{ $t("From Email") }}</label>
 | 
			
		||||
        <input id="from-email" v-model="$parent.notification.smtpFrom" type="text" class="form-control" required autocomplete="false" placeholder=""Uptime Kuma" <example@kuma.pet>">
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="to-email" class="form-label">To Email</label>
 | 
			
		||||
        <label for="to-email" class="form-label">{{ $t("To Email") }}</label>
 | 
			
		||||
        <input id="to-email" v-model="$parent.notification.smtpTo" type="text" class="form-control" autocomplete="false" placeholder="example2@kuma.pet, example3@kuma.pet" :required="!hasRecipient">
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="to-cc" class="form-label">CC</label>
 | 
			
		||||
        <label for="to-cc" class="form-label">{{ $t("smtpCC") }}</label>
 | 
			
		||||
        <input id="to-cc" v-model="$parent.notification.smtpCC" type="text" class="form-control" autocomplete="false" :required="!hasRecipient">
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="to-bcc" class="form-label">BCC</label>
 | 
			
		||||
        <label for="to-bcc" class="form-label">{{ $t("smtpBCC") }}</label>
 | 
			
		||||
        <input id="to-bcc" v-model="$parent.notification.smtpBCC" type="text" class="form-control" autocomplete="false" :required="!hasRecipient">
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,25 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="signal-url" class="form-label">Post URL</label>
 | 
			
		||||
        <label for="signal-url" class="form-label">{{ $t("Post URL") }}</label>
 | 
			
		||||
        <input id="signal-url" v-model="$parent.notification.signalURL" type="url" pattern="https?://.+" class="form-control" required>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="signal-number" class="form-label">Number</label>
 | 
			
		||||
        <label for="signal-number" class="form-label">{{ $t("Number") }}</label>
 | 
			
		||||
        <input id="signal-number" v-model="$parent.notification.signalNumber" type="text" class="form-control" required>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="signal-recipients" class="form-label">Recipients</label>
 | 
			
		||||
        <label for="signal-recipients" class="form-label">{{ $t("Recipients") }}</label>
 | 
			
		||||
        <input id="signal-recipients" v-model="$parent.notification.signalRecipients" type="text" class="form-control" required>
 | 
			
		||||
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            You need to have a signal client with REST API.
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                {{ $t("needSignalAPI") }}
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                You can check this url to view how to setup one:
 | 
			
		||||
                {{ $t("wayToCheckSignalURL") }}
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
@@ -25,7 +27,7 @@
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                IMPORTANT: You cannot mix groups and numbers in recipients!
 | 
			
		||||
                {{ $t("signalImportant") }}
 | 
			
		||||
            </p>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,29 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="slack-webhook-url" class="form-label">Webhook URL<span style="color: red;"><sup>*</sup></span></label>
 | 
			
		||||
        <label for="slack-webhook-url" class="form-label">{{ $t("Webhook URL") }}<span style="color: red;"><sup>*</sup></span></label>
 | 
			
		||||
        <input id="slack-webhook-url" v-model="$parent.notification.slackwebhookURL" type="text" class="form-control" required>
 | 
			
		||||
        <label for="slack-username" class="form-label">Username</label>
 | 
			
		||||
        <label for="slack-username" class="form-label">{{ $t("Username") }}</label>
 | 
			
		||||
        <input id="slack-username" v-model="$parent.notification.slackusername" type="text" class="form-control">
 | 
			
		||||
        <label for="slack-iconemo" class="form-label">Icon Emoji</label>
 | 
			
		||||
        <label for="slack-iconemo" class="form-label">{{ $t("Icon Emoji") }}</label>
 | 
			
		||||
        <input id="slack-iconemo" v-model="$parent.notification.slackiconemo" type="text" class="form-control">
 | 
			
		||||
        <label for="slack-channel" class="form-label">Channel Name</label>
 | 
			
		||||
        <label for="slack-channel" class="form-label">{{ $t("Channel Name") }}</label>
 | 
			
		||||
        <input id="slack-channel-name" v-model="$parent.notification.slackchannel" type="text" class="form-control">
 | 
			
		||||
        <label for="slack-button-url" class="form-label">Uptime Kuma URL</label>
 | 
			
		||||
        <label for="slack-button-url" class="form-label">{{ $t("Uptime Kuma URL") }}</label>
 | 
			
		||||
        <input id="slack-button" v-model="$parent.notification.slackbutton" type="text" class="form-control">
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            <span style="color: red;"><sup>*</sup></span>Required
 | 
			
		||||
            <span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
 | 
			
		||||
            <i18n-t tag="p" keypath="aboutWebhooks" style="margin-top: 8px;">
 | 
			
		||||
                <a href="https://api.slack.com/messaging/webhooks" target="_blank">https://api.slack.com/messaging/webhooks</a>
 | 
			
		||||
            </i18n-t>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                More info about webhooks on: <a href="https://api.slack.com/messaging/webhooks" target="_blank">https://api.slack.com/messaging/webhooks</a>
 | 
			
		||||
                {{ $t("aboutChannelName", [$t("slack")]) }}
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                Enter the channel name on Slack Channel Name field if you want to bypass the webhook channel. Ex: #other-channel
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                If you leave the Uptime Kuma URL field blank, it will default to the Project Github page.
 | 
			
		||||
            </p>
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                Emoji cheat sheet: <a href="https://www.webfx.com/tools/emoji-cheat-sheet/" target="_blank">https://www.webfx.com/tools/emoji-cheat-sheet/</a>
 | 
			
		||||
                {{ $t("aboutKumaURL") }}
 | 
			
		||||
            </p>
 | 
			
		||||
            <i18n-t tag="p" keypath="emojiCheatSheet" style="margin-top: 8px;">
 | 
			
		||||
                <a href="https://www.webfx.com/tools/emoji-cheat-sheet/" target="_blank">https://www.webfx.com/tools/emoji-cheat-sheet/</a>
 | 
			
		||||
            </i18n-t>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="teams-webhookurl" class="form-label">Webhook URL</label>
 | 
			
		||||
        <label for="teams-webhookurl" class="form-label">{{ $t("Webhook URL") }}</label>
 | 
			
		||||
        <input
 | 
			
		||||
            id="teams-webhookurl"
 | 
			
		||||
            v-model="$parent.notification.webhookUrl"
 | 
			
		||||
@@ -8,12 +8,11 @@
 | 
			
		||||
            class="form-control"
 | 
			
		||||
            required
 | 
			
		||||
        />
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            You can learn how to create a webhook url
 | 
			
		||||
        <i18n-t tag="div" keypath="wayToGetTeamsURL" class="form-text">
 | 
			
		||||
            <a
 | 
			
		||||
                href="https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook"
 | 
			
		||||
                target="_blank"
 | 
			
		||||
            >here</a>.
 | 
			
		||||
        </div>
 | 
			
		||||
            >{{ $t("here") }}</a>
 | 
			
		||||
        </i18n-t>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,14 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="telegram-bot-token" class="form-label">Bot Token</label>
 | 
			
		||||
        <label for="telegram-bot-token" class="form-label">{{ $t("Bot Token") }}</label>
 | 
			
		||||
        <HiddenInput id="telegram-bot-token" v-model="$parent.notification.telegramBotToken" :required="true" autocomplete="one-time-code"></HiddenInput>
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            You can get a token from <a href="https://t.me/BotFather" target="_blank">https://t.me/BotFather</a>.
 | 
			
		||||
            {{ $t("You can get a token from") }} <a href="https://t.me/BotFather" target="_blank">https://t.me/BotFather</a>.
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="telegram-chat-id" class="form-label">Chat ID</label>
 | 
			
		||||
        <label for="telegram-chat-id" class="form-label">{{ $t("Chat ID") }}</label>
 | 
			
		||||
 | 
			
		||||
        <div class="input-group mb-3">
 | 
			
		||||
            <input id="telegram-chat-id" v-model="$parent.notification.telegramChatID" type="text" class="form-control" required>
 | 
			
		||||
@@ -18,10 +18,10 @@
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            Support Direct Chat / Group / Channel's Chat ID
 | 
			
		||||
            {{ $t("supportTelegramChatID") }}
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
                You can get your chat id by sending message to the bot and go to this url to view the chat_id:
 | 
			
		||||
                {{ $t("wayToGetTelegramChatID") }}
 | 
			
		||||
            </p>
 | 
			
		||||
 | 
			
		||||
            <p style="margin-top: 8px;">
 | 
			
		||||
@@ -49,7 +49,7 @@ export default {
 | 
			
		||||
    },
 | 
			
		||||
    computed: {
 | 
			
		||||
        telegramGetUpdatesURL() {
 | 
			
		||||
            let token = "<YOUR BOT TOKEN HERE>"
 | 
			
		||||
            let token = `<${this.$t("YOUR BOT TOKEN HERE")}>`
 | 
			
		||||
 | 
			
		||||
            if (this.$parent.notification.telegramBotToken) {
 | 
			
		||||
                token = this.$parent.notification.telegramBotToken;
 | 
			
		||||
@@ -71,11 +71,11 @@ export default {
 | 
			
		||||
                    } else if (update.message) {
 | 
			
		||||
                        this.notification.telegramChatID = update.message.chat.id;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        throw new Error("Chat ID is not found, please send a message to this bot first")
 | 
			
		||||
                        throw new Error(this.$t("chatIDNotFound"))
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                } else {
 | 
			
		||||
                    throw new Error("Chat ID is not found, please send a message to this bot first")
 | 
			
		||||
                    throw new Error(this.$t("chatIDNotFound"))
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            } catch (error) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,11 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="webhook-url" class="form-label">Post URL</label>
 | 
			
		||||
        <label for="webhook-url" class="form-label">{{ $t("Post URL") }}</label>
 | 
			
		||||
        <input id="webhook-url" v-model="$parent.notification.webhookURL" type="url" pattern="https?://.+" class="form-control" required>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
        <label for="webhook-content-type" class="form-label">Content Type</label>
 | 
			
		||||
        <label for="webhook-content-type" class="form-label">{{ $t("Content Type") }}</label>
 | 
			
		||||
        <select id="webhook-content-type" v-model="$parent.notification.webhookContentType" class="form-select" required>
 | 
			
		||||
            <option value="json">
 | 
			
		||||
                application/json
 | 
			
		||||
@@ -17,7 +17,12 @@
 | 
			
		||||
 | 
			
		||||
        <div class="form-text">
 | 
			
		||||
            <p>"application/json" is good for any modern http servers such as express.js</p>
 | 
			
		||||
            <p>"multipart/form-data" is good for PHP, you just need to parse the json by <strong>json_decode($_POST['data'])</strong></p>
 | 
			
		||||
            <i18n-t tag="p" keypath="webhookFormDataDesc">
 | 
			
		||||
                <template #multipart>"multipart/form-data"</template>
 | 
			
		||||
                <template #decodeFunction>
 | 
			
		||||
                    <strong>json_decode($_POST['data'])</strong>
 | 
			
		||||
                </template>
 | 
			
		||||
            </i18n-t>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import { createI18n } from "vue-i18n";
 | 
			
		||||
import { createI18n } from "vue-i18n/index";
 | 
			
		||||
import daDK from "./languages/da-DK";
 | 
			
		||||
import deDE from "./languages/de-DE";
 | 
			
		||||
import en from "./languages/en";
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
export default {
 | 
			
		||||
    languageName: "Danish",
 | 
			
		||||
    languageName: "Danish (Danmark)",
 | 
			
		||||
    Settings: "Indstillinger",
 | 
			
		||||
    Dashboard: "Dashboard",
 | 
			
		||||
    "New Update": "Opdatering tilgængelig",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
export default {
 | 
			
		||||
    languageName: "German",
 | 
			
		||||
    languageName: "Deutsch (Deutschland)",
 | 
			
		||||
    Settings: "Einstellungen",
 | 
			
		||||
    Dashboard: "Dashboard",
 | 
			
		||||
    "New Update": "Update Verfügbar",
 | 
			
		||||
 
 | 
			
		||||
@@ -178,14 +178,59 @@ export default {
 | 
			
		||||
    "Add a monitor": "Add a monitor",
 | 
			
		||||
    "Edit Status Page": "Edit Status Page",
 | 
			
		||||
    "Go to Dashboard": "Go to Dashboard",
 | 
			
		||||
    telegram: "Telegram",
 | 
			
		||||
    webhook: "Webhook",
 | 
			
		||||
    smtp: "Email (SMTP)",
 | 
			
		||||
    discord: "Discord",
 | 
			
		||||
    teams: "Microsoft Teams",
 | 
			
		||||
    signal: "Signal",
 | 
			
		||||
    gotify: "Gotify",
 | 
			
		||||
    slack: "Slack",
 | 
			
		||||
    "Status Page": "Status Page",
 | 
			
		||||
    // Start notification form
 | 
			
		||||
    defaultNotificationName: "My {notification} Alert ({number})",
 | 
			
		||||
    here: "here",
 | 
			
		||||
    "Required": "Required",
 | 
			
		||||
    "telegram": "Telegram",
 | 
			
		||||
    "Bot Token": "Bot Token",
 | 
			
		||||
    "You can get a token from": "You can get a token from",
 | 
			
		||||
    "Chat ID": "Chat ID",
 | 
			
		||||
    supportTelegramChatID: "Support Direct Chat / Group / Channel's Chat ID",
 | 
			
		||||
    wayToGetTelegramChatID: "You can get your chat id by sending message to the bot and go to this url to view the chat_id:",
 | 
			
		||||
    "YOUR BOT TOKEN HERE": "YOUR BOT TOKEN HERE",
 | 
			
		||||
    chatIDNotFound: "Chat ID is not found, please send a message to this bot first",
 | 
			
		||||
    "webhook": "Webhook",
 | 
			
		||||
    "Post URL": "Post URL",
 | 
			
		||||
    "Content Type": "Content Type",
 | 
			
		||||
    webhookJsonDesc: "{0} is good for any modern http servers such as express.js",
 | 
			
		||||
    webhookFormDataDesc: "{multipart} is good for PHP, you just need to parse the json by {decodeFunction}",
 | 
			
		||||
    "smtp": "Email (SMTP)",
 | 
			
		||||
    secureOptionNone: "None / STARTTLS (25, 587)",
 | 
			
		||||
    secureOptionTLS: "TLS (465)",
 | 
			
		||||
    "Ignore TLS Error": "Ignore TLS Error",
 | 
			
		||||
    "From Email": "From Email",
 | 
			
		||||
    "To Email": "To Email",
 | 
			
		||||
    smtpCC: "CC",
 | 
			
		||||
    smtpBCC: "BCC",
 | 
			
		||||
    "discord": "Discord",
 | 
			
		||||
    "Discord Webhook URL": "Discord Webhook URL",
 | 
			
		||||
    wayToGetDiscordURL: "You can get this by going to Server Settings -> Integrations -> Create Webhook",
 | 
			
		||||
    "Bot Display Name": "Bot Display Name",
 | 
			
		||||
    "Prefix Custom Message": "Prefix Custom Message",
 | 
			
		||||
    "Hello @everyone is...": "Hello {'@'}everyone is...",
 | 
			
		||||
    "teams": "Microsoft Teams",
 | 
			
		||||
    "Webhook URL": "Webhook URL",
 | 
			
		||||
    wayToGetTeamsURL: "You can learn how to create a webhook url {0}.",
 | 
			
		||||
    "signal": "Signal",
 | 
			
		||||
    "Number": "Number",
 | 
			
		||||
    "Recipients": "Recipients",
 | 
			
		||||
    needSignalAPI: "You need to have a signal client with REST API.",
 | 
			
		||||
    wayToCheckSignalURL: "You can check this url to view how to setup one:",
 | 
			
		||||
    signalImportant: "IMPORTANT: You cannot mix groups and numbers in recipients!",
 | 
			
		||||
    "gotify": "Gotify",
 | 
			
		||||
    "Application Token": "Application Token",
 | 
			
		||||
    "Server URL": "Server URL",
 | 
			
		||||
    "Priority": "Priority",
 | 
			
		||||
    "slack": "Slack",
 | 
			
		||||
    "Icon Emoji": "Icon Emoji",
 | 
			
		||||
    "Channel Name": "Channel Name",
 | 
			
		||||
    "Uptime Kuma URL": "Uptime Kuma URL",
 | 
			
		||||
    aboutWebhooks: "More info about webhooks on: {0}",
 | 
			
		||||
    aboutChannelName: "Enter the channel name on {0} Channel Name field if you want to bypass the webhook channel. Ex: #other-channel",
 | 
			
		||||
    aboutKumaURL: "If you leave the Uptime Kuma URL field blank, it will default to the Project Github page.",
 | 
			
		||||
    emojiCheatSheet: "Emoji cheat sheet: {0}",
 | 
			
		||||
    "rocket.chat": "Rocket.chat",
 | 
			
		||||
    pushover: "Pushover",
 | 
			
		||||
    pushy: "Pushy",
 | 
			
		||||
@@ -195,5 +240,5 @@ export default {
 | 
			
		||||
    pushbullet: "Pushbullet",
 | 
			
		||||
    line: "Line Messenger",
 | 
			
		||||
    mattermost: "Mattermost",
 | 
			
		||||
    "Status Page": "Status Page",
 | 
			
		||||
    // End notification form
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
export default {
 | 
			
		||||
    languageName: "繁體中文 (香港)",
 | 
			
		||||
    Settings: "設定",
 | 
			
		||||
    Dashboard: "錶板",
 | 
			
		||||
    Dashboard: "主控台",
 | 
			
		||||
    "New Update": "有更新",
 | 
			
		||||
    Language: "語言",
 | 
			
		||||
    Appearance: "外觀",
 | 
			
		||||
@@ -104,7 +104,7 @@ export default {
 | 
			
		||||
    rrtypeDescription: "請選擇 DNS 記錄類型",
 | 
			
		||||
    pauseMonitorMsg: "是否確定暫停?",
 | 
			
		||||
    "Last Result": "最後結果",
 | 
			
		||||
    "Create your admin account": "製作你的管理員帳號",
 | 
			
		||||
    "Create your admin account": "建立管理員帳號",
 | 
			
		||||
    "Repeat Password": "重複密碼",
 | 
			
		||||
    respTime: "反應時間 (ms)",
 | 
			
		||||
    notAvailableShort: "N/A",
 | 
			
		||||
@@ -146,43 +146,43 @@ export default {
 | 
			
		||||
    importHandleDescription: "Choose 'Skip existing' if you want to skip every monitor or notification with the same name. 'Overwrite' will delete every existing monitor and notification.",
 | 
			
		||||
    confirmImportMsg: "Are you sure to import the backup? Please make sure you've selected the right import option.",
 | 
			
		||||
    "Heartbeat Retry Interval": "Heartbeat Retry Interval",
 | 
			
		||||
    "Import Backup": "Import Backup",
 | 
			
		||||
    "Export Backup": "Export Backup",
 | 
			
		||||
    "Skip existing": "Skip existing",
 | 
			
		||||
    Overwrite: "Overwrite",
 | 
			
		||||
    Options: "Options",
 | 
			
		||||
    "Keep both": "Keep both",
 | 
			
		||||
    Tags: "Tags",
 | 
			
		||||
    "Import Backup": "匯入備份",
 | 
			
		||||
    "Export Backup": "匯出備份",
 | 
			
		||||
    "Skip existing": "略過已存在的",
 | 
			
		||||
    Overwrite: "覆蓋",
 | 
			
		||||
    Options: "選項",
 | 
			
		||||
    "Keep both": "兩者並存",
 | 
			
		||||
    Tags: "標籤",
 | 
			
		||||
    "Add New below or Select...": "Add New below or Select...",
 | 
			
		||||
    "Tag with this name already exist.": "Tag with this name already exist.",
 | 
			
		||||
    "Tag with this value already exist.": "Tag with this value already exist.",
 | 
			
		||||
    color: "color",
 | 
			
		||||
    "value (optional)": "value (optional)",
 | 
			
		||||
    Gray: "Gray",
 | 
			
		||||
    Red: "Red",
 | 
			
		||||
    Orange: "Orange",
 | 
			
		||||
    Green: "Green",
 | 
			
		||||
    Blue: "Blue",
 | 
			
		||||
    Indigo: "Indigo",
 | 
			
		||||
    Purple: "Purple",
 | 
			
		||||
    Pink: "Pink",
 | 
			
		||||
    "Search...": "Search...",
 | 
			
		||||
    "Avg. Ping": "Avg. Ping",
 | 
			
		||||
    "Avg. Response": "Avg. Response",
 | 
			
		||||
    color: "顏色",
 | 
			
		||||
    "value (optional)": "值 (非必需)",
 | 
			
		||||
    Gray: "灰",
 | 
			
		||||
    Red: "紅",
 | 
			
		||||
    Orange: "橙",
 | 
			
		||||
    Green: "綠",
 | 
			
		||||
    Blue: "藍",
 | 
			
		||||
    Indigo: "靛",
 | 
			
		||||
    Purple: "紫",
 | 
			
		||||
    Pink: "粉紅",
 | 
			
		||||
    "Search...": "搜尋...",
 | 
			
		||||
    "Avg. Ping": "平均反應時間",
 | 
			
		||||
    "Avg. Response": "平均反應時間",
 | 
			
		||||
    "Entry Page": "Entry Page",
 | 
			
		||||
    statusPageNothing: "Nothing here, please add a group or a monitor.",
 | 
			
		||||
    "No Services": "No Services",
 | 
			
		||||
    "All Systems Operational": "All Systems Operational",
 | 
			
		||||
    "Partially Degraded Service": "Partially Degraded Service",
 | 
			
		||||
    "Degraded Service": "Degraded Service",
 | 
			
		||||
    "Add Group": "Add Group",
 | 
			
		||||
    "Add a monitor": "Add a monitor",
 | 
			
		||||
    "Edit Status Page": "Edit Status Page",
 | 
			
		||||
    "Go to Dashboard": "Go to Dashboard",
 | 
			
		||||
    "No Services": "沒有服務",
 | 
			
		||||
    "All Systems Operational": "一切正常",
 | 
			
		||||
    "Partially Degraded Service": "部份服務受阻",
 | 
			
		||||
    "Degraded Service": "服務受阻",
 | 
			
		||||
    "Add Group": "新增群組",
 | 
			
		||||
    "Add a monitor": " 新增監測器",
 | 
			
		||||
    "Edit Status Page": "編輯 Status Page",
 | 
			
		||||
    "Go to Dashboard": "前往主控台",
 | 
			
		||||
    "Status Page": "Status Page",
 | 
			
		||||
    telegram: "Telegram",
 | 
			
		||||
    webhook: "Webhook",
 | 
			
		||||
    smtp: "Email (SMTP)",
 | 
			
		||||
    smtp: "電郵 (SMTP)",
 | 
			
		||||
    discord: "Discord",
 | 
			
		||||
    teams: "Microsoft Teams",
 | 
			
		||||
    signal: "Signal",
 | 
			
		||||
@@ -193,7 +193,7 @@ export default {
 | 
			
		||||
    pushy: "Pushy",
 | 
			
		||||
    octopush: "Octopush",
 | 
			
		||||
    lunasea: "LunaSea",
 | 
			
		||||
    apprise: "Apprise (Support 50+ Notification services)",
 | 
			
		||||
    apprise: "Apprise (支援 50 多種通知)",
 | 
			
		||||
    pushbullet: "Pushbullet",
 | 
			
		||||
    line: "Line Messenger",
 | 
			
		||||
    mattermost: "Mattermost",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user