diff --git a/main.go b/main.go index 85c30d7f..f3dc055a 100644 --- a/main.go +++ b/main.go @@ -23,7 +23,7 @@ const ConfigLogTemplate = `Config -- Static Files: %s Client Name: %s Katsu URL: %v - WES URL: %v + Gohan URL: %v Bento Portal Url: %s Port: %d Translated: %t @@ -37,7 +37,7 @@ type BentoConfig struct { StaticFilesPath string `envconfig:"BENTO_PUBLIC_STATIC_FILES_PATH" default:"./www"` ClientName string `envconfig:"BENTO_PUBLIC_CLIENT_NAME"` KatsuUrl string `envconfig:"BENTO_PUBLIC_KATSU_URL"` - WesUrl string `envconfig:"BENTO_PUBLIC_WES_URL"` + GohanUrl string `envconfig:"BENTO_PUBLIC_GOHAN_URL"` BentoPortalUrl string `envconfig:"BENTO_PUBLIC_PORTAL_URL"` Port int `envconfig:"INTERNAL_PORT" default:"8090"` Translated bool `envconfig:"BENTO_PUBLIC_TRANSLATED" default:"true"` @@ -114,7 +114,7 @@ func main() { cfg.StaticFilesPath, cfg.ClientName, cfg.KatsuUrl, - cfg.WesUrl, + cfg.GohanUrl, cfg.BentoPortalUrl, cfg.Port, cfg.Translated, @@ -176,14 +176,6 @@ func main() { return c.JSON(http.StatusOK, result) } - wesRequest := func(path string, qs url.Values, c echo.Context, rf responseFormatterFunc) error { - result, err := genericRequestJsonOnly(fmt.Sprintf("%s%s", cfg.WesUrl, path), qs, c, rf) - if err != nil { - return err - } - return c.JSON(http.StatusOK, result) - } - katsuRequestBasic := func(path string, c echo.Context) error { return katsuRequest(path, nil, c, jsonDeserialize) } @@ -201,11 +193,28 @@ func main() { return jsonFormattedData, nil } - wesRequestWithDetailsAndPublic := func(c echo.Context) error { - qs := url.Values{} - qs.Add("with_details", "true") - qs.Add("public", "true") - return wesRequest("/runs", qs, c, jsonDeserialize) + dataTypesEndpointHandler := func(baseUrl string) echo.HandlerFunc { + return func(c echo.Context) error { + fullPath := fmt.Sprintf("%s/data-types", baseUrl) + result, err := genericRequestJsonOnly(fullPath, nil, c, jsonDeserialize) + if err != nil { + return err + } + + resultSlice, ok := result.([]JsonLike) + if !ok { + return fmt.Errorf("result is not of type []JsonLike") + } + + var modifiedResult []JsonLike + // Update the "count" value + for _, item := range resultSlice { + item["count"] = nil + modifiedResult = append(modifiedResult, item) + } + + return c.JSON(http.StatusOK, modifiedResult) + } } fetchAndSetKatsuPublic := func(c echo.Context, katsuCache *cache.Cache) (JsonLike, error) { @@ -359,8 +368,6 @@ func main() { return katsuRequestBasic("/api/public_search_fields", c) }) - e.GET("/wes-runs", wesRequestWithDetailsAndPublic) - e.GET("/provenance", func(c echo.Context) error { // Query Katsu for datasets provenance return katsuRequestBasic("/api/public_dataset", c) @@ -382,6 +389,10 @@ func main() { return c.String(http.StatusOK, string(data)) }) + e.GET("/gohan/data-types", dataTypesEndpointHandler(cfg.GohanUrl)) + + e.GET("/katsu/data-types", dataTypesEndpointHandler(cfg.KatsuUrl)) + // Run e.Logger.Fatal(e.Start(fmt.Sprintf(":%d", cfg.Port))) } diff --git a/package-lock.json b/package-lock.json index f467a500..dec588f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,46 +1,46 @@ { "name": "bento_public", - "version": "0.16.1", + "version": "0.17.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bento_public", - "version": "0.16.1", + "version": "0.17.0", "license": "LGPL-3.0-only", "dependencies": { "@ant-design/icons": "^5.2.6", "@reduxjs/toolkit": "^1.9.7", - "antd": "^5.10.3", - "axios": "^1.6.0", - "bento-charts": "^2.4.2", + "antd": "^5.11.5", + "axios": "^1.6.2", + "bento-charts": "^2.5.0", "css-loader": "^6.8.1", "dotenv": "^16.3.1", - "i18next": "^23.6.0", - "i18next-browser-languagedetector": "^7.1.0", - "i18next-http-backend": "^2.3.1", + "i18next": "^23.7.7", + "i18next-browser-languagedetector": "^7.2.0", + "i18next-http-backend": "^2.4.2", "leaflet": "^1.9.4", "less": "^4.2.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-i18next": "^13.3.1", - "react-icons": "^4.11.0", + "react-i18next": "^13.5.0", + "react-icons": "^4.12.0", "react-leaflet": "^4.2.1", "react-redux": "^8.1.3", - "react-router-dom": "^6.17.0", - "recharts": "^2.8.0", + "react-router-dom": "^6.20.0", + "recharts": "^2.10.3", "redux": "^4.2.1", "redux-thunk": "^2.4.1" }, "devDependencies": { - "@types/react-dom": "^18.2.14", - "@typescript-eslint/eslint-plugin": "^6.9.0", - "@typescript-eslint/parser": "^6.9.0", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", "@webpack-cli/serve": "^2.0.4", "copy-webpack-plugin": "^11.0.0", "cross-env": "^7.0.3", "dotenv-webpack": "^8.0.1", - "eslint": "^8.50.0", + "eslint": "^8.54.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-react": "^7.33.2", "file-loader": "^6.2.0", @@ -48,11 +48,11 @@ "html-webpack-plugin": "^5.5.3", "less-loader": "~11.1.3", "nodemon": "^3.0.1", - "prettier": "^3.0.3", + "prettier": "^3.1.0", "source-map-loader": "^4.0.1", "style-loader": "^3.3.3", - "ts-loader": "^9.5.0", - "typescript": "~5.2.2", + "ts-loader": "^9.5.1", + "typescript": "~5.3.2", "webpack": "^5.89.0", "webpack-cli": "^5.1.4", "webpack-dev-middleware": "^6.1.1", @@ -77,9 +77,9 @@ } }, "node_modules/@ant-design/cssinjs": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.17.2.tgz", - "integrity": "sha512-vu7lnfEx4Mf8MPzZxn506Zen3Nt4fRr2uutwvdCuTCN5IiU0lDdQ0tiJ24/rmB8+pefwjluYsbyzbQSbgfJy+A==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.18.0.tgz", + "integrity": "sha512-NXzfnNjJgpn+L6d0cD2cS14Tsqs46Bsua6PwVMlmN+F0OEoa9PhJRwUWmI+HyIrc4cgVZVfQTDpXC0p07Jmglw==", "dependencies": { "@babel/runtime": "^7.11.1", "@emotion/hash": "^0.8.0", @@ -134,9 +134,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -196,9 +196,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", @@ -219,9 +219,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -446,9 +446,9 @@ } }, "node_modules/@rc-component/trigger": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.18.0.tgz", - "integrity": "sha512-vloGnWpeTmt7DBw0OHnG9poQ8h1WFh0hebq6fpgVjGYSxm6JU8rLH+kNwVNNvhL6Rg5He4ESjOk6O7uF9dJhxA==", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.18.2.tgz", + "integrity": "sha512-jRLYgFgjLEPq3MvS87fIhcfuywFSRDaDrYw1FLku7Cm4esszvzTbA0JBsyacAyLrK9rF3TiHFcvoEDMzoD3CTA==", "dependencies": { "@babel/runtime": "^7.23.2", "@rc-component/portal": "^1.1.0", @@ -499,17 +499,17 @@ } }, "node_modules/@remix-run/router": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", - "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.13.0.tgz", + "integrity": "sha512-5dMOnVnefRsl4uRnAdoWjtVTdh8e6aZqgM4puy9nmEADH72ck+uXwzpJLEKE9Q6F8ZljNewLgmTfkxUrBdv4WA==", "engines": { "node": ">=14.0.0" } }, "node_modules/@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", @@ -517,27 +517,27 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.12.tgz", - "integrity": "sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", - "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -545,86 +545,86 @@ } }, "node_modules/@types/d3-array": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.9.tgz", - "integrity": "sha512-mZowFN3p64ajCJJ4riVYlOjNlBJv3hctgAY01pjw3qTnJePD8s9DZmYDzhHKvzfCYvdjwylkU38+Vdt7Cu2FDA==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" }, "node_modules/@types/d3-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.2.tgz", - "integrity": "sha512-At+Ski7dL8Bs58E8g8vPcFJc8tGcaC12Z4m07+p41+DRqnZQcAlp3NfYjLrhNYv+zEyQitU1CUxXNjqUyf+c0g==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" }, "node_modules/@types/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-VZofjpEt8HWv3nxUAosj5o/+4JflnJ7Bbv07k17VO3T2WRuzGdZeookfaF60iVh5RdhVG49LE5w6LIshVUC6rg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" }, "node_modules/@types/d3-interpolate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.3.tgz", - "integrity": "sha512-6OZ2EIB4lLj+8cUY7I/Cgn9Q+hLdA4DjJHYOQDiHL0SzqS1K9DL5xIOVBSIHgF+tiuO9MU1D36qvdIvRDRPh+Q==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.1.tgz", - "integrity": "sha512-blRhp7ki7pVznM8k6lk5iUU9paDbVRVq+/xpf0RRgSJn5gr6SE7RcFtxooYGMBOc1RZiGyqRpVdu5AD0z0ooMA==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz", + "integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==" }, "node_modules/@types/d3-scale": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.6.tgz", - "integrity": "sha512-lo3oMLSiqsQUovv8j15X4BNEDOsnHuGjeVg7GRbAuB2PUa1prK5BNSOu6xixgNf3nqxPl4I1BqJWrPvFGlQoGQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-shape": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.4.tgz", - "integrity": "sha512-M2/xsWPsjaZc5ifMKp1EBp0gqJG0eO/zlldJNOC85Y/5DGsBQ49gDkRJ2h5GY7ZVD6KUumvZWsylSbvTaJTqKg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.2.tgz", - "integrity": "sha512-kbdRXTmUgNfw5OTE3KZnFQn6XdIc4QGroN5UixgdrXATmYsdlPQS6pEut9tVlIojtzuFD4txs/L+Rq41AHtLpg==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" }, "node_modules/@types/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-GGTvzKccVEhxmRfJEB6zhY9ieT4UhGVUIQaBzFpUO9OXy2ycAlnPCSJLzmGGgqt3KVjqN3QCQB4g1rsZnHsWhg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, "node_modules/@types/eslint": { - "version": "8.44.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", - "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", + "version": "8.44.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", + "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", - "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", - "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -634,9 +634,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.39", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", - "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dev": true, "dependencies": { "@types/node": "*", @@ -646,9 +646,9 @@ } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.4.tgz", - "integrity": "sha512-ZchYkbieA+7tnxwX/SCBySx9WwvWR8TaP5tb2jRAzwvLb/rWchGw3v0w3pqUbUvj0GCwW2Xz/AVPSk6kUGctXQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -661,69 +661,69 @@ "dev": true }, "node_modules/@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.13", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", - "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "dependencies": { "@types/node": "*" } }, "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==" }, "node_modules/@types/mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz", + "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-forge": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz", - "integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==", + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", + "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/prop-types": { - "version": "15.7.9", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", - "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, "node_modules/@types/react": { - "version": "18.2.33", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.33.tgz", - "integrity": "sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==", + "version": "18.2.39", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.39.tgz", + "integrity": "sha512-Oiw+ppED6IremMInLV4HXGbfbG6GyziY3kqAwJYOR0PNbkYDmLWQA3a95EhdSmamsvbkJN96ZNN+YD+fGjzSBA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -731,9 +731,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", - "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", + "version": "18.2.17", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", + "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", "devOptional": true, "dependencies": { "@types/react": "*" @@ -746,20 +746,20 @@ "dev": true }, "node_modules/@types/scheduler": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", - "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, "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.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@types/send": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", - "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -767,18 +767,18 @@ } }, "node_modules/@types/serve-index": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.3.tgz", - "integrity": "sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", - "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, "dependencies": { "@types/http-errors": "*", @@ -787,9 +787,9 @@ } }, "node_modules/@types/sockjs": { - "version": "0.3.35", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz", - "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "dependencies": { "@types/node": "*" @@ -801,25 +801,25 @@ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, "node_modules/@types/ws": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", - "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", - "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", + "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/type-utils": "6.13.1", + "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -845,15 +845,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", + "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4" }, "engines": { @@ -873,13 +873,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -890,13 +890,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", - "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", + "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/utils": "6.13.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -917,9 +917,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -930,13 +930,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -957,17 +957,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", - "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", + "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", "semver": "^7.5.4" }, "engines": { @@ -982,12 +982,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1193,6 +1193,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": true }, "node_modules/abbrev": { @@ -1341,12 +1342,12 @@ } }, "node_modules/antd": { - "version": "5.10.3", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.10.3.tgz", - "integrity": "sha512-IV+F4P9Fm0pXj4WFCLVLKIu7eCtVKZMLvU1a0HUIRBEy5YPsD5bDzjYkZ4F+RVPaFrAjAvChrWcX6NtQOVNuJw==", + "version": "5.11.5", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.11.5.tgz", + "integrity": "sha512-qB1YmvO4Zm4r48M0Ptxn7orpaXeMPSeTrrw6dAgtTYN+ysnWD/D/zlxFc5g73GywIzZ10XGqvNC+74A+HD0yeQ==", "dependencies": { "@ant-design/colors": "^7.0.0", - "@ant-design/cssinjs": "^1.17.2", + "@ant-design/cssinjs": "^1.17.5", "@ant-design/icons": "^5.2.6", "@ant-design/react-slick": "~1.0.2", "@babel/runtime": "^7.18.3", @@ -1354,44 +1355,44 @@ "@rc-component/color-picker": "~1.4.1", "@rc-component/mutate-observer": "^1.1.0", "@rc-component/tour": "~1.10.0", - "@rc-component/trigger": "^1.18.0", - "classnames": "^2.2.6", - "copy-to-clipboard": "^3.2.0", + "@rc-component/trigger": "^1.18.2", + "classnames": "^2.3.2", + "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.1", "qrcode.react": "^3.1.0", - "rc-cascader": "~3.18.1", + "rc-cascader": "~3.20.0", "rc-checkbox": "~3.1.0", "rc-collapse": "~3.7.1", "rc-dialog": "~9.3.4", "rc-drawer": "~6.5.2", "rc-dropdown": "~4.1.0", - "rc-field-form": "~1.39.0", - "rc-image": "~7.3.1", - "rc-input": "~1.2.1", - "rc-input-number": "~8.1.0", - "rc-mentions": "~2.8.0", + "rc-field-form": "~1.40.0", + "rc-image": "~7.5.1", + "rc-input": "~1.3.6", + "rc-input-number": "~8.4.0", + "rc-mentions": "~2.9.1", "rc-menu": "~9.12.2", "rc-motion": "^2.9.0", "rc-notification": "~5.3.0", - "rc-pagination": "~3.6.1", + "rc-pagination": "~3.7.0", "rc-picker": "~3.14.6", "rc-progress": "~3.5.1", "rc-rate": "~2.12.0", "rc-resize-observer": "^1.4.0", "rc-segmented": "~2.2.2", - "rc-select": "~14.9.2", - "rc-slider": "~10.3.1", + "rc-select": "~14.10.0", + "rc-slider": "~10.4.0", "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", - "rc-table": "~7.34.4", - "rc-tabs": "~12.12.1", - "rc-textarea": "~1.4.0", + "rc-table": "~7.36.0", + "rc-tabs": "~12.13.1", + "rc-textarea": "~1.5.3", "rc-tooltip": "~6.1.2", - "rc-tree": "~5.7.12", - "rc-tree-select": "~5.13.0", + "rc-tree": "~5.8.2", + "rc-tree-select": "~5.15.0", "rc-upload": "~4.3.5", - "rc-util": "^5.38.0", - "scroll-into-view-if-needed": "^3.0.3", + "rc-util": "^5.38.1", + "scroll-into-view-if-needed": "^3.1.0", "throttle-debounce": "^5.0.0" }, "funding": { @@ -1576,9 +1577,9 @@ } }, "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -1598,9 +1599,9 @@ "dev": true }, "node_modules/bento-charts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bento-charts/-/bento-charts-2.4.2.tgz", - "integrity": "sha512-f2/7LykBJcFdbjsmAQ6ayn6x8svZfSoPBPLIndBOK2u8gteH6Sfh3d3jdBBPPzPiV6XjiVm/HfDUD8IHeChUVA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bento-charts/-/bento-charts-2.5.0.tgz", + "integrity": "sha512-ZqT7+8gfWZd2sis5Uy7imBeCs4Ocoo6h7JiFximYHnTlR0HtlsKSAmh3Z93U3R+bI9+GIkFvxhWbX56OmFwOEg==", "dependencies": { "d3-interpolate": "^3.0.1" }, @@ -1817,9 +1818,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001559", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", - "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", + "version": "1.0.30001565", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", + "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", "funding": [ { "type": "opencollective", @@ -1904,9 +1905,9 @@ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "dependencies": { "source-map": "~0.6.0" @@ -1929,6 +1930,14 @@ "node": ">=6" } }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2681,9 +2690,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.571", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.571.tgz", - "integrity": "sha512-Sc+VtKwKCDj3f/kLBjdyjMpNzoZsU6WuL/wFb6EH8USmHEcebxRXcRrVpOpayxd52tuey4RUDpUsw5OS5LhJqg==" + "version": "1.4.600", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.600.tgz", + "integrity": "sha512-KD6CWjf1BnQG+NsXuyiTDDT1eV13sKuYsOUioXkQweYTQIbgHkXPry9K7M+7cKtYHnSUPitVaLrXYB1jTkkYrw==" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -2728,9 +2737,9 @@ } }, "node_modules/envinfo": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", - "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -2827,9 +2836,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" }, "node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -2898,15 +2907,15 @@ } }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3222,9 +3231,9 @@ } }, "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", @@ -3411,9 +3420,9 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -3421,7 +3430,7 @@ "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { @@ -4077,9 +4086,9 @@ } }, "node_modules/i18next": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.6.0.tgz", - "integrity": "sha512-z0Cxr0MGkt+kli306WS4nNNM++9cgt2b2VCMprY92j+AIab/oclgPxdwtTZVLP1zn5t5uo8M6uLsZmYrcjr3HA==", + "version": "23.7.7", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.7.7.tgz", + "integrity": "sha512-peTvdT+Lma+o0LfLFD7IC2M37N9DJ04dH0IJYOyOHRhDfLo6nK36v7LkrQH35C2l8NHiiXZqGirhKESlEb/5PA==", "funding": [ { "type": "individual", @@ -4095,21 +4104,21 @@ } ], "dependencies": { - "@babel/runtime": "^7.22.5" + "@babel/runtime": "^7.23.2" } }, "node_modules/i18next-browser-languagedetector": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.1.0.tgz", - "integrity": "sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz", + "integrity": "sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==", "dependencies": { - "@babel/runtime": "^7.19.4" + "@babel/runtime": "^7.23.2" } }, "node_modules/i18next-http-backend": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.3.1.tgz", - "integrity": "sha512-jnagFs5cnq4ryb+g92Hex4tB5kj3tWmiRWx8gHMCcE/PEgV1fjH5rC7xyJmPSgyb9r2xgcP8rvZxPKgsmvMqTw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.4.2.tgz", + "integrity": "sha512-wKrgGcaFQ4EPjfzBTjzMU0rbFTYpa0S5gv9N/d8WBmWS64+IgJb7cHddMvV+tUkse7vUfco3eVs2lB+nJhPo3w==", "dependencies": { "cross-fetch": "4.0.0" } @@ -4138,9 +4147,9 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -5132,9 +5141,9 @@ } }, "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", @@ -5233,9 +5242,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/nodemon": { "version": "3.0.1", @@ -5370,13 +5379,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -5893,9 +5902,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -6077,16 +6086,16 @@ } }, "node_modules/rc-cascader": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.18.1.tgz", - "integrity": "sha512-M7Xr5Fs/E87ZGustfObtBYQjsvBCET0UX2JYXB2GmOP+2fsZgjaRGXK+CJBmmWXQ6o4OFinpBQBXG4wJOQ5MEg==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.20.0.tgz", + "integrity": "sha512-lkT9EEwOcYdjZ/jvhLoXGzprK1sijT3/Tp4BLxQQcHDZkkOzzwYQC9HgmKoJz0K7CukMfgvO9KqHeBdgE+pELw==", "dependencies": { "@babel/runtime": "^7.12.5", "array-tree-filter": "^2.1.0", "classnames": "^2.3.1", - "rc-select": "~14.9.0", - "rc-tree": "~5.7.0", - "rc-util": "^5.35.0" + "rc-select": "~14.10.0", + "rc-tree": "~5.8.1", + "rc-util": "^5.37.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -6108,9 +6117,9 @@ } }, "node_modules/rc-collapse": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.1.tgz", - "integrity": "sha512-N/7ejyiTf3XElNJBBpxqnZBUuMsQWEOPjB2QkfNvZ/Ca54eAvJXuOD1EGbCWCk2m7v/MSxku7mRpdeaLOCd4Gg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.2.tgz", + "integrity": "sha512-ZRw6ipDyOnfLFySxAiCMdbHtb5ePAsB9mT17PA6y1mRD/W6KHRaZeb5qK/X9xDV1CqgyxMpzw0VdS74PCcUk4A==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -6170,9 +6179,9 @@ } }, "node_modules/rc-field-form": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.39.0.tgz", - "integrity": "sha512-V7Wk7uji1jBsUGGgP788H9rpFy55HLiD4lywTlktUGjK7EgW5dt+mq1MPbtCpPRMzs83vZBW4SOChOmCACz4WA==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.40.0.tgz", + "integrity": "sha512-OM3N01X2BYFGJDJcwpk9/BBtlwgveE7eh2SQAKIxVCt9KVWlODYJ9ypTHQdxchfDbeJKJKxMBFXlLAmyvlgPHg==", "dependencies": { "@babel/runtime": "^7.18.0", "async-validator": "^4.1.0", @@ -6187,9 +6196,9 @@ } }, "node_modules/rc-image": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.3.2.tgz", - "integrity": "sha512-ICEF6SWv9YKhDXxy1vrXcmf0TVvEcQWIww5Yg+f+mn7e4oGX7FNP4+FExwMjNO5UHBEuWrigbGhlCgI6yZZ1jg==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.5.1.tgz", + "integrity": "sha512-Z9loECh92SQp0nSipc0MBuf5+yVC05H/pzC+Nf8xw1BKDFUJzUeehYBjaWlxly8VGBZJcTHYri61Fz9ng1G3Ag==", "dependencies": { "@babel/runtime": "^7.11.2", "@rc-component/portal": "^1.0.2", @@ -6204,9 +6213,9 @@ } }, "node_modules/rc-input": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.2.1.tgz", - "integrity": "sha512-nQRmBvEFoGi+SNRDavccZ8ueyhFgmxkWqIt4aDyuNJgUZF12HJKIwDhAafUM7N+g7PyuW9FH3pf3zPHzdiCWbA==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.3.6.tgz", + "integrity": "sha512-/HjTaKi8/Ts4zNbYaB5oWCquxFyFQO4Co1MnMgoCeGJlpe7k8Eir2HN0a0F9IHDmmo+GYiGgPpz7w/d/krzsJA==", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -6218,14 +6227,14 @@ } }, "node_modules/rc-input-number": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-8.1.0.tgz", - "integrity": "sha512-bdHgduOxuN0lrhzgPmoKbhRD4GLIzVcddVz972/JHPHr7oLwPX5xDb9w4bXhuMzyT2VzQy7nggRCfH3yAl09oA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-8.4.0.tgz", + "integrity": "sha512-B6rziPOLRmeP7kcS5qbdC5hXvvDHYKV4vUxmahevYx2E6crS2bRi0xLDjhJ0E1HtOWo8rTmaE2EBJAkTCZOLdA==", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/mini-decimal": "^1.0.1", "classnames": "^2.2.5", - "rc-input": "~1.2.1", + "rc-input": "~1.3.5", "rc-util": "^5.28.0" }, "peerDependencies": { @@ -6234,16 +6243,16 @@ } }, "node_modules/rc-mentions": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.8.0.tgz", - "integrity": "sha512-LBMkO6bSGhEvS1CvMK978qGN82tI+mzk7l/uTiQJH+UDiwpvq+pxK4DxU5b6Q1T5LW6bn2pSua9RaZKZrDoBOw==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.9.1.tgz", + "integrity": "sha512-cZuElWr/5Ws0PXx1uxobxfYh4mqUw2FitfabR62YnWgm+WAfDyXZXqZg5DxXW+M1cgVvntrQgDDd9LrihrXzew==", "dependencies": { "@babel/runtime": "^7.22.5", "@rc-component/trigger": "^1.5.0", "classnames": "^2.2.6", - "rc-input": "~1.2.1", + "rc-input": "~1.3.5", "rc-menu": "~9.12.0", - "rc-textarea": "~1.4.0", + "rc-textarea": "~1.5.0", "rc-util": "^5.34.1" }, "peerDependencies": { @@ -6316,9 +6325,9 @@ } }, "node_modules/rc-pagination": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.6.1.tgz", - "integrity": "sha512-R/sUnKKXx1Nm4kZfUKS3YKa7yEPF1ZkVB/AynQaHt+nMER7h9wPTfliDJFdYo+RM/nk2JD4Yc5QpUq8fIQHeug==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.7.0.tgz", + "integrity": "sha512-IxSzKapd13L91/195o1TPkKnCNw8gIR25UP1GCW/7c7n/slhld4npu2j2PB9IWjXm4SssaAaSAt2lscYog7wzg==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", @@ -6427,9 +6436,9 @@ } }, "node_modules/rc-select": { - "version": "14.9.2", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.9.2.tgz", - "integrity": "sha512-VQ15sRFgPURHb8ZcZNSDtb2rAw3+C9xlL0nDziwNHTEW1KvEpZ8y+0v5w24X/Bpl9b3cW1BOyW1F5UqSAq+7Dg==", + "version": "14.10.0", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.10.0.tgz", + "integrity": "sha512-TsIJTYafTTapCA32LLNpx/AD6ntepR1TG8jEVx35NiAAWCPymhUfuca8kRcUNd3WIGVMDcMKn9kkphoxEz+6Ag==", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/trigger": "^1.5.0", @@ -6448,9 +6457,9 @@ } }, "node_modules/rc-slider": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.3.1.tgz", - "integrity": "sha512-XszsZLkbjcG9ogQy/zUC0n2kndoKUAnY/Vnk1Go5Gx+JJQBz0Tl15d5IfSiglwBUZPS9vsUJZkfCmkIZSqWbcA==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.4.1.tgz", + "integrity": "sha512-wiHRWgzEEHcgF7MWDd0ODsMpqBwszT558R2qH52fplJwctw/L9J8ipEt89ZqVASlh0QFG9kJPgBuL2+cbdLRUw==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -6496,15 +6505,15 @@ } }, "node_modules/rc-table": { - "version": "7.34.4", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.34.4.tgz", - "integrity": "sha512-os+i88Y2AO/6dNkOgJkKSHgXYaZZGnuOEEe+nyaq5IRgvAQNhLysUjXt2objtBeFDEZR8TqXrajwBNRUwunmdw==", + "version": "7.36.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.36.0.tgz", + "integrity": "sha512-3xVcdCC5OLeOOhaCg+5Lps2oPreM/GWXmUXWTSX4p6vF7F76ABM4dfPpMJ9Dnf5yGRyh+8pe7FRyhRVnWw2H/w==", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/context": "^1.4.0", "classnames": "^2.2.5", "rc-resize-observer": "^1.1.0", - "rc-util": "^5.36.0", + "rc-util": "^5.37.0", "rc-virtual-list": "^3.11.1" }, "engines": { @@ -6516,9 +6525,9 @@ } }, "node_modules/rc-tabs": { - "version": "12.12.1", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.12.1.tgz", - "integrity": "sha512-e10VBjEkECdPl4XZSs9to81SE+mgclBTM7J8/LMsFqmJoi05Tci91bRnmeeDtrcOCx2PuZdJv57XUlC4d8PEIw==", + "version": "12.13.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.13.1.tgz", + "integrity": "sha512-83u3l2QkO0UznCzdBLEk9WnNcT+imtmDmMT993sUUEOGnNQAmqOdev0XjeqrcvsAMe9CDpAWDFd7L/RZw+LVJQ==", "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "2.x", @@ -6537,13 +6546,13 @@ } }, "node_modules/rc-textarea": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.4.0.tgz", - "integrity": "sha512-CiqK+uyoJlnfufbC0kwfHJpfElhQacuDSNyNQ/xGnA/QMaJLDbgmqRT8QmX0T0KD/ws/hy6qqRaGJSsrRR5uiQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.5.3.tgz", + "integrity": "sha512-oH682ghHx++stFNYrosPRBfwsypywrTXpaD0/5Z8MPkUOnyOQUaY9ueL9tMu6BP1LfsuYQ1VLpg5OtshViLNgA==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", - "rc-input": "~1.2.1", + "rc-input": "~1.3.5", "rc-resize-observer": "^1.0.0", "rc-util": "^5.27.0" }, @@ -6567,9 +6576,9 @@ } }, "node_modules/rc-tree": { - "version": "5.7.12", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.12.tgz", - "integrity": "sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.2.tgz", + "integrity": "sha512-xH/fcgLHWTLmrSuNphU8XAqV7CdaOQgm4KywlLGNoTMhDAcNR3GVNP6cZzb0GrKmIZ9yae+QLot/cAgUdPRMzg==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -6586,14 +6595,14 @@ } }, "node_modules/rc-tree-select": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.13.0.tgz", - "integrity": "sha512-g01JU9EdE7j/9KfDKtmvFqJ7ZDNIYDzkpmAXllbTBFoRNhWJBjW1x/dCZLVG+IdZeIz8SKJkgZzCf1CUZrzV/Q==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.15.0.tgz", + "integrity": "sha512-YJHfdO6azFnR0/JuNBZLDptGE4/RGfVeHAafUIYcm2T3RBkL1O8aVqiHvwIyLzdK59ry0NLrByd+3TkfpRM+9Q==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", - "rc-select": "~14.9.0", - "rc-tree": "~5.7.0", + "rc-select": "~14.10.0", + "rc-tree": "~5.8.1", "rc-util": "^5.16.1" }, "peerDependencies": { @@ -6616,9 +6625,9 @@ } }, "node_modules/rc-util": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.0.tgz", - "integrity": "sha512-yV/YBNdFn+edyBpBdCqkPE29Su0jWcHNgwx2dJbRqMrMfrUcMJUjCRV+ZPhcvWyKFJ63GzEerPrz9JIVo0zXmA==", + "version": "5.38.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.1.tgz", + "integrity": "sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng==", "dependencies": { "@babel/runtime": "^7.18.3", "react-is": "^18.2.0" @@ -6634,9 +6643,9 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/rc-virtual-list": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.2.tgz", - "integrity": "sha512-MTFLL2LOHr3+/+r+WjTIs6j8XmJE6EqdOsJvCH8SWig7qyik3aljCEImUtw5tdWR0tQhXUfbv7P7nZaLY91XPg==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.3.tgz", + "integrity": "sha512-tu5UtrMk/AXonHwHxUogdXAWynaXsrx1i6dsgg+lOo/KJSF8oBAcprh1z5J3xgnPJD5hXxTL58F8s8onokdt0Q==", "dependencies": { "@babel/runtime": "^7.20.0", "classnames": "^2.2.6", @@ -6675,9 +6684,9 @@ } }, "node_modules/react-i18next": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.3.1.tgz", - "integrity": "sha512-JAtYREK879JXaN9GdzfBI4yJeo/XyLeXWUsRABvYXiFUakhZJ40l+kaTo+i+A/3cKIED41kS/HAbZ5BzFtq/Og==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.5.0.tgz", + "integrity": "sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==", "dependencies": { "@babel/runtime": "^7.22.5", "html-parse-stringify": "^3.0.1" @@ -6696,9 +6705,9 @@ } }, "node_modules/react-icons": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.11.0.tgz", - "integrity": "sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", + "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", "peerDependencies": { "react": "*" } @@ -6769,24 +6778,12 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, - "node_modules/react-resize-detector": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz", - "integrity": "sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==", - "dependencies": { - "lodash": "^4.17.21" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-router": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz", - "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.20.0.tgz", + "integrity": "sha512-pVvzsSsgUxxtuNfTHC4IxjATs10UaAtvLGVSA1tbUE4GDaOSU1Esu2xF5nWLz7KPiMuW8BJWuPFdlGYJ7/rW0w==", "dependencies": { - "@remix-run/router": "1.11.0" + "@remix-run/router": "1.13.0" }, "engines": { "node": ">=14.0.0" @@ -6796,12 +6793,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", - "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.0.tgz", + "integrity": "sha512-CbcKjEyiSVpA6UtCHOIYLUYn/UJfwzp55va4yEfpk7JBN3GPqWfHrdLkAvNCcpXr8QoihcDMuk0dzWZxtlB/mQ==", "dependencies": { - "@remix-run/router": "1.11.0", - "react-router": "6.18.0" + "@remix-run/router": "1.13.0", + "react-router": "6.20.0" }, "engines": { "node": ">=14.0.0" @@ -6867,22 +6864,21 @@ } }, "node_modules/recharts": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.9.1.tgz", - "integrity": "sha512-GqHrQVMgDIktzNIIlhtvZnjYurr6Wy+KMSDxO1MEp3CrZZbvisUmnBojSWAZ7j8cjwhD4uRRFga2s5wcd/w9sQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.3.tgz", + "integrity": "sha512-G4J96fKTZdfFQd6aQnZjo2nVNdXhp+uuLb00+cBTGLo85pChvm1+E67K3wBOHDE/77spcYb2Cy9gYWVqiZvQCg==", "dependencies": { - "classnames": "^2.2.5", + "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.19", "react-is": "^16.10.2", - "react-resize-detector": "^8.0.4", - "react-smooth": "^2.0.4", + "react-smooth": "^2.0.5", "recharts-scale": "^0.4.4", "tiny-invariant": "^1.3.1", "victory-vendor": "^36.6.8" }, "engines": { - "node": ">=12" + "node": ">=14" }, "peerDependencies": { "prop-types": "^15.6.0", @@ -7979,9 +7975,9 @@ } }, "node_modules/ts-loader": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz", - "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -8115,9 +8111,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8246,9 +8242,9 @@ } }, "node_modules/victory-vendor": { - "version": "36.6.11", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.11.tgz", - "integrity": "sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg==", + "version": "36.7.0", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.7.0.tgz", + "integrity": "sha512-nqYuTkLSdTTeACyXcCLbL7rl0y6jpzLPtTNGOtSnajdR+xxMxBdjMxDjfNJNlhR+ZU8vbXz+QejntcbY7h9/ZA==", "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", diff --git a/package.json b/package.json index 50d11e73..e2e67d5e 100755 --- a/package.json +++ b/package.json @@ -1,15 +1,16 @@ { "name": "bento_public", - "version": "0.16.1", + "version": "0.17.0", "description": "A publicly accessible portal for clinical datasets, where users are able to see high-level statistics of the data available through predefined variables of interest and search the data using limited variables at a time. This portal allows users to gain a generic understanding of the data available (secure and firewalled) without the need to access it directly. Initially, this portal facilitates the search in English language only, but the French language will be added at a later time.", "main": "index.js", "scripts": { "build": "npx webpack --mode=production", - "build-dev": "npx webpack --mode=development", - "watch": "npx webpack --mode=development --watch", + "build-dev": "rm -r build/www/* && npx webpack --mode=development", + "watch": "rm -r build/www/* && npx webpack --mode=development --watch", "gobuild": "./buildandrun.sh", "lint": "npx eslint src/js", - "lint-fix": "npx eslint --fix src/js" + "lint-fix": "npx eslint --fix src/js", + "prettier": "npx prettier --write src/js" }, "keywords": [], "author": "", @@ -17,36 +18,36 @@ "dependencies": { "@ant-design/icons": "^5.2.6", "@reduxjs/toolkit": "^1.9.7", - "antd": "^5.10.3", - "axios": "^1.6.0", - "bento-charts": "^2.4.2", + "antd": "^5.11.5", + "axios": "^1.6.2", + "bento-charts": "^2.5.0", "css-loader": "^6.8.1", "dotenv": "^16.3.1", - "i18next": "^23.6.0", - "i18next-browser-languagedetector": "^7.1.0", - "i18next-http-backend": "^2.3.1", + "i18next": "^23.7.7", + "i18next-browser-languagedetector": "^7.2.0", + "i18next-http-backend": "^2.4.2", "leaflet": "^1.9.4", "less": "^4.2.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-i18next": "^13.3.1", - "react-icons": "^4.11.0", + "react-i18next": "^13.5.0", + "react-icons": "^4.12.0", "react-leaflet": "^4.2.1", "react-redux": "^8.1.3", - "react-router-dom": "^6.17.0", - "recharts": "^2.8.0", + "react-router-dom": "^6.20.0", + "recharts": "^2.10.3", "redux": "^4.2.1", "redux-thunk": "^2.4.1" }, "devDependencies": { - "@types/react-dom": "^18.2.14", - "@typescript-eslint/eslint-plugin": "^6.9.0", - "@typescript-eslint/parser": "^6.9.0", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", "@webpack-cli/serve": "^2.0.4", "copy-webpack-plugin": "^11.0.0", "cross-env": "^7.0.3", "dotenv-webpack": "^8.0.1", - "eslint": "^8.50.0", + "eslint": "^8.54.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-react": "^7.33.2", "file-loader": "^6.2.0", @@ -54,11 +55,11 @@ "html-webpack-plugin": "^5.5.3", "less-loader": "~11.1.3", "nodemon": "^3.0.1", - "prettier": "^3.0.3", + "prettier": "^3.1.0", "source-map-loader": "^4.0.1", "style-loader": "^3.3.3", - "ts-loader": "^9.5.0", - "typescript": "~5.2.2", + "ts-loader": "^9.5.1", + "typescript": "~5.3.2", "webpack": "^5.89.0", "webpack-cli": "^5.1.4", "webpack-dev-middleware": "^6.1.1", diff --git a/src/js/components/Beacon/BeaconErrorMessage.tsx b/src/js/components/Beacon/BeaconErrorMessage.tsx index b52881cb..69640a99 100644 --- a/src/js/components/Beacon/BeaconErrorMessage.tsx +++ b/src/js/components/Beacon/BeaconErrorMessage.tsx @@ -1,17 +1,17 @@ -import React, { Dispatch, SetStateAction } from 'react'; +import React from 'react'; import { Alert } from 'antd'; -const BeaconErrorMessage = ({ message, setErrorAlertClosed }: BeaconErrorMessageProps) => { +const BeaconErrorMessage = ({ message, onClose }: BeaconErrorMessageProps) => { return (
- setErrorAlertClosed(true)} closable showIcon /> +
); }; export interface BeaconErrorMessageProps { message: string; - setErrorAlertClosed: Dispatch>; + onClose: () => void; } export default BeaconErrorMessage; diff --git a/src/js/components/Beacon/BeaconQueryUi.tsx b/src/js/components/Beacon/BeaconQueryUi.tsx index 7e08ede5..e4da3ca5 100644 --- a/src/js/components/Beacon/BeaconQueryUi.tsx +++ b/src/js/components/Beacon/BeaconQueryUi.tsx @@ -1,12 +1,11 @@ import React, { useEffect, useState, ReactNode } from 'react'; -import { useAppSelector, useAppDispatch } from '@/hooks'; -import { useTranslation } from 'react-i18next'; -import { Button, Card, Col, Form, Row, Tooltip } from 'antd'; +import { useAppSelector, useAppDispatch, useTranslationDefault } from '@/hooks'; +import { Button, Card, Col, Form, Row, Space, Tooltip, Typography } from 'antd'; import { InfoCircleOutlined } from '@ant-design/icons'; import Filters from './Filters'; import BeaconSearchResults from './BeaconSearchResults'; -import VariantsForm from './VariantsForm'; import BeaconErrorMessage from './BeaconErrorMessage'; +import VariantsForm from './VariantsForm'; import { makeBeaconQuery } from '@/features/beacon/beaconQuery.store'; import { BeaconQueryPayload, FormFilter, FormValues, PayloadFilter, PayloadVariantsQuery } from '@/types/beacon'; import { @@ -18,16 +17,32 @@ import { BUTTON_AREA_STYLE, BUTTON_STYLE, } from '@/constants/beaconConstants'; -import { DEFAULT_TRANSLATION } from '@/constants/configConstants'; - +const { Text, Title } = Typography; // TODOs // example searches, either hardcoded or configurable // more intuitive variants ui const STARTER_FILTER = { index: 1, active: true }; +// complexity of instructions suggests the form isn't intuitive enough +const VARIANTS_INSTRUCTIONS_TITLE = 'Variant search'; +const VARIANTS_INSTRUCTIONS_LINE1a = + 'To search for all variants inside a range: fill both "Variant start" and "Variant end",'; +const VARIANTS_INSTRUCTIONS_LINE1b = + 'all variants inside the range will be returned. You can optionally filter by reference or alternate bases.'; + +const VARIANTS_INSTRUCTIONS_LINE2a = + 'To search for a variant at a particular position, either set "Variant end" to the same value in "Variant start",'; +const VARIANTS_INSTRUCTIONS_LINE2b = 'or fill in values for both reference and alternate bases.'; +const VARIANTS_INSTRUCTIONS_LINE3 = '"Chromosome", "Variant start" and "Assembly ID" are always required.'; +const VARIANTS_INSTRUCTIONS_LINE4a = 'Coordinates are one-based.'; +const VARIANTS_INSTRUCTIONS_LINE4b = 'Leave this form blank to search by metadata only.'; +const METADATA_INSTRUCTIONS = 'Search over clinical or phenotypic properties.'; +const VARIANTS_FORM_ERROR_MESSAGE = + 'variants form should include either an end position or both reference and alternate bases'; + const BeaconQueryUi = () => { - const { t: td } = useTranslation(DEFAULT_TRANSLATION); + const td = useTranslationDefault(); const [form] = Form.useForm(); const [filters, setFilters] = useState([STARTER_FILTER]); const [hasVariants, setHasVariants] = useState(false); @@ -61,29 +76,6 @@ const BeaconQueryUi = () => { setFormErrorMessage(''); }; - // complexity of instructions suggests the form isn't intuitive enough - const variantsInstructions = ( -
-

{td('Variant search')}

-

- {td( - 'To search for all variants inside a range: fill both "Variant start" and "Variant end", all variants inside the range will be returned. You can optionally filter by reference or alternate bases.' - )} -

-

- {td( - 'To search for a variant at a particular position, either set "Variant end" to the same value in "Variant start", or fill in values for both reference and alternate bases.' - )} -

-

{td('"Chromosome", "Variant start" and "Assembly ID" are always required.')}

-

- {td('Coordinates are one-based.')} {td('Leave this form blank to search by metadata only.')} -

-
- ); - - const metadataInstructions =

{td('Search over clinical or phenotypic properties.')}

; - useEffect(() => { // wait for config if (!beaconUrl) { @@ -187,9 +179,7 @@ const BeaconQueryUi = () => { if (!variantsFormValid(formValues)) { setHasFormError(true); setErrorAlertClosed(false); - setFormErrorMessage( - td('variants form should include either an end position or both reference and alternate bases') - ); + setFormErrorMessage(td(VARIANTS_FORM_ERROR_MESSAGE)); return; } @@ -218,6 +208,10 @@ const BeaconQueryUi = () => { // can also check filter values here (to e.g. avoid offering duplicate options) }; + // Tooltips + + const ToolTipText = ({ children }: { children: string }) => {children}; + const SearchToolTip = ({ children }: { children: ReactNode }) => { return ( @@ -226,6 +220,21 @@ const BeaconQueryUi = () => { ); }; + const variantsInstructions = ( + + + {VARIANTS_INSTRUCTIONS_TITLE} + + {td(VARIANTS_INSTRUCTIONS_LINE1a) + ' ' + td(VARIANTS_INSTRUCTIONS_LINE1b)} + {td(VARIANTS_INSTRUCTIONS_LINE2a) + ' ' + td(VARIANTS_INSTRUCTIONS_LINE2b)} + {td(VARIANTS_INSTRUCTIONS_LINE3)} + {td(VARIANTS_INSTRUCTIONS_LINE4a) + ' ' + td(VARIANTS_INSTRUCTIONS_LINE4b)} + + ); + + const metadataInstructions = {METADATA_INSTRUCTIONS}; + const isFetchingBeaconQuery = useAppSelector((state) => state.beaconQuery.isFetchingQueryResponse); + return (
@@ -268,11 +277,11 @@ const BeaconQueryUi = () => { {showError && ( setErrorAlertClosed(true)} /> )}
- + } + > {sections.map(({ sectionTitle, charts }: { sectionTitle: string; charts: ChartDataField[] }, i: number) => (
- {t(sectionTitle)} + + + {t(sectionTitle)} + + + + + +
))} diff --git a/src/js/components/Overview/LastIngestion.tsx b/src/js/components/Overview/LastIngestion.tsx index ccb01c37..d486153b 100644 --- a/src/js/components/Overview/LastIngestion.tsx +++ b/src/js/components/Overview/LastIngestion.tsx @@ -7,9 +7,17 @@ import { DEFAULT_TRANSLATION } from '@/constants/configConstants'; import { useAppSelector } from '@/hooks'; import { getDataTypeLabel } from '@/types/dataTypes'; +import { LastIngestionDataTypeResponse } from '@/types/lastIngestionDataTypeResponse'; + const LastIngestionInfo: React.FC = () => { const { t, i18n } = useTranslation(DEFAULT_TRANSLATION); - const lastEndTimesByDataType = useAppSelector((state) => state.ingestionData?.lastEndTimesByDataType) || {}; + + const dataTypesObject = useAppSelector((state) => state.lastIngestionData?.dataTypes) || {}; + + const sortedDataTypes = Object.values(dataTypesObject).sort((a, b) => a.label.localeCompare(b.label)); + + // Filter out the queryable data types + const queryableDataTypes = sortedDataTypes.filter((dataType: LastIngestionDataTypeResponse) => dataType.queryable); const formatDate = useCallback( (dateString: string) => { @@ -28,19 +36,21 @@ const LastIngestionInfo: React.FC = () => { [i18n.language] ); - const hasData = Object.keys(lastEndTimesByDataType).length > 0; + const hasData = queryableDataTypes.length > 0; return ( {t('Latest Data Ingestion')} {hasData ? ( - Object.entries(lastEndTimesByDataType).map(([dataType, endTime]) => ( - + queryableDataTypes.map((dataType: LastIngestionDataTypeResponse) => ( + - {t(getDataTypeLabel(dataType))} + + {t(getDataTypeLabel(dataType.id))} + - {formatDate(endTime)} + {dataType.last_ingested ? formatDate(dataType.last_ingested) : 'Not Available'} diff --git a/src/js/components/Overview/OverviewSection.tsx b/src/js/components/Overview/OverviewSection.tsx index 9f586131..aa364952 100644 --- a/src/js/components/Overview/OverviewSection.tsx +++ b/src/js/components/Overview/OverviewSection.tsx @@ -1,13 +1,12 @@ import React from 'react'; import { Typography, Space } from 'antd'; -import { useTranslation } from 'react-i18next'; import OverviewDisplayData from './OverviewDisplayData'; -import { NON_DEFAULT_TRANSLATION } from '@/constants/configConstants'; +import { useTranslationCustom } from '@/hooks'; import { ChartDataField } from '@/types/data'; const OverviewSection = ({ title, chartData }: { title: string; chartData: ChartDataField[] }) => { - const { t } = useTranslation(NON_DEFAULT_TRANSLATION); + const t = useTranslationCustom(); return ( diff --git a/src/js/components/Provenance/DatasetProvenance.tsx b/src/js/components/Provenance/DatasetProvenance.tsx index 65949796..390530c1 100644 --- a/src/js/components/Provenance/DatasetProvenance.tsx +++ b/src/js/components/Provenance/DatasetProvenance.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { Card, Descriptions, Tag, Typography } from 'antd'; -import { useTranslation } from 'react-i18next'; import DistributionsTable from './Tables/DistributionsTable'; import IsAboutTable from './Tables/IsAboutTable'; @@ -10,7 +9,7 @@ import ExtraPropertiesTable from './Tables/ExtraPropertiesTable'; import PublicationsTable from './Tables/PublicationsTable'; import CreatedByTable from './Tables/CreatedByTable'; import DownloadDats from './DownloadDats'; -import { DEFAULT_TRANSLATION, NON_DEFAULT_TRANSLATION } from '@/constants/configConstants'; +import { useTranslationCustom, useTranslationDefault } from '@/hooks'; import { ProvenanceStoreDataset } from '@/types/provenance'; const { Item } = Descriptions; @@ -18,8 +17,8 @@ const { Text, Title } = Typography; const { Meta } = Card; const DatasetProvenance = ({ metadata, loading }: DatasetProvenanceProps) => { - const { t } = useTranslation(NON_DEFAULT_TRANSLATION); - const { t: td } = useTranslation(DEFAULT_TRANSLATION); + const t = useTranslationCustom(); + const td = useTranslationDefault(); return (
@@ -137,7 +136,7 @@ export type DatasetProvenanceProps = { export default DatasetProvenance; const TableTitleWithTranslation = ({ title }: { title: string }) => { - const { t } = useTranslation(DEFAULT_TRANSLATION); + const t = useTranslationCustom(); return ( diff --git a/src/js/components/Provenance/DownloadDats.tsx b/src/js/components/Provenance/DownloadDats.tsx index 3f2589d1..73cdea65 100644 --- a/src/js/components/Provenance/DownloadDats.tsx +++ b/src/js/components/Provenance/DownloadDats.tsx @@ -2,11 +2,11 @@ import React, { useCallback } from 'react'; import PropTypes from 'prop-types'; import { Button, Space } from 'antd'; import { DownloadOutlined } from '@ant-design/icons'; -import { useTranslation } from 'react-i18next'; +import { useTranslationDefault } from '@/hooks'; import { ProvenanceStoreDataset } from '@/types/provenance'; const DownloadDats = ({ metadata }: { metadata: ProvenanceStoreDataset }) => { - const { t } = useTranslation(); + const t = useTranslationDefault(); const exportData = useCallback(() => { window.location.href = `/datasets/${metadata.identifier}/dats`; diff --git a/src/js/components/Search/MakeQueryOption.tsx b/src/js/components/Search/MakeQueryOption.tsx index 1f341276..63d46b97 100644 --- a/src/js/components/Search/MakeQueryOption.tsx +++ b/src/js/components/Search/MakeQueryOption.tsx @@ -1,18 +1,16 @@ import React from 'react'; import { Row, Col, Checkbox } from 'antd'; -import { useTranslation } from 'react-i18next'; import OptionDescription from './OptionDescription'; import { addQueryParam, makeGetKatsuPublic, removeQueryParam } from '@/features/search/query.store'; import SelectOption from './SelectOption'; -import { DEFAULT_TRANSLATION, NON_DEFAULT_TRANSLATION } from '@/constants/configConstants'; -import { useAppDispatch, useAppSelector } from '@/hooks'; +import { useAppDispatch, useAppSelector, useTranslationCustom, useTranslationDefault } from '@/hooks'; import { Field } from '@/types/search'; const MakeQueryOption = ({ queryField }: MakeQueryOptionProps) => { - const { t } = useTranslation(NON_DEFAULT_TRANSLATION); - const { t: td } = useTranslation(DEFAULT_TRANSLATION); + const t = useTranslationCustom(); + const td = useTranslationDefault(); const dispatch = useAppDispatch(); const { title, id, description, config, options } = queryField; diff --git a/src/js/components/Search/Search.tsx b/src/js/components/Search/Search.tsx index 31080908..f7c696a3 100644 --- a/src/js/components/Search/Search.tsx +++ b/src/js/components/Search/Search.tsx @@ -1,14 +1,12 @@ import React, { useEffect, useMemo } from 'react'; import { Row, Typography, Space, FloatButton } from 'antd'; -import { useTranslation } from 'react-i18next'; import { useLocation, useNavigate } from 'react-router-dom'; import SearchFieldsStack from './SearchFieldsStack'; import SearchResults from './SearchResults'; -import { NON_DEFAULT_TRANSLATION } from '@/constants/configConstants'; import { makeGetKatsuPublic, setQueryParams } from '@/features/search/query.store'; -import { useAppDispatch, useAppSelector } from '@/hooks'; +import { useAppDispatch, useAppSelector, useTranslationCustom } from '@/hooks'; import { buildQueryParamsUrl } from '@/utils/search'; import type { QueryParams } from '@/types/search'; @@ -95,7 +93,7 @@ const SEARCH_SECTION_SPACE_ITEM_STYLE = { item: { display: 'flex', justifyConten const SEARCH_SECTION_STYLE = { maxWidth: 1200 }; const Search: React.FC = () => { - const { t } = useTranslation(NON_DEFAULT_TRANSLATION); + const t = useTranslationCustom(); const searchSections = useAppSelector((state) => state.query.querySections); diff --git a/src/js/components/Search/SelectOption.tsx b/src/js/components/Search/SelectOption.tsx index cd3662c4..8a9c0688 100644 --- a/src/js/components/Search/SelectOption.tsx +++ b/src/js/components/Search/SelectOption.tsx @@ -1,14 +1,12 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import React from 'react'; import { Select } from 'antd'; -import { useTranslation } from 'react-i18next'; import { addQueryParam, makeGetKatsuPublic } from '@/features/search/query.store'; -import { NON_DEFAULT_TRANSLATION } from '@/constants/configConstants'; -import { useAppDispatch, useAppSelector } from '@/hooks'; +import { useAppDispatch, useAppSelector, useTranslationCustom } from '@/hooks'; const SelectOption = ({ id, isChecked, options }: SelectOptionProps) => { - const { t } = useTranslation(NON_DEFAULT_TRANSLATION); + const t = useTranslationCustom(); const dispatch = useAppDispatch(); const queryParams = useAppSelector((state) => state.query.queryParams); diff --git a/src/js/components/SiteFooter.tsx b/src/js/components/SiteFooter.tsx index ce57dd80..7bff03a2 100644 --- a/src/js/components/SiteFooter.tsx +++ b/src/js/components/SiteFooter.tsx @@ -1,13 +1,13 @@ import React from 'react'; -import { useTranslation } from 'react-i18next'; import { Layout, Row, Typography, Space } from 'antd'; const { Footer } = Layout; const { Title, Text, Link } = Typography; +import { useTranslationDefault } from '@/hooks'; import bentoLogo from '@public/assets/bento.svg'; const SiteFooter = () => { - const { t } = useTranslation(); + const td = useTranslationDefault(); return ( <Footer> @@ -22,7 +22,7 @@ const SiteFooter = () => { <div> <Text type="secondary"> Copyright © 2019-2023 the{' '} - <Link href="http://computationalgenomics.ca" target="_blank"> + <Link href="https://computationalgenomics.ca" target="_blank"> Canadian Centre for Computational Genomics </Link> . @@ -42,7 +42,7 @@ const SiteFooter = () => { </div> <div> <Link href="/public/terms.html" target="_blank"> - {t('Terms of Use')} + {td('Terms of Use')} </Link> </div> </Space> diff --git a/src/js/components/TabbedDashboard.tsx b/src/js/components/TabbedDashboard.tsx index 3a1f8a6e..fc9c0f00 100644 --- a/src/js/components/TabbedDashboard.tsx +++ b/src/js/components/TabbedDashboard.tsx @@ -1,5 +1,4 @@ import React, { useEffect, useCallback } from 'react'; -import { useTranslation } from 'react-i18next'; import { useNavigate, useLocation, useParams } from 'react-router-dom'; import { Tabs, Typography } from 'antd'; @@ -10,21 +9,20 @@ import { makeGetAboutRequest } from '@/features/content/content.store'; import { makeGetDataRequestThunk } from '@/features/data/data.store'; import { makeGetSearchFields } from '@/features/search/query.store'; import { makeGetProvenanceRequest } from '@/features/provenance/provenance.store'; -import { makeGetIngestionDataRequest } from '@/features/ingestion/ingestion.store'; import { getBeaconConfig } from '@/features/beacon/beaconConfig.store'; +import { fetchGohanData, fetchKatsuData } from '@/features/ingestion/lastIngestion.store'; import Loader from './Loader'; import PublicOverview from './Overview/PublicOverview'; import Search from './Search/Search'; import ProvenanceTab from './Provenance/ProvenanceTab'; import BeaconQueryUi from './Beacon/BeaconQueryUi'; -import { DEFAULT_TRANSLATION } from '@/constants/configConstants'; -import { useAppDispatch, useAppSelector } from '@/hooks'; +import { useAppDispatch, useAppSelector, useTranslationDefault } from '@/hooks'; import { buildQueryParamsUrl } from '@/utils/search'; const TabbedDashboard = () => { const dispatch = useAppDispatch(); - const { t } = useTranslation(DEFAULT_TRANSLATION); + const td = useTranslationDefault(); const navigate = useNavigate(); const location = useLocation(); const { page } = useParams<{ page?: string }>(); @@ -35,7 +33,9 @@ const TabbedDashboard = () => { dispatch(makeGetDataRequestThunk()); dispatch(makeGetSearchFields()); dispatch(makeGetProvenanceRequest()); - dispatch(makeGetIngestionDataRequest()); + dispatch(fetchKatsuData()); + dispatch(fetchGohanData()); + //TODO: Dispatch makeGetDataTypes to get the data types from service-registry }, []); const isFetchingOverviewData = useAppSelector((state) => state.data.isFetchingData); @@ -98,7 +98,7 @@ const TabbedDashboard = () => { const mappedTabPanes = tabPanes .filter((t) => t.active) .map(({ title, content, loading, key }) => ({ - label: <TabTitle title={t(title)} />, + label: <TabTitle title={td(title)} />, children: loading ? <Loader /> : content, key, })); diff --git a/src/js/components/Util/CustomEmpty.js b/src/js/components/Util/CustomEmpty.js index 640e14bc..8e0192c9 100644 --- a/src/js/components/Util/CustomEmpty.js +++ b/src/js/components/Util/CustomEmpty.js @@ -1,12 +1,11 @@ import React from 'react'; import { Empty } from 'antd'; -import { useTranslation } from 'react-i18next'; -import { DEFAULT_TRANSLATION } from '../../constants/configConstants'; +import { useTranslationDefault } from '@/hooks'; const CustomEmpty = ({ text }) => { - const { t } = useTranslation(DEFAULT_TRANSLATION); + const td = useTranslationDefault(); - return <Empty description={t(text)} />; + return <Empty description={td(text)} />; }; export default CustomEmpty; diff --git a/src/js/constants/configConstants.ts b/src/js/constants/configConstants.ts index b59e6650..02425459 100644 --- a/src/js/constants/configConstants.ts +++ b/src/js/constants/configConstants.ts @@ -5,7 +5,8 @@ export const publicOverviewUrl = '/overview'; export const searchFieldsUrl = '/fields'; export const katsuUrl = '/katsu'; export const provenanceUrl = '/provenance'; -export const lastIngestionsUrl = '/wes-runs'; +export const katsuLastIngestionsUrl = '/katsu/data-types'; +export const gohanLastIngestionsUrl = '/gohan/data-types'; export const DEFAULT_TRANSLATION = 'default_translation'; export const NON_DEFAULT_TRANSLATION = 'translation'; diff --git a/src/js/features/data/data.store.ts b/src/js/features/data/data.store.ts index 34c697c8..45d3f966 100644 --- a/src/js/features/data/data.store.ts +++ b/src/js/features/data/data.store.ts @@ -47,6 +47,28 @@ const data = createSlice({ const chartObj = state.sections.find((e) => e.sectionTitle === section)!.charts.find((c) => c.id === chart)!; chartObj.width = width; }, + setAllDisplayedCharts: (state, { payload }: PayloadAction<{ section?: string }>) => { + if (payload.section) { + state.sections + .find((e) => e.sectionTitle === payload.section)! + .charts.forEach((_, ind, arr) => { + arr[ind].isDisplayed = true; + }); + } else { + state.sections.forEach((section) => { + section.charts.forEach((val, ind, arr) => { + arr[ind].isDisplayed = true; + }); + }); + } + }, + hideAllSectionCharts: (state, { payload }: PayloadAction<{ section: string }>) => { + state.sections + .find((e) => e.sectionTitle === payload.section)! + .charts.forEach((_, ind, arr) => { + arr[ind].isDisplayed = false; + }); + }, }, extraReducers: (builder) => { builder @@ -64,6 +86,13 @@ const data = createSlice({ }, }); -export const { rearrange, disableChart, setDisplayedCharts, setChartWidth } = data.actions; +export const { + rearrange, + disableChart, + setDisplayedCharts, + setChartWidth, + setAllDisplayedCharts, + hideAllSectionCharts, +} = data.actions; export { makeGetDataRequestThunk }; export default data.reducer; diff --git a/src/js/features/ingestion/ingestion.store.ts b/src/js/features/ingestion/ingestion.store.ts deleted file mode 100644 index 2ce4d686..00000000 --- a/src/js/features/ingestion/ingestion.store.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'; -import axios from 'axios'; -import { lastIngestionsUrl } from '@/constants/configConstants'; -import { printAPIError } from '@/utils/error.util'; -import { IngestionData, LastIngestionResponse } from '@/types/lastIngestionResponse'; - -export const makeGetIngestionDataRequest = createAsyncThunk<LastIngestionResponse, void, { rejectValue: string }>( - 'ingestionData/getIngestionData', - (_, { rejectWithValue }) => - axios - .get(lastIngestionsUrl) - .then((res) => res.data) - .catch(printAPIError(rejectWithValue)) -); - -export interface IngestionDataState { - isFetchingIngestionData: boolean; - ingestionData: IngestionData[]; - lastEndTimesByDataType: { [dataType: string]: string }; -} - -const initialState: IngestionDataState = { - isFetchingIngestionData: false, - ingestionData: [], - lastEndTimesByDataType: {}, -}; - -const IngestionDataStore = createSlice({ - name: 'ingestionData', - initialState, - reducers: {}, - extraReducers: (builder) => { - builder.addCase(makeGetIngestionDataRequest.pending, (state) => { - state.isFetchingIngestionData = true; - }); - builder.addCase( - makeGetIngestionDataRequest.fulfilled, - (state, { payload }: PayloadAction<LastIngestionResponse>) => { - state.ingestionData = payload; - payload.forEach((ingestion) => { - const dataType = ingestion.details.request.tags.workflow_metadata.data_type; - const endTime = ingestion.details.run_log.end_time; - const previousEndTime = state.lastEndTimesByDataType[dataType]; - if (!previousEndTime || new Date(endTime) > new Date(previousEndTime)) { - state.lastEndTimesByDataType[dataType] = endTime; - } - }); - state.isFetchingIngestionData = false; - } - ); - builder.addCase(makeGetIngestionDataRequest.rejected, (state) => { - state.isFetchingIngestionData = false; - }); - }, -}); - -export default IngestionDataStore.reducer; diff --git a/src/js/features/ingestion/lastIngestion.store.ts b/src/js/features/ingestion/lastIngestion.store.ts new file mode 100644 index 00000000..09146e2e --- /dev/null +++ b/src/js/features/ingestion/lastIngestion.store.ts @@ -0,0 +1,73 @@ +import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'; +import axios from 'axios'; +import { katsuLastIngestionsUrl, gohanLastIngestionsUrl } from '@/constants/configConstants'; +import { printAPIError } from '@/utils/error.util'; + +import { LastIngestionDataTypeResponse, DataTypeMap } from '@/types/lastIngestionDataTypeResponse'; + +// Async thunks to fetch data from the two endpoints +export const fetchKatsuData = createAsyncThunk('dataTypes/fetchKatsuData', (_, { rejectWithValue }) => + axios + .get(katsuLastIngestionsUrl) + .then((res) => res.data) + .catch(printAPIError(rejectWithValue)) +); + +export const fetchGohanData = createAsyncThunk('dataTypes/fetchGohanData', (_, { rejectWithValue }) => + axios + .get(gohanLastIngestionsUrl) + .then((res) => res.data) + .catch(printAPIError(rejectWithValue)) +); + +// Define the state structure +export interface DataTypeState { + isFetchingKatsuData: boolean; + isFetchingGohanData: boolean; + dataTypes: DataTypeMap; +} + +// Initialize the state +const initialDataTypeState: DataTypeState = { + isFetchingKatsuData: false, + isFetchingGohanData: false, + dataTypes: {}, +}; + +const reduceServiceDataTypes = (state: DataTypeState, { payload }: PayloadAction<LastIngestionDataTypeResponse[]>) => { + state.dataTypes = { + ...state.dataTypes, + ...Object.fromEntries(payload.map((data) => [data.id, data])), + }; +}; + +// Create a slice to manage the state +const DataTypeStore = createSlice({ + name: 'dataTypes', + initialState: initialDataTypeState, + reducers: {}, + extraReducers: (builder) => { + builder.addCase(fetchKatsuData.pending, (state) => { + state.isFetchingKatsuData = true; + }); + builder.addCase(fetchGohanData.pending, (state) => { + state.isFetchingGohanData = true; + }); + builder.addCase(fetchKatsuData.fulfilled, (state, action) => { + reduceServiceDataTypes(state, action); + state.isFetchingKatsuData = false; + }); + builder.addCase(fetchGohanData.fulfilled, (state, action) => { + reduceServiceDataTypes(state, action); + state.isFetchingGohanData = false; + }); + builder.addCase(fetchKatsuData.rejected, (state) => { + state.isFetchingKatsuData = false; + }); + builder.addCase(fetchGohanData.rejected, (state) => { + state.isFetchingGohanData = false; + }); + }, +}); + +export default DataTypeStore.reducer; diff --git a/src/js/store.ts b/src/js/store.ts index 313180b1..921821a8 100644 --- a/src/js/store.ts +++ b/src/js/store.ts @@ -4,7 +4,7 @@ import configReducer from '@/features/config/config.store'; import contentReducer from '@/features/content/content.store'; import dataReducer from '@/features/data/data.store'; import queryReducer from '@/features/search/query.store'; -import ingestionDataReducer from '@/features/ingestion/ingestion.store'; +import lastIngestionDataReducer from '@/features/ingestion/lastIngestion.store'; import provenanceReducer from '@/features/provenance/provenance.store'; import beaconConfigReducer from './features/beacon/beaconConfig.store'; import beaconQueryReducer from './features/beacon/beaconQuery.store'; @@ -16,7 +16,7 @@ export const store = configureStore({ data: dataReducer, query: queryReducer, provenance: provenanceReducer, - ingestionData: ingestionDataReducer, + lastIngestionData: lastIngestionDataReducer, beaconConfig: beaconConfigReducer, beaconQuery: beaconQueryReducer, }, diff --git a/src/js/types/lastIngestionDataTypeResponse.ts b/src/js/types/lastIngestionDataTypeResponse.ts new file mode 100644 index 00000000..617bd148 --- /dev/null +++ b/src/js/types/lastIngestionDataTypeResponse.ts @@ -0,0 +1,9 @@ +export interface LastIngestionDataTypeResponse { + count: number | null; + id: string; + label: string; + last_ingested: string | null; + queryable: boolean; +} + +export type DataTypeMap = { [id: string]: LastIngestionDataTypeResponse }; diff --git a/src/js/types/lastIngestionResponse.ts b/src/js/types/lastIngestionResponse.ts deleted file mode 100644 index 22357371..00000000 --- a/src/js/types/lastIngestionResponse.ts +++ /dev/null @@ -1,36 +0,0 @@ -interface Tags { - table_id: string; - workflow_id: string; - workflow_metadata: { - data_type: string; - id: string; - }; -} - -interface Request { - tags: Tags; - workflow_type: string; -} - -interface RunLog { - end_time: string; - id: string; - start_time: string; -} - -export interface IngestionDetails { - end_time: string; - request: Request; - run_id: string; - run_log: RunLog; - state: string; - task_logs: null; -} - -export interface IngestionData { - details: IngestionDetails; - run_id: string; - state: string; -} - -export type LastIngestionResponse = IngestionData[]; diff --git a/src/public/locales/en/default_translation_en.json b/src/public/locales/en/default_translation_en.json index 32c6707a..c88c4c5f 100644 --- a/src/public/locales/en/default_translation_en.json +++ b/src/public/locales/en/default_translation_en.json @@ -42,8 +42,10 @@ "Date": "Date", "Dates": "Dates", "Description": "Description", + "Download DATS File": "Download DATS File", "Manage Charts": "Manage Charts", "Remove this chart": "Remove this chart", + "Width": "Width", "Insufficient data available.": "Insufficient data available.", "Terms of Use": "Terms of Use", "No Data": "No Data", @@ -67,9 +69,9 @@ "maximum of": "maximum of", "filters permitted": "filters permitted", "Enter a chromosome name, e.g.: \"17\" or \"X\"": "Enter a chromosome name, e.g.: \"17\" or \"X\"", - "enter a position number, e.g. \"100\"": "enter a position number, e.g. \"100\"", - "enter a position number, e.g. \"200\"": "enter a position number, e.g. \"200\"", - "enter any combination of A, C, G, T, or N": "enter any combination of A, C, G, T, or N", + "Enter a position number, e.g. \"100\"": "Enter a position number, e.g. \"100\"", + "Enter a position number, e.g. \"200\"": "Enter a position number, e.g. \"200\"", + "Enter any combination of A, C, G, T, or N": "Enter any combination of A, C, G, T, or N", "e.g.": "e.g.", "or": "or", "Ingestion History Is Empty": "Ingestion History Is Empty", @@ -83,5 +85,6 @@ "or fill in values for both reference and alternate bases.": "or fill in values for both reference and alternate bases.", "\"Chromosome\", \"Variant start\" and \"Assembly ID\" are always required.": "\"Chromosome\", \"Variant start\" and \"Assembly ID\" are always required.", "Coordinates are one-based.": "Coordinates are one-based.", - "Leave this form blank to search by metadata only.": "Leave this form blank to search by metadata only." + "Leave this form blank to search by metadata only.": "Leave this form blank to search by metadata only.", + "Clinical Data": "Clinical Data" } diff --git a/src/public/locales/en/translation_en.json b/src/public/locales/en/translation_en.json index 3b8c08a5..8fc8615e 100644 --- a/src/public/locales/en/translation_en.json +++ b/src/public/locales/en/translation_en.json @@ -9,6 +9,5 @@ "MALE": "MALE", "FEMALE": "FEMALE", "I have no problems in walking about": "I have no problems in walking about", - "Results": "Results", - "Download DATS File": "Download DATS File" -} \ No newline at end of file + "Results": "Results" +} diff --git a/src/public/locales/fr/default_translation_fr.json b/src/public/locales/fr/default_translation_fr.json index bfd5df5d..4509ce35 100644 --- a/src/public/locales/fr/default_translation_fr.json +++ b/src/public/locales/fr/default_translation_fr.json @@ -42,8 +42,10 @@ "Date": "Date", "Dates": "Dates", "Description": "Description", + "Download DATS File": "Télécharcher le fichier DATS", "Manage Charts": "Gestion des tableaux", "Remove this chart": "Supprimer ce tableau", + "Width": "Largeur", "Insufficient data available.": "Pas suffisamment de données.", "Terms of Use": "Conditions d'utilisation (en anglais)", "No Data": "Pas de données", @@ -67,9 +69,9 @@ "maximum of": "maximum de", "filters permitted": "filtres autorisés", "Enter a chromosome name, e.g.: \"17\" or \"X\"": "Entrer un nom de chromosome, par exemple : \"17\" ou \"X\"", - "enter a position number, e.g. \"100\"": "entrer un numéro de position, par exemple \"100\"", - "enter a position number, e.g. \"200\"": "entrer un numéro de position, par exemple \"200\"", - "enter any combination of A, C, G, T, or N": "entrer une combinaison quelconque de A, C, G, T, ou N", + "Enter a position number, e.g. \"100\"": "Entrer un numéro de position, par exemple \"100\"", + "Enter a position number, e.g. \"200\"": "Entrer un numéro de position, par exemple \"200\"", + "Enter any combination of A, C, G, T, or N": "Entrer une combinaison quelconque de A, C, G, T, ou N", "e.g.": "par exemple", "or": "ou", "Ingestion History Is Empty": "L'historique d'ingestion est vide", @@ -83,5 +85,6 @@ "or fill in values for both reference and alternate bases.": "ou fournissez les valeurs pour la référence ainsi que les bases alternes.", "\"Chromosome\", \"Variant start\" and \"Assembly ID\" are always required.": "\"Chromosome\", \"Début du variant\" and \"Assemblage génomique\" sont toujours requis.", "Coordinates are one-based.": "Les coordonnées sont pour une seule base.", - "Leave this form blank to search by metadata only.": "Laissez ce formulaire vide pour effectuer une recherche sur les métadonnées seulement." - } + "Leave this form blank to search by metadata only.": "Laissez ce formulaire vide pour effectuer une recherche sur les métadonnées seulement.", + "Clinical Data": "Données cliniques" +} diff --git a/src/public/locales/fr/translation_fr.json b/src/public/locales/fr/translation_fr.json index 68448c6b..97d12d8f 100644 --- a/src/public/locales/fr/translation_fr.json +++ b/src/public/locales/fr/translation_fr.json @@ -9,6 +9,5 @@ "Lab Test Result": "Résultats des tests de laboratoire", "Experiment Types": "Types d'expériences", "I have no problems in walking about": "Je n’ai aucun problème à marcher", - "Results": "Résultats", - "Download DATS File": "Télécharger le fichier DATS" + "Results": "Résultats" } \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index ed4d4081..c3e81ebd 100755 --- a/webpack.config.js +++ b/webpack.config.js @@ -32,10 +32,11 @@ const config = { }, devServer: { static: './dist', - contentBase: './distgetuk', + contentBase: './dist', }, watchOptions: { poll: 1000, + ignored: /node_modules/, }, plugins: [ new HtmlWebpackPlugin({