diff --git a/package-lock.json b/package-lock.json index f5071ef7a4061111b053f37f467f4ba6a693777c..477762e26e7f02ba4f952276c59ebb00c79d91f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "@vue/eslint-config-prettier": "~8.0.0", "@vue/eslint-config-typescript": "~11.0.3", "@vue/tsconfig": "~0.4.0", - "axios": "~1.5.0", + "axios": "~1.6.0", "eslint": "~8.48.0", "eslint-plugin-vue": "~9.17.0", "npm-run-all": "~4.1.5", @@ -202,16 +202,16 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/client-s3": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.441.0.tgz", - "integrity": "sha512-tJUhHk4Nvakw/q3IVI2oDFCu48DzuPCMu2G3n42JPyvmY0RvmtRjduduoG1lYIGgRKJu81/MFr9i8CGYNK+/5A==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.445.0.tgz", + "integrity": "sha512-2G+3MnO78irZRjlfkdvtlKRQ3yuOfrRMg8mztKpMw0q/9WHtwCcmaUUpl1bXwJ+BcNTVHopLQXdbzCeaxxI92w==", "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.441.0", - "@aws-sdk/core": "3.441.0", - "@aws-sdk/credential-provider-node": "3.441.0", + "@aws-sdk/client-sts": "3.445.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.445.0", "@aws-sdk/middleware-bucket-endpoint": "3.433.0", "@aws-sdk/middleware-expect-continue": "3.433.0", "@aws-sdk/middleware-flexible-checksums": "3.433.0", @@ -269,13 +269,13 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.441.0.tgz", - "integrity": "sha512-gndGymu4cEIN7WWhQ67RO0JMda09EGBlay2L8IKCHBK/65Y34FHUX1tCNbO2qezEzsi6BPW5o2n53Rd9QqpHUw==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.445.0.tgz", + "integrity": "sha512-me4LvqNnu6kxi+sW7t0AgMv1Yi64ikas0x2+5jv23o6Csg32w0S0xOjCTKQYahOA5CMFunWvlkFIfxbqs+Uo7w==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.441.0", + "@aws-sdk/core": "3.445.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", @@ -315,14 +315,14 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.441.0.tgz", - "integrity": "sha512-GL0Cw2v7XL1cn0T+Sk5VHLlgBJoUdMsysXsHa1mFdk0l6XHMAAnwXVXiNnjmoDSPrG0psz7dL2AKzPVRXbIUjA==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.445.0.tgz", + "integrity": "sha512-ogbdqrS8x9O5BTot826iLnTQ6i4/F5BSi/74gycneCxYmAnYnyUBNOWVnynv6XZiEWyDJQCU2UtMd52aNGW1GA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.441.0", - "@aws-sdk/credential-provider-node": "3.441.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.445.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", @@ -365,11 +365,12 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.441.0.tgz", - "integrity": "sha512-gV0eQwR0VnSPUYAbgDkbBtfXbSpZgl/K6UB13DP1IFFjQYbF/BxYwvcQe4jHoPOBifSgjEbl8MfOOeIyI7k9vg==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", + "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==", "dependencies": { - "@smithy/smithy-client": "^2.1.12" + "@smithy/smithy-client": "^2.1.12", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" @@ -390,13 +391,13 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.441.0.tgz", - "integrity": "sha512-SQipQYxYqDUuSOfIhDmaTdwPTcndGQotGZXWJl56mMWqAhU8MkwjK+oMf3VgRt/umJC0QwUCF5HUHIj7gSB1JA==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.445.0.tgz", + "integrity": "sha512-R7IYSGjNZ5KKJwQJ2HNPemjpAMWvdce91i8w+/aHfqeGfTXrmYJu99PeGRyyBTKEumBaojyjTRvmO8HzS+/l7g==", "dependencies": { "@aws-sdk/credential-provider-env": "3.433.0", "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.441.0", + "@aws-sdk/credential-provider-sso": "3.445.0", "@aws-sdk/credential-provider-web-identity": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -410,14 +411,14 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.441.0.tgz", - "integrity": "sha512-WB9p37yHq6fGJt6Vll29ijHbkh9VDbPM/n5ns73bTAgFD7R0ht5kPmdmHGQA6m3RKjcHLPbymQ3lXykkMwWf/Q==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.445.0.tgz", + "integrity": "sha512-zI4k4foSjQRKNEsouculRcz7IbLfuqdFxypDLYwn+qPNMqJwWJ7VxOOeBSPUpHFcd7CLSfbHN2JAhQ7M02gPTA==", "dependencies": { "@aws-sdk/credential-provider-env": "3.433.0", - "@aws-sdk/credential-provider-ini": "3.441.0", + "@aws-sdk/credential-provider-ini": "3.445.0", "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.441.0", + "@aws-sdk/credential-provider-sso": "3.445.0", "@aws-sdk/credential-provider-web-identity": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -446,11 +447,11 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.441.0.tgz", - "integrity": "sha512-pTg16G+62mWCE8yGKuQnEBqPdpG5g71remf2jUqXaI1c7GCzbnkQDV9eD4DaAGOvzIs0wo9zAQnS2kVDPFlCYA==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.445.0.tgz", + "integrity": "sha512-gJz7kAiDecdhtApgXnxfZsXKsww8BnifDF9MAx9Dr4X6no47qYsCCS3XPuEyRiF9VebXvHOH0H260Zp3bVyniQ==", "dependencies": { - "@aws-sdk/client-sso": "3.441.0", + "@aws-sdk/client-sso": "3.445.0", "@aws-sdk/token-providers": "3.438.0", "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", @@ -477,9 +478,9 @@ } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.441.0.tgz", - "integrity": "sha512-Olj/kVIhJo9Cvw06dzn0uQ8M29L7Vu8tSj4MHCewH0goJ0GGIclOf83uVofMZO94zG7X/bv6+4CtNBJIhlokQw==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.445.0.tgz", + "integrity": "sha512-sCP3lh71oMkx/B3+tSOGr81cff1Z1Yy5ejh5xa/YuH6OefQUFBM7/EC0CJiNfVXemh3D6O+biKETL+t2rAiZoQ==", "dependencies": { "@smithy/abort-controller": "^2.0.1", "@smithy/middleware-endpoint": "^2.1.3", @@ -690,9 +691,9 @@ } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.441.0.tgz", - "integrity": "sha512-EUVsmy92imURMLoA/MX+PL1SIONQ8YSi424BHJA6xGEoaqvQiaVKlv8jJfCqJ6qQ8oLiCLe2hOBSBTY1XZiy/g==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.445.0.tgz", + "integrity": "sha512-UZrtfYdwkNfPkdCYdLYSshTBHkK1W1f3qf011f5P99sxC5nahBnBiLRMeTeKAxveIkAHKqYKlMVa/+gD65d5yA==", "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.437.0", "@aws-sdk/types": "3.433.0", @@ -883,9 +884,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1314,9 +1315,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1525,11 +1526,11 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.16.tgz", - "integrity": "sha512-1k+FWHQDt2pfpXhJsOmNMmlAZ3NUQ98X5tYsjQhVGq+0X6cOBMhfh6Igd0IX3Ut6lEO6DQAdPMI/blNr3JZfMQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.17.tgz", + "integrity": "sha512-iQ8Q8ojqiPqRKdybDI1g7HvG8EcnekRnH3DYeNTrT26vDuPq2nomyMCc0DZnPW+uAUcLCGZpAmGTAvEOYX55wA==", "dependencies": { - "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-config-provider": "^2.1.4", "@smithy/types": "^2.4.0", "@smithy/util-config-provider": "^2.0.0", "@smithy/util-middleware": "^2.0.5", @@ -1540,11 +1541,11 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.18.tgz", - "integrity": "sha512-QnPBi6D2zj6AHJdUTo5zXmk8vwHJ2bNevhcVned1y+TZz/OI5cizz5DsYNkqFUIDn8tBuEyKNgbmKVNhBbuY3g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.0.tgz", + "integrity": "sha512-amqeueHM3i02S6z35WlXp7gejBnRloT5ctR/mQLlg/6LWGd70Avc2epzuuWtCptNg2ak5/yODD1fAVs9NPCyqg==", "dependencies": { - "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-config-provider": "^2.1.4", "@smithy/property-provider": "^2.0.13", "@smithy/types": "^2.4.0", "@smithy/url-parser": "^2.0.12", @@ -1710,13 +1711,13 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.3.tgz", - "integrity": "sha512-ZrQ0/YX6hNVTxqMEHtEaDbDv6pNeEji/a5Vk3HuFC5R3ZY8lfoATyxmOGxBVYnF3NUvZLNC7umEv1WzWGWvCGQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.4.tgz", + "integrity": "sha512-fNUTsdTkM/RUu77AljH7fD3O0sFKDPNn1dFMR1oLAuJLOq4r6yjnL7Uc/F7wOgzgw1KRqqEnqAZccyAX2iEa4Q==", "dependencies": { "@smithy/middleware-serde": "^2.0.12", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/shared-ini-file-loader": "^2.2.3", "@smithy/types": "^2.4.0", "@smithy/url-parser": "^2.0.12", "@smithy/util-middleware": "^2.0.5", @@ -1727,11 +1728,11 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.18.tgz", - "integrity": "sha512-VyrHQRldGSb3v9oFOB5yPxmLT7U2sQic2ytylOnYlnsmVOLlFIaI6sW22c+w2675yq+XZ6HOuzV7x2OBYCWRNA==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.19.tgz", + "integrity": "sha512-VMS1GHxLpRnuLHrPTj/nb9aD99jJsNzWX07F00fIuV9lkz3lWP7RUM7P1aitm0+4YfhShPn+Wri8/CuoqPOziA==", "dependencies": { - "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-config-provider": "^2.1.4", "@smithy/protocol-http": "^3.0.8", "@smithy/service-error-classification": "^2.0.5", "@smithy/types": "^2.4.0", @@ -1769,12 +1770,12 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.3.tgz", - "integrity": "sha512-J6lXvRHGVnSX3n1PYi+e1L5HN73DkkJpUviV3Ebf+8wSaIjAf+eVNbzyvh/S5EQz7nf4KVfwbD5vdoZMAthAEQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.4.tgz", + "integrity": "sha512-kROLnHFatpimtmZ8YefsRRb5OJ8LVIVNhUWp67KHL4D2Vjd+WpIHMzWtkLLV4p0qXpY+IxmwcL2d2XMPn8ppsQ==", "dependencies": { "@smithy/property-provider": "^2.0.13", - "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/shared-ini-file-loader": "^2.2.3", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -1858,9 +1859,9 @@ } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.2.tgz", - "integrity": "sha512-noyQUPn7b1M8uB0GEXc/Zyxq+5K2b7aaqWnLp+hgJ7+xu/FCvtyWy5eWLDjQEsHnAet2IZhS5QF8872OR69uNg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.3.tgz", + "integrity": "sha512-VDyhCNycPbNkPidMnBgYQeSwJkoATRFm5VrveVqIPAjsdGutf7yZpPycuDWW9bRFnuuwaBhCC0pA7KCH0+2wrg==", "dependencies": { "@smithy/types": "^2.4.0", "tslib": "^2.5.0" @@ -1992,13 +1993,13 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.21.tgz", - "integrity": "sha512-cUEsttVZ79B7Al2rWK2FW03HBpD9LyuqFtm+1qFty5u9sHSdesr215gS2Ln53fTopNiPgeXpdoM3IgjvIO0rJw==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.22.tgz", + "integrity": "sha512-4nNsNBi4pj8nQX/cbRPzomyU/cptFr1OJckxo+nlRZdTZlj+raA8NI5sNF1kD4pyGyARuqDtWc9+xMhFHXIJmw==", "dependencies": { - "@smithy/config-resolver": "^2.0.16", - "@smithy/credential-provider-imds": "^2.0.18", - "@smithy/node-config-provider": "^2.1.3", + "@smithy/config-resolver": "^2.0.17", + "@smithy/credential-provider-imds": "^2.1.0", + "@smithy/node-config-provider": "^2.1.4", "@smithy/property-provider": "^2.0.13", "@smithy/smithy-client": "^2.1.12", "@smithy/types": "^2.4.0", @@ -2009,11 +2010,11 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.2.tgz", - "integrity": "sha512-QEdq+sP68IJHAMVB2ugKVVZEWeKQtZLuf+akHzc8eTVElsZ2ZdVLWC6Cp+uKjJ/t4yOj1qu6ZzyxJQEQ8jdEjg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.3.tgz", + "integrity": "sha512-rMYXLMdAMVbJAEHhNlCSJsAxo3NG3lcPja7WmesjAbNrMSyYZ6FnHHTy8kzRhddn4eAtLvPBSO6LiBB21gCoHQ==", "dependencies": { - "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-config-provider": "^2.1.4", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2118,51 +2119,51 @@ "dev": true }, "node_modules/@types/bootstrap": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.8.tgz", - "integrity": "sha512-14do+aWZPc1w3G+YevSsy8eas1XEPhTOUNBhQX/r12YKn7ySssATJusBQ/HCQAd2nq54U8vvrftHSb1YpeJUXg==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.9.tgz", + "integrity": "sha512-Fcg4nORBKaVUAG4F0ePWcatWQVfr3NAT9XIN+hl1PaiAwb4tq55+iua9R3exsbB3yyfhyQlHYg2foTlW86J+RA==", "dev": true, "dependencies": { "@popperjs/core": "^2.9.2" } }, "node_modules/@types/dompurify": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.4.tgz", - "integrity": "sha512-1Jk8S/IRzNSbwQRbuGuLFHviwxQ8pX81ZEW3INY9432Cwb4VedkBYan8gSIXVLOLHBtimOmUTEYphjRVmo+30g==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", "dev": true, "dependencies": { "@types/trusted-types": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/node": { - "version": "16.18.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.60.tgz", - "integrity": "sha512-ZUGPWx5vKfN+G2/yN7pcSNLkIkXEvlwNaJEd4e0ppX7W2S8XAkdc/37hM4OUNJB9sa0p12AOvGvxL4JCPiz9DA==", + "version": "16.18.61", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.61.tgz", + "integrity": "sha512-k0N7BqGhJoJzdh6MuQg1V1ragJiXTh8VUBAZTWjJ9cUq23SG0F0xavOwZbhiP4J3y20xd6jxKx+xNUhkMAi76Q==", "dev": true }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, "node_modules/@types/showdown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.3.tgz", - "integrity": "sha512-cFuAcA3p2YPq8HR8KxvDXnOdccOZ74ypANB3kb3AL5Srji0QnteVw6vf4o7GJ8hMyz+uZ+nSQHVgXSgjYD1a5g==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-2.0.4.tgz", + "integrity": "sha512-cSXSKOpTSr2HTdlGq8WskyZwNyxKhM7M/zJeLVdWjlUQmQ4d8TdtPrwz4JejglZdzIzSgU5loi5QUaEJF9JD8w==", "dev": true }, "node_modules/@types/trusted-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", - "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz", + "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -2395,12 +2396,12 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.7.tgz", - "integrity": "sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.8.tgz", + "integrity": "sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==", "dependencies": { "@babel/parser": "^7.23.0", - "@vue/shared": "3.3.7", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } @@ -2411,25 +2412,25 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "node_modules/@vue/compiler-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.7.tgz", - "integrity": "sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz", + "integrity": "sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==", "dependencies": { - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.7.tgz", - "integrity": "sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz", + "integrity": "sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==", "dependencies": { "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-ssr": "3.3.7", - "@vue/reactivity-transform": "3.3.7", - "@vue/shared": "3.3.7", + "@vue/compiler-core": "3.3.8", + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-ssr": "3.3.8", + "@vue/reactivity-transform": "3.3.8", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", "magic-string": "^0.30.5", "postcss": "^8.4.31", @@ -2453,12 +2454,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.7.tgz", - "integrity": "sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz", + "integrity": "sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==", "dependencies": { - "@vue/compiler-dom": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-dom": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/devtools-api": { @@ -2553,21 +2554,21 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.7.tgz", - "integrity": "sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.8.tgz", + "integrity": "sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==", "dependencies": { - "@vue/shared": "3.3.7" + "@vue/shared": "3.3.8" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.7.tgz", - "integrity": "sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz", + "integrity": "sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==", "dependencies": { "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7", + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", "magic-string": "^0.30.5" } @@ -2589,40 +2590,40 @@ } }, "node_modules/@vue/runtime-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.7.tgz", - "integrity": "sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.8.tgz", + "integrity": "sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==", "dependencies": { - "@vue/reactivity": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/reactivity": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/runtime-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.7.tgz", - "integrity": "sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.8.tgz", + "integrity": "sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==", "dependencies": { - "@vue/runtime-core": "3.3.7", - "@vue/shared": "3.3.7", + "@vue/runtime-core": "3.3.8", + "@vue/shared": "3.3.8", "csstype": "^3.1.2" } }, "node_modules/@vue/server-renderer": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.7.tgz", - "integrity": "sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.8.tgz", + "integrity": "sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==", "dependencies": { - "@vue/compiler-ssr": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-ssr": "3.3.8", + "@vue/shared": "3.3.8" }, "peerDependencies": { - "vue": "3.3.7" + "vue": "3.3.8" } }, "node_modules/@vue/shared": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.7.tgz", - "integrity": "sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==" + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.8.tgz", + "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==" }, "node_modules/@vue/tsconfig": { "version": "0.4.0", @@ -2771,9 +2772,9 @@ } }, "node_modules/axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -3717,9 +3718,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4925,9 +4926,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -7007,15 +7008,15 @@ } }, "node_modules/vue": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.7.tgz", - "integrity": "sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==", - "dependencies": { - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-sfc": "3.3.7", - "@vue/runtime-dom": "3.3.7", - "@vue/server-renderer": "3.3.7", - "@vue/shared": "3.3.7" + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.8.tgz", + "integrity": "sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==", + "dependencies": { + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-sfc": "3.3.8", + "@vue/runtime-dom": "3.3.8", + "@vue/server-renderer": "3.3.8", + "@vue/shared": "3.3.8" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index 823b0b95e061256f766227982db928b0763c2f3e..2c7bbd8337e0cd7a9423ddcdac50b5c2d64a212e 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@vue/eslint-config-prettier": "~8.0.0", "@vue/eslint-config-typescript": "~11.0.3", "@vue/tsconfig": "~0.4.0", - "axios": "~1.5.0", + "axios": "~1.6.0", "eslint": "~8.48.0", "eslint-plugin-vue": "~9.17.0", "npm-run-all": "~4.1.5", diff --git a/src/client/workflow/index.ts b/src/client/workflow/index.ts index 3b82994fee1718758b8ac10abf07efc931577860..6d265a31eea81f607b44b43bb9597752591803a5 100644 --- a/src/client/workflow/index.ts +++ b/src/client/workflow/index.ts @@ -7,6 +7,7 @@ export { CancelablePromise, CancelError } from './core/CancelablePromise'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; +export type { AnonymizedWorkflowExecution } from './models/AnonymizedWorkflowExecution'; export type { Body_Workflow_Version_upload_workflow_version_icon } from './models/Body_Workflow_Version_upload_workflow_version_icon'; export type { DevWorkflowExecutionIn } from './models/DevWorkflowExecutionIn'; export { DocumentationEnum } from './models/DocumentationEnum'; diff --git a/src/client/workflow/models/AnonymizedWorkflowExecution.ts b/src/client/workflow/models/AnonymizedWorkflowExecution.ts new file mode 100644 index 0000000000000000000000000000000000000000..eb4085fe63360b4b3018cf3e85a097f9679422ed --- /dev/null +++ b/src/client/workflow/models/AnonymizedWorkflowExecution.ts @@ -0,0 +1,42 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { WorkflowExecutionStatus } from './WorkflowExecutionStatus'; + +export type AnonymizedWorkflowExecution = { + /** + * ID of the workflow execution + */ + workflow_execution_id: string; + /** + * Anonymized user ID of the user who ran the workflow execution + */ + pseudo_uid: string; + /** + * ID of the workflow mode this workflow execution ran in + */ + workflow_mode_id?: (string | null); + /** + * Hash of the git commit + */ + git_commit_hash: string; + /** + * Day of the workflow execution + */ + started_at: string; + /** + * ID of the workflow + */ + workflow_id: string; + /** + * ID of developer of the workflow + */ + developer_id: string; + /** + * End status of the workflow execution + */ + status: WorkflowExecutionStatus; +}; + diff --git a/src/client/workflow/models/WorkflowOut.ts b/src/client/workflow/models/WorkflowOut.ts index e0ef6d9d76564b982caf7146d138252e69202b32..a3d055f5a99d8683b29183cfe42cf01b9903ad28 100644 --- a/src/client/workflow/models/WorkflowOut.ts +++ b/src/client/workflow/models/WorkflowOut.ts @@ -19,7 +19,7 @@ export type WorkflowOut = { */ repository_url: string; /** - * Id of the workflow + * ID of the workflow */ workflow_id: string; /** @@ -27,7 +27,7 @@ export type WorkflowOut = { */ versions: Array<WorkflowVersion>; /** - * Id of developer of the workflow + * ID of developer of the workflow */ developer_id: string; /** diff --git a/src/client/workflow/services/WorkflowService.ts b/src/client/workflow/services/WorkflowService.ts index 4409a96bab414b3598f3c7c6a01e525106de96c1..b173a102fe754904bcd8acfb703ef02616a7d5e5 100644 --- a/src/client/workflow/services/WorkflowService.ts +++ b/src/client/workflow/services/WorkflowService.ts @@ -2,6 +2,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { AnonymizedWorkflowExecution } from '../models/AnonymizedWorkflowExecution'; import type { Body_Workflow_Version_upload_workflow_version_icon } from '../models/Body_Workflow_Version_upload_workflow_version_icon'; import type { DocumentationEnum } from '../models/DocumentationEnum'; import type { IconUpdateOut } from '../models/IconUpdateOut'; @@ -82,11 +83,48 @@ export class WorkflowService { }); } + /** + * Get anonymized workflow execution + * Get the workflow executions with meta information and anonymized user IDs. + * + * Permission "workflow:read_statistics" required if the `developer_id` is the same as the uid of the current user, + * other "workflow:read_statistics_any". + * @param developerId Filter by the developer of the workflows + * @param workflowId Filter by workflow IDs + * @param start Filter by workflow executions after this date + * @param end Filter by workflow executions before this date + * @returns AnonymizedWorkflowExecution Successful Response + * @throws ApiError + */ + public static workflowGetDeveloperWorkflowStatistics( + developerId?: (string | null), + workflowId?: (Array<string> | null), + start?: (string | null), + end?: (string | null), + ): CancelablePromise<Array<AnonymizedWorkflowExecution>> { + return __request(OpenAPI, { + method: 'GET', + url: '/workflows/developer_statistics', + query: { + 'developer_id': developerId, + 'workflow_id': workflowId, + 'start': start, + 'end': end, + }, + errors: { + 400: `Error decoding JWT Token`, + 403: `Not authenticated`, + 404: `Entity not Found`, + 422: `Validation Error`, + }, + }); + } + /** * Get a workflow * Get a specific workflow. * - * Permission "workflow: read" required. + * Permission "workflow:read" required. * @param wid ID of a workflow * @param versionStatus Which versions of the workflow to include in the response. Permission 'workflow:read_any' required if you are not the developer of this workflow. Default PUBLISHED and DEPRECATED * @returns WorkflowOut Successful Response @@ -144,6 +182,8 @@ export class WorkflowService { /** * Get statistics for a workflow * Get the number of started workflow per day. + * + * Permission "workflow:read" required. * @param wid ID of a workflow * @returns WorkflowStatistic Successful Response * @throws ApiError diff --git a/src/components/object-storage/modals/PermissionModal.vue b/src/components/object-storage/modals/PermissionModal.vue index 485f1ace427930c8cd8bb0e36af5a00ec1ec9b8f..60ad031740571fd138c8cb918a68137d4bf94259 100644 --- a/src/components/object-storage/modals/PermissionModal.vue +++ b/src/components/object-storage/modals/PermissionModal.vue @@ -435,7 +435,7 @@ function toTimestampChanged(target?: HTMLInputElement | null) { <input type="date" class="form-control" - id="permissionToFromInput" + id="permissionDateToInput" :readonly="formState.readonly" :min=" permission.from_timestamp != null diff --git a/src/components/workflows/WorkflowWithVersionsCard.vue b/src/components/workflows/WorkflowWithVersionsCard.vue index d43ce26bb4024457da84b853064cbf880ee29317..d27d855bc536c91fb40317fdafa283ec144f4639 100644 --- a/src/components/workflows/WorkflowWithVersionsCard.vue +++ b/src/components/workflows/WorkflowWithVersionsCard.vue @@ -1,12 +1,18 @@ <script setup lang="ts"> -import type { WorkflowOut, WorkflowVersion } from "@/client/workflow"; -import { onMounted, ref, watch } from "vue"; -import { Status } from "@/client/workflow"; +import type { + AnonymizedWorkflowExecution, + WorkflowOut, + WorkflowVersion, +} from "@/client/workflow"; +import { Status, WorkflowExecutionStatus } from "@/client/workflow"; +import { computed, onMounted, ref, watch } from "vue"; import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue"; import dayjs from "dayjs"; import { sortedVersions } from "@/utils/Workflow"; import { Tooltip } from "bootstrap"; +import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; +const workflowExecutionRepository = useWorkflowExecutionStore(); const props = defineProps<{ workflow: WorkflowOut; loading: boolean; @@ -30,6 +36,25 @@ watch( }, ); +const workflowExecutions = computed<AnonymizedWorkflowExecution[]>(() => + workflowExecutionRepository.anonymizedExecutions.filter( + (execution) => execution.workflow_id == props.workflow.workflow_id, + ), +); + +const executionsByVersion = computed< + Record<string, AnonymizedWorkflowExecution[]> +>(() => { + const mapping: Record<string, AnonymizedWorkflowExecution[]> = {}; + for (const version of props.workflow.versions) { + mapping[version.git_commit_hash] = []; + } + for (const execution of workflowExecutions.value) { + mapping[execution.git_commit_hash].push(execution); + } + return mapping; +}); + const statusToIconMapping: Record<string, string> = { PUBLISHED: "fa-solid fa-circle-check", DENIED: "fa-solid fa-x", @@ -37,15 +62,51 @@ const statusToIconMapping: Record<string, string> = { DEPRECATED: "fa-solid fa-box-archive", }; +function successfulExecutions( + executions: AnonymizedWorkflowExecution[], +): number { + return executions.filter( + (execution) => execution.status === WorkflowExecutionStatus.SUCCESS, + ).length; +} + +function unsuccessfulExecutions( + executions: AnonymizedWorkflowExecution[], +): number { + return executions.filter( + (execution) => execution.status !== WorkflowExecutionStatus.SUCCESS, + ).length; +} + +function uniqueUsers(executions: AnonymizedWorkflowExecution[]): number { + return executions.filter( + // filter unique UIDs + (execution, index, array) => + array.findIndex((val) => val.pseudo_uid === execution.pseudo_uid) === + index, + ).length; +} + onMounted(() => { - if (!props.loading && props.workflow.private) { - new Tooltip(`#tooltip-${randomIDSuffix}`); + if (!props.loading) { + if (props.workflow.private) { + new Tooltip(`#tooltip-${randomIDSuffix}`); + } + document + .querySelector("#workflow-card-" + randomIDSuffix) + ?.querySelectorAll('[data-bs-toggle="tooltip"]') + .forEach((tooltipTriggerEl) => + Tooltip.getOrCreateInstance(tooltipTriggerEl), + ); } }); </script> <template> - <div class="card-hover border border-secondary card m-2"> + <div + :id="'workflow-card-' + randomIDSuffix" + class="card-hover border border-secondary card m-2" + > <div class="card-body"> <div class="card-title fs-3 d-flex justify-content-between align-items-center" @@ -124,11 +185,12 @@ onMounted(() => { <th scope="col">Version</th> <th scope="col">Status</th> <th scope="col">Updated at</th> + <th scope="col" class="text-align-center">Usage</th> <th scope="col" class="text-align-center">Icon</th> <th scope="col">Link</th> </tr> </thead> - <tbody> + <tbody class="table-group-divider"> <tr v-for="version in sortedVersions(props.workflow.versions)" :key="version.git_commit_hash" @@ -148,7 +210,39 @@ onMounted(() => { {{ version.status }} </td> <td> - {{ dayjs.unix(version.created_at).format("D MMMM YYYY") }} + {{ dayjs.unix(version.created_at).format("DD MMM YYYY") }} + </td> + <td class="text-align-center"> + <span + class="text-success me-1" + data-bs-toggle="tooltip" + data-bs-title="Successful Workflow Executions" + > + {{ + successfulExecutions( + executionsByVersion[version.git_commit_hash], + ) + }} + <font-awesome-icon icon="fa-solid fa-circle-check" /> + </span> + <span + class="text-danger me-1" + data-bs-toggle="tooltip" + data-bs-title="Unsuccessful Workflow Executions" + > + {{ + unsuccessfulExecutions( + executionsByVersion[version.git_commit_hash], + ) + }} + <font-awesome-icon icon="fa-solid fa-x" /> + </span> + <span data-bs-toggle="tooltip" data-bs-title="Unique Users"> + {{ + uniqueUsers(executionsByVersion[version.git_commit_hash]) + }} + <font-awesome-icon icon="fa-solid fa-user" /> + </span> </td> <td class="text-align-center"> <img @@ -187,6 +281,33 @@ onMounted(() => { </router-link> </td> </tr> + <tr> + <th scope="row" class="fw-bold">Overall</th> + <td colspan="2"></td> + <td class="text-align-center"> + <span + class="text-success me-1" + data-bs-toggle="tooltip" + data-bs-title="Successful Workflow Executions" + > + {{ successfulExecutions(workflowExecutions) }} + <font-awesome-icon icon="fa-solid fa-circle-check" /> + </span> + <span + class="text-danger me-1" + data-bs-toggle="tooltip" + data-bs-title="Unsuccessful Workflow Executions" + > + {{ unsuccessfulExecutions(workflowExecutions) }} + <font-awesome-icon icon="fa-solid fa-x" /> + </span> + <span data-bs-toggle="tooltip" data-bs-title="Unique Users"> + {{ uniqueUsers(workflowExecutions) }} + <font-awesome-icon icon="fa-solid fa-user" /> + </span> + </td> + <td colspan="2"></td> + </tr> </tbody> </table> </div> diff --git a/src/components/workflows/modals/ArbitraryWorkflowModal.vue b/src/components/workflows/modals/ArbitraryWorkflowModal.vue index 92ae9243e7074ad2ea9994b35c2367551a25440e..0f56f351e162cdb6e43e061a3dba364381c59456 100644 --- a/src/components/workflows/modals/ArbitraryWorkflowModal.vue +++ b/src/components/workflows/modals/ArbitraryWorkflowModal.vue @@ -199,7 +199,7 @@ onMounted(() => { ref="arbitraryWorkflowForm" > <div class="mb-3"> - <label for="workflowRepositoryInput" class="form-label" + <label for="arbitraryWorkflowRepositoryInput" class="form-label" >Git Repository URL</label > <div class="input-group"> @@ -209,7 +209,7 @@ onMounted(() => { <input type="url" class="form-control" - id="workflowRepositoryInput" + id="arbitraryWorkflowRepositoryInput" placeholder="https://..." required ref="workflowRepositoryElement" @@ -273,7 +273,9 @@ onMounted(() => { </label> </div> <div class="collapse" id="privateRepositoryCollapse"> - <label for="tokenUsernameInput" class="form-label">Token</label> + <label for="arbitraryRepositoryTokenInput" class="form-label" + >Token</label + > <div class="input-group"> <div class="input-group-text"> <font-awesome-icon icon="fa-solid fa-key" /> @@ -281,7 +283,7 @@ onMounted(() => { <input type="password" class="form-control" - id="repositoryTokenInput" + id="arbitraryRepositoryTokenInput" v-model="repositoryCredentials.token" @change="formState.allowUpload = false" :required="repositoryCredentials.privateRepo" @@ -342,7 +344,7 @@ onMounted(() => { <div class="collapse" id="workflowModeCollapse"> <div class="row"> <div class="col-6 mb-2"> - <label for="modeEntryInput-" class="form-label" + <label for="arbitraryModeEntryInput" class="form-label" >Entrypoint</label > <div class="input-group"> @@ -352,7 +354,7 @@ onMounted(() => { <input type="text" class="form-control" - id="modeEntryInput" + id="arbitraryModeEntryInput" maxlength="128" v-model="workflowMode.mode.entrypoint" :required="workflowMode.modeEnabled" diff --git a/src/components/workflows/modals/CreateWorkflowModal.vue b/src/components/workflows/modals/CreateWorkflowModal.vue index f9df97b2ede49c80550eae0faf291da294f189fa..86bd5862fcfe811428259c97758a9fb9ca299ee7 100644 --- a/src/components/workflows/modals/CreateWorkflowModal.vue +++ b/src/components/workflows/modals/CreateWorkflowModal.vue @@ -389,7 +389,7 @@ onMounted(() => { </div> </div> <div class="mb-3"> - <label for="workflowRepositoryInput" class="form-label" + <label for="createWorkflowRepositoryInput" class="form-label" >Git Repository URL</label > <div class="input-group"> @@ -399,7 +399,7 @@ onMounted(() => { <input type="url" class="form-control" - id="workflowRepositoryInput" + id="createWorkflowRepositoryInput" placeholder="https://..." required ref="workflowRepositoryElement" @@ -465,7 +465,7 @@ onMounted(() => { </div> </div> <div class="col-4"> - <label for="workflowVersionInput" class="form-label" + <label for="createWorkflowVersionInput" class="form-label" >Initial Version</label > <div class="input-group"> @@ -475,7 +475,7 @@ onMounted(() => { <input type="text" class="form-control" - id="workflowRepositoryInput" + id="createWorkflowVersionInput" placeholder="v1.0.0" maxlength="10" ref="workflowVersionElement" @@ -508,7 +508,9 @@ onMounted(() => { </label> </div> <div class="collapse" id="privateRepositoryCollapse"> - <label for="tokenUsernameInput" class="form-label">Token</label> + <label for="createRepositoryTokenInput" class="form-label" + >Token</label + > <div class="input-group"> <div class="input-group-text"> <font-awesome-icon icon="fa-solid fa-key" /> @@ -516,7 +518,7 @@ onMounted(() => { <input type="password" class="form-control" - id="repositoryTokenInput" + id="createRepositoryTokenInput" v-model="repositoryCredentials.token" @change="formState.allowUpload = false" :required="repositoryCredentials.privateRepo" diff --git a/src/components/workflows/modals/UpdateWorkflowModal.vue b/src/components/workflows/modals/UpdateWorkflowModal.vue index 2f1aa6daacde55fd19b1b61787e48cbe27a8c685..1b393686f6bdd81ebcdf4ce82d6e975fcac7eaa4 100644 --- a/src/components/workflows/modals/UpdateWorkflowModal.vue +++ b/src/components/workflows/modals/UpdateWorkflowModal.vue @@ -362,11 +362,12 @@ onMounted(() => { ref="workflowIconElement" class="float-end" :hidden="!showIcon" + alt="Workflow Icon" /> </div> <div class="row mb-3"> <div class="col-8"> - <label for="workflowGitCommitInput" class="form-label" + <label for="updateWorkflowGitCommitInput" class="form-label" >Git Commit Hash</label > <div class="input-group"> @@ -376,7 +377,7 @@ onMounted(() => { <input type="text" class="form-control text-lowercase" - id="workflowGitCommitInput" + id="updateWorkflowGitCommitInput" placeholder="ba8bcd9..." required ref="workflowGitCommitHashElement" @@ -396,7 +397,9 @@ onMounted(() => { </div> </div> <div class="col-4"> - <label for="workflowVersionInput" class="form-label">Version</label> + <label for="updateWorkflowVersionInput" class="form-label" + >Version</label + > <div class="input-group"> <div class="input-group-text"> <font-awesome-icon icon="fa-solid fa-tag" /> @@ -404,17 +407,17 @@ onMounted(() => { <input type="text" class="form-control" - id="workflowRepositoryInput" + id="updateWorkflowVersionInput" :placeholder="inc(latestVersion.version, 'patch') ?? undefined" maxlength="10" required ref="workflowVersionElement" @change="checkVersionValidity" v-model="workflowUpdate.version" - aria-describedby="versionHelp" + aria-describedby="updateVersionHelp" /> </div> - <div id="versionHelp" class="form-text"> + <div id="updateVersionHelp" class="form-text"> Previous Version: {{ latestVersion.version }} </div> </div> diff --git a/src/stores/workflowExecutions.ts b/src/stores/workflowExecutions.ts index 59c6c61c72ddb45716b40106053ec991e02f1a45..87b5d37bb550a8e91291e76533cdf02e95da1c3d 100644 --- a/src/stores/workflowExecutions.ts +++ b/src/stores/workflowExecutions.ts @@ -1,5 +1,6 @@ import { defineStore } from "pinia"; import type { + AnonymizedWorkflowExecution, DevWorkflowExecutionIn, WorkflowExecutionIn, WorkflowExecutionOut, @@ -7,6 +8,7 @@ import type { import { WorkflowExecutionService, WorkflowExecutionStatus, + WorkflowService, } from "@/client/workflow"; import { useAuthStore } from "@/stores/users"; import dayjs from "dayjs"; @@ -16,8 +18,10 @@ export const useWorkflowExecutionStore = defineStore({ state: () => ({ executionMapping: {}, + anonymizedExecutions: [], }) as { executionMapping: Record<string, WorkflowExecutionOut>; + anonymizedExecutions: AnonymizedWorkflowExecution[]; }, getters: { executions(): WorkflowExecutionOut[] { @@ -25,6 +29,22 @@ export const useWorkflowExecutionStore = defineStore({ }, }, actions: { + fetchExecutionsForDevStatistics( + onFinally?: () => void, + ): Promise<AnonymizedWorkflowExecution[]> { + if (this.anonymizedExecutions.length > 0) { + onFinally?.(); + } + const userStore = useAuthStore(); + return WorkflowService.workflowGetDeveloperWorkflowStatistics( + userStore.currentUID, + ) + .then((executions) => { + this.anonymizedExecutions = executions; + return executions; + }) + .finally(onFinally); + }, fetchExecutions(onFinally?: () => void): Promise<WorkflowExecutionOut[]> { if (Object.keys(this.executionMapping).length > 0) { onFinally?.(); diff --git a/src/views/object-storage/BucketView.vue b/src/views/object-storage/BucketView.vue index 2d1c8234d12d6b8b77e6cdf6d8f291b1e776c502..badf054ecbc935b3c0263756e5b32bebc353ad7f 100644 --- a/src/views/object-storage/BucketView.vue +++ b/src/views/object-storage/BucketView.vue @@ -496,6 +496,7 @@ function getObjectFileName(key: string): string { ><font-awesome-icon icon="fa-solid fa-magnifying-glass" /></span> <input + id="filterObjectNameInput" type="text" class="form-control" placeholder="Search Files" diff --git a/src/views/object-storage/BucketsView.vue b/src/views/object-storage/BucketsView.vue index 19f6a23671006f076364cd772fe08b28b60aff22..ab979d2bf0c3db67201ae61bc94b2748831971a7 100644 --- a/src/views/object-storage/BucketsView.vue +++ b/src/views/object-storage/BucketsView.vue @@ -131,6 +131,7 @@ onMounted(() => { ><font-awesome-icon icon="fa-solid fa-magnifying-glass" /></span> <input + id="filterBucketNameInput" type="text" class="form-control" placeholder="Search Buckets" diff --git a/src/views/object-storage/S3KeyView.vue b/src/views/object-storage/S3KeyView.vue index 87ae43cf260cd6f36d713aa494160c0b816caa53..b0afc9668715d7f703a932d26f7bad0e63c6ed40 100644 --- a/src/views/object-storage/S3KeyView.vue +++ b/src/views/object-storage/S3KeyView.vue @@ -60,6 +60,7 @@ function deleteKeyTrigger() { /> </span> <input + id="s3-access-key" class="form-control" :type="visibleKeys.access ? 'text' : 'password'" :value="props.s3key.access_key" diff --git a/src/views/workflows/ListWorkflowsView.vue b/src/views/workflows/ListWorkflowsView.vue index 0f17b24080a0fca156246f6cf8d2a5b6bcc720be..ac39acf8aed4fe2cb96107b67b4bce36ad79274f 100644 --- a/src/views/workflows/ListWorkflowsView.vue +++ b/src/views/workflows/ListWorkflowsView.vue @@ -79,6 +79,7 @@ onMounted(() => { /></span> <input type="text" + id="filterWorkflowInput" class="form-control" placeholder="Filter Workflows" aria-label="Filter Workflows" diff --git a/src/views/workflows/MyWorkflowsView.vue b/src/views/workflows/MyWorkflowsView.vue index dad67158d3231e59afc68ad0fdd978d0ffe611f3..2e1ecde8d926ed346ca30ee86bbf85bd76473d54 100644 --- a/src/views/workflows/MyWorkflowsView.vue +++ b/src/views/workflows/MyWorkflowsView.vue @@ -10,8 +10,11 @@ import DeleteModal from "@/components/modals/DeleteModal.vue"; import UpdateWorkflowVersionIconModal from "@/components/workflows/modals/UpdateWorkflowVersionIconModal.vue"; import UpdateWorkflowCredentialsModal from "@/components/workflows/modals/UpdateWorkflowCredentialsModal.vue"; import { useWorkflowStore } from "@/stores/workflows"; +import { useWorkflowExecutionStore } from "@/stores/workflowExecutions"; const workflowRepository = useWorkflowStore(); +const workflowExecutionRepository = useWorkflowExecutionStore(); + const workflowsState = reactive<{ loading: boolean; updateWorkflow: WorkflowOut; @@ -78,6 +81,7 @@ onMounted(() => { workflowRepository.fetchOwnWorkflows(() => { workflowsState.loading = false; }); + workflowExecutionRepository.fetchExecutionsForDevStatistics(); }); </script> diff --git a/src/views/workflows/WorkflowView.vue b/src/views/workflows/WorkflowView.vue index 4b668301b2a23a4157d19d3d9fcbfc84870fe3f7..2ece0235006271559b4ecc77ba7946f48e5f0a49 100644 --- a/src/views/workflows/WorkflowView.vue +++ b/src/views/workflows/WorkflowView.vue @@ -255,9 +255,15 @@ onMounted(() => { v-if="activeVersionModeIds.length > 0" class="row align-items-center mb-3 fs-5" > - <label class="col-sm-1 col-form-label"><b>Mode:</b></label> + <label class="col-sm-1 col-form-label" for="workflowModeSelect" + ><b>Mode:</b></label + > <div class="col-sm-11"> - <select class="form-select w-fit" v-model="workflowState.activeModeId"> + <select + id="workflowModeSelect" + class="form-select w-fit" + v-model="workflowState.activeModeId" + > <option v-for="modeId of activeVersionModeIds" :key="modeId" @@ -325,6 +331,7 @@ onMounted(() => { ><font-awesome-icon icon="fa-solid fa-tags" class="text-secondary" /></span> <select + id="workflowVersionSelect" class="form-select form-select-sm" aria-label="Workflow version selection" aria-describedby="workflow-version-wrapping"