diff --git a/package-lock.json b/package-lock.json index f1b4f8e1d8fa522dc9c14d0ee4ea3985800dbecc..da62351ca6317c0874411306d9c64fe75b6c9bf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,13 +12,13 @@ "@aws-sdk/client-s3": "^3.637.0", "@aws-sdk/lib-storage": "^3.637.0", "@aws-sdk/s3-request-presigner": "^3.637.0", - "@fortawesome/fontawesome-free": "~6.6.0", + "@fortawesome/fontawesome-free": "~6.7.0", "@hey-api/client-axios": "^0.2.7", "@popperjs/core": "~2.11.8", "ajv": "~8.17.0", "bootstrap": "~5.3.0", "chart.js": "~4.4.0", - "chartjs-plugin-zoom": "~2.0.1", + "chartjs-plugin-zoom": "~2.1.0", "dayjs": "~1.11.0", "dompurify": "~3.2.0", "filesize": "~10.1.0", @@ -40,7 +40,7 @@ "@tsconfig/node22": "^22.0.0", "@types/bootstrap": "~5.2.0", "@types/dompurify": "~3.0.0", - "@types/node": "^20.11.0", + "@types/node": "^22.9.0", "@types/qs": "^6.9.16", "@types/semver": "~7.5.1", "@types/showdown": "~2.0.1", @@ -1685,9 +1685,9 @@ } }, "node_modules/@fortawesome/fontawesome-free": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.6.0.tgz", - "integrity": "sha512-60G28ke/sXdtS9KZCpZSHHkCbdsOGEhIUGlwq6yhY74UpTiToIh8np7A8yphhM4BWsvNFtIvLpi4co+h9Mr9Ow==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.0.tgz", + "integrity": "sha512-lXTP8oiLGM97Aqjn47nod9awKe574HRfCngFizr7FiHTadKTiPkoVn0Mzg+tZBLD1XpE4CRvcF7/UM3g1jyVYw==", "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", "engines": { "node": ">=6" @@ -1706,9 +1706,9 @@ } }, "node_modules/@hey-api/openapi-ts": { - "version": "0.56.0", - "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.56.0.tgz", - "integrity": "sha512-bwqfuqJVNRVsbyC+jlAY2geJOWVQZWpVKS9z9sFeuTeRMJ5C8m+WzucMP0hurqYy67I90GaRyFSepvL1+miSXg==", + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.56.1.tgz", + "integrity": "sha512-AGoFnI2Mx8p70L+yaVnrpVK39Jo9flP4JyUTc5pqyp3syBdfwNecnoCL/JOjMvOq4Jy3IHneRJr0mQXKXZsziA==", "dev": true, "license": "FSL-1.1-MIT", "dependencies": { @@ -2232,9 +2232,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.2.tgz", - "integrity": "sha512-Tj+j7Pyzd15wAdSJswvs5CJzJNV+qqSUcr/aCD+jpQSBtXvGnV0pnrjoc8zFTe9fcKCatkpFpOO7yAzpO998HA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz", + "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==", "cpu": [ "arm" ], @@ -2246,9 +2246,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.2.tgz", - "integrity": "sha512-xsPeJgh2ThBpUqlLgRfiVYBEf/P1nWlWvReG+aBWfNv3XEBpa6ZCmxSVnxJgLgkNz4IbxpLy64h2gCmAAQLneQ==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz", + "integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==", "cpu": [ "arm64" ], @@ -2260,9 +2260,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.2.tgz", - "integrity": "sha512-KnXU4m9MywuZFedL35Z3PuwiTSn/yqRIhrEA9j+7OSkji39NzVkgxuxTYg5F8ryGysq4iFADaU5osSizMXhU2A==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz", + "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==", "cpu": [ "arm64" ], @@ -2274,9 +2274,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.2.tgz", - "integrity": "sha512-Hj77A3yTvUeCIx/Vi+4d4IbYhyTwtHj07lVzUgpUq9YpJSEiGJj4vXMKwzJ3w5zp5v3PFvpJNgc/J31smZey6g==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz", + "integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==", "cpu": [ "x64" ], @@ -2288,9 +2288,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.2.tgz", - "integrity": "sha512-RjgKf5C3xbn8gxvCm5VgKZ4nn0pRAIe90J0/fdHUsgztd3+Zesb2lm2+r6uX4prV2eUByuxJNdt647/1KPRq5g==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz", + "integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==", "cpu": [ "arm64" ], @@ -2302,9 +2302,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.2.tgz", - "integrity": "sha512-duq21FoXwQtuws+V9H6UZ+eCBc7fxSpMK1GQINKn3fAyd9DFYKPJNcUhdIKOrMFjLEJgQskoMoiuizMt+dl20g==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz", + "integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==", "cpu": [ "x64" ], @@ -2316,9 +2316,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.2.tgz", - "integrity": "sha512-6npqOKEPRZkLrMcvyC/32OzJ2srdPzCylJjiTJT2c0bwwSGm7nz2F9mNQ1WrAqCBZROcQn91Fno+khFhVijmFA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz", + "integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==", "cpu": [ "arm" ], @@ -2330,9 +2330,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.2.tgz", - "integrity": "sha512-V9Xg6eXtgBtHq2jnuQwM/jr2mwe2EycnopO8cbOvpzFuySCGtKlPCI3Hj9xup/pJK5Q0388qfZZy2DqV2J8ftw==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz", + "integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==", "cpu": [ "arm" ], @@ -2344,9 +2344,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.2.tgz", - "integrity": "sha512-uCFX9gtZJoQl2xDTpRdseYuNqyKkuMDtH6zSrBTA28yTfKyjN9hQ2B04N5ynR8ILCoSDOrG/Eg+J2TtJ1e/CSA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz", + "integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==", "cpu": [ "arm64" ], @@ -2358,9 +2358,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.2.tgz", - "integrity": "sha512-/PU9P+7Rkz8JFYDHIi+xzHabOu9qEWR07L5nWLIUsvserrxegZExKCi2jhMZRd0ATdboKylu/K5yAXbp7fYFvA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz", + "integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==", "cpu": [ "arm64" ], @@ -2372,9 +2372,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.2.tgz", - "integrity": "sha512-eCHmol/dT5odMYi/N0R0HC8V8QE40rEpkyje/ZAXJYNNoSfrObOvG/Mn+s1F/FJyB7co7UQZZf6FuWnN6a7f4g==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz", + "integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==", "cpu": [ "ppc64" ], @@ -2386,9 +2386,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.2.tgz", - "integrity": "sha512-DEP3Njr9/ADDln3kNi76PXonLMSSMiCir0VHXxmGSHxCxDfQ70oWjHcJGfiBugzaqmYdTC7Y+8Int6qbnxPBIQ==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz", + "integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==", "cpu": [ "riscv64" ], @@ -2400,9 +2400,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.2.tgz", - "integrity": "sha512-NHGo5i6IE/PtEPh5m0yw5OmPMpesFnzMIS/lzvN5vknnC1sXM5Z/id5VgcNPgpD+wHmIcuYYgW+Q53v+9s96lQ==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz", + "integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==", "cpu": [ "s390x" ], @@ -2414,9 +2414,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.2.tgz", - "integrity": "sha512-PaW2DY5Tan+IFvNJGHDmUrORadbe/Ceh8tQxi8cmdQVCCYsLoQo2cuaSj+AU+YRX8M4ivS2vJ9UGaxfuNN7gmg==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz", + "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==", "cpu": [ "x64" ], @@ -2428,9 +2428,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.2.tgz", - "integrity": "sha512-dOlWEMg2gI91Qx5I/HYqOD6iqlJspxLcS4Zlg3vjk1srE67z5T2Uz91yg/qA8sY0XcwQrFzWWiZhMNERylLrpQ==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz", + "integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==", "cpu": [ "x64" ], @@ -2442,9 +2442,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.2.tgz", - "integrity": "sha512-euMIv/4x5Y2/ImlbGl88mwKNXDsvzbWUlT7DFky76z2keajCtcbAsN9LUdmk31hAoVmJJYSThgdA0EsPeTr1+w==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz", + "integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==", "cpu": [ "arm64" ], @@ -2456,9 +2456,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.2.tgz", - "integrity": "sha512-RsnE6LQkUHlkC10RKngtHNLxb7scFykEbEwOFDjr3CeCMG+Rr+cKqlkKc2/wJ1u4u990urRHCbjz31x84PBrSQ==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz", + "integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==", "cpu": [ "ia32" ], @@ -2470,9 +2470,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.2.tgz", - "integrity": "sha512-foJM5vv+z2KQmn7emYdDLyTbkoO5bkHZE1oth2tWbQNGW7mX32d46Hz6T0MqXdWS2vBZhaEtHqdy9WYwGfiliA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz", + "integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==", "cpu": [ "x64" ], @@ -3214,6 +3214,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/hammerjs": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", + "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -3222,13 +3228,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.17.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", - "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.19.8" } }, "node_modules/@types/qs": { @@ -3267,17 +3273,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz", - "integrity": "sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz", + "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.14.0", - "@typescript-eslint/type-utils": "8.14.0", - "@typescript-eslint/utils": "8.14.0", - "@typescript-eslint/visitor-keys": "8.14.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/type-utils": "8.15.0", + "@typescript-eslint/utils": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3301,16 +3307,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.14.0.tgz", - "integrity": "sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz", + "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.14.0", - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/typescript-estree": "8.14.0", - "@typescript-eslint/visitor-keys": "8.14.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4" }, "engines": { @@ -3330,14 +3336,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz", - "integrity": "sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz", + "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/visitor-keys": "8.14.0" + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3348,14 +3354,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz", - "integrity": "sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz", + "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.14.0", - "@typescript-eslint/utils": "8.14.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/utils": "8.15.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -3366,6 +3372,9 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -3373,9 +3382,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.14.0.tgz", - "integrity": "sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", "dev": true, "license": "MIT", "engines": { @@ -3387,14 +3396,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz", - "integrity": "sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz", + "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/visitor-keys": "8.14.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3416,16 +3425,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.14.0.tgz", - "integrity": "sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz", + "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.14.0", - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/typescript-estree": "8.14.0" + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3436,17 +3445,22 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz", - "integrity": "sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.14.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3456,6 +3470,19 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.0.tgz", @@ -4021,13 +4048,6 @@ "node": ">= 0.12" } }, - "node_modules/browserify-sign/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, "node_modules/browserify-sign/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -4190,11 +4210,12 @@ } }, "node_modules/chartjs-plugin-zoom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.0.1.tgz", - "integrity": "sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.1.0.tgz", + "integrity": "sha512-7lMimfQCUaIJLhPJaWSAA4gw+1m8lyR3Wn+M3MxjHbM/XxRUnOxN7cM5RR9jUmxmyW0h7L2hZ8KhvUsqrFxy/Q==", "license": "MIT", "dependencies": { + "@types/hammerjs": "^2.0.45", "hammerjs": "^2.0.8" }, "peerDependencies": { @@ -5258,9 +5279,9 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true, "license": "ISC" }, @@ -5853,6 +5874,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5968,9 +5996,9 @@ "license": "MIT" }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.13", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz", + "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -7013,9 +7041,9 @@ } }, "node_modules/rollup": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.2.tgz", - "integrity": "sha512-KreA+PzWmk2yaFmZVwe6GB2uBD86nXl86OsDkt1bJS9p3vqWuEQ6HnJJ+j/mZi/q0920P99/MVRlB4L3crpF5w==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz", + "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7029,24 +7057,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.27.2", - "@rollup/rollup-android-arm64": "4.27.2", - "@rollup/rollup-darwin-arm64": "4.27.2", - "@rollup/rollup-darwin-x64": "4.27.2", - "@rollup/rollup-freebsd-arm64": "4.27.2", - "@rollup/rollup-freebsd-x64": "4.27.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.27.2", - "@rollup/rollup-linux-arm-musleabihf": "4.27.2", - "@rollup/rollup-linux-arm64-gnu": "4.27.2", - "@rollup/rollup-linux-arm64-musl": "4.27.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.27.2", - "@rollup/rollup-linux-riscv64-gnu": "4.27.2", - "@rollup/rollup-linux-s390x-gnu": "4.27.2", - "@rollup/rollup-linux-x64-gnu": "4.27.2", - "@rollup/rollup-linux-x64-musl": "4.27.2", - "@rollup/rollup-win32-arm64-msvc": "4.27.2", - "@rollup/rollup-win32-ia32-msvc": "4.27.2", - "@rollup/rollup-win32-x64-msvc": "4.27.2", + "@rollup/rollup-android-arm-eabi": "4.27.3", + "@rollup/rollup-android-arm64": "4.27.3", + "@rollup/rollup-darwin-arm64": "4.27.3", + "@rollup/rollup-darwin-x64": "4.27.3", + "@rollup/rollup-freebsd-arm64": "4.27.3", + "@rollup/rollup-freebsd-x64": "4.27.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.27.3", + "@rollup/rollup-linux-arm-musleabihf": "4.27.3", + "@rollup/rollup-linux-arm64-gnu": "4.27.3", + "@rollup/rollup-linux-arm64-musl": "4.27.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3", + "@rollup/rollup-linux-riscv64-gnu": "4.27.3", + "@rollup/rollup-linux-s390x-gnu": "4.27.3", + "@rollup/rollup-linux-x64-gnu": "4.27.3", + "@rollup/rollup-linux-x64-musl": "4.27.3", + "@rollup/rollup-win32-arm64-msvc": "4.27.3", + "@rollup/rollup-win32-ia32-msvc": "4.27.3", + "@rollup/rollup-win32-x64-msvc": "4.27.3", "fsevents": "~2.3.2" } }, @@ -7494,15 +7522,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.14.0.tgz", - "integrity": "sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.15.0.tgz", + "integrity": "sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.14.0", - "@typescript-eslint/parser": "8.14.0", - "@typescript-eslint/utils": "8.14.0" + "@typescript-eslint/eslint-plugin": "8.15.0", + "@typescript-eslint/parser": "8.15.0", + "@typescript-eslint/utils": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7511,6 +7539,9 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true diff --git a/package.json b/package.json index 6beff182cb443921454191b000a2ffeefa1bef39..9f277ecb4005ccda4bdaf687d79f8ed9109ea1c5 100644 --- a/package.json +++ b/package.json @@ -15,13 +15,13 @@ "@aws-sdk/client-s3": "^3.637.0", "@aws-sdk/lib-storage": "^3.637.0", "@aws-sdk/s3-request-presigner": "^3.637.0", - "@fortawesome/fontawesome-free": "~6.6.0", + "@fortawesome/fontawesome-free": "~6.7.0", "@hey-api/client-axios": "^0.2.7", "@popperjs/core": "~2.11.8", "ajv": "~8.17.0", "bootstrap": "~5.3.0", "chart.js": "~4.4.0", - "chartjs-plugin-zoom": "~2.0.1", + "chartjs-plugin-zoom": "~2.1.0", "dayjs": "~1.11.0", "dompurify": "~3.2.0", "filesize": "~10.1.0", @@ -43,7 +43,7 @@ "@tsconfig/node22": "^22.0.0", "@types/bootstrap": "~5.2.0", "@types/dompurify": "~3.0.0", - "@types/node": "^20.11.0", + "@types/node": "^22.9.0", "@types/qs": "^6.9.16", "@types/semver": "~7.5.1", "@types/showdown": "~2.0.1", diff --git a/src/assets/base.css b/src/assets/base.css index 459bda1b18677534994f349a59e766625fca9789..2f1e22ec1c4e1794dea8ea209c3e7b5db2b99d86 100644 --- a/src/assets/base.css +++ b/src/assets/base.css @@ -31,7 +31,8 @@ --color-text: var(--vt-c-text-light-1); --section-gap: 160px; - --color-header: rgb(255, 177, 45) + --color-header: rgb(255, 177, 45); + --bs-cyan-rgb: rgb(29, 230, 230); } *, @@ -70,8 +71,14 @@ header { --bs-box-shadow-lg: 0 1rem 3rem rgba(150, 150, 150, .575); --bs-box-shadow-inset: inset 0 1px 2px rgba(150, 150, 150, .475); --color-header: rgb(204, 129, 0); + --bs-cyan-rgb: rgb(0, 255, 255); } img { max-width: 100%; } + +.bg-cyan { + background-color: var(--bs-cyan-rgb) !important; + color: black; +} \ No newline at end of file diff --git a/src/components/ParameterTable.vue b/src/components/ParameterTable.vue new file mode 100644 index 0000000000000000000000000000000000000000..7cfd8a234c782b98aa048a10a05cd5bc66e70fd8 --- /dev/null +++ b/src/components/ParameterTable.vue @@ -0,0 +1,199 @@ +<script setup lang="ts"> +import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; +import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; +import type { + FlatWorkflowParameters, + TemporaryParams, +} from "@/types/WorkflowParameters.ts"; +import { computed } from "vue"; +import { flattenParameters } from "@/utils/Workflow.ts"; +import type { RouteLocationRaw, RouteParamsRaw } from "vue-router"; + +const props = defineProps<{ + loading?: boolean; + parameters: TemporaryParams; +}>(); + +const emit = defineEmits<{ + (e: "link-clicked", route: RouteLocationRaw): void; +}>(); + +const flatParameters = computed<FlatWorkflowParameters | undefined>(() => { + if (props.parameters.params == undefined) { + return undefined; + } + return flattenParameters(flattenParameters(props.parameters.params)); +}); + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function isBucketLink(value: any): boolean { + if (typeof value === "string") { + return value.startsWith("s3://"); + } + return false; +} + +function getS3LinkParameters(s3String: string): RouteParamsRaw { + const pathComponents = s3String.slice(5).split("/"); + const s3File = + pathComponents.length > 1 && + pathComponents[pathComponents.length - 1].includes("."); + return { + bucketName: pathComponents[0], + subFolders: pathComponents.slice(1, s3File ? -1 : undefined), + }; +} + +const logs_s3_path = computed<string | undefined>( + () => props.parameters.metaParams?.logs_s3_path ?? undefined, +); +const debug_s3_path = computed<string | undefined>( + () => props.parameters.metaParams?.debug_s3_path ?? undefined, +); +const provenance_s3_path = computed<string | undefined>( + () => props.parameters.metaParams?.provenance_s3_path ?? undefined, +); +const notes = computed<string | undefined>( + () => props.parameters.metaParams?.notes ?? undefined, +); +</script> + +<template> + <table class="table table-hover"> + <caption class="placeholder-glow"> + <span v-if="loading" class="placeholder col-1"></span> + <template v-else> + {{ Object.keys(flatParameters ?? {}).length }} + </template> + Parameters + </caption> + <tbody> + <template v-if="loading"> + <tr v-for="n in 5" :key="n"> + <th scope="row" style="width: 20%" class="placeholder-glow"> + <div class="placeholder col-12"></div> + </th> + <td class="placeholder-glow"> + <div class="placeholder col-8"></div> + </td> + </tr> + </template> + <template v-else> + <tr v-if="notes"> + <th scope="row" class="text-end"><b>notes</b></th> + <th> + <markdown-renderer :markdown="notes" /> + </th> + </tr> + <tr + v-if="logs_s3_path" + :class="{ + 'border-bottom-thick': !debug_s3_path && !provenance_s3_path, + }" + > + <th scope="row" style="width: 10%" class="text-end"> + <b>logs</b> + </th> + <td> + <router-link + :to="{ + name: 'bucket', + params: getS3LinkParameters(logs_s3_path), + }" + @click.prevent=" + emit('link-clicked', { + name: 'bucket', + params: getS3LinkParameters(logs_s3_path), + }) + " + >{{ logs_s3_path }} + </router-link> + </td> + </tr> + <tr + v-if="provenance_s3_path" + :class="{ + 'border-bottom-thick': !debug_s3_path, + }" + > + <th scope="row" style="width: 10%" class="text-end"> + <b>provenance</b> + </th> + <td> + <router-link + :to="{ + name: 'bucket', + params: getS3LinkParameters(provenance_s3_path), + }" + @click.prevent=" + emit('link-clicked', { + name: 'bucket', + params: getS3LinkParameters(provenance_s3_path), + }) + " + >{{ provenance_s3_path }} + </router-link> + </td> + </tr> + <tr v-if="debug_s3_path" class="border-bottom-thick"> + <th scope="row" style="width: 10%" class="text-end"> + <b>debug</b> + </th> + <td> + <router-link + :to="{ + name: 'bucket', + params: getS3LinkParameters(debug_s3_path), + }" + @click.prevent=" + emit('link-clicked', { + name: 'bucket', + params: getS3LinkParameters(debug_s3_path), + }) + " + >{{ debug_s3_path }} + </router-link> + </td> + </tr> + <tr v-for="(value, name) in flatParameters" :key="name"> + <th scope="row" style="width: 10%" class="text-end"> + <b>{{ name }}</b> + </th> + <td> + <router-link + v-if="typeof value === 'string' && isBucketLink(value)" + :to="{ + name: 'bucket', + params: getS3LinkParameters(value), + }" + @click.prevent=" + emit('link-clicked', { + name: 'bucket', + params: getS3LinkParameters(value), + }) + " + >{{ value }} + </router-link> + <a + v-else-if="typeof value === 'string' && value.startsWith('http')" + :href="value" + target="_blank" + >{{ value }} + <font-awesome-icon + icon="fa-solid fa-arrow-up-right-from-square" + class="ms-1" + /> + </a> + <template v-else>{{ value }}</template> + </td> + </tr> + </template> + </tbody> + </table> +</template> + +<style scoped> +.border-bottom-thick { + border-bottom: 3px var(--bs-border-style) var(--bs-border-color) !important; +} +</style> diff --git a/src/components/parameter-schema/LastParameterizationsModal.vue b/src/components/parameter-schema/LastParameterizationsModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..2cf2ff6475698737f76ccf4f7690b6f9657e4e20 --- /dev/null +++ b/src/components/parameter-schema/LastParameterizationsModal.vue @@ -0,0 +1,314 @@ +<script setup lang="ts"> +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import { computed, nextTick, onMounted, reactive, ref } from "vue"; +import { useUserStore } from "@/stores/users.ts"; +import { useWorkflowExecutionStore } from "@/stores/workflowExecutions.ts"; +import type { WorkflowExecutionOut } from "@/client"; +import { useNameStore } from "@/stores/names.ts"; +import dayjs from "dayjs"; +import type { + FlatWorkflowParameters, + NestedWorkflowParameters, + TemporaryParams, +} from "@/types/WorkflowParameters.ts"; +import { flattenParameters } from "@/utils/Workflow.ts"; +import ParameterTable from "@/components/ParameterTable.vue"; +import { type RouteLocationRaw, useRouter } from "vue-router"; +import { Modal } from "bootstrap"; + +const props = defineProps<{ + modalId: string; + workflowId?: string; +}>(); + +const userRepository = useUserStore(); +const executionRepository = useWorkflowExecutionStore(); +const nameRepository = useNameStore(); +const router = useRouter(); + +let parameterModal: Modal | null = null; + +let loadingObserver: IntersectionObserver; +const endOfTableElement = ref<HTMLTableCaptionElement | undefined>(undefined); + +const formState = reactive<{ + loading: boolean; + executions: WorkflowExecutionOut[]; + params?: NestedWorkflowParameters; + selectedExecution?: WorkflowExecutionOut; +}>({ + loading: false, + executions: [], + params: undefined, + selectedExecution: undefined, +}); + +const emit = defineEmits<{ + (e: "parameters-selected", params: TemporaryParams): void; +}>(); + +const statusToColorMapping = { + PENDING: "bg-warning", + SCHEDULED: "bg-warning", + RUNNING: "bg-info", + CANCELED: "bg-danger", + SUCCESS: "bg-success", + ERROR: "bg-danger", +}; + +const parameterTableParams = computed<TemporaryParams>(() => { + return { + params: formState.params, + metaParams: { + notes: formState.selectedExecution?.notes, + provenance_s3_path: formState.selectedExecution?.provenance_s3_path, + debug_s3_path: formState.selectedExecution?.debug_s3_path, + logs_s3_path: formState.selectedExecution?.logs_s3_path, + }, + }; +}); + +const executionIterator = ref< + AsyncGenerator<WorkflowExecutionOut[], void, never> | undefined +>(undefined); + +function loadExecution() { + loadingObserver.disconnect(); + formState.loading = true; + formState.executions = []; + executionIterator.value = executionRepository.fetchExecutionsRaw( + userRepository.currentUID, + undefined, + undefined, + props.workflowId, + undefined, + undefined, + 30, + ); + loadNextExecutions(); +} + +function loadNextExecutions() { + formState.loading = true; + executionIterator.value + ?.next() + .then((executions) => { + if (executions.done ?? false) { + return; + } + formState.executions.push(...executions.value); + nextTick(() => { + if (endOfTableElement.value != undefined) { + loadingObserver.observe(endOfTableElement.value); + } + }); + }) + .finally(() => { + formState.loading = false; + }); +} + +const flatParameters = computed<FlatWorkflowParameters | undefined>(() => { + if (formState.params == undefined) { + return undefined; + } + return flattenParameters(formState.params); +}); + +function emitParameters() { + if (formState.params != undefined) { + emit("parameters-selected", { + params: formState.params, + metaParams: { + notes: formState.selectedExecution?.notes, + provenance_s3_path: parentDir( + formState.selectedExecution?.provenance_s3_path, + ), + debug_s3_path: parentDir(formState.selectedExecution?.debug_s3_path), + logs_s3_path: parentDir(formState.selectedExecution?.logs_s3_path), + }, + }); + formState.selectedExecution = undefined; + formState.params = undefined; + } +} + +function loadParameters(execution: WorkflowExecutionOut) { + executionRepository + .fetchExecutionParameters(execution.execution_id) + .then((params) => { + formState.selectedExecution = execution; + formState.params = params; + }); +} + +function handleLinkClick(route: RouteLocationRaw) { + parameterModal?.hide(); + router.push(route); +} + +onMounted(() => { + parameterModal = Modal.getOrCreateInstance("#" + props.modalId); + loadingObserver = new IntersectionObserver( + (entries) => { + if (entries.length > 0 && entries[0].isIntersecting) { + loadingObserver.unobserve(entries[0].target); + loadNextExecutions(); + } + }, + { + threshold: 0, + rootMargin: "0px 0px 150px 0px", + }, + ); + loadExecution(); +}); + +function parentDir(s3Path?: string | null): string | undefined { + if (s3Path == undefined) { + return undefined; + } + return s3Path.split("/").slice(0, -1).join("/"); +} +</script> + +<template> + <bootstrap-modal + :modal-id="props.modalId" + :static-backdrop="true" + modal-label="List Last Parameterization Modal" + size-modifier-modal="xl" + > + <template #header + >Last parameterization for + <b>{{ nameRepository.getName(props.workflowId) }}</b></template + > + <template #body> + <div class="overflow-y-auto" style="max-height: 40vh"> + <table ref="executionTable" class="table table-hover align-middle"> + <caption ref="endOfTableElement"> + Displaying + {{ + formState.executions.length + }} + Workflow Execution + </caption> + <thead> + <tr> + <th scope="col">Version</th> + <th scope="col">Status</th> + <th scope="col">Started</th> + <th scope="col">Duration</th> + <th scope="col"></th> + </tr> + </thead> + <tbody> + <template v-if="formState.executions.length > 0"> + <tr + v-for="execution in formState.executions" + :id="`last-parameterization-execution-${execution.execution_id}`" + :key="execution.execution_id" + > + <td> + <span v-if="execution.workflow_version_id"> + {{ nameRepository.getName(execution.workflow_version_id) }} + </span> + <span v-else>Deleted Workflow</span> + </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 class="text-end"> + <button + type="button" + class="btn btn-secondary" + @click="loadParameters(execution)" + > + View + </button> + </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="spinner-border text-secondary spinner-border-sm" + role="status" + > + <span class="visually-hidden">Loading...</span> + </div> + </td> + </tr> + </tbody> + </table> + </div> + <div + v-if="flatParameters" + class="overflow-y-auto mt-2" + style="max-height: 50vh" + > + <h5> + Parameters + <span v-if="formState.selectedExecution != undefined" + >from + {{ + dayjs + .unix(formState.selectedExecution.start_time) + .format("DD.MM.YYYY HH:mm") + }}</span + >: + </h5> + <parameter-table + :parameters="parameterTableParams" + @link-clicked="handleLinkClick" + /> + </div> + </template> + <template #footer> + <button + type="button" + class="btn btn-success" + data-bs-dismiss="modal" + :disabled="formState.params == undefined" + @click="emitParameters" + > + Load + </button> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped></style> diff --git a/src/components/parameter-schema/ParameterSchemaFormComponent.vue b/src/components/parameter-schema/ParameterSchemaFormComponent.vue index a0c2069bef6e9a11ab17355e129a463981a602e8..2ebc26f432ca2f1773017e3220e38646b90b587e 100644 --- a/src/components/parameter-schema/ParameterSchemaFormComponent.vue +++ b/src/components/parameter-schema/ParameterSchemaFormComponent.vue @@ -22,6 +22,7 @@ import type { import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; import { NextflowVersion, type ParameterExtension } from "@/client/types.gen"; import { flattenParameters, nestParameters } from "@/utils/Workflow"; +import LastParameterizationsModal from "@/components/parameter-schema/LastParameterizationsModal.vue"; const bucketRepository = useBucketStore(); const resourceRepository = useResourceStore(); @@ -61,6 +62,10 @@ const props = defineProps({ return ["simple", "advanced", "expert"].includes(value); }, }, + workflowId: { + type: String, + required: false, + }, }); const emit = defineEmits<{ @@ -270,7 +275,7 @@ function scroll(selectedAnchor: string) { onMounted(() => { if (props.schema) updateSchema(props.schema); if (props.clowmInfo?.exampleParameters) - Tooltip.getOrCreateInstance("#exampleDataButton"); + Tooltip.getOrCreateInstance("#TryItOutButton"); bucketRepository.fetchOwnBuckets(); bucketRepository.fetchOwnPermissions(); keyRepository.fetchS3Keys(); @@ -302,13 +307,18 @@ onMounted(() => { <upload-parameter-file-modal modal-id="parameterUploadModal" @parameters-uploaded=" - (params: FlatWorkflowParameters) => + (params: NestedWorkflowParameters) => loadParameters({ params: params, metaParams: {}, }) " /> + <last-parameterizations-modal + modal-id="last-parameterization-modal" + :workflow-id="workflowId" + @parameters-selected="loadParameters" + /> <div class="row align-items-start"> <form v-if="props.schema" @@ -340,7 +350,7 @@ onMounted(() => { <h5 class="card-title"> General Options about the pipeline execution </h5> - <div v-if="props.allowNotes" :hidden="!showOptional"> + <div v-if="props.allowNotes"> <code class="bg-secondary-subtle p-2 rounded-top border border-secondary" >--notes</code @@ -564,7 +574,7 @@ onMounted(() => { <div class="d-grid gap-2 mb-2 px-2"> <button v-if="props.clowmInfo?.exampleParameters" - id="exampleDataButton" + id="TryItOutButton" type="button" class="btn btn-primary" data-bs-toggle="tooltip" @@ -578,6 +588,15 @@ onMounted(() => { > Try it out </button> + <button + type="button" + class="btn btn-primary" + data-bs-toggle="modal" + data-bs-target="#last-parameterization-modal" + > + <font-awesome-icon icon="fas fa-user-gear" class="me-2" /> + My last parameterizations + </button> <button class="btn btn-primary" data-bs-toggle="modal" diff --git a/src/components/parameter-schema/UploadParameterFileModal.vue b/src/components/parameter-schema/UploadParameterFileModal.vue index 7aabd414311dd21f9678ac2a1f1f90b9ede1fdac..b90a3eff66f1d82504b7df36ef2a9d3619925e9f 100644 --- a/src/components/parameter-schema/UploadParameterFileModal.vue +++ b/src/components/parameter-schema/UploadParameterFileModal.vue @@ -1,11 +1,14 @@ <script setup lang="ts"> import BootstrapModal from "@/components/modals/BootstrapModal.vue"; -import { computed, reactive, ref } from "vue"; +import { computed, onMounted, reactive, ref } from "vue"; import type { NestedWorkflowParameters, FlatWorkflowParameters, } from "@/types/WorkflowParameters"; import { flattenParameters } from "@/utils/Workflow"; +import ParameterTable from "@/components/ParameterTable.vue"; +import { type RouteLocationRaw, useRouter } from "vue-router"; +import { Modal } from "bootstrap"; const props = defineProps<{ modalId: string; @@ -19,8 +22,10 @@ const parameterState = reactive<{ error: undefined, }); +const router = useRouter(); const randomIDSuffix = Math.random().toString(16).substring(2, 8); const parameterFileInput = ref<HTMLInputElement | undefined>(undefined); +let parameterModal: Modal | null = null; const emit = defineEmits<{ (e: "parameters-uploaded", params: NestedWorkflowParameters): void; @@ -64,13 +69,22 @@ function fileChange() { } }); } + +function handleLinkClick(route: RouteLocationRaw) { + parameterModal?.hide(); + router.push(route); +} + +onMounted(() => { + parameterModal = Modal.getOrCreateInstance("#" + props.modalId); +}); </script> <template> <bootstrap-modal :modal-id="props.modalId" :static-backdrop="true" - modal-label="Confirm Delete Modal" + modal-label="Upload Parameters Modal" size-modifier-modal="lg" > <template #header>Upload Parameter File</template> @@ -92,24 +106,10 @@ function fileChange() { </template> <template v-else-if="flatParameters"> <h5>Uploaded Parameters:</h5> - <table class="table table-bordered"> - <caption> - {{ - Object.keys(flatParameters).length - }} - Parameters - </caption> - <tbody> - <tr v-for="(value, name) in flatParameters" :key="name"> - <th scope="row" style="width: 10%" class="text-end"> - <b>{{ name }}</b> - </th> - <td> - {{ value }} - </td> - </tr> - </tbody> - </table> + <parameter-table + :parameters="{ params: parameterState.params }" + @link-clicked="handleLinkClick" + /> </template> </template> <template #footer> diff --git a/src/components/parameter-schema/description-mode/ParameterDescription.vue b/src/components/parameter-schema/description-mode/ParameterDescription.vue index ef548fbce7c15330372b80fc6be1524d14508725..4e3bc3e9c0870ca76b695e8d35e7c95c7228f9f4 100644 --- a/src/components/parameter-schema/description-mode/ParameterDescription.vue +++ b/src/components/parameter-schema/description-mode/ParameterDescription.vue @@ -134,7 +134,7 @@ onMounted(() => { </span> <span v-if="anyOfTooltip != undefined" - class="rounded py-0 px-1 bg-secondary ms-2 label w-fit fs-6" + class="rounded py-0 px-1 bg-cyan ms-2 label w-fit fs-6" data-bs-toggle="tooltip" data-bs-placement="bottom" :data-bs-title="anyOfTooltip" @@ -144,7 +144,7 @@ onMounted(() => { > <span v-if="oneOfTooltip != undefined" - class="rounded py-0 px-1 bg-secondary ms-2 label w-fit fs-6" + class="rounded py-0 px-1 bg-cyan ms-2 label w-fit fs-6" data-bs-toggle="tooltip" data-bs-placement="bottom" :data-bs-title="oneOfTooltip" @@ -154,7 +154,7 @@ onMounted(() => { > <span v-if="dependentTooltip != undefined" - class="rounded py-0 px-1 bg-secondary ms-2 label w-fit fs-6" + class="rounded py-0 px-1 bg-cyan ms-2 label w-fit fs-6" data-bs-toggle="tooltip" data-bs-placement="bottom" :data-bs-title="dependentTooltip" diff --git a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue index f3555c7d3392562f41aad2bb9f0ba3b4bc171aef..70ad2e6bbe99c9ec30a356dd14da972d11d3ffdd 100644 --- a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue +++ b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue @@ -350,7 +350,7 @@ onMounted(() => { </span> <span v-if="anyOfTooltip[parameterName] != undefined" - class="rounded p-1 bg-secondary ms-2 label" + class="rounded p-1 bg-cyan ms-2 label" data-bs-toggle="tooltip" data-bs-placement="bottom" :data-bs-title="anyOfTooltip[parameterName]" @@ -360,7 +360,7 @@ onMounted(() => { > <span v-if="oneOfTooltip[parameterName] != undefined" - class="rounded p-1 bg-secondary ms-2 label" + class="rounded p-1 bg-cyan ms-2 label" data-bs-toggle="tooltip" data-bs-placement="bottom" :data-bs-title="oneOfTooltip[parameterName]" @@ -370,7 +370,7 @@ onMounted(() => { > <span v-if="dependentTooltip[parameterName] != undefined" - class="rounded p-1 bg-secondary ms-2 label" + class="rounded p-1 bg-cyan ms-2 label" data-bs-toggle="tooltip" data-bs-placement="bottom" :data-bs-title="dependentTooltip[parameterName]" diff --git a/src/components/workflows/modals/ParameterModal.vue b/src/components/workflows/modals/ParameterModal.vue index 23c3f6c174b5aa51fd05914e54e41a3c7bb58070..9b52f749880d5a9b8925a2afaa8cc1f47ca79ae0 100644 --- a/src/components/workflows/modals/ParameterModal.vue +++ b/src/components/workflows/modals/ParameterModal.vue @@ -2,7 +2,7 @@ import BootstrapModal from "@/components/modals/BootstrapModal.vue"; import { computed, onMounted, reactive, watch } from "vue"; import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; -import type { RouteLocationRaw, RouteParamsRaw } from "vue-router"; +import type { RouteLocationRaw } from "vue-router"; import { Modal } from "bootstrap"; import { useRouter } from "vue-router"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; @@ -12,10 +12,9 @@ import { useWorkflowStore } from "@/stores/workflows"; import { createDownloadUrl } from "@/utils/DownloadJson"; import type { NestedWorkflowParameters, - FlatWorkflowParameters, + TemporaryParams, } from "@/types/WorkflowParameters"; -import { flattenParameters } from "@/utils/Workflow"; -import MarkdownRenderer from "@/components/MarkdownRenderer.vue"; +import ParameterTable from "@/components/ParameterTable.vue"; const nameRepository = useNameStore(); const executionRepository = useWorkflowExecutionStore(); @@ -82,11 +81,16 @@ const parameters = computed<NestedWorkflowParameters | undefined>(() => { return executionRepository.parameters[props.executionId] ?? undefined; }); -const flatParameters = computed<FlatWorkflowParameters | undefined>(() => { - if (parameters.value == undefined) { - return undefined; - } - return flattenParameters(flattenParameters(parameters.value)); +const parameterTableParams = computed<TemporaryParams>(() => { + return { + params: parameters.value, + metaParams: { + notes: notes.value, + provenance_s3_path: provenance_s3_path.value, + debug_s3_path: debug_s3_path.value, + logs_s3_path: logs_s3_path.value, + }, + }; }); const parameterDownloadUrl = computed<string | undefined>(() => { @@ -150,25 +154,6 @@ function saveParameters() { } } -function getS3LinkParameters(s3String: string): RouteParamsRaw { - const pathComponents = s3String.slice(5).split("/"); - const s3File = - pathComponents.length > 1 && - pathComponents[pathComponents.length - 1].includes("."); - return { - bucketName: pathComponents[0], - subFolders: pathComponents.slice(1, s3File ? -1 : undefined), - }; -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function isBucketLink(value: any): boolean { - if (typeof value === "string") { - return value.startsWith("s3://"); - } - return false; -} - watch( () => props.executionId, (newId, oldId) => { @@ -209,139 +194,12 @@ onMounted(() => { Workflow Execution <i>{{ props.executionId }}</i> not found </p> </div> - <table v-else-if="props.executionId" class="table table-hover"> - <caption class="placeholder-glow"> - <span v-if="parameterState.loading" class="placeholder col-1"></span> - <template v-else> - {{ Object.keys(flatParameters ?? {}).length }} - </template> - Parameters - </caption> - <tbody> - <template v-if="parameterState.loading"> - <tr v-for="n in 6" :key="n"> - <th scope="row" style="width: 20%" class="placeholder-glow"> - <div class="placeholder col-12"></div> - </th> - <td class="placeholder-glow"> - <div class="placeholder col-8"></div> - </td> - </tr> - </template> - <template v-else> - <tr v-if="execution?.notes"> - <th scope="row" class="text-end"><b>Notes</b></th> - <th> - <markdown-renderer :markdown="execution.notes" /> - </th> - </tr> - <tr - v-if="logs_s3_path" - :class="{ - 'border-bottom-thick': !debug_s3_path && !provenance_s3_path, - }" - > - <th scope="row" style="width: 10%" class="text-end"> - <b>logs</b> - </th> - <td> - <router-link - :to="{ - name: 'bucket', - params: getS3LinkParameters(logs_s3_path), - }" - @click.prevent=" - handleLinkClick({ - name: 'bucket', - params: getS3LinkParameters(logs_s3_path), - }) - " - >{{ logs_s3_path }} - </router-link> - </td> - </tr> - <tr - v-if="provenance_s3_path" - :class="{ - 'border-bottom-thick': !debug_s3_path, - }" - > - <th scope="row" style="width: 10%" class="text-end"> - <b>provenance</b> - </th> - <td> - <router-link - :to="{ - name: 'bucket', - params: getS3LinkParameters(provenance_s3_path), - }" - @click.prevent=" - handleLinkClick({ - name: 'bucket', - params: getS3LinkParameters(provenance_s3_path), - }) - " - >{{ provenance_s3_path }} - </router-link> - </td> - </tr> - <tr v-if="debug_s3_path" class="border-bottom-thick"> - <th scope="row" style="width: 10%" class="text-end"> - <b>debug</b> - </th> - <td> - <router-link - :to="{ - name: 'bucket', - params: getS3LinkParameters(debug_s3_path), - }" - @click.prevent=" - handleLinkClick({ - name: 'bucket', - params: getS3LinkParameters(debug_s3_path), - }) - " - >{{ debug_s3_path }} - </router-link> - </td> - </tr> - <tr v-for="(value, name) in flatParameters" :key="name"> - <th scope="row" style="width: 10%" class="text-end"> - <b>{{ name }}</b> - </th> - <td> - <router-link - v-if="typeof value === 'string' && isBucketLink(value)" - :to="{ - name: 'bucket', - params: getS3LinkParameters(value), - }" - @click.prevent=" - handleLinkClick({ - name: 'bucket', - params: getS3LinkParameters(value), - }) - " - >{{ value }} - </router-link> - <a - v-else-if=" - typeof value === 'string' && value.startsWith('http') - " - :href="value" - target="_blank" - >{{ value }} - <font-awesome-icon - icon="fa-solid fa-arrow-up-right-from-square" - class="ms-1" - /> - </a> - <template v-else>{{ value }}</template> - </td> - </tr> - </template> - </tbody> - </table> + <parameter-table + v-else-if="props.executionId" + :loading="parameterState.loading" + :parameters="parameterTableParams" + @link-clicked="handleLinkClick" + /> </template> <template #footer> <router-link @@ -398,8 +256,4 @@ onMounted(() => { </bootstrap-modal> </template> -<style scoped> -.border-bottom-thick { - border-bottom: 3px var(--bs-border-style) var(--bs-border-color) !important; -} -</style> +<style scoped></style> diff --git a/src/stores/workflowExecutions.ts b/src/stores/workflowExecutions.ts index 554ace50f4d508bb052d8234571c77002752ed44..7fe936a949de0fb85efc0c21d140a58d2a97bd6d 100644 --- a/src/stores/workflowExecutions.ts +++ b/src/stores/workflowExecutions.ts @@ -47,7 +47,7 @@ export const useWorkflowExecutionStore = defineStore({ anonymizedExecutions: AnonymizedWorkflowExecution[]; parameters: Record<string, FlatWorkflowParameters>; __temporaryParameters?: FlatWorkflowParameters; - __temporaryMetaParameters?: Record<string, string>; + __temporaryMetaParameters?: Record<string, string | undefined | null>; }, getters: { executions(): WorkflowExecutionOut[] { diff --git a/src/types/WorkflowParameters.ts b/src/types/WorkflowParameters.ts index d524f052f53972677370d6add74c3f84325402fd..0328356bc8ec07f3bfa53ff1c46e5a3ca0b7c77d 100644 --- a/src/types/WorkflowParameters.ts +++ b/src/types/WorkflowParameters.ts @@ -7,10 +7,10 @@ export type FlatWorkflowParameters = Record< export type NestedWorkflowParameters = Record<string, any>; export type WorkflowMetaParameters = { - logs_s3_path?: string; - debug_s3_path?: string; - provenance_s3_path?: string; - notes?: string; + logs_s3_path?: string | null; + debug_s3_path?: string | null; + provenance_s3_path?: string | null; + notes?: string | null; }; export type TemporaryParams = { diff --git a/src/views/workflows/StartWorkflowView.vue b/src/views/workflows/StartWorkflowView.vue index e84885ded48e880fec6450a0d0619f9ce0bc7d10..5ea539f48a61626b958398b37f5a9f4e544ee30e 100644 --- a/src/views/workflows/StartWorkflowView.vue +++ b/src/views/workflows/StartWorkflowView.vue @@ -137,6 +137,7 @@ onMounted(() => { workflowRepository.versionMapping[versionId]?.parameter_extension ?? undefined " + :workflow-id="props.workflowId" @start-workflow="startWorkflow" /> </template>