diff --git a/package-lock.json b/package-lock.json index 2bef613fb334e7f717a705d0ce8f0818659dd941..207776b2f9f10c6bd3f12596dda88f919d0a4eb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,9 @@ "@aws-sdk/client-s3": "<3.530.0", "@aws-sdk/lib-storage": "<3.530.0", "@aws-sdk/s3-request-presigner": "<3.530.0", - "@fortawesome/fontawesome-free": "~6.5.0", + "@fortawesome/fontawesome-free": "~6.6.0", "@popperjs/core": "~2.11.8", - "ajv": "~8.16.0", + "ajv": "~8.17.0", "bootstrap": "~5.3.0", "chart.js": "~4.4.0", "chartjs-plugin-zoom": "~2.0.1", @@ -929,9 +929,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1470,10 +1470,9 @@ } }, "node_modules/@fortawesome/fontawesome-free": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.2.tgz", - "integrity": "sha512-hRILoInAx8GNT5IMkrtIt9blOdrqHOnPBH+k70aWUAqPZPgopb9G5EQJFpaBx/S8zp2fC+mPW349Bziuk1o28Q==", - "hasInstallScript": true, + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.6.0.tgz", + "integrity": "sha512-60G28ke/sXdtS9KZCpZSHHkCbdsOGEhIUGlwq6yhY74UpTiToIh8np7A8yphhM4BWsvNFtIvLpi4co+h9Mr9Ow==", "engines": { "node": ">=6" } @@ -2495,9 +2494,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2528,16 +2527,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz", - "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", + "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.16.0", - "@typescript-eslint/type-utils": "7.16.0", - "@typescript-eslint/utils": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/type-utils": "7.16.1", + "@typescript-eslint/utils": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2561,15 +2560,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz", - "integrity": "sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz", + "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.16.0", - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/typescript-estree": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/typescript-estree": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", "debug": "^4.3.4" }, "engines": { @@ -2589,13 +2588,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz", - "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz", + "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0" + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2606,13 +2605,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz", - "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", + "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.16.0", - "@typescript-eslint/utils": "7.16.0", + "@typescript-eslint/typescript-estree": "7.16.1", + "@typescript-eslint/utils": "7.16.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2633,9 +2632,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz", - "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", + "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2646,13 +2645,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz", - "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", + "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/visitor-keys": "7.16.0", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2674,15 +2673,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz", - "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", + "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.16.0", - "@typescript-eslint/types": "7.16.0", - "@typescript-eslint/typescript-estree": "7.16.0" + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/typescript-estree": "7.16.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2696,12 +2695,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz", - "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==", + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz", + "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/types": "7.16.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -2732,38 +2731,38 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.0-alpha.15", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.15.tgz", - "integrity": "sha512-mt8z4Fm2WxfQYoQHPcKVjLQV6PgPqyKLbkCVY2cr5RSaamqCHjhKEpsFX66aL4D/7oYguuaUw9Bx03Vt0TpIIA==", + "version": "2.4.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.16.tgz", + "integrity": "sha512-oOTnIZlx0P/idFwVw+W0NbzKDtZAQMzXSdIFfTePCKcXlb4Ys12GaGkx8NF9dsvPYV3nbv3ZsSxnkZWBmNKd7A==", "dev": true, "dependencies": { - "@volar/source-map": "2.4.0-alpha.15" + "@volar/source-map": "2.4.0-alpha.16" } }, "node_modules/@volar/source-map": { - "version": "2.4.0-alpha.15", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.15.tgz", - "integrity": "sha512-8Htngw5TmBY4L3ClDqBGyfLhsB8EmoEXUH1xydyEtEoK0O6NX5ur4Jw8jgvscTlwzizyl/wsN1vn0cQXVbbXYg==", + "version": "2.4.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.16.tgz", + "integrity": "sha512-sL9vNG7iR2hiKZor7UkD5Sufu3QCia4cbp2gX/nGRNSdaPbhOpdAoavwlBm0PrVkpiA19NZuavZoobD8krviFg==", "dev": true }, "node_modules/@volar/typescript": { - "version": "2.4.0-alpha.15", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.15.tgz", - "integrity": "sha512-U3StRBbDuxV6Woa4hvGS4kz3XcOzrWUKgFdEFN+ba1x3eaYg7+ytau8ul05xgA+UNGLXXsKur7fTUhDFyISk0w==", + "version": "2.4.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.16.tgz", + "integrity": "sha512-WCx7z5O81McCQp2cC0c8081y+MgTiAR2WAiJjVL4tr4Qh4GgqK0lgn3CqAjcKizaK1R5y3wfrUqgIYr+QeFYcw==", "dev": true, "dependencies": { - "@volar/language-core": "2.4.0-alpha.15", + "@volar/language-core": "2.4.0-alpha.16", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "node_modules/@vue/compiler-core": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", - "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.32.tgz", + "integrity": "sha512-8tCVWkkLe/QCWIsrIvExUGnhYCAOroUs5dzhSoKL5w4MJS8uIYiou+pOPSVIOALOQ80B0jBs+Ri+kd5+MBnCDw==", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.31", + "@vue/shared": "3.4.32", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" @@ -2775,27 +2774,27 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "node_modules/@vue/compiler-dom": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", - "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.32.tgz", + "integrity": "sha512-PbSgt9KuYo4fyb90dynuPc0XFTfFPs3sCTbPLOLlo+PrUESW1gn/NjSsUvhR+mI2AmmEzexwYMxbHDldxSOr2A==", "dependencies": { - "@vue/compiler-core": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-core": "3.4.32", + "@vue/shared": "3.4.32" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", - "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.32.tgz", + "integrity": "sha512-STy9im/WHfaguJnfKjjVpMHukxHUrOKjm2vVCxiojQJyo3Sb6Os8SMXBr/MI+ekpstEGkDONfqAQoSbZhspLYw==", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.31", - "@vue/compiler-dom": "3.4.31", - "@vue/compiler-ssr": "3.4.31", - "@vue/shared": "3.4.31", + "@vue/compiler-core": "3.4.32", + "@vue/compiler-dom": "3.4.32", + "@vue/compiler-ssr": "3.4.32", + "@vue/shared": "3.4.32", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", - "postcss": "^8.4.38", + "postcss": "^8.4.39", "source-map-js": "^1.2.0" } }, @@ -2813,12 +2812,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", - "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.32.tgz", + "integrity": "sha512-nyu/txTecF6DrxLrpLcI34xutrvZPtHPBj9yRoPxstIquxeeyywXpYZrQMsIeDfBhlw1abJb9CbbyZvDw2kjdg==", "dependencies": { - "@vue/compiler-dom": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-dom": "3.4.32", + "@vue/shared": "3.4.32" } }, "node_modules/@vue/devtools-api": { @@ -2889,49 +2888,49 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", - "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.32.tgz", + "integrity": "sha512-1P7QvghAzhSIWmiNmh4MNkLVjr2QTNDcFv2sKmytEWhR6t7BZzNicgm5ENER4uU++wbWxgRh/pSEYgdI3MDcvg==", "dependencies": { - "@vue/shared": "3.4.31" + "@vue/shared": "3.4.32" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", - "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.32.tgz", + "integrity": "sha512-FxT2dTHUs1Hki8Ui/B1Hu339mx4H5kRJooqrNM32tGUHBPStJxwMzLIRbeGO/B1NMplU4Pg9fwOqrJtrOzkdfA==", "dependencies": { - "@vue/reactivity": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/reactivity": "3.4.32", + "@vue/shared": "3.4.32" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", - "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.32.tgz", + "integrity": "sha512-Xz9G+ZViRyPFQtRBCPFkhMzKn454ihCPMKUiacNaUhuTIXvyfkAq8l89IZ/kegFVyw/7KkJGRGqYdEZrf27Xsg==", "dependencies": { - "@vue/reactivity": "3.4.31", - "@vue/runtime-core": "3.4.31", - "@vue/shared": "3.4.31", + "@vue/reactivity": "3.4.32", + "@vue/runtime-core": "3.4.32", + "@vue/shared": "3.4.32", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", - "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.32.tgz", + "integrity": "sha512-3c4rd0522Ao8hKjzgmUAbcjv2mBnvnw0Ld2f8HOMCuWJZjYie/p8cpIoYJbeP0VV2JYmrJJMwGQDO5RH4iQ30A==", "dependencies": { - "@vue/compiler-ssr": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-ssr": "3.4.32", + "@vue/shared": "3.4.32" }, "peerDependencies": { - "vue": "3.4.31" + "vue": "3.4.32" } }, "node_modules/@vue/shared": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", - "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==" + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.32.tgz", + "integrity": "sha512-ep4mF1IVnX/pYaNwxwOpJHyBtOMKWoKZMbnUyd+z0udqIxLUh7YCCd/JfDna8aUrmnG9SFORyIq2HzEATRrQsg==" }, "node_modules/@vue/tsconfig": { "version": "0.5.1", @@ -2961,14 +2960,14 @@ } }, "node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -3441,9 +3440,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", - "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", + "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==" }, "node_modules/de-indent": { "version": "1.0.2", @@ -3810,13 +3809,13 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "synckit": "^0.9.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -4057,6 +4056,11 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" + }, "node_modules/fast-xml-parser": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", @@ -4737,9 +4741,9 @@ } }, "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, "dependencies": { "hasown": "^2.0.2" @@ -5726,9 +5730,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -5748,9 +5752,9 @@ } }, "node_modules/prettier": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", - "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -5784,6 +5788,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -6080,9 +6085,9 @@ } }, "node_modules/sass": { - "version": "1.77.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.7.tgz", - "integrity": "sha512-9ywH75cO+rLjbrZ6en3Gp8qAMwPGBapFtlsMJoDTkcMU/bSe5a6cjKVUn5Jr4Gzg5GbP3HE8cm+02pLCgcoMow==", + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", + "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -6097,9 +6102,9 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -6427,9 +6432,9 @@ } }, "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, "dependencies": { "@pkgr/core": "^0.1.0", @@ -6588,9 +6593,9 @@ } }, "node_modules/uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.0.tgz", + "integrity": "sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==", "dev": true, "optional": true, "bin": { @@ -6634,6 +6639,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -6666,9 +6672,9 @@ } }, "node_modules/vite": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", - "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", "dev": true, "dependencies": { "esbuild": "^0.21.3", @@ -7133,15 +7139,15 @@ "dev": true }, "node_modules/vue": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", - "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", - "dependencies": { - "@vue/compiler-dom": "3.4.31", - "@vue/compiler-sfc": "3.4.31", - "@vue/runtime-dom": "3.4.31", - "@vue/server-renderer": "3.4.31", - "@vue/shared": "3.4.31" + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.32.tgz", + "integrity": "sha512-9mCGIAi/CAq7GtaLLLp2J92pEic+HArstG+pq6F+H7+/jB9a0Z7576n4Bh4k79/50L1cKMIhZC3MC0iGpl+1IA==", + "dependencies": { + "@vue/compiler-dom": "3.4.32", + "@vue/compiler-sfc": "3.4.32", + "@vue/runtime-dom": "3.4.32", + "@vue/server-renderer": "3.4.32", + "@vue/shared": "3.4.32" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index 9d3de222c264933b3fcf479e74fa9abdb3aec26c..b9272e11517960a56f89c3ad71a6af48b51c6520 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,9 @@ "@aws-sdk/client-s3": "<3.530.0", "@aws-sdk/lib-storage": "<3.530.0", "@aws-sdk/s3-request-presigner": "<3.530.0", - "@fortawesome/fontawesome-free": "~6.5.0", + "@fortawesome/fontawesome-free": "~6.6.0", "@popperjs/core": "~2.11.8", - "ajv": "~8.16.0", + "ajv": "~8.17.0", "bootstrap": "~5.3.0", "chart.js": "~4.4.0", "chartjs-plugin-zoom": "~2.0.1", diff --git a/src/assets/images/clowm.svg b/src/assets/images/clowm.svg index 4b8d5e55f504302fd08f32c1bd004699019e46e6..fb06b2d8745021804abf7fea813fe2370f06d244 100644 --- a/src/assets/images/clowm.svg +++ b/src/assets/images/clowm.svg @@ -1,70 +1,62 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> - <svg width="23.757999mm" height="23.757999mm" viewBox="0 0 23.758 23.757998" version="1.1" - id="svg5126" xmlns="http://www.w3.org/2000/svg"> - <g - id="layer1" transform="translate(-78.650696,-68.730968)"> <path - style="fill:none;fill-opacity:1;stroke:#4f4f4f;stroke-width:0.851766;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="m 90.554464,80.612424 -8.112762,1.426799" - id="path7807-9-7" - /> + fill="none" + stroke-width="0.85" + stroke="#4f4f4f"/> <path - style="fill:none;fill-opacity:1;stroke:#4f4f4f;stroke-width:0.851766;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="m 97.830538,77.453091 -7.276074,3.159333" - id="path7807-9" - /> + fill="none" + stroke-width="0.85" + stroke="#4f4f4f"/> <circle - style="fill:#0d6efd;fill-opacity:1;stroke:none;stroke-width:0.283922;stop-color:#000000" - id="path5738-5" + fill="#0d6efd" cx="97.868805" cy="77.424881" r="2.1244874"/> <path - style="fill:none;fill-opacity:1;stroke:#4f4f4f;stroke-width:0.851766;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="m 86.98483,73.171742 3.569634,7.440682" - id="path7807" - /> + fill="none" + stroke="#4f4f4f" + stroke-width="0.85"/> <path - style="fill:none;stroke:#4f4f4f;stroke-width:0.851766;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="m 82.4106,82.134057 c 1.648883,4.723585 6.971072,7.829186 12.763187,5.358027" - id="path9337" - /> + fill="none" + stroke-width="0.85" + stroke="#4f4f4f"/> <circle - style="fill:#0d6efd;fill-opacity:1;stroke:none;stroke-width:0.283922;stop-color:#000000" - id="path5738" + fill="#0d6efd" cx="86.98037" cy="73.195999" r="2.1244874"/> <circle - style="fill:#dc3545;fill-opacity:1;stroke:none;stroke-width:0.283922;stroke-opacity:1;stop-color:#000000" - id="path5738-7" cx="90.529472" + fill="#dc3545" cy="80.609749" r="3.2386508"/> <circle - style="fill:#198754;fill-opacity:1;stroke:none;stroke-width:0.283922;stop-color:#000000" - id="path5738-4" cx="82.418419" cy="82.049561" + fill="#198754" r="1.752311"/> <circle - style="fill:#198754;fill-opacity:1;stroke:none;stroke-width:0.283922;stop-color:#000000" - id="path5738-4-5" cx="95.175735" cy="87.50563" + fill="#198754" r="1.752311"/> <circle - style="fill:none;fill-opacity:1;stroke:#4f4f4f;stroke-width:0.567844;stroke-dasharray:none;stroke-opacity:1;stop-color:#000000" - id="path10954" cx="90.529472" + fill="none" + stroke="#4f4f4f" + stroke-width="0.57" cy="80.609749" r="11.594855"/> </g> diff --git a/src/client/models/WorkflowExecutionOut.ts b/src/client/models/WorkflowExecutionOut.ts index 514ea962aa479014f046a4c05032e37e3a865c45..26f3353269c9811c93699c09d64255f53bc6d9eb 100644 --- a/src/client/models/WorkflowExecutionOut.ts +++ b/src/client/models/WorkflowExecutionOut.ts @@ -52,5 +52,9 @@ export type WorkflowExecutionOut = { * S3 Path where debug information from Nextflow is saved. */ debug_s3_path?: (string | null); + /** + * The consumed cpu time in ISO 8601 format + */ + cpu_time: string; }; diff --git a/src/main.ts b/src/main.ts index 164d4be366b6bb36e1745367e78eb2e6492ae40e..93d3f605ccc9a163a1f854c3ff6a3635865543d9 100644 --- a/src/main.ts +++ b/src/main.ts @@ -55,7 +55,7 @@ if (environment.MATOMO_HOST && environment.MATOMO_SITE_ID) { app.use(VueMatomo, { host: environment.MATOMO_HOST, siteId: environment.MATOMO_SITE_ID, - disableCookies: true, + disableCookies: false, }); } diff --git a/src/views/ImprintView.vue b/src/views/ImprintView.vue index 4ea27c721e29b249c26fa880a6386a9f2517dd36..8a1d633fac9634c0be6307dae4286a383a96455a 100644 --- a/src/views/ImprintView.vue +++ b/src/views/ImprintView.vue @@ -1,10 +1,74 @@ <script setup lang="ts"></script> <template> - <div> - <h2>Impressum</h2> - <p>TBD</p> - </div> + <h2>Information according to §5 DDG (Digitale-Dienste-Gesetz)</h2> + <h3>Responsible for technical operations:</h3> + <p> + Computational Metagenomics Group & Genome Informatics Group<br /> + Bielefeld Institute for Bioinformatics infrastructure (BIBI)<br /> + Technische Fakultät<br /> + Universität Bielefeld<br /> + Universitätsstraße 25<br /> + 33615 Bielefeld + </p> + <p> + Represented by<br /> + Project Managers: Dr. Michael Beckstette and M.Sc. Daniel Göbel<br /> + Head of Institute: Prof. Dr. Jens Stoye<br /> + </p> + <h3>Responsible for the content:</h3> + <p> + Prof. Dr. Alexander Sczyrba<br /> + Forschungszentrum Jülich<br /> + c/o Centrum für Biotechnologie<br /> + Universität Bielefeld<br /> + 33594 Bielefeld + </p> + <p> + Institut für Bio- und Geowissenschaften (IBG)<br /> + IBG-5 - Computergestützte Metagenomik<br /> + Gebäude Außenstelle-Univ-Bielefeld / Raum M3.111 + </p> + <h2>Exclusion of liability (disclaimer)</h2> + <h3>Liability for content</h3> + <p> + As a service provider, we are responsible for our own content on these pages + in accordance with §7 para.1 TMG (Deutsches Telemediengesetz) and general + laws. According to §8 to 10 TMG, however, we as a service provider are not + obliged to monitor transmitted or stored third-party information or to + investigate circumstances that indicate illegal activity. Obligations to + remove or block the use of information in accordance with general + legislation remain unaffected by this. However, liability in this respect is + only possible from the time of knowledge of a specific infringement. As soon + as we become aware of such infringements, we will remove this content + immediately. + </p> + <h3>Liability for links</h3> + <p> + Our website contains links to external third-party websites over whose + content we have no influence. Therefore, we cannot accept any liability for + this third-party content. The respective provider or operator of the pages + is always responsible for the content of the linked pages. The linked pages + were checked for possible legal violations at the time of linking. Illegal + content was not recognizable at the time of linking. However, permanent + monitoring of the content of the linked pages is not reasonable without + concrete evidence of an infringement. If we become aware of any legal + infringements, we will remove such links immediately. + </p> + <h2>Copyright</h2> + <p> + The content and works created by the site operators on these pages are + subject to German copyright law. Duplication, processing, distribution and + any form of commercialization of such material beyond the scope of the + copyright law shall require the prior written consent of its respective + author or creator. Downloads and copies of this site are only permitted for + private, non-commercial use. Insofar as the content on this site was not + created by the operator, the copyrights of third parties are respected. In + particular, third-party content is identified as such. Should you + nevertheless become aware of a copyright infringement, please inform us + accordingly. If we become aware of any infringements, we will remove such + content immediately. + </p> </template> <style scoped></style> diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index ffa889c489c09ad561b152639e2f2ee80c571eaa..ab2ed19cefad6185a579fa78f566632a868e49b5 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -97,6 +97,13 @@ onMounted(() => { style="max-height: 70px" /> </a> + <div class="mt-2"> + By using this service you agree to our + <router-link :to="{ name: 'terms' }">terms of usage</router-link> + and + <router-link :to="{ name: 'privacy' }">privacy policy </router-link> + . + </div> </div> </div> </div> diff --git a/src/views/PrivacyPolicyView.vue b/src/views/PrivacyPolicyView.vue index d6d98a1c69edaf5059c27eba691bdcb7846bac31..8de50113bc15bef9a49136b95d25ed39f42c5e9f 100644 --- a/src/views/PrivacyPolicyView.vue +++ b/src/views/PrivacyPolicyView.vue @@ -1,9 +1,283 @@ -<script setup lang="ts"></script> +<script setup lang="ts"> +import { onMounted } from "vue"; +import { environment } from "@/environment"; + +onMounted(() => { + if (environment.MATOMO_HOST) { + const matomoScript = document.createElement("script"); + matomoScript.setAttribute( + "src", + `${environment.MATOMO_HOST}/index.php?module=CoreAdminHome&action=optOutJS&divId=matomo-opt-out&language=auto&showIntro=1`, + ); + document.head.appendChild(matomoScript); + } +}); +</script> <template> <div> - <h2>Privacy Policy</h2> - <p>TBD</p> + <h2>Privacy Notice</h2> + <h3>1. General information on data processing and data protection</h3> + <p> + The operators of this website take the protection of your personal data + very seriously. This privacy policy informs you as a visitor to our + website about the processing of personal data. We collect and use personal + data of our users only insofar as this is necessary to provide a + functional website and our content and services and a legal basis allows + us to do so or you have consented to the collection and always treat it + confidentially. With this privacy policy, we comply with the information + obligation pursuant to Article 13 of the EU General Data Protection + Regulation (EU GDPR). + </p> + <h3>2. Contact details of the responsible body</h3> + <p> + The technical provision (hosting) of the website is carried out in + cooperation with Bielefeld University at Bielefeld University, and can be + contacted as follows: + </p> + <p> + Universität Bielefeld<br /> + Universitätsstraße 25<br /> + D-33615 Bielefeld<br /> + Tel.: <a href="tel:+4952110600">+49521/106-00</a><br /> + <a href="mailto:post@uni-bielefeld.de">post@uni-bielefeld.de</a> + </p> + <h3>3. Data protection officer</h3> + <p> + You can contact the data protection officer of Bielefeld University by + post at the address of the controller given above or as follows: + </p> + <p> + E-Mail: + <a href="mailto:datenschutzbeauftragte@uni-bielefeld.de" + >datenschutzbeauftragte@uni-bielefeld.de</a + ><br /> + Tel.: <a href="tel:+495211065225">+49521 / 106 – 5225</a> + </p> + <h3>4. Purpose</h3> + <p> + The primary purpose of the Cloud based Workflow Manager (CloWM) is to + offer data analysis workflows as services to the scientific community. If + personal data is collected, this only includes the data required for + technical operation and log files to ensure the technical security of the + systems in accordance with Art. 6 para. 1 lit. f GDPR. The temporary + storage of the IP address by the system is necessary to enable the website + to be delivered to the user's computer. The data is stored in log files to + ensure the functionality of the website. In addition, we use the data to + optimize the website and to ensure the security of our information + technology systems. The data is not analyzed for marketing purposes in + this context. + </p> + <h3>5. Scope of data processing</h3> + <h4>5.1 Storage of browser data</h4> + <div class="py-1"> + As the provider of this website, we automatically collect and store + information in so-called server log files that your browser automatically + transmits to us each time you visit our website. The following data is + collected: + <ol> + <li>Information about the browser type and version used</li> + <li>The user's operating system</li> + <li>The user's internet service provider</li> + <li>The IP address of the user</li> + <li>Date and time of access</li> + <li>Websites from which the user's system accesses our website</li> + </ol> + The browser data is stored for a period of 14 days (log-rotation). + </div> + <h4>5.2 Use of cookies</h4> + <p> + Our website uses cookies. These are small files that your browser + automatically creates and that are stored on your end device (laptop, + tablet, smartphone, etc.) when you visit our website. Cookies do not cause + any damage to your end device and do not contain any viruses, Trojans or + other malware. We use cookies to make our website more user-friendly. The + data collected by these cookies is not used to create user profiles. + </p> + <p> + We use so-called session cookies to recognize that you have already + visited individual pages of our website. These cookies contain a + characteristic string of characters that enables the browser and the + associated session settings to be uniquely identified when the website is + called up again. They are automatically deleted after you leave our site + or when you end your session. + </p> + <p> + In addition, we use cross-site request forgery (CSRF) protection cookies + to increase the security of our website, which are stored on your end + device for a specified period of time. + </p> + <p> + Cookies are stored on the user's computer and transmitted by it to our + website. As a user, you therefore have full control over the use of + cookies. You can deactivate or restrict the transmission of cookies by + changing the settings in your Internet browser. Cookies that have already + been saved can be deleted at any time. This can also be done + automatically. If cookies are deactivated for our website, it may no + longer be possible to use all functions of the website to their full + extent. + </p> + <h4>5.3 Web analysis using Matomo</h4> + <p> + We use cookies to statistically record the use of our website and to + evaluate it for the purpose of optimizing our offer for you. This + subsection explains how we use the open source software Matomo for web + analysis in order to collect anonymized usage statistics. + </p> + <h5>5.3.1 What data is collected</h5> + <div class="py-1"> + When using Matomo, we collect the following anonymized data: + <ul> + <li>Your IP address (in anonymized form)</li> + <li>The pages accessed and their sequence</li> + <li>The time spent on the individual pages</li> + <li>The browser type and version used</li> + <li>The operating system</li> + <li>The country of origin</li> + <li>Date and time of access</li> + <li>Referring pages from which you accessed our website (referrer)</li> + </ul> + </div> + <h5>5.3.2 Anonymization of the data</h5> + <p> + Your IP address is immediately anonymized by Matomo so that no conclusions + can be drawn about your person. This is done by shortening the IP address + by the last two bytes (example: 192.168.100.123 becomes 192.168.0.0). As a + result, all data collected remains completely anonymous and cannot be + traced back to you. + </p> + <h5>5.3.3 Intended use of the data</h5> + <p> + We use Matomo exclusively to collect and analyze anonymized information + about the use of our website in order to measure its reach. Our focus here + is on statistically recording and continuously improving the use of our + website. Furthermore, lists and summaries of usage statistics derived from + this are reported to the Federal Ministry of Education and Research + (BMBF), as the web content offered is a service provided as part of a + BMBF-funded third-party project. The data is collected on the basis of + Art. 6 para. 1 lit. f GDPR. In doing so, we are pursuing our legitimate + interest in optimizing our website and reporting to funding bodies. + </p> + <h5>5.3.4 Storage and deletion of data</h5> + <p> + The Matomo instance we use is provided by the Center for Biotechnology - + CeBiTec at Bielefeld University as a service within the framework of the + de.NBI project. The collected and anonymized data are stored on CeBiTec's + servers and are not passed on to third parties or merged with other data + sources. They are only stored for as long as is necessary to achieve the + above-mentioned purposes. The data will be deleted as soon as it is no + longer required for the aforementioned purposes. + </p> + <h5>5.3.5 Matomo Cookies</h5> + <p> + Cookies are used to enable anonymous recognition of a user by the web + analysis software Matomo. The "_pk_id" cookie contains an anonymous unique + user ID with a validity of 13 months, the "_pk_ref" cookie contains the + referrer originally used to visit the website with a lifespan of 6 months + and the "_pk_ses" cookie, which is a short-lived cookie with a lifespan of + 30 minutes that temporarily stores the data of the website visit. Expiring + cookies are then deleted by your browser. The validity is renewed when you + visit the website again. Cross-site or cross-domain tracking does not take + place; the cookies are used exclusively in the context of this website and + to fulfill the above-mentioned purposes. + </p> + <h5>5.3.6 Your rights and option to object</h5> + <p> + As we do not collect any personal data using Matomo, you cannot assert any + rights against us with regard to information, correction, blocking or + deletion of this data. However, you have the option of objecting to the + collection by Matomo at any time. To do this, you can set an opt-out + cookie that prevents the future collection of your data on this website. + Please note that the opt-out cookie will be deleted if you delete all + cookies in your browser. In this case, you must set the opt-out cookie + again. Furthermore, data will not be collected by Matomo if you use the + browser in so-called anonymous mode. + </p> + <div id="matomo-opt-out"></div> + <h5>5.3.7 Contact for the technical provision of the Matomo service</h5> + <p> + Bioinformatics Resource Facility<br /> + Centrum für Biotechnologie (CeBiTec)<br /> + Universität Bielefeld<br /> + Universitätsstraße 25<br /> + 33615 Bielefeld + </p> + <p> + Represented by:<br /> + Group Leader: Dr. Stefan Albaum<br /> + Scientific director: Prof. Dr. Olaf Kruse<br /> + Management: Dr. Lutz Wobbe + </p> + <h3>6. Storage and deletion of data</h3> + <p> + Collected data is stored on the operator's servers and is not merged with + other data sources or passed on to third parties. They are only stored for + as long as is necessary to achieve the above-mentioned purposes. The data + will be deleted as soon as it is no longer required for the stated + purposes. + </p> + <p> + In individual cases, data may be passed on on the basis of legal + permission, for example, transmission to law enforcement authorities for + the investigation of criminal offenses under the provisions of the Code of + Criminal Procedure (StPO) or for the purpose of asserting claims for + damages in the event of copyright infringements. If technical service + providers are given access to personal data, this is done on the basis of + a contract in accordance with Art. 28 GDPR. + </p> + <h3>7. Your privacy rights</h3> + <div class="py-1"> + As a person, you can assert the rights granted to you by the EU GDPR at + any time: + <ul> + <li> + the right to information as to whether and which of your data is being + processed (Art. 15 EU GDPR), + </li> + <li> + the right to request the rectification or completion of data + concerning you (Art. 16 EU GDPR), + </li> + <li> + the right to erasure of the data concerning you in accordance with + Art. 17 EU GDPR, + </li> + <li> + the right to request the restriction of the processing of data in + accordance with Art. 18 EU GDPR, + </li> + <li> + the right to withdraw your consent at any time. This does not affect + the lawfulness of the processing carried out on the basis of the + consent until revocation (Art. 7 para. 3 EU GDPR), + </li> + <li> + the right to object to the future processing of data concerning you in + accordance with Art. 21 EU GDPR and + </li> + <li> + the right to lodge a complaint with the data protection supervisory + authority in accordance with Art. 77 EU GDPR. + </li> + </ul> + </div> + <h3>8. Validity of this privacy policy</h3> + <p>This privacy policy is currently valid and is dated 18.07.2024.</p> + <p> + Unless specified in more detail or formulated differently in this privacy + policy, the provisions of Bielefeld University's + <a + target="_blank" + href="https://www.uni-bielefeld.de/datenschutzhinweise/" + >privacy policy</a + > + apply. + </p> + <p> + Due to the further development of our website or due to changed legal or + official requirements, we reserve the right or it may become necessary to + change this privacy policy. + </p> </div> </template> diff --git a/src/views/TermsOfUsageView.vue b/src/views/TermsOfUsageView.vue index 5d6374d868b34e2fb81e1ce913d3849646e8dc66..004e7e3f85f72e8cc6088209f0ce2350e1e28e4d 100644 --- a/src/views/TermsOfUsageView.vue +++ b/src/views/TermsOfUsageView.vue @@ -1,10 +1,149 @@ <script setup lang="ts"></script> <template> - <div> - <h2>Terms of Usage</h2> - <p>TBD</p> - </div> + <h2>Terms of Use</h2> + <p class="fs-5">Last updated: July 18, 2024</p> + <p> + These Terms of Use ("Terms") apply to your use of the Cloud-based Workflow + Manager (CloWM) instance on clowm.bi.denbi.de ("CloWM"). Please read them + carefully and let us know if you have any questions. + </p> + <p> + By using CloWM, you agree to be bound by these Terms. If you are using CloWM + on behalf of an organization, you agree to these Terms on behalf of that + organization. + </p> + <h3>Content</h3> + <p> + Content such as uploaded workflows or data sets in CloWM is protected by + intellectual property laws. You give us permission to access that material + solely to do what is necessary to provide our services, including storing, + displaying, reproducing, and distributing those materials. + </p> + <p> + You are solely responsible for the data sets you use in CloWM and assume all + risks associated with them, including intellectual property or other legal + claims. By using data sets in CloWM, you acknowledge that you have the + necessary rights to that material, and that doing so does not conflict with + any licenses you have granted to others. + </p> + <p> + CloWM allows you to share your data sets and analysis results with others. + Please be careful about what you choose to share. CloWM does not actively + monitor the data sets you use. However, we have the right to remove data + sets from CloWM for any reason (such as copyright infringement, we learn the + material is patently unlawful, etc.) We assume no liability for any content + that you or anyone else uses with CloWM. + </p> + + <h4>The CloWM Software</h4> + <p> + The CloWM software is protected by copyright and other laws. CloWM gives you + a personal, worldwide, royalty-free, non-assignable and non-exclusive + license to use the software we provide you to use our service. This license + is for the sole purpose of enabling you to use CloWM as permitted by these + Terms. If you violate these Terms, we may terminate this license and disable + or restrict your access to our services. + </p> + + <h3>Prohibited Activities</h3> + <p> + We require you to respect these limitations, and we may terminate your + account if you do not follow them. + </p> + <ul> + <li> + Do not use CloWM in a manner that violates any laws, regulations, + ordinances, or directives. + </li> + <li>Do not use CloWM contrary to our policies.</li> + <li> + Do not use CloWM to do anything threatening, abusive, harassing, + defamatory, tortious, or invasive of another person's privacy. + </li> + <li> + Do not interfere with the proper functioning of any software, hardware, or + equipment of CloWM. + </li> + <li> + Do not engage in any conduct that inhibits anyone else's use of our + services, or which we determine may harm CloWM or our users. + </li> + <li> + Do not monitor or copy any material on CloWM, either manually or through + automated means (i.e. scraping), without prior written consent. + </li> + </ul> + <h3>Our Rights</h3> + <p> + We are always working to improve CloWM and make our services better, so we + do reserve some rights. In our sole discretion, we may, at any time -- with + or without notice -- change, disable or restrict access to our services, and + modify, suspend, or terminate a user account. As a technical necessity, we + also have full access to all files, metadata and other information that is + processed through CloWM. CloWM is not liable for any damages as a result of + these actions. + </p> + + <h3>Other Sites and Services</h3> + <p> + CloWM may contain links to websites, services, and advertisements that we + neither own nor control. We do not endorse or assume responsibility for any + third-party sites, information, materials, products, or services. + </p> + + <h3>Privacy</h3> + <p> + Our + <router-link :to="{ name: 'privacy' }">Privacy Policy</router-link> + governs our collection and use of your personal information. Please review + those provisions, too. + </p> + + <h3>Cancellation</h3> + <p> + You can delete your user account any time you like by writing an email with + your inquiry to + <a + href="mailto:support@clowm.bi.denbi.de?subject=Termination of user account" + >support@clowm.bi.denbi.de</a + >. Please be aware that your data sets workflows will not be deleted in this + case. Workflows will be shown to be associated to a "deleted user" and data + sets will still be accessible by the users who had access permissions + before. If you wish to remove any of this content, delete it before you + delete your user account. + </p> + + <h3>Disclaimers</h3> + <p>CloWM is provided "as is" without any warranties, expressed or implied.</p> + + <h3>Limitation of Liability</h3> + <p> + To the fullest extent allowed by law, CloWM shall not be liable for any + indirect, incidental, special, consequential, or punitive damages, or any + loss of profits or revenues, whether incurred directly or indirectly, or any + loss of data, use, goodwill, or other intangible losses resulting from (A) + your access to, use of, inability to access, or inability to use CloWM; (B) + any third party conduct or content on CloWM, including any defamatory, + offensive, or illegal conduct of third parties; or (C) any unauthorized + access, use, or alteration of your content. + </p> + + <h3>Modification</h3> + <p> + The Terms may be modified from time to time. The date of the most recent + revisions will always be shown on this page. If we make changes that we + believe will substantially alter your rights, we will notify you. You will + agree to accept any changes or revisions to the Terms by continuing to use + CloWM. + </p> + + <h3>Contact</h3> + <p> + We welcome all questions, concerns, and feedback you might have about these + terms. If you have suggestions for us, let us know at + <a href="mailto:support@clowm.bi.denbi.de">support@clowm.bi.denbi.de.</a> + </p> </template> <style scoped></style> diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue index 9778ed07a7bf0eea3924fd4751f99ee1c0a9ae6e..ac014a6f14c4692f2d4004470a3010a93e6b006b 100644 --- a/src/views/admin/AdminWorkflowExecutionView.vue +++ b/src/views/admin/AdminWorkflowExecutionView.vue @@ -340,152 +340,160 @@ onMounted(() => { Clear </button> </form> - <table class="table table-hover align-middle" ref="executionTable"> - <caption ref="endOfTableElement"> - Displaying - {{ - formState.executions.length - }} - Workflow Execution - </caption> - <thead> - <tr> - <th scope="col">Workflow</th> - <th scope="col">Execution ID</th> - <th scope="col">Status</th> - <th scope="col">Started</th> - <th scope="col">Duration</th> - <th scope="col">Ended</th> - <th scope="col">User</th> - <th scope="col"></th> - </tr> - </thead> - <tbody> - <template v-if="formState.executions.length > 0"> - <tr - v-for="execution in formState.executions" - :key="execution.execution_id" - :id="`admin-execution-${execution.execution_id}`" - > - <td> - <router-link - v-if="execution.workflow_id && execution.workflow_version_id" - :to="{ - name: 'workflow-version', - params: { - versionId: execution.workflow_version_id, - workflowId: execution.workflow_id, - }, - }" - > - {{ nameRepository.getName(execution.workflow_id) }}@{{ - nameRepository.getName(execution.workflow_version_id) - }} - </router-link> - <markdown-renderer - class="execution-notes" - v-else-if="execution.notes" - :markdown="execution.notes" - /> - <span v-else>Deleted Workflow</span> - </td> - <td> - {{ execution.execution_id }} - </td> - <td> - <span - class="rounded-pill py-1 px-2 text-light" - :class="statusToColorMapping[execution.status]" - > - {{ execution.status }}</span - > - </td> - <td> - {{ dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm") }} - </td> - <td> - <template v-if="execution.end_time"> - {{ - dayjs - .duration( - execution.end_time - execution.start_time, - "seconds", - ) - .humanize() + <div class="overflow-x-auto" style="max-width: 100vw"> + <table class="table table-hover align-middle" ref="executionTable"> + <caption ref="endOfTableElement"> + Displaying + {{ + formState.executions.length + }} + Workflow Execution + </caption> + <thead> + <tr> + <th scope="col">Workflow</th> + <th scope="col">Execution ID</th> + <th scope="col">Status</th> + <th scope="col">Started</th> + <th scope="col">Duration</th> + <th scope="col">Ended</th> + <th scope="col">CPU hours [HH:mm:ss]</th> + <th scope="col">User</th> + <th scope="col"></th> + </tr> + </thead> + <tbody> + <template v-if="formState.executions.length > 0"> + <tr + v-for="execution in formState.executions" + :key="execution.execution_id" + :id="`admin-execution-${execution.execution_id}`" + > + <td> + <router-link + v-if="execution.workflow_id && execution.workflow_version_id" + :to="{ + name: 'workflow-version', + params: { + versionId: execution.workflow_version_id, + workflowId: execution.workflow_id, + }, + }" + > + {{ nameRepository.getName(execution.workflow_id) }}@{{ + nameRepository.getName(execution.workflow_version_id) + }} + </router-link> + <markdown-renderer + class="execution-notes" + v-else-if="execution.notes" + :markdown="execution.notes" + /> + <span v-else>Deleted Workflow</span> + </td> + <td> + {{ execution.execution_id }} + </td> + <td> + <span + class="rounded-pill py-1 px-2 text-light" + :class="statusToColorMapping[execution.status]" + > + {{ execution.status }}</span + > + </td> + <td> + {{ dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm") }} + </td> + <td> + <template v-if="execution.end_time"> + {{ + dayjs + .duration( + execution.end_time - execution.start_time, + "seconds", + ) + .humanize() + }} + </template> + <template v-else> + {{ dayjs.unix(execution.start_time).toNow(true) }} + </template> + </td> + <td> + <template v-if="execution.end_time"> + {{ dayjs.unix(execution.end_time).format("DD.MM.YYYY HH:mm") }} + </template> + <template v-else> -</template> + </td> + <td> + {{ Math.floor(dayjs.duration(execution.cpu_time).asHours()) }}:{{ + dayjs.duration(execution.cpu_time).format("mm:ss") }} - </template> - <template v-else> - {{ dayjs.unix(execution.start_time).toNow(true) }} - </template> - </td> - <td> - <template v-if="execution.end_time"> - {{ dayjs.unix(execution.end_time).format("DD.MM.YYYY HH:mm") }} - </template> - <template v-else> -</template> - </td> - <td> - {{ nameRepository.getName(execution.executor_id) }} - </td> - <td class="text-end"> + </td> + <td> + {{ nameRepository.getName(execution.executor_id) }} + </td> + <td class="text-end"> + <div + class="btn-group btn-group-sm dropdown-center dropdown-menu-start" + > + <button type="button" class="btn btn-secondary" disabled> + Details + </button> + <button + type="button" + class="btn btn-secondary dropdown-toggle dropdown-toggle-split" + data-bs-toggle="dropdown" + aria-expanded="false" + > + <span class="visually-hidden">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu dropdown-menu"> + <li> + <button + class="dropdown-item align-middle" + type="button" + data-bs-toggle="modal" + data-bs-target="#workflowExecutionParameterModal" + @click=" + formState.executionParameters = execution.execution_id + " + > + <span class="ms-1">Parameters</span> + </button> + </li> + <li v-if="workflowExecutionCancelable(execution)"> + <button + class="dropdown-item text-danger align-middle" + type="button" + @click="cancelWorkflowExecution(execution.execution_id)" + > + <font-awesome-icon icon="fa-solid fa-ban" /> + <span class="ms-1">Cancel</span> + </button> + </li> + </ul> + </div> + </td> + </tr> + </template> + <tr v-else-if="!formState.loading"> + <td colspan="9" class="text-center"><i>No workflow executions</i></td> + </tr> + <tr v-if="formState.loading"> + <td colspan="9" class="text-center"> <div - class="btn-group btn-group-sm dropdown-center dropdown-menu-start" + class="spinner-border text-secondary spinner-border-sm" + role="status" > - <button type="button" class="btn btn-secondary" disabled> - Details - </button> - <button - type="button" - class="btn btn-secondary dropdown-toggle dropdown-toggle-split" - data-bs-toggle="dropdown" - aria-expanded="false" - > - <span class="visually-hidden">Toggle Dropdown</span> - </button> - <ul class="dropdown-menu dropdown-menu"> - <li> - <button - class="dropdown-item align-middle" - type="button" - data-bs-toggle="modal" - data-bs-target="#workflowExecutionParameterModal" - @click=" - formState.executionParameters = execution.execution_id - " - > - <span class="ms-1">Parameters</span> - </button> - </li> - <li v-if="workflowExecutionCancelable(execution)"> - <button - class="dropdown-item text-danger align-middle" - type="button" - @click="cancelWorkflowExecution(execution.execution_id)" - > - <font-awesome-icon icon="fa-solid fa-ban" /> - <span class="ms-1">Cancel</span> - </button> - </li> - </ul> + <span class="visually-hidden">Loading...</span> </div> </td> </tr> - </template> - <tr v-else-if="!formState.loading"> - <td colspan="8" class="text-center"><i>No workflow executions</i></td> - </tr> - <tr v-if="formState.loading"> - <td colspan="8" class="text-center"> - <div - class="spinner-border text-secondary spinner-border-sm" - role="status" - > - <span class="visually-hidden">Loading...</span> - </div> - </td> - </tr> - </tbody> - </table> + </tbody> + </table> + </div> </template> <style scoped></style> diff --git a/src/views/object-storage/S3KeysView.vue b/src/views/object-storage/S3KeysView.vue index aa3959ec82e846ee36365b165f458fb33c695b27..76ff629fe588a9c4896943bbf284d8a29bae3437 100644 --- a/src/views/object-storage/S3KeysView.vue +++ b/src/views/object-storage/S3KeysView.vue @@ -155,7 +155,7 @@ onMounted(() => { :s3key=" keyState.initialLoading ? { uid: '', access_key: '', secret_key: '' } - : keyRepository.keys[keyState.activeKey] ?? keyRepository.keys[0] + : (keyRepository.keys[keyState.activeKey] ?? keyRepository.keys[0]) " :deletable="allowKeyDeletion" :loading="keyState.initialLoading" diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue index d24eca4009458cd1ee20a32d319bc78ef3fb30d8..d2ac6b311cf0c6eb4cdf470077b76893255b6bf1 100644 --- a/src/views/workflows/ListWorkflowExecutionsView.vue +++ b/src/views/workflows/ListWorkflowExecutionsView.vue @@ -193,177 +193,183 @@ onUnmounted(() => { </router-link> </div> </div> - <table class="table table-hover caption-top align-middle"> - <caption> - Displaying - {{ - executionRepository.executions.length - }} - Workflow Execution - </caption> - <thead> - <tr> - <th scope="col">Workflow</th> - <th scope="col">Status</th> - <th scope="col">Started</th> - <th scope="col">Duration</th> - <th scope="col">Ended</th> - <th scope="col"></th> - </tr> - </thead> - <tbody> - <template v-if="executionsState.loading"> - <tr v-for="n in 5" :key="n"> - <td class="placeholder-glow w-25"> - <span class="placeholder col-6"></span> - </td> - <td class="placeholder-glow" style="width: 15%"> - <span class="placeholder col-4"></span> - </td> - <td class="placeholder-glow" style="width: 15%"> - <span class="placeholder col-6"></span> - </td> - <td class="placeholder-glow" style="width: 15%"> - <span class="placeholder col-6"></span> - </td> - <td class="text-end"> - <div - class="btn-group btn-group-sm dropdown-center dropdown-menu-start" - > - <button type="button" class="btn btn-secondary border" disabled> - Details - </button> - <button - type="button" - class="btn btn-secondary dropdown-toggle dropdown-toggle-split" - disabled - > - <span class="visually-hidden">Toggle Dropdown</span> - </button> - </div> - </td> + <div class="overflow-x-auto" style="max-width: 100vw"> + <table class="table table-hover caption-top align-middle"> + <caption> + Displaying + {{ + executionRepository.executions.length + }} + Workflow Execution + </caption> + <thead> + <tr> + <th scope="col">Workflow</th> + <th scope="col">Status</th> + <th scope="col">Started</th> + <th scope="col">Duration</th> + <th scope="col">Ended</th> + <th scope="col"></th> </tr> - </template> - <template v-else-if="executionRepository.executions.length > 0"> - <tr v-for="execution in sortedExecutions" :key="execution.execution_id"> - <td> - <router-link - v-if="execution.workflow_id && execution.workflow_version_id" - :to="{ - name: 'workflow-version', - params: { - versionId: execution.workflow_version_id, - workflowId: execution.workflow_id, - }, - }" - > - {{ nameRepository.getName(execution.workflow_id) }}@{{ - nameRepository.getName(execution.workflow_version_id) - }} - </router-link> - <markdown-renderer - class="execution-notes" - v-else-if="execution.notes" - :markdown="execution.notes" - /> - <span v-else>Deleted Workflow</span> - </td> - <td> - <span - class="rounded-pill py-1 px-2 text-light" - :class="statusToColorMapping[execution.status]" - ><font-awesome-icon - class="me-2" - :icon="statusToIconMapping[execution.status]" - />{{ execution.status }}</span - > - </td> - <td> - {{ dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm") }} - </td> - <td> - <template v-if="execution.end_time"> - {{ - dayjs - .duration( - execution.end_time - execution.start_time, - "seconds", - ) - .humanize() - }} - </template> - <template v-else - >{{ dayjs.unix(execution.start_time).toNow(true) }} - </template> - </td> - <td> - <template v-if="execution.end_time"> - {{ dayjs.unix(execution.end_time).format("DD.MM.YYYY HH:mm") }} - </template> - <template v-else> -</template> - </td> - <td class="text-end"> - <div - class="btn-group btn-group-sm dropdown-center dropdown-menu-start" - > - <button type="button" class="btn btn-secondary" disabled> - Details - </button> - <button - type="button" - class="btn btn-secondary dropdown-toggle dropdown-toggle-split" - data-bs-toggle="dropdown" - aria-expanded="false" + </thead> + <tbody> + <template v-if="executionsState.loading"> + <tr v-for="n in 5" :key="n"> + <td class="placeholder-glow w-25"> + <span class="placeholder col-6"></span> + </td> + <td class="placeholder-glow" style="width: 15%"> + <span class="placeholder col-4"></span> + </td> + <td class="placeholder-glow" style="width: 15%"> + <span class="placeholder col-6"></span> + </td> + <td class="placeholder-glow" style="width: 15%"> + <span class="placeholder col-6"></span> + </td> + <td class="text-end"> + <div + class="btn-group btn-group-sm dropdown-center dropdown-menu-start" + > + <button type="button" class="btn btn-secondary border" disabled> + Details + </button> + <button + type="button" + class="btn btn-secondary dropdown-toggle dropdown-toggle-split" + disabled + > + <span class="visually-hidden">Toggle Dropdown</span> + </button> + </div> + </td> + </tr> + </template> + <template v-else-if="executionRepository.executions.length > 0"> + <tr + v-for="execution in sortedExecutions" + :key="execution.execution_id" + > + <td> + <router-link + v-if="execution.workflow_id && execution.workflow_version_id" + :to="{ + name: 'workflow-version', + params: { + versionId: execution.workflow_version_id, + workflowId: execution.workflow_id, + }, + }" + > + {{ nameRepository.getName(execution.workflow_id) }}@{{ + nameRepository.getName(execution.workflow_version_id) + }} + </router-link> + <markdown-renderer + class="execution-notes" + v-else-if="execution.notes" + :markdown="execution.notes" + /> + <span v-else>Deleted Workflow</span> + </td> + <td> + <span + class="rounded-pill py-1 px-2 text-light text-nowrap" + :class="statusToColorMapping[execution.status]" > - <span class="visually-hidden">Toggle Dropdown</span> - </button> - <ul class="dropdown-menu dropdown-menu"> - <li> - <button - class="dropdown-item align-middle" - type="button" - data-bs-toggle="modal" - data-bs-target="#workflowExecutionParameterModal" - @click=" - executionsState.executionParameters = - execution.execution_id - " - > - <span class="ms-1">Parameters</span> - </button> - </li> - <li v-if="workflowExecutionCancelable(execution)"> - <button - class="dropdown-item text-danger align-middle" - type="button" - @click="cancelWorkflowExecution(execution.execution_id)" - > - <font-awesome-icon icon="fa-solid fa-ban" /> - <span class="ms-1">Cancel</span> - </button> - </li> - <li v-if="!workflowExecutionCancelable(execution)"> - <button - class="dropdown-item text-danger align-middle" - type="button" - data-bs-toggle="modal" - data-bs-target="#deleteWorkflowExecutionModal" - @click="executionsState.executionToDelete = execution" - > - <font-awesome-icon icon="fa-solid fa-trash" /> - <span class="ms-1">Delete</span> - </button> - </li> - </ul> - </div> - </td> + <font-awesome-icon + class="me-2" + :icon="statusToIconMapping[execution.status]" + />{{ execution.status }}</span + > + </td> + <td> + {{ dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm") }} + </td> + <td> + <template v-if="execution.end_time"> + {{ + dayjs + .duration( + execution.end_time - execution.start_time, + "seconds", + ) + .humanize() + }} + </template> + <template v-else + >{{ dayjs.unix(execution.start_time).toNow(true) }} + </template> + </td> + <td> + <template v-if="execution.end_time"> + {{ dayjs.unix(execution.end_time).format("DD.MM.YYYY HH:mm") }} + </template> + <template v-else> -</template> + </td> + <td class="text-end"> + <div + class="btn-group btn-group-sm dropdown-center dropdown-menu-start" + > + <button type="button" class="btn btn-secondary" disabled> + Details + </button> + <button + type="button" + class="btn btn-secondary dropdown-toggle dropdown-toggle-split" + data-bs-toggle="dropdown" + aria-expanded="false" + > + <span class="visually-hidden">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu dropdown-menu"> + <li> + <button + class="dropdown-item align-middle" + type="button" + data-bs-toggle="modal" + data-bs-target="#workflowExecutionParameterModal" + @click=" + executionsState.executionParameters = + execution.execution_id + " + > + <span class="ms-1">Parameters</span> + </button> + </li> + <li v-if="workflowExecutionCancelable(execution)"> + <button + class="dropdown-item text-danger align-middle" + type="button" + @click="cancelWorkflowExecution(execution.execution_id)" + > + <font-awesome-icon icon="fa-solid fa-ban" /> + <span class="ms-1">Cancel</span> + </button> + </li> + <li v-if="!workflowExecutionCancelable(execution)"> + <button + class="dropdown-item text-danger align-middle" + type="button" + data-bs-toggle="modal" + data-bs-target="#deleteWorkflowExecutionModal" + @click="executionsState.executionToDelete = execution" + > + <font-awesome-icon icon="fa-solid fa-trash" /> + <span class="ms-1">Delete</span> + </button> + </li> + </ul> + </div> + </td> + </tr> + </template> + <tr v-else> + <td colspan="6" class="text-center"><i>No workflow executions</i></td> </tr> - </template> - <tr v-else> - <td colspan="6" class="text-center"><i>No workflow executions</i></td> - </tr> - </tbody> - </table> + </tbody> + </table> + </div> </template> <style scoped></style>