From bdf7a74c766570f36588f85a5c579e815176225f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Wed, 7 Feb 2024 11:52:27 +0100 Subject: [PATCH] Allow upload of parameter file and example parameters #94 --- package-lock.json | 226 ++++++++++-------- src/App.vue | 3 +- .../modals/UploadObjectModal.vue | 4 +- .../ParameterSchemaFormComponent.vue | 69 ++++-- .../UploadParameterFileModal.vue | 128 ++++++++++ .../form-mode/ParameterBooleanInput.vue | 7 +- .../form-mode/ParameterEnumInput.vue | 4 +- .../form-mode/ParameterStringInput.vue | 13 +- .../workflows/modals/ParameterModal.vue | 1 + src/types/ClowmInfo.ts | 1 + 10 files changed, 322 insertions(+), 134 deletions(-) create mode 100644 src/components/parameter-schema/UploadParameterFileModal.vue diff --git a/package-lock.json b/package-lock.json index 32d44c5..fd24c5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -211,16 +211,16 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/client-s3": { - "version": "3.504.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.504.0.tgz", - "integrity": "sha512-J8xPsnk7EDwalFSaDxPFNT2+x99nG2uQTpsLXAV3bWbT1nD/JZ+fase9GqxM11v6WngzqRvTQg26ljMn5hQSKA==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.507.0.tgz", + "integrity": "sha512-rRLiC5Ly3e7kZVNoRsG6JhZ8Yat5uEnDeShdWNdHchyTO88AaEnHaeyiVG9ecmKI8jYl6NbWSHB8xL0l9KIr/w==", "dependencies": { "@aws-crypto/sha1-browser": "3.0.0", "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.504.0", + "@aws-sdk/client-sts": "3.507.0", "@aws-sdk/core": "3.496.0", - "@aws-sdk/credential-provider-node": "3.504.0", + "@aws-sdk/credential-provider-node": "3.507.0", "@aws-sdk/middleware-bucket-endpoint": "3.502.0", "@aws-sdk/middleware-expect-continue": "3.502.0", "@aws-sdk/middleware-flexible-checksums": "3.502.0", @@ -279,9 +279,9 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.502.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.502.0.tgz", - "integrity": "sha512-OZAYal1+PQgUUtWiHhRayDtX0OD+XpXHKAhjYgEIPbyhQaCMp3/Bq1xDX151piWXvXqXLJHFKb8DUEqzwGO9QA==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.507.0.tgz", + "integrity": "sha512-pFeaKwqv4tXD6QVxWC2V4N62DUoP3bPSm/mCe2SPhaNjNsmwwA53viUHz/nwxIbs8w4vV44UQsygb0AgKm+HoQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -326,13 +326,13 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.504.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.504.0.tgz", - "integrity": "sha512-ODA33/nm2srhV08EW0KZAP577UgV0qjyr7Xp2yEo8MXWL4ZqQZprk1c+QKBhjr4Djesrm0VPmSD/np0mtYP68A==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.507.0.tgz", + "integrity": "sha512-ms5CH2ImhqqCIbo5irxayByuPOlVAmSiqDVfjZKwgIziqng2bVgNZMeKcT6t0bmrcgScEAVnZwY7j/iZTIw73g==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.504.0", + "@aws-sdk/client-sts": "3.507.0", "@aws-sdk/core": "3.496.0", "@aws-sdk/middleware-host-header": "3.502.0", "@aws-sdk/middleware-logger": "3.502.0", @@ -374,13 +374,13 @@ "node": ">=14.0.0" }, "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.504.0" + "@aws-sdk/credential-provider-node": "^3.507.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.504.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.504.0.tgz", - "integrity": "sha512-IESs8FkL7B/uY+ml4wgoRkrr6xYo4PizcNw6JX17eveq1gRBCPKeGMjE6HTDOcIYZZ8rqz/UeuH3JD4UhrMOnA==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.507.0.tgz", + "integrity": "sha512-TOWBe0ApEh32QOib0R+irWGjd1F9wnhbGV5PcB9SakyRwvqwG5MKOfYxG7ocoDqLlaRwzZMidcy/PV8/OEVNKg==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -426,7 +426,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.504.0" + "@aws-sdk/credential-provider-node": "^3.507.0" } }, "node_modules/@aws-sdk/core": { @@ -479,15 +479,15 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.504.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.504.0.tgz", - "integrity": "sha512-ODICLXfr8xTUd3wweprH32Ge41yuBa+u3j0JUcLdTUO1N9ldczSMdo8zOPlP0z4doqD3xbnqMkjNQWgN/Q+5oQ==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.507.0.tgz", + "integrity": "sha512-2CnyduoR9COgd7qH1LPYK8UggGqVs8R4ASDMB5bwGxbg9ZerlStDiHpqvJNNg1k+VlejBr++utxfmHd236XgmQ==", "dependencies": { - "@aws-sdk/client-sts": "3.504.0", + "@aws-sdk/client-sts": "3.507.0", "@aws-sdk/credential-provider-env": "3.502.0", "@aws-sdk/credential-provider-process": "3.502.0", - "@aws-sdk/credential-provider-sso": "3.504.0", - "@aws-sdk/credential-provider-web-identity": "3.504.0", + "@aws-sdk/credential-provider-sso": "3.507.0", + "@aws-sdk/credential-provider-web-identity": "3.507.0", "@aws-sdk/types": "3.502.0", "@smithy/credential-provider-imds": "^2.2.1", "@smithy/property-provider": "^2.1.1", @@ -500,16 +500,16 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.504.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.504.0.tgz", - "integrity": "sha512-6+V5hIh+tILmUjf2ZQWQINR3atxQVgH/bFrGdSR/sHSp/tEgw3m0xWL3IRslWU1e4/GtXrfg1iYnMknXy68Ikw==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.507.0.tgz", + "integrity": "sha512-tkQnmOLkRBXfMLgDYHzogrqTNdtl0Im0ipzJb2IV5hfM5NoTfCf795e9A9isgwjSP/g/YEU0xQWxa4lq8LRtuA==", "dependencies": { "@aws-sdk/credential-provider-env": "3.502.0", "@aws-sdk/credential-provider-http": "3.503.1", - "@aws-sdk/credential-provider-ini": "3.504.0", + "@aws-sdk/credential-provider-ini": "3.507.0", "@aws-sdk/credential-provider-process": "3.502.0", - "@aws-sdk/credential-provider-sso": "3.504.0", - "@aws-sdk/credential-provider-web-identity": "3.504.0", + "@aws-sdk/credential-provider-sso": "3.507.0", + "@aws-sdk/credential-provider-web-identity": "3.507.0", "@aws-sdk/types": "3.502.0", "@smithy/credential-provider-imds": "^2.2.1", "@smithy/property-provider": "^2.1.1", @@ -537,12 +537,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.504.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.504.0.tgz", - "integrity": "sha512-4MgH2or2SjPzaxM08DCW+BjaX4DSsEGJlicHKmz6fh+w9JmLh750oXcTnbvgUeVz075jcs6qTKjvUcsdGM/t8Q==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.507.0.tgz", + "integrity": "sha512-6WBjou52QukFpDi4ezb19bcAx/bM8ge8qnJnRT02WVRmU6zFQ5yLD2fW1MFsbX3cwbey+wSqKd5FGE1Hukd5wQ==", "dependencies": { - "@aws-sdk/client-sso": "3.502.0", - "@aws-sdk/token-providers": "3.504.0", + "@aws-sdk/client-sso": "3.507.0", + "@aws-sdk/token-providers": "3.507.0", "@aws-sdk/types": "3.502.0", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", @@ -554,11 +554,11 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.504.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.504.0.tgz", - "integrity": "sha512-L1ljCvGpIEFdJk087ijf2ohg7HBclOeB1UgBxUBBzf4iPRZTQzd2chGaKj0hm2VVaXz7nglswJeURH5PFcS5oA==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.507.0.tgz", + "integrity": "sha512-f+aGMfazBimX7S06224JRYzGTaMh1uIhfj23tZylPJ05KxTVi5IO1RoqeI/uHLJ+bDOx+JHBC04g/oCdO4kHvw==", "dependencies": { - "@aws-sdk/client-sts": "3.504.0", + "@aws-sdk/client-sts": "3.507.0", "@aws-sdk/types": "3.502.0", "@smithy/property-provider": "^2.1.1", "@smithy/types": "^2.9.1", @@ -569,9 +569,9 @@ } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.504.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.504.0.tgz", - "integrity": "sha512-A2h/yHy+2JFhqiCL1vfSlKxLRIZyyQte58O8s0yAV/TDt7ElzeXMTVtCUvhcOrnjtdHKfh4F36jeZSh1ja/9HA==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.507.0.tgz", + "integrity": "sha512-cwCBGw6W71d0PrFSRizBd7WdyzsZnRWVftnOvNkyjIE5vFifdFbpdVaFidMVUZmvUQvS3Vgkx1LeXPT98EBWUQ==", "dependencies": { "@smithy/abort-controller": "^2.1.1", "@smithy/middleware-endpoint": "^2.4.1", @@ -772,9 +772,9 @@ } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.504.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.504.0.tgz", - "integrity": "sha512-5FxVdRufiFLSUDJ/Qul5JFPHjhFFzo+C6u53bzbi7gaSshA6lLLhJ9KbVk2LmKE1mTR+nh2+JebI6y+3njtkzw==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.507.0.tgz", + "integrity": "sha512-A3EGvXMeOvnG+qtAsmlcQyLP7+PlCePS+PsVqLm3Pz3C16avOTxTqOZIkYCqBBX2fnASr2qUr0d3cezBfsU7PQ==", "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.502.0", "@aws-sdk/types": "3.502.0", @@ -806,11 +806,11 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.504.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.504.0.tgz", - "integrity": "sha512-YIJWWsZi2ClUiILS1uh5L6VjmCUSTI6KKMuL9DkGjYqJ0aI6M8bd8fT9Wm7QmXCyjcArTgr/Atkhia4T7oKvzQ==", + "version": "3.507.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.507.0.tgz", + "integrity": "sha512-ehOINGjoGJc6Puzon7ev4bXckkaZx18WNgMTNttYJhj3vTpj5LPSQbI/5SS927bEbpGMFz1+hJ6Ra5WGfbTcEQ==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.504.0", + "@aws-sdk/client-sso-oidc": "3.507.0", "@aws-sdk/types": "3.502.0", "@smithy/property-provider": "^2.1.1", "@smithy/shared-ini-file-loader": "^2.3.1", @@ -2719,9 +2719,9 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "node_modules/@vue/compiler-sfc/node_modules/magic-string": { - "version": "0.30.6", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.6.tgz", - "integrity": "sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==", + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", + "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -2960,13 +2960,16 @@ "dev": true }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2982,17 +2985,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -3126,14 +3130,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", + "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.3", + "set-function-length": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3354,14 +3362,15 @@ "dev": true }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", + "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -3495,6 +3504,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", @@ -3930,9 +3948,9 @@ } }, "node_modules/fastq": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", - "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4120,28 +4138,32 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.1.tgz", + "integrity": "sha512-KmuibvwbWaM4BHcBRYwJfZ1JxyJeBwB8ct9YYu67SvYdbEIlcQ2e56dHxfbobqW38GXo8/zDFqJeGtHiVbWyQw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -4470,12 +4492,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -4484,14 +4506,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5483,9 +5507,9 @@ } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.34", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.34.tgz", + "integrity": "sha512-4eLTO36woPSocqZ1zIrFD2K1v6wH7pY1uBh0JIM2KKfrVtGvPFiAku6aNOP0W1Wr9qwnaCsF0Z+CrVnryB2A8Q==", "funding": [ { "type": "opencollective", @@ -5532,9 +5556,9 @@ } }, "node_modules/prettier": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", - "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" diff --git a/src/App.vue b/src/App.vue index 5d537e2..1ae0d2e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -38,7 +38,8 @@ onBeforeMount(() => { query: { login_error: err.response.status === 400 ? "token_invalid" : "token_expired", - return_path: encodeURI(route.path), + return_path: + route.name != "login" ? encodeURI(route.path) : undefined, }, }); } diff --git a/src/components/object-storage/modals/UploadObjectModal.vue b/src/components/object-storage/modals/UploadObjectModal.vue index 331fbf6..f317f78 100644 --- a/src/components/object-storage/modals/UploadObjectModal.vue +++ b/src/components/object-storage/modals/UploadObjectModal.vue @@ -117,7 +117,7 @@ onMounted(() => { :static-backdrop="true" modal-label="Upload Object Modal" > - <template v-slot:header> + <template #header> <h4>Upload file to</h4> <ol class="breadcrumb"> <li class="breadcrumb-item">{{ props.bucketName }}</li> @@ -130,7 +130,7 @@ onMounted(() => { </li> </ol> </template> - <template v-slot:body> + <template #body> <div class="container-fluid"> <div class="row"> <form diff --git a/src/components/parameter-schema/ParameterSchemaFormComponent.vue b/src/components/parameter-schema/ParameterSchemaFormComponent.vue index 53e57e0..e0721ac 100644 --- a/src/components/parameter-schema/ParameterSchemaFormComponent.vue +++ b/src/components/parameter-schema/ParameterSchemaFormComponent.vue @@ -12,6 +12,7 @@ import BootstrapToast from "@/components/BootstrapToast.vue"; import { useResourceStore } from "@/stores/resources"; import { useRoute, useRouter } from "vue-router"; import type { ClowmInfo } from "@/types/ClowmInfo"; +import UploadParameterFileModal from "@/components/parameter-schema/UploadParameterFileModal.vue"; const bucketRepository = useBucketStore(); const resourceRepository = useResourceStore(); @@ -81,8 +82,7 @@ let validateSchema: ValidateFunction; const launchForm = ref<HTMLFormElement | null>(null); const formState = reactive<{ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - formInput: Record<string, any>; + formInput: Record<string, number | boolean | string | undefined>; validated: boolean; pipelineNotes: string; logs_s3_path?: string; @@ -156,8 +156,7 @@ watch( /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/ban-ts-comment, @typescript-eslint/no-unused-vars */ function updateSchema(schema: Record<string, any>) { validateSchema = schemaCompiler.compile(schema); - const b = Object.keys(schema["definitions"]).map((groupName) => [ - groupName, + const b = Object.keys(schema["definitions"]).map((groupName) => Object.fromEntries( Object.entries(schema["definitions"][groupName]["properties"]).map( ([parameterName, parameter]) => [ @@ -167,8 +166,10 @@ function updateSchema(schema: Record<string, any>) { ], ), ), - ]); - formState.formInput = Object.fromEntries(b); + ); + formState.formInput = b.reduce((acc, val) => { + return { ...acc, ...val }; + }); } /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/ban-ts-comment, @typescript-eslint/no-unused-vars */ @@ -176,13 +177,9 @@ function startWorkflow() { errorToast?.hide(); formState.validated = true; formState.errorType = undefined; + console.log(formState.formInput); if (launchForm.value?.checkValidity()) { - const realInput: Record<string, any> = Object.values( - formState.formInput, - ).reduce((acc, val) => { - return { ...acc, ...val }; - }); - const schemaValid = validateSchema(realInput); + const schemaValid = validateSchema(formState.formInput); if (!schemaValid) { console.error(validateSchema.errors); @@ -190,7 +187,7 @@ function startWorkflow() { } else { emit( "start-workflow", - realInput, + formState.formInput, formState.pipelineNotes, formState.logs_s3_path, formState.debug_s3_path, @@ -203,6 +200,18 @@ function startWorkflow() { } } +function loadParameters( + params?: Record<string, number | boolean | string | undefined>, +) { + if (params) { + for (const param in params) { + if (param in formState.formInput) { + formState.formInput[param] = params[param]; + } + } + } +} + function scroll(selectedAnchor: string) { document.querySelector(selectedAnchor)?.scrollIntoView({ behavior: "smooth", @@ -234,6 +243,10 @@ onMounted(() => { </template> </template> </bootstrap-toast> + <upload-parameter-file-modal + modal-id="parameterUploadModal" + @parameters-uploaded="loadParameters" + /> <div class="row mb-5 align-items-start"> <form v-if="props.schema" @@ -246,11 +259,9 @@ onMounted(() => { > <template v-for="(group, groupName) in parameterGroups" :key="groupName"> <parameter-group-form - :modelValue="formState.formInput[groupName]" - @update:model-value=" - (newValue) => (formState.formInput[groupName] = newValue) - " - v-if="formState.formInput[groupName]" + :modelValue="formState.formInput" + @update:model-value="(newValue) => (formState.formInput = newValue)" + v-if="formState.formInput" :parameter-group-name="groupName" :parameter-group="group" :showHidden="showHidden" @@ -397,7 +408,7 @@ onMounted(() => { > <input type="radio" - class="btn-check w-100" + class="btn-check" name="view-mode" id="view-mode-simple" autocomplete="off" @@ -490,11 +501,27 @@ onMounted(() => { ></span> </div> </nav> - <div class="d-grid gap-2 mb-2"> + <div class="d-grid gap-2 mb-2 px-2"> + <button + type="button" + class="btn btn-primary" + v-if="props.clowmInfo?.exampleParameters" + @click="loadParameters(props.clowmInfo?.exampleParameters)" + > + Test this workflow + </button> + <button + class="btn btn-primary" + data-bs-toggle="modal" + data-bs-target="#parameterUploadModal" + > + <font-awesome-icon icon="fa-solid fa-upload" class="me-2" /> + Upload Parameters + </button> <button type="submit" form="launchWorkflowForm" - class="btn btn-success btn-lg mx-2" + class="btn btn-success btn-lg" :disabled="props.loading || !props.schema" > <font-awesome-icon icon="fa-solid fa-play" class="me-2" /> diff --git a/src/components/parameter-schema/UploadParameterFileModal.vue b/src/components/parameter-schema/UploadParameterFileModal.vue new file mode 100644 index 0000000..db24fe3 --- /dev/null +++ b/src/components/parameter-schema/UploadParameterFileModal.vue @@ -0,0 +1,128 @@ +<script setup lang="ts"> +import BootstrapModal from "@/components/modals/BootstrapModal.vue"; +import { reactive, ref } from "vue"; + +const props = defineProps<{ + modalId: string; +}>(); + +const parameterState = reactive<{ + params?: Record<string, string | number | boolean | undefined>; + error?: string; +}>({ + params: undefined, + error: undefined, +}); + +const randomIDSuffix = Math.random().toString(16).substring(2, 8); +const parameterFileInput = ref<HTMLInputElement | undefined>(undefined); + +const emit = defineEmits<{ + ( + e: "parameters-uploaded", + params: Record<string, string | number | boolean | undefined>, + ): void; +}>(); + +function modalClosed() { + console.log("Modal closed"); +} + +function emitParameters() { + if (parameterState.params != undefined) { + emit("parameters-uploaded", parameterState.params); + parameterState.params = undefined; + if (parameterFileInput.value != undefined) { + parameterFileInput.value.value = ""; + } + } +} + +function fileChange() { + if (!parameterFileInput.value?.value?.length) return; + parameterFileInput.value?.files?.[0].text().then((str) => { + try { + parameterState.params = JSON.parse(str); + parameterState.error = undefined; + } catch (err) { + parameterState.params = undefined; + if (typeof err === "string") { + parameterState.error = err; + } else if (err instanceof Error) { + parameterState.error = err.message; + } else { + parameterState.error = "unknown error"; + } + if (parameterFileInput.value != undefined) { + parameterFileInput.value.value = ""; + } + } + }); +} +</script> + +<template> + <bootstrap-modal + :modalId="props.modalId" + :static-backdrop="true" + modal-label="Confirm Delete Modal" + v-on="{ 'hidden.bs.modal': modalClosed }" + size-modifier="lg" + > + <template #header>Upload Parameter File</template> + <template #body> + <label :for="'parameter-upload-input' + randomIDSuffix" class="form-label" + >Parameter File</label + > + <input + class="form-control mb-3" + type="file" + :id="'parameter-upload-input' + randomIDSuffix" + accept="application/json" + @change="fileChange" + ref="parameterFileInput" + /> + <template v-if="parameterState.error"> + <h5 class="text-danger">Error parsing JSON</h5> + <p class="text-danger">{{ parameterState.error }}</p> + </template> + <template v-else-if="parameterState.params"> + <h5>Uploaded Parameters:</h5> + <table class="table table-bordered"> + <caption> + {{ + Object.keys(parameterState.params).length + }} + Parameters + </caption> + <tbody> + <tr v-for="(value, name) in parameterState.params" :key="name"> + <th scope="row" style="width: 10%" class="text-end"> + <b>{{ name }}</b> + </th> + <td> + {{ value }} + </td> + </tr> + </tbody> + </table> + </template> + </template> + <template #footer> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> + Close + </button> + <button + :disabled="parameterState.params == undefined" + type="button" + class="btn btn-primary" + data-bs-dismiss="modal" + @click="emitParameters" + > + Upload + </button> + </template> + </bootstrap-modal> +</template> + +<style scoped></style> diff --git a/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue b/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue index dbcbe47..a30bd4e 100644 --- a/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue +++ b/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue @@ -26,9 +26,6 @@ const randomIDSuffix = Math.random().toString(16).substring(2, 8); const helpTextPresent = computed<boolean>(() => props.parameter["help_text"]); const iconPresent = computed<boolean>(() => props.parameter["fa_icon"]); -const defaultValue = computed<boolean>( - () => props.parameter["default"] ?? false, -); const emit = defineEmits<{ (e: "update:modelValue", value: boolean): void; @@ -50,7 +47,7 @@ const emit = defineEmits<{ :name="'inlineRadioOptions' + randomIDSuffix" :id="'trueOption' + randomIDSuffix" :value="true" - :checked="defaultValue" + :checked="props.modelValue" @input="emit('update:modelValue', true)" /> </div> @@ -62,7 +59,7 @@ const emit = defineEmits<{ :id="'falseOption' + randomIDSuffix" :value="false" @input="emit('update:modelValue', false)" - :checked="!defaultValue" + :checked="!props.modelValue" /> <label class="form-check-label" :for="'falseOption' + randomIDSuffix" >False</label diff --git a/src/components/parameter-schema/form-mode/ParameterEnumInput.vue b/src/components/parameter-schema/form-mode/ParameterEnumInput.vue index 44ce05c..03ec622 100644 --- a/src/components/parameter-schema/form-mode/ParameterEnumInput.vue +++ b/src/components/parameter-schema/form-mode/ParameterEnumInput.vue @@ -22,8 +22,6 @@ const props = defineProps({ }, }); -const defaultValue = computed<string>(() => props.parameter["default"]); - const possibleValues = computed<string[]>(() => props.parameter["enum"]); const enumSelection = ref<HTMLSelectElement | undefined>(undefined); @@ -49,7 +47,7 @@ function updateValue() { <option v-for="val in possibleValues" :key="val" - :selected="defaultValue === val" + :selected="props.modelValue === val" > {{ val }} </option> diff --git a/src/components/parameter-schema/form-mode/ParameterStringInput.vue b/src/components/parameter-schema/form-mode/ParameterStringInput.vue index af87135..a41cc04 100644 --- a/src/components/parameter-schema/form-mode/ParameterStringInput.vue +++ b/src/components/parameter-schema/form-mode/ParameterStringInput.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import { computed, watch, onMounted, reactive } from "vue"; +import { computed, watch, onMounted, reactive, ref } from "vue"; import { useBucketStore } from "@/stores/buckets"; import { useS3ObjectStore } from "@/stores/s3objects"; import { useResourceStore } from "@/stores/resources"; @@ -67,6 +67,7 @@ const formState = reactive<{ stringVal: undefined, }); +const stringInput = ref<HTMLInputElement | undefined>(undefined); const pattern = computed<string>(() => props.parameter["pattern"]); const dataFormat = computed<string | undefined>( () => props.parameter["format"], @@ -137,6 +138,16 @@ watch(selectedResource, () => { } }); +watch( + () => props.modelValue, + (newVal) => { + if (formState.stringVal != newVal) { + formState.stringVal = newVal; + formState.advancedInput = true; + } + }, +); + watch( () => formState.advancedInput, (newVal, oldValue) => { diff --git a/src/components/workflows/modals/ParameterModal.vue b/src/components/workflows/modals/ParameterModal.vue index fed99a8..c457cfb 100644 --- a/src/components/workflows/modals/ParameterModal.vue +++ b/src/components/workflows/modals/ParameterModal.vue @@ -142,6 +142,7 @@ onMounted(() => { :modalId="modalID" :static-backdrop="false" modal-label="Workflow Execution Parameters Modal" + size-modifier="lg" > <template v-slot:header >Workflow Execution Parameters diff --git a/src/types/ClowmInfo.ts b/src/types/ClowmInfo.ts index ebd4644..09ea3ef 100644 --- a/src/types/ClowmInfo.ts +++ b/src/types/ClowmInfo.ts @@ -3,4 +3,5 @@ export type ClowmInfo = { outputParameters: string[]; resourceParameters?: string[]; exampleParameters?: Record<string, string | boolean | number>; + dois?: string[]; }; -- GitLab