Fix some more views.

This commit is contained in:
James Cole
2026-07-02 15:52:29 +02:00
parent b2b92aa4e6
commit 6dfdbf71c6
11 changed files with 569 additions and 647 deletions
+203 -155
View File
@@ -97,9 +97,9 @@
}
},
"node_modules/@oxc-project/types": {
"version": "0.137.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz",
"integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==",
"version": "0.138.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.138.0.tgz",
"integrity": "sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==",
"dev": true,
"license": "MIT",
"funding": {
@@ -235,6 +235,9 @@
"arm"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -256,6 +259,9 @@
"arm"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -277,6 +283,9 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -298,6 +307,9 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -319,6 +331,9 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -340,6 +355,9 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -441,9 +459,9 @@
}
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz",
"integrity": "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.4.tgz",
"integrity": "sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==",
"cpu": [
"arm64"
],
@@ -458,9 +476,9 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz",
"integrity": "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.4.tgz",
"integrity": "sha512-aUi+HBvmYb7j8krl1+qJgkG8C17fO79gk3c+jPw4S8glRFc1DTija9S3EyaTSQUm5GJXYKDAsugBEhFHH2vYiQ==",
"cpu": [
"arm64"
],
@@ -475,9 +493,9 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz",
"integrity": "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.4.tgz",
"integrity": "sha512-F7hHC3gwY11+vByKPRWqwGbeXWVgKmL+pTGCinaEhdihzBV2aQ0fvZOch9cXYUOKuKKq429HeYXOqQLc7wFCEg==",
"cpu": [
"x64"
],
@@ -492,9 +510,9 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz",
"integrity": "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.4.tgz",
"integrity": "sha512-sI5yw+7s92SK6odiEhD5lKCBlWcpjHS5qyqpVQbZAJ0fIzEUXrmbl3DH2ybR3PZogulNJF+COLtmA8hUfvkCCQ==",
"cpu": [
"x64"
],
@@ -509,9 +527,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz",
"integrity": "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.4.tgz",
"integrity": "sha512-mCi0OKgEieFircrtVYmQAFGszRtMnZ6fpZAXrxanXAu7lqZcsK1E1RAaZNG0uKAnxox3B1f4EyQNnoyMfN1vAA==",
"cpu": [
"arm"
],
@@ -526,13 +544,16 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz",
"integrity": "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.4.tgz",
"integrity": "sha512-B9Ial3Kv5sh0SHnB1g/QWcUQCEvCF6QKGAl4zXypYj65mVI+B4AhFBwPtSN7pDrJeIx8Z7zdy4ntx+wQABom7w==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -543,13 +564,16 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz",
"integrity": "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.4.tgz",
"integrity": "sha512-lZVym0PuHE1KZ22gmFTC15lAkrg9iTszR617oYRB/iPY1A56ywoJzVKOJBKaot5RiikCObmur6pogpse3gRcng==",
"cpu": [
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -560,13 +584,16 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz",
"integrity": "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.4.tgz",
"integrity": "sha512-t2DNiLJWNTbnEHyUzTumldML6ET4/g16467LZoDDJ3tSxGvguL5/NyC2lCsNKuyRycg9XeDQF5SSv+TNOhQEXg==",
"cpu": [
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -577,13 +604,16 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz",
"integrity": "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.4.tgz",
"integrity": "sha512-0WIRnL1Uw4BvTZRLQt+PVgo6ZKTJadlC2btP+/EOXv2f/DWbY0rEgl+y834mIVwP1FkTlWVTrGGJXf12lru7EQ==",
"cpu": [
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -594,13 +624,16 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz",
"integrity": "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.4.tgz",
"integrity": "sha512-JWtGshGfX+oENAKonoNkqEJX+7hC8yfhi9GUyPX1VX4mdh1y5r+ZiJLR5XzAB0aoP6s/PcILsGjKq8O0mm24bw==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -611,13 +644,16 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz",
"integrity": "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.4.tgz",
"integrity": "sha512-rT6yQcxUuXs4CnbofqwHRRV0iem349rLMYpTjkgQGLjrY4ado/eDzwPZPTCgTOlF6Nkp8NEv70yLMTn6qkWxsQ==",
"cpu": [
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -628,9 +664,9 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz",
"integrity": "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.4.tgz",
"integrity": "sha512-KXMGoboq5cyaCQjDA4GLuRiOwBQ0EyFnJoVViLeZ45/3rFItRODEr+NdsBcVpll40hhNArlm/speWGRvj08LzA==",
"cpu": [
"arm64"
],
@@ -645,9 +681,9 @@
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz",
"integrity": "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.4.tgz",
"integrity": "sha512-5K83rb36oJiY7BCyE9zLZtGcPV4g5wvq+xwdO0XPIwDVZI8cyB/AUjkNXGb92/rnmezEkjMOpgY61rtwjQtFwg==",
"cpu": [
"wasm32"
],
@@ -664,9 +700,9 @@
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz",
"integrity": "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.4.tgz",
"integrity": "sha512-PnWBtw3TV5KOg69HQQDR0mnQuyCmSGR2pAB4DC1rPF808fgKeTUMj2EOEyKATpgiuxuR5APQmiDO7PDgEjTFSA==",
"cpu": [
"arm64"
],
@@ -681,9 +717,9 @@
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz",
"integrity": "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.4.tgz",
"integrity": "sha512-M1lpniBePobTfsa7Ks9a199e1akxsXn+GYBUKsEzv3YFzOm1HJAMNwKI3qr0Zq+mxwx9gOZoTdP1yXRYsZUocQ==",
"cpu": [
"x64"
],
@@ -724,7 +760,7 @@
"@vue/shared": "3.1.5"
}
},
"node_modules/@vue/reactivity/node_modules/@vue/shared": {
"node_modules/@vue/shared": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz",
"integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==",
@@ -943,6 +979,34 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/chalk/node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/chokidar": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
"integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
"dev": true,
"license": "MIT",
"dependencies": {
"readdirp": "^5.0.0"
},
"engines": {
"node": ">= 20.19.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/ci-info": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
@@ -1028,54 +1092,6 @@
"url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
}
},
"node_modules/concurrently/node_modules/shell-quote": {
"version": "1.8.4",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz",
"integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/concurrently/node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/concurrently/node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -1835,6 +1851,9 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -1856,6 +1875,9 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -1877,6 +1899,9 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -1898,6 +1923,9 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -2158,6 +2186,20 @@
"node": ">=10"
}
},
"node_modules/readdirp": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
"integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 20.19.0"
},
"funding": {
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -2169,13 +2211,13 @@
}
},
"node_modules/rolldown": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz",
"integrity": "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.4.tgz",
"integrity": "sha512-IjZYiLxZwpnhwhdBH2ugdTGVSdhCQUmLxLoqyjiL0JxYjyRst+5a0P3xfrTxJ5F638j4Mvvw5FAX5XE6eHpXbA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@oxc-project/types": "=0.137.0",
"@oxc-project/types": "=0.138.0",
"@rolldown/pluginutils": "^1.0.0"
},
"bin": {
@@ -2185,21 +2227,21 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
"@rolldown/binding-android-arm64": "1.1.3",
"@rolldown/binding-darwin-arm64": "1.1.3",
"@rolldown/binding-darwin-x64": "1.1.3",
"@rolldown/binding-freebsd-x64": "1.1.3",
"@rolldown/binding-linux-arm-gnueabihf": "1.1.3",
"@rolldown/binding-linux-arm64-gnu": "1.1.3",
"@rolldown/binding-linux-arm64-musl": "1.1.3",
"@rolldown/binding-linux-ppc64-gnu": "1.1.3",
"@rolldown/binding-linux-s390x-gnu": "1.1.3",
"@rolldown/binding-linux-x64-gnu": "1.1.3",
"@rolldown/binding-linux-x64-musl": "1.1.3",
"@rolldown/binding-openharmony-arm64": "1.1.3",
"@rolldown/binding-wasm32-wasi": "1.1.3",
"@rolldown/binding-win32-arm64-msvc": "1.1.3",
"@rolldown/binding-win32-x64-msvc": "1.1.3"
"@rolldown/binding-android-arm64": "1.1.4",
"@rolldown/binding-darwin-arm64": "1.1.4",
"@rolldown/binding-darwin-x64": "1.1.4",
"@rolldown/binding-freebsd-x64": "1.1.4",
"@rolldown/binding-linux-arm-gnueabihf": "1.1.4",
"@rolldown/binding-linux-arm64-gnu": "1.1.4",
"@rolldown/binding-linux-arm64-musl": "1.1.4",
"@rolldown/binding-linux-ppc64-gnu": "1.1.4",
"@rolldown/binding-linux-s390x-gnu": "1.1.4",
"@rolldown/binding-linux-x64-gnu": "1.1.4",
"@rolldown/binding-linux-x64-musl": "1.1.4",
"@rolldown/binding-openharmony-arm64": "1.1.4",
"@rolldown/binding-wasm32-wasi": "1.1.4",
"@rolldown/binding-win32-arm64-msvc": "1.1.4",
"@rolldown/binding-win32-x64-msvc": "1.1.4"
}
},
"node_modules/rxjs": {
@@ -2233,36 +2275,6 @@
"@parcel/watcher": "^2.4.1"
}
},
"node_modules/sass/node_modules/chokidar": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
"integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
"dev": true,
"license": "MIT",
"dependencies": {
"readdirp": "^5.0.0"
},
"engines": {
"node": ">= 20.19.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/sass/node_modules/readdirp": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
"integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 20.19.0"
},
"funding": {
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/semver": {
"version": "7.8.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
@@ -2313,6 +2325,19 @@
"node": ">=8"
}
},
"node_modules/shell-quote": {
"version": "1.8.4",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz",
"integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/shepherd.js": {
"version": "15.2.2",
"resolved": "https://registry.npmjs.org/shepherd.js/-/shepherd.js-15.2.2.tgz",
@@ -2383,15 +2408,19 @@
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/tailwindcss": {
@@ -2501,16 +2530,16 @@
"link": true
},
"node_modules/vite": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.1.0.tgz",
"integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==",
"version": "8.1.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.1.2.tgz",
"integrity": "sha512-6YYPbRXTxx6bRXmOn7XdnQAy5DQNHhDgtjhDHI13oe4pY93kkcdGJWxpGwOm++/Wh0QpQhDrpIoVMrmrsI5AGQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"lightningcss": "^1.32.0",
"picomatch": "^4.0.4",
"postcss": "^8.5.15",
"rolldown": "~1.1.2",
"postcss": "^8.5.16",
"rolldown": "~1.1.3",
"tinyglobby": "^0.2.17"
},
"bin": {
@@ -2667,6 +2696,25 @@
"url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
@@ -19,241 +19,7 @@
-->
<template>
<div>
<div v-if="success_message !== ''" class="row">
<div class="col-lg-12">
<div class="alert alert-success alert-dismissible" role="alert">
<button class="close" data-dismiss="alert" type="button" v-bind:aria-label="$t('firefly.close')"><span
aria-hidden="true">&times;</span></button>
<strong>{{ $t("firefly.flash_success") }}</strong> <span v-html="success_message"></span>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ title }}</h3>
</div>
<div class="card-body p-0">
<table class="table table-hover" aria-label="A table">
<tbody>
<tr>
<td style="width:40%;"><strong>{{ $t('list.title') }}</strong></td>
<td>{{ title }}</td>
</tr>
<tr>
<td style="width:40%;"><strong>{{ $t('list.active') }}</strong></td>
<td>
<em class="fa fa-check text-success" v-if="active"></em>
<em class="fa fa-times text-danger" v-if="!active"></em>
</td>
</tr>
<tr>
<td style="width:40%;"><strong>{{ $t('list.trigger') }}</strong></td>
<td>
<span v-for="trigger in triggers" :key="trigger">
{{ $t('firefly.webhook_trigger_' + trigger) }}<br>
</span>
</td>
</tr>
<tr>
<td style="width:40%;"><strong>{{ $t('list.response') }}</strong></td>
<td>
<span v-for="response in responses" :key="response">
{{ $t('firefly.webhook_response_' + response) }}
</span>
</td>
</tr>
<tr>
<td style="width:40%;"><strong>{{ $t('list.delivery') }}</strong></td>
<td>
<span v-for="delivery in deliveries" :key="delivery">
{{ $t('firefly.webhook_delivery_' + delivery) }}
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="box-footer">
<div class="btn-group pull-right">
<a :href=edit_url class="btn btn-default"><em class="fa fa-pencil"></em> {{ $t('firefly.edit') }}</a>
<a id="triggerButton" v-if="active" href="#" @click="submitTest" :class="disabledTrigger ? 'btn btn-default disabled ' : 'btn btn-default'"><em
class="fa fa-bolt"></em>
{{ $t('list.trigger') }}
</a>
<a :href=delete_url class="btn btn-danger"><em class="fa fa-trash"></em> {{ $t('firefly.delete') }}</a>
</div>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ $t('firefly.meta_data') }}</h3>
</div>
<div class="card-body p-0">
<table class="table table-hover" aria-label="A table">
<tbody>
<tr>
<td style="width:40%;"><strong>{{ $t('list.url') }}</strong></td>
<td><input type="text" readonly class="form-control" :value=url></td>
</tr>
<tr>
<td style="width:40%;"><strong>
{{ $t('list.secret') }}
</strong>
</td>
<td>
<em style="cursor:pointer"
v-if="show_secret" class="fa fa-eye" @click="toggleSecret"></em>
<em style="cursor:pointer"
v-if="!show_secret" class="fa fa-eye-slash" @click="toggleSecret"></em>
<code v-if="show_secret">{{ secret }}</code>
<code v-if="!show_secret">********</code>
</td>
</tr>
</tbody>
</table>
</div>
<div class="box-footer">
<a :href=url class="btn btn-default">
<em class="fa fa-globe-europe"></em> {{ $t('firefly.visit_webhook_url') }}
</a>
<a @click="resetSecret" class="btn btn-default">
<em class="fa fa-lock"></em> {{ $t('firefly.reset_webhook_secret') }}
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ $t('firefly.webhook_messages') }}</h3>
</div>
<div class="box-body" v-if="messages.length === 0 && !loading">
<p>
{{ $t('firefly.no_webhook_messages') }}
</p>
</div>
<div class="box-body" v-if="loading">
<p class="text-center">
<em class="fa fa-spin fa-spinner"></em>
</p>
</div>
<div class="card-body p-0" v-if="messages.length > 0 && !loading">
<table class="table table-hover" aria-label="A table">
<thead>
<tr>
<th>
Date and time
</th>
<th>
UID
</th>
<th>
Success?
</th>
<th>
More details
</th>
</tr>
</thead>
<tbody>
<tr v-for="message in messages">
<td>
{{ message.created_at }}
</td>
<td>
{{ message.uuid }}
</td>
<td>
<em class="fa fa-check text-success" v-if="message.success"></em>
<em class="fa fa-times text-danger" v-if="!message.success"></em>
</td>
<td>
<a @click="showWebhookMessage(message.id)" class="btn btn-default">
<em class="fa fa-envelope"></em>
{{ $t('firefly.view_message') }}
</a>
<a @click="showWebhookAttempts(message.id)" class="btn btn-default">
<em class="fa fa-cloud-upload"></em>
{{ $t('firefly.view_attempts') }}
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- modal for message content -->
<div class="modal fade" id="messageModal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">{{ $t('firefly.message_content_title') }}</h4>
</div>
<div class="modal-body">
<p>
{{ $t('firefly.message_content_help') }}
</p>
<textarea class="form-control" rows="10" readonly>{{ message_content }}</textarea>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $t('firefly.close') }}</button>
</div>
</div>
</div>
</div>
<!-- modal for message attempts -->
<div class="modal fade" id="attemptModal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">{{ $t('firefly.attempt_content_title') }}</h4>
</div>
<div class="modal-body">
<p>
{{ $t('firefly.attempt_content_help') }}
</p>
<p v-if="0===message_attempts.length">
<em>
{{ $t('firefly.no_attempts') }}
</em>
</p>
<div v-for="message in message_attempts" style="border:1px #eee solid;margin-bottom:0.5em;">
<strong>
{{ $t('firefly.webhook_attempt_at', {moment: message.created_at}) }}
<span class="text-danger">({{ message.status_code }})</span>
</strong>
<p>
{{ $t('firefly.logs') }}: <br/>
<textarea class="form-control" rows="5" readonly>{{ message.logs }}</textarea>
</p>
<p v-if="null !== message.response">
{{ $t('firefly.response') }}: <br/>
<textarea class="form-control" rows="5" readonly>{{ message.response }}</textarea>
</p>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ $t('firefly.close') }}</button>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
@@ -8,7 +8,7 @@
@if('Revenue account' === $source['type'])
<span title="Deposit from revenue">{!! format_amount_by_symbol($destination['balance_after'], $currency['symbol'], $currency['decimal_places']) !!}</span>
@else
<span title="Deposit from liab">{!! format_amount_by_symbol($destination['balance_after'], $foreign['currency_symbol'], $foreign['decimal_places']) !!}</span>
<span title="Deposit from liab">{!! format_amount_by_symbol($destination['balance_after'], $foreign['symbol'], $foreign['decimal_places']) !!}</span>
@endif
{{-- if this is a deposit from revenue account, use the destination account currency? For #12043 and #12169. Otherwise, keep at source account -}}
{{-- changed from normal currency_symbol to foreign_currency_symbol for #12043 --}}
@@ -58,7 +58,7 @@
<span title="Transfer, dest, normal currency">{!! format_amount_by_symbol($destination['balance_after'], $currency['symbol'], $currency['decimal_places']) !!}</span>
@endif
@if(null !== $foreign['id'])
<span title="Transfer, dest, foreign currency">{!! format_amount_by_symbol($destination['balance_after'], $foreign['currency_symbol'], $foreign['decimal_places']) !!}</span>
<span title="Transfer, dest, foreign currency">{!! format_amount_by_symbol($destination['balance_after'], $foreign['symbol'], $foreign['decimal_places']) !!}</span>
@endif
@endif
@else
@@ -136,7 +136,7 @@
<x-elements.transaction-running-balance
:balance-dirty="($transaction['source_balance_dirty'] ?? false) || ($transaction['destination_balance_dirty'] ?? false)"
:currency="['symbol' => $transaction['currency_symbol'],'decimal_places' => $transaction['currency_decimal_places']]"
:foreign="[]"
:foreign="['symbol' => $transaction['foreign_currency_symbol'], 'decimal_places' => $transaction['foreign_currency_decimal_places']]"
:type="$transaction['transaction_type_type']"
:account="$account ?? null"
:source="['id' => $transaction['source_account_id'], 'balance_after' => $transaction['source_balance_after'], 'type' => $transaction['source_account_type']]"
@@ -1,18 +1,13 @@
@extends('layout.v3.session')
{{ Breadcrumbs.render(Route.getCurrentRoute.getName, group) }}
@endsection
@section('content')
<form method="POST" action="{{ route('transactions.destroy',group.id) }}" accept-charset="UTF-8" class="form-horizontal" id="destroy">
<form method="POST" action="{{ route('transactions.destroy',[$group->id]) }}" accept-charset="UTF-8" class="form-horizontal" id="destroy">
<input name="_token" type="hidden" value="{{ csrf_token() }}">
<div class="row">
<div class="col-lg-6 offset-lg-3 col-md-6 col-sm-12">
<div class="card card-danger card-outline">
<div class="card-header">
<h3 class="card-title">{{ trans('form.delete_journal', {'description': group.title|default(journal.description)}) }}</h3>
<h3 class="card-title">{{ trans('form.delete_journal', ['description' => $group->title ?? $journal->description]) }}</h3>
</div>
<div class="card-body">
<p class="text-danger">
@@ -20,12 +15,12 @@
</p>
<p>
{{ trans('form.journal_areYouSure', {'description': group.title|default(journal.description)}) }}
{{ trans('form.journal_areYouSure', ['description' => $group->title ?? $journal->description]) }}
</p>
</div>
<div class="card-footer">
<input type="submit" name="submit" value="{{ trans('form.deletePermanently') }}" class="btn btn-danger text-end"/>
<a href="{{ previous }}" class="btn-outline-secondary btn">{{ trans('form.cancel') }}</a>
<a href="{{ $previous }}" class="btn-outline-secondary btn">{{ trans('form.cancel') }}</a>
</div>
</div>
</div>
@@ -33,3 +28,4 @@
</form>
@endsection
@@ -27,3 +27,6 @@
</div>
</form>
@endsection
@section('scripts')
@vite(['js/pages/generic.js'])
@endsection
@@ -1,9 +1,4 @@
@extends('layout.v3.session')
{{ Breadcrumbs.render(Route.getCurrentRoute.getName, journals) }}
@endsection
@section('content')
<form method="POST" action="{{ route('transactions.mass.destroy') }}" accept-charset="UTF-8" class="form-horizontal" id="destroy">
<input name="_token" type="hidden" value="{{ csrf_token() }}">
@@ -12,12 +7,12 @@
<div class="col-lg-8 offset-lg-2 col-md-8 coll-offset-md-2 col-sm-12">
<div class="card card-danger card-outline">
<div class="card-header">
<h3 class="card-title">{{ 'mass_delete_journals'|_ }}</h3>
<h3 class="card-title">{{ __('firefly.mass_delete_journals') }}</h3>
</div>
<div class="card-body">
<p class="text-danger">
{{ trans('form.permDeleteWarning') }}
{{ 'perm-delete-many'|_ }}
{{ __('firefly.perm-delete-many') }}
</p>
<p>
{{ trans('form.mass_journal_are_you_sure') }}
@@ -34,72 +29,72 @@
<th class="hidden-xs">{{ trans('list.from') }}</th>
<th class="hidden-xs">{{ trans('list.to') }}</th>
</tr>
{% for journal in journals %}
@foreach($journals as $journal)
<tr>
<td>
<input type="checkbox" name="confirm_mass_delete[]" value="{{ journal.transaction_journal_id }}" checked/>
<input type="checkbox" name="confirm_mass_delete[]" value="{{ $journal['transaction_journal_id'] }}" checked/>
</td>
<td>
{% if journal.transaction_type_type == 'Withdrawal' %}
@if('Withdrawal' === $journal['transaction_type_type'])
<span class="bi bi-arrow-left" title="{{ trans('firefly.Withdrawal') }}"></span>
@endif
{% if journal.transaction_type_type == 'Deposit' %}
@if('Deposit' === $journal['transaction_type_type'])
<span class="bi bi-arrow-right" title="{{ trans('firefly.Deposit') }}"></span>
@endif
{% if journal.transaction_type_type == 'Transfer' %}
@if('Transfer' === $journal['transaction_type_type'])
<span class="bi bi-arrow-left-right" title="{{ trans('firefly.Deposit') }}"></span>
@endif
{% if journal.transaction_type_type == 'Reconciliation' %}
@if('Reconciliation' === $journal['transaction_type_type'])
<span class="bi bi-calculator" title="{{ trans('firefly.reconciliation_transaction') }}"></span>
@endif
{% if journal.transaction_type_type == 'Opening balance' %}
@if('Opening balance' === $journal['transaction_type_type'])
<span class="bi bi-star" title="{{ trans('firefly.Opening balance') }}"></span>
@endif
</td>
<td>
<a href="{{ route('transactions.show',journal.transaction_group_id) }}"
title="{{ journal.description }}">{{ journal.description }}</a>
<a href="{{ route('transactions.show',$journal['transaction_group_id']) }}"
title="{{ $journal['description'] }}">{{ $journal['description'] }}</a>
</td>
<td>
{% if journal.transaction_type_type == 'Deposit' %}
{!! format_amount_by_symbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places) }}
{% if null != journal.foreign_amount %}
({!! format_amount_by_symbol(journal.foreign_amount*-1, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places) }})
@if('Deposit' === $journal['transaction_type_type'])
{!! format_amount_by_symbol($journal['amount']*-1, $journal['currency_symbol'], $journal['currency_decimal_places']) !!}
@if(null !== $journal['foreign_amount'])
({!! format_amount_by_symbol($journal['foreign_amount']*-1, $journal['foreign_currency_symbol'], $journal['foreign_currency_decimal_places']) !!})
@endif
{% elseif journal.transaction_type_type == 'Transfer' %}
<span class="text-info money-transfer">{!! format_amount_by_symbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places, false) }}
{% if null != journal.foreign_amount %}
({!! format_amount_by_symbol(journal.foreign_amount*-1, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places, false) }})
@elseif($journal['transaction_type_type'] === 'Transfer')
<span class="text-info money-transfer">{!! format_amount_by_symbol($journal['amount']*-1, $journal['currency_symbol'], $journal['currency_decimal_places'], false) !!}
@if(null !== $journal['foreign_amount'])
({!! format_amount_by_symbol($journal['foreign_amount']*-1, $journal['foreign_currency_symbol'], $journal['foreign_currency_decimal_places'], false) !!})
@endif
</span>
@else
{!! format_amount_by_symbol(journal.amount, journal.currency_symbol, journal.currency_decimal_places) }}
{% if null != journal.foreign_amount %}
({!! format_amount_by_symbol(journal.foreign_amount, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places) }})
{!! format_amount_by_symbol($journal['amount'], $journal['currency_symbol'], $journal['currency_decimal_places']) !!}
@if(null !== $journal['foreign_amount'])
({!! format_amount_by_symbol($journal['foreign_amount'], $journal['foreign_currency_symbol'], $journal['foreign_currency_decimal_places']) !!})
@endif
@endif
</td>
<td>
{{ journal.date.isoFormat($monthAndDayFormat) }}
{{ $journal['date']->isoFormat($monthAndDayFormat) }}
</td>
<td>
<a href="{{ route('accounts.show', [journal.source_account_id]) }}"
title="{{ journal.source_account_iban|default(journal.source_account_name) }}">{{ journal.source_account_name }}</a>
<a href="{{ route('accounts.show', [$journal['source_account_id']]) }}"
title="{{ $journal['source_account_iban'] ?? $journal['source_account_name'] }}">{{ $journal['source_account_name'] }}</a>
</td>
<td>
<a href="{{ route('accounts.show', [journal.destination_account_id]) }}"
title="{{ journal.destination_account_iban|default(journal.destination_account_name) }}">{{ journal.destination_account_name }}</a>
<a href="{{ route('accounts.show', [$journal['destination_account_id']]) }}"
title="{{ $journal['destination_account_iban'] ?? $journal['destination_account_name'] }}">{{ $journal['destination_account_name'] }}</a>
</td>
</tr>
@endforeach
</table>
</div>
<div class="card-footer">
<input type="submit" name="submit" value="{{ trans('form.delete_all_permanently') }}" class="btn btn-danger text-end"/>
<div class="card-footer text-end">
<input type="submit" name="submit" value="{{ trans('form.delete_all_permanently') }}" class="btn btn-danger"/>
<a href="{{ route('index') }}" class="btn-outline-secondary btn">{{ trans('form.cancel') }}</a>
</div>
</div>
@@ -107,3 +102,6 @@
</div>
</form>
@endsection
@section('scripts')
@vite(['js/pages/generic.js'])
@endsection
@@ -7,12 +7,12 @@
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="card mb-2">
<div class="card-header">
<h3 class="card-title">{{ 'mass_edit_journals'|_ }}</h3>
<h3 class="card-title">{{ __('firefly.mass_edit_journals') }}</h3>
</div>
<div class="card-body">
<p>
{{ 'cannot_edit_other_fields'|_ }}
<span class="text-danger">{{ 'cannot_change_amount_reconciled'|_ }}</span>
{{ __('firefly.cannot_edit_other_fields') }}
<span class="text-danger">{{ __('firefly.cannot_change_amount_reconciled') }}</span>
</p>
<table class="table table-striped table-sm">
@@ -26,138 +26,135 @@
<th class="col-lg-2 col-md-2 col-sm-2">{{ trans('list.category') }}</th>
<th class="col-lg-2 col-md-2 col-sm-2">{{ trans('list.budget') }}</th>
</tr>
{% for journal in journals %}
@foreach($journals as $journal)
<tr>
<td>
{{-- LINK TO EDIT FORM --}}
<a href="{{ route('transactions.edit', journal.transaction_group_id) }}" class="btn btn-xs btn-outline-secondary"><span
<a href="{{ route('transactions.edit', $journal['transaction_group_id']) }}" class="btn btn-xs btn-outline-secondary"><span
class="bi bi-pencil"></span></a>
<input type="hidden" name="journals[]" value="{{ journal.transaction_journal_id }}"/>
<input type="hidden" name="journals[]" value="{{ $journal['transaction_journal_id'] }}"/>
</td>
<td>
{{-- DESCRIPTION --}}
<input class="form-control input-sm" autocomplete="off"
placeholder="{{ journal.description }}" name="description[{{ journal.transaction_journal_id }}]"
type="text" value="{{ journal.description }}">
placeholder="{{ $journal['description'] }}" name="description[{{ $journal['transaction_journal_id'] }}]"
type="text" value="{{ $journal['description'] }}">
</td>
{{-- AMOUNT --}}
<td>
{% if journal.reconciled == false %}
@if(false === $journal['reconciled'])
<div class="input-group input-group-sm">
<span class="input-group-addon">{{ journal.currency_symbol }}</span>
<input name="amount[{{ journal.transaction_journal_id }}]" class="form-control" autocomplete="off"
step="any" type="number" value="{{ journal.amount }}">
<input type="hidden" name="transaction_currency_id[{{ journal.transaction_journal_id }}]"
value="{{ journal.currency_id }}">
<span class="input-group-addon">{{ $journal['currency_symbol'] }}</span>
<input name="amount[{{ $journal['transaction_journal_id'] }}]" class="form-control" autocomplete="off"
step="any" type="number" value="{{ $journal['amount'] }}">
<input type="hidden" name="transaction_currency_id[{{ $journal['transaction_journal_id'] }}]"
value="{{ $journal['currency_id'] }}">
</div>
{% if journal.foreign_amount %}
@if(null !== $journal['foreign_amount'])
{{-- insert foreign data --}}
<div class="input-group input-group-sm">
<span class="input-group-addon">{{ journal.foreign_currency_symbol }}</span>
<input name="foreign_amount[{{ journal.transaction_journal_id }}]" class="form-control" autocomplete="off"
step="any" type="number" value="{{ journal.foreign_amount }}">
<input type="hidden" name="foreign_currency_id[{{ journal.transaction_journal_id }}]"
value="{{ journal.foreign_currency_id }}">
<span class="input-group-addon">{{ $journal['foreign_currency_symbol'] }}</span>
<input name="foreign_amount[{{ $journal['transaction_journal_id'] }}]" class="form-control" autocomplete="off"
step="any" type="number" value="{{ $journal['foreign_amount'] }}">
<input type="hidden" name="foreign_currency_id[{{ $journal['transaction_journal_id'] }}]"
value="{{ $journal['foreign_currency_id'] }}">
</div>
@endif
@endif
<span class="text-sm">
{% if journal.reconciled != false %}
{% if journal.transaction_type_type == 'Deposit' %}
{!! format_amount_by_symbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places) }}
{% if null != journal.foreign_amount %}
({!! format_amount_by_symbol(journal.foreign_amount*-1, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places) }})
@endif
{% elseif journal.transaction_type_type == 'Transfer' %}
<span class="text-info money-transfer">
{!! format_amount_by_symbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places, false) }}
{% if null != journal.foreign_amount %}
({!! format_amount_by_symbol(journal.foreign_amount*-1, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places, false) }})
@if(false !== $journal['reconciled'])
@if('Deposit' === $journal['transaction_type_type'])
{!! format_amount_by_symbol($journal['amount']*-1, $journal['currency_symbol'], $journal['currency_decimal_places']) !!}
@if(null !== $journal['foreign_amount'])
({!! format_amount_by_symbol($journal['foreign_amount']*-1, $journal['foreign_currency_symbol'], $journal['foreign_currency_decimal_places']) !!})
@endif
@elseif('Transfer' === $journal['transaction_type_type'])
<span class="text-info money-transfer">
{!! format_amount_by_symbol($journal['amount']*-1, $journal['currency_symbol'], $journal['currency_decimal_places'], false) !!}
@if(null !== $journal['foreign_amount'])
({!! format_amount_by_symbol($journal['foreign_amount']*-1, $journal['foreign_currency_symbol'], $journal['foreign_currency_decimal_places'], false) !!})
@endif
</span>
@else
{!! format_amount_by_symbol(journal.amount, journal.currency_symbol, journal.currency_decimal_places) }}
{% if null != journal.foreign_amount %}
({!! format_amount_by_symbol(journal.foreign_amount, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places) }})
{!! format_amount_by_symbol($journal['amount'], $journal['currency_symbol'], $journal['currency_decimal_places'])!!}
@if(null !== $journal['foreign_amount'])
({!! format_amount_by_symbol($journal['foreign_amount'], $journal['foreign_currency_symbol'], $journal['foreign_currency_decimal_places']) !!})
@endif
@endif
@endif
</span>
</span>
</td>
<td>
{{-- DATE --}}
<input class="form-control input-sm" autocomplete="off"
name="date[{{ journal.transaction_journal_id }}]" type="datetime-local" value="{{ journal.date }}">
name="date[{{ $journal['transaction_journal_id'] }}]" type="datetime-local" value="{{ $journal['date'] }}">
</td>
<!-- {{ journal.transaction_type_type }} -->
<!-- Source: {{ journal.source_account_name }} ({{ journal.source_account_id }}) -->
<!-- Destination: {{ journal.destination_account_name }} ({{ journal.destination_account_id }}) -->
<!-- {{ $journal['transaction_type_type'] }} -->
<!-- Source: {{ $journal['source_account_name'] }} ({{ $journal['source_account_id'] }}) -->
<!-- Destination: {{ $journal['destination_account_name'] }} ({{ $journal['destination_account_id'] }}) -->
<td class="position-relative">
{% if journal.reconciled == true %}
<a href="{{ route('accounts.show', [journal.source_account_id]) }}">{{ journal.source_account_name }}</a>
@if(true === $journal['reconciled'])
<a href="{{ route('accounts.show', [$journal['source_account_id']]) }}">{{ $journal['source_account_name'] }}</a>
@endif
{% if journal.reconciled == false %}
@if(false === $journal['reconciled'])
{{-- SOURCE ACCOUNT ID FOR TRANSFER OR WITHDRAWAL --}}
{% if journal.transaction_type_type == 'Transfer' or journal.transaction_type_type == 'Withdrawal' %}
<select class="form-control input-sm" name="source_id[{{ journal.transaction_journal_id }}]">
{% for account in withdrawalSources %}
<option value="{{ account.id }}"{% if account.id == journal.source_account_id %} selected@endif
label="{{ account.name }}">{{ account.name }}</option>
@if($journal['transaction_type_type'] == 'Transfer' or $journal['transaction_type_type'] == 'Withdrawal')
<select class="form-control input-sm" name="source_id[{{ $journal['transaction_journal_id'] }}]">
@foreach($withdrawalSources as $account)
<option value="{{ $account->id }}" @if($account->id === $journal['source_account_id']) selected @endif
label="{{ $account->name }}">{{ $account->name }}</option>
@endforeach
</select>
@endif
{{-- SOURCE ACCOUNT NAME FOR DEPOSIT --}}
{% if journal.transaction_type_type == 'Deposit' %}
@if($journal['transaction_type_type'] == 'Deposit')
<input class="form-control input-sm" spellcheck="false"
placeholder="{% if journal.source_type != 'Cash account' %}{{ journal.source_account_name }}@endif"
placeholder="@if($journal['source_account_type'] !== 'Cash account'){{ $journal['source_account_name'] }}@endif"
autocomplete="off"
name="source_name[{{ journal.transaction_journal_id }}]" type="text"
value="{% if journal.source_type != 'Cash account' %}{{ journal.source_account_name }}@endif">
name="source_name[{{ $journal['transaction_journal_id'] }}]" type="text"
value="@if($journal['source_account_type'] !== 'Cash account'){{ $journal['source_account_name'] }}@endif">
@endif
@endif
</td>
<td class="position-relative">
{% if journal.reconciled == true %}
<a href="{{ route('accounts.show', [journal.destination_account_id]) }}">{{ journal.destination_account_name }}</a>
@if(true === $journal['reconciled'])
<a href="{{ route('accounts.show', [$journal['destination_account_id']]) }}">{{ $journal['destination_account_name'] }}</a>
@endif
{% if journal.reconciled == false %}
@if(false === $journal['reconciled'])
{{-- DESTINATION ACCOUNT NAME FOR TRANSFER AND DEPOSIT --}}
{% if journal.transaction_type_type == 'Transfer' or journal.transaction_type_type == 'Deposit' %}
<select class="form-control input-sm" name="destination_id[{{ journal.transaction_journal_id }}]">
{% for account in depositDestinations %}
<option value="{{ account.id }}"{% if account.id == journal.destination_account_id %} selected="selected"@endif
label="{{ account.name }}">{{ account.name }}</option>
@if($journal['transaction_type_type'] == 'Transfer' || $journal['transaction_type_type'] == 'Deposit')
<select class="form-control input-sm" name="destination_id[{{ $journal['transaction_journal_id'] }}]">
@foreach($depositDestinations as $account)
<option value="{{ $account->id }}" @if($account->id === $journal['destination_account_id']) selected="selected" @endif
label="{{ $account->name }}">{{ $account->name }}</option>
@endforeach
</select>
@endif
{{-- DESTINATION ACCOUNT NAME FOR WITHDRAWAL --}}
{% if journal.transaction_type_type == 'Withdrawal' %}
@if($journal['transaction_type_type'] === 'Withdrawal')
<input class="form-control input-sm" spellcheck="false"
placeholder="{% if journal.destination_type != 'Cash account' %}{{ journal.destination_account_name }}@endif"
name="destination_name[{{ journal.transaction_journal_id }}]" type="text" autocomplete="off"
value="{% if journal.destination_type != 'Cash account' %}{{ journal.destination_account_name }}@endif">
placeholder="@if($journal['destination_type'] !== 'Cash account'){{ $journal['destination_account_name'] }}@endif"
name="destination_name[{{ $journal['transaction_journal_id'] }}]" type="text" autocomplete="off"
value="@if($journal['destination_type'] !== 'Cash account'){{ $journal['destination_account_name'] }}@endif">
@endif
@endif
</td>
{{-- category --}}
<td class="position-relative">
<input class="form-control input-sm" placeholder="{{ journal['category_name'] }}" autocomplete="off" spellcheck="false"
name="category[{{ journal.transaction_journal_id }}]" type="text" value="{{ journal['category_name'] }}">
<input class="form-control input-sm" placeholder="{{ $journal['category_name'] }}" autocomplete="off" spellcheck="false"
name="category[{{ $journal['transaction_journal_id'] }}]" type="text" value="{{ $journal['category_name'] }}">
</td>
{{-- budget --}}
<td>
{% if journal.transaction_type_type == 'Withdrawal' %}
<select class="form-control input-sm" name="budget_id[{{ journal.transaction_journal_id }}]">
@if($journal['transaction_type_type'] === 'Withdrawal')
<select class="form-control input-sm" name="budget_id[{{ $journal['transaction_journal_id'] }}]">
<option value="0" label="({{ __('firefly.no_budget') }})"
{% if journal.budget_id == 0 %}selected="selected"@endif
>{{ __('firefly.no_budget') }}
</option>
{% for budget in budgets %}
<option value="{{ budget.id }}"{% if budget.id == journal.budget_id %} selected="selected"@endif
label="{{ budget.name }}">{{ budget.name }}</option>
@if($journal['budget_id'] === 0) selected="selected" @endif>{{ __('firefly.no_budget') }}</option>
@foreach($budgets as $budget)
<option value="{{ $budget->id }}"@if($budget->id === $journal['budget_id']) selected="selected"@endif
label="{{ $budget->name }}">{{ $budget->name }}</option>
@endforeach
</select>
@endif
@@ -176,6 +173,7 @@
</form>
@endsection
@section('scripts')
@vite(['js/pages/generic.js'])
<script type="text/javascript" nonce="{{ $JS_NONCE }}">
var what = "";
</script>
@@ -183,3 +181,6 @@
<script type="text/javascript" src="v1/js/ff/common/autocomplete.js?v={{ $FF_BUILD_TIME }}" nonce="{{ $JS_NONCE }}"></script>
<script type="text/javascript" src="v1/js/ff/transactions/mass/edit.js?v={{ $FF_BUILD_TIME }}" nonce="{{ $JS_NONCE }}"></script>
@endsection
@section('scripts')
@vite(['js/pages/generic.js'])
@endsection
@@ -1,18 +1,13 @@
@extends('layout.v3.session')
{{ Breadcrumbs.render(Route.getCurrentRoute.getName, journal) }}
@endsection
@section('content')
<form method="POST" action="{{ route('transactions.destroy',journal.id) }}" accept-charset="UTF-8" class="form-horizontal" id="destroy">
<form method="POST" action="{{ route('transactions.destroy', [$journal->id]) }}" accept-charset="UTF-8" class="form-horizontal" id="destroy">
<input name="_token" type="hidden" value="{{ csrf_token() }}">
<div class="row">
<div class="col-lg-6 offset-lg-3 col-md-6 col-sm-12">
<div class="card card-danger card-outline">
<div class="card-header">
<h3 class="card-title">{{ trans('form.delete_journal', {'description': journal.description}) }}</h3>
<h3 class="card-title">{{ trans('form.delete_journal', ['description' => $journal->description]) }}</h3>
</div>
<div class="card-body">
<p class="text-danger">
@@ -20,18 +15,18 @@
</p>
<p>
{{ trans('form.journal_areYouSure', {'description': journal.description}) }}
{{ trans('form.journal_areYouSure', ['description' => $journal->description]) }}
</p>
</div>
<div class="card-footer">
<input type="submit" name="submit" value="{{ trans('form.deletePermanently') }}" class="btn btn-danger text-end"/>
{% if journal.transactiontype.type == 'Withdrawal' %}
<div class="card-footer text-end">
<input type="submit" name="submit" value="{{ trans('form.deletePermanently') }}" class="btn btn-danger"/>
@if('Withdrawal' === $journal->transaction_type_type)
<a href="{{ route('transactions.index','withdrawal') }}" class="btn-outline-secondary btn">{{ trans('form.cancel') }}</a>
@endif
{% if journal.transactiontype.type == 'Deposit' %}
@if('Deposit' === $journal->transaction_type_type)
<a href="{{ route('transactions.index','deposit') }}" class="btn-outline-secondary btn">{{ trans('form.cancel') }}</a>
@endif
{% if journal.transactiontype.type == 'Transfer' %}
@if('Transfer' === $journal->transaction_type_type)
<a href="{{ route('transactions.index','transfers') }}" class="btn-outline-secondary btn">{{ trans('form.cancel') }}</a>
@endif
</div>
@@ -41,3 +36,6 @@
</form>
@endsection
@section('scripts')
@vite(['js/pages/generic.js'])
@endsection
-118
View File
@@ -1,118 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<base href="{{ route('index') }}/">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Firefly III v{{ config('firefly.version') }} - {{ 'authorization'|_ }}</title>
{{-- CSS things --}}
{{-- libraries --}}
<link href="v1/lib/bs/css/bootstrap.min.css?v={{ $FF_BUILD_TIME }}" rel="stylesheet" type="text/css"
nonce="{{ $JS_NONCE }}">
<link href="v1/lib/fa/css/font-awesome.min.css?v={{ $FF_BUILD_TIME }}" rel="stylesheet" type="text/css"
nonce="{{ $JS_NONCE }}">
{{-- the theme --}}
<link href="v1/lib/adminlte/css/AdminLTE.min.css?v={{ $FF_BUILD_TIME }}" rel="stylesheet" type="text/css"
nonce="{{ $JS_NONCE }}">
{{-- Firefly III customisations --}}
<link href="v1/css/firefly.css?v={{ $FF_BUILD_TIME }}" rel="stylesheet" type="text/css" nonce="{{ $JS_NONCE }}">
<style>
.passport-authorize .container {
margin-top: 30px;
}
.passport-authorize .scopes {
margin-top: 20px;
}
.passport-authorize .buttons {
margin-top: 25px;
text-align: center;
}
.passport-authorize .btn {
width: 125px;
}
.passport-authorize .btn-approve {
margin-right: 15px;
}
.passport-authorize form {
display: inline;
}
</style>
</head>
<body class="passport-authorize">
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<div class="panel panel-default">
<div class="panel-heading">
{{ trans('firefly.authorization_request', {version: config('firefly.version')}) }}
</div>
<div class="panel-body">
{% if client.user.id == user.id %}
<p>
{{ trans('firefly.authorization_request_intro', {client: client.name|escape})|raw }}
</p>
<p>
{{ trans('firefly.authorization_request_site', {url: client.redirect|phphost})|raw }}
</p>
@endif
{% if client.user.id != user.id %}
<p class="text-danger">
{{ 'authorization_request_invalid'|_ }}
</p>
@endif
<!-- Scope List -->
{% if scopes|length > 0 %}
<div class="scopes">
<p><strong>{{ 'scopes_will_be_able'|_ }}</strong></p>
<ul>
{% for scope in scopes %}
<li>{{ scope.description }}</li>
@endforeach
</ul>
</div>
@endif
<div class="buttons">
<!-- Authorize Button -->
{% if client.user.id == user.id %}
<form method="post" action="{{ route('index') }}/oauth/authorize">
{{ csrf_field() }}
<input type="hidden" name="state" value="{{ request.state }}">
<input type="hidden" name="client_id" value="{{ client.id }}">
<button type="submit"
class="btn btn-success btn-approve">{{ 'button_authorize'|_ }}</button>
</form>
@endif
<!-- Cancel Button -->
<form method="post" action="{{ route('index') }}/oauth/authorize">
{{ csrf_field() }}
{{ method_field('DELETE') }}
<input type="hidden" name="state" value="{{ request.state }}">
<input type="hidden" name="client_id" value="{{ client.id }}">
<button class="btn btn-danger">{{ 'cancel'|_ }}</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
+237 -7
View File
@@ -1,14 +1,244 @@
{% set VUE_SCRIPT_NAME = 'webhooks/show' %}
@extends('layout.v3.session')
{{ Breadcrumbs.render(Route.getCurrentRoute.getName, webhook) }}
@endsection
@section('content')
<div id="webhooks_show"></div>
<div>
<template x-if="success_message !== ''">
<div class="row">
<div class="col-lg-12">
<div class="alert alert-success alert-dismissible" role="alert">
<button class="close" data-dismiss="alert" type="button" aria-label="{{ __('firefly.close') }}"><span aria-hidden="true">&times;</span></button>
<strong>{{ __("firefly.flash_success") }}</strong> <span x-html="success_message"></span>
</div>
</div>
</div>
</template>
<div class="row">
<div class="col-lg-6">
<div class="card">
<div class="card-header">
<h3 class="box-title"><span x-text="title"></span></h3>
</div>
<div class="card-body p-0">
<table class="table table-hover" aria-label="A table">
<tbody>
<tr>
<td style="width:40%;"><strong>{{ __('list.title') }}</strong></td>
<td><span x-text="title"></span></td>
</tr>
<tr>
<td style="width:40%;"><strong>{{ __('list.active') }}</strong></td>
<td>
<em class="fa fa-check text-success" v-if="active"></em>
<em class="fa fa-times text-danger" v-if="!active"></em>
</td>
</tr>
<tr>
<td style="width:40%;"><strong>{{ __('list.trigger') }}</strong></td>
<td>
<span v-for="trigger in triggers" :key="trigger">
{{ __('firefly.webhook_trigger_' + trigger) }}<br>
</span>
</td>
</tr>
<tr>
<td style="width:40%;"><strong>{{ __('list.response') }}</strong></td>
<td>
<span v-for="response in responses" :key="response">
{{ __('firefly.webhook_response_' + response) }}
</span>
</td>
</tr>
<tr>
<td style="width:40%;"><strong>{{ __('list.delivery') }}</strong></td>
<td>
<span v-for="delivery in deliveries" :key="delivery">
{{ __('firefly.webhook_delivery_' + delivery) }}
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="box-footer">
<div class="btn-group pull-right">
<a :href=edit_url class="btn btn-default"><em class="fa fa-pencil"></em> {{ __('firefly.edit') }}</a>
<a id="triggerButton" v-if="active" href="#" @click="submitTest" :class="disabledTrigger ? 'btn btn-default disabled ' : 'btn btn-default'"><em
class="fa fa-bolt"></em>
{{ __('list.trigger') }}
</a>
<a :href=delete_url class="btn btn-danger"><em class="fa fa-trash"></em> {{ __('firefly.delete') }}</a>
</div>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ __('firefly.meta_data') }}</h3>
</div>
<div class="card-body p-0">
<table class="table table-hover" aria-label="A table">
<tbody>
<tr>
<td style="width:40%;"><strong>{{ __('list.url') }}</strong></td>
<td><input type="text" readonly class="form-control" :value=url></td>
</tr>
<tr>
<td style="width:40%;"><strong>
{{ __('list.secret') }}
</strong>
</td>
<td>
<em style="cursor:pointer"
v-if="show_secret" class="fa fa-eye" @click="toggleSecret"></em>
<em style="cursor:pointer"
v-if="!show_secret" class="fa fa-eye-slash" @click="toggleSecret"></em>
<code v-if="show_secret">{{ secret }}</code>
<code v-if="!show_secret">********</code>
</td>
</tr>
</tbody>
</table>
</div>
<div class="box-footer">
<a :href=url class="btn btn-default">
<em class="fa fa-globe-europe"></em> {{ __('firefly.visit_webhook_url') }}
</a>
<a @click="resetSecret" class="btn btn-default">
<em class="fa fa-lock"></em> {{ __('firefly.reset_webhook_secret') }}
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{{ __('firefly.webhook_messages') }}</h3>
</div>
<div class="box-body" v-if="messages.length === 0 && !loading">
<p>
{{ __('firefly.no_webhook_messages') }}
</p>
</div>
<div class="box-body" v-if="loading">
<p class="text-center">
<em class="fa fa-spin fa-spinner"></em>
</p>
</div>
<div class="card-body p-0" v-if="messages.length > 0 && !loading">
<table class="table table-hover" aria-label="A table">
<thead>
<tr>
<th>
Date and time
</th>
<th>
UID
</th>
<th>
Success?
</th>
<th>
More details
</th>
</tr>
</thead>
<tbody>
<tr v-for="message in messages">
<td>
{{ message.created_at }}
</td>
<td>
{{ message.uuid }}
</td>
<td>
<em class="fa fa-check text-success" v-if="message.success"></em>
<em class="fa fa-times text-danger" v-if="!message.success"></em>
</td>
<td>
<a @click="showWebhookMessage(message.id)" class="btn btn-default">
<em class="fa fa-envelope"></em>
{{ __('firefly.view_message') }}
</a>
<a @click="showWebhookAttempts(message.id)" class="btn btn-default">
<em class="fa fa-cloud-upload"></em>
{{ __('firefly.view_attempts') }}
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- modal for message content -->
<div class="modal fade" id="messageModal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">{{ __('firefly.message_content_title') }}</h4>
</div>
<div class="modal-body">
<p>
{{ __('firefly.message_content_help') }}
</p>
<textarea class="form-control" rows="10" readonly>{{ message_content }}</textarea>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ __('firefly.close') }}</button>
</div>
</div>
</div>
</div>
<!-- modal for message attempts -->
<div class="modal fade" id="attemptModal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">{{ __('firefly.attempt_content_title') }}</h4>
</div>
<div class="modal-body">
<p>
{{ __('firefly.attempt_content_help') }}
</p>
<p v-if="0===message_attempts.length">
<em>
{{ __('firefly.no_attempts') }}
</em>
</p>
<div v-for="message in message_attempts" style="border:1px #eee solid;margin-bottom:0.5em;">
<strong>
{{ __('firefly.webhook_attempt_at', {moment: message.created_at}) }}
<span class="text-danger">({{ message.status_code }})</span>
</strong>
<p>
{{ __('firefly.logs') }}: <br/>
<textarea class="form-control" rows="5" readonly>{{ message.logs }}</textarea>
</p>
<p v-if="null !== message.response">
{{ __('firefly.response') }}: <br/>
<textarea class="form-control" rows="5" readonly>{{ message.response }}</textarea>
</p>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ __('firefly.close') }}</button>
</div>
</div>
</div>
</div>
</div>
@endsection
@section('scripts')
<script type="text/javascript" nonce="{{ $JS_NONCE }}">
var previousUrl = '{{ previousUrl }}';
var previousUrl = '{{ $previousUrl ?? '' }}';
</script>
@endsection