diff --git a/.tekton/koku-frontend-pull-request.yaml b/.tekton/koku-frontend-pull-request.yaml index b55962e88..09ada52e9 100644 --- a/.tekton/koku-frontend-pull-request.yaml +++ b/.tekton/koku-frontend-pull-request.yaml @@ -45,7 +45,7 @@ spec: - name: name value: show-sbom - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:9bfc6b99ef038800fe131d7b45ff3cd4da3a415dd536f7c657b3527b01c4a13b + value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:52f8b96b96ce4203d4b74d850a85f963125bf8eef0683ea5acdd80818d335a28 - name: kind value: task resolver: bundles @@ -152,7 +152,7 @@ spec: - name: name value: init - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:092c113b614f6551113f17605ae9cb7e822aa704d07f0e37ed209da23ce392cc + value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:f239f38bba3a8351c8cb0980fde8e2ee477ded7200178b0f45175e4006ff1dca - name: kind value: task resolver: bundles @@ -194,7 +194,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:fe7234e3824d1e65d6a7aac352e7a6bbce623d90d8d7da9aceeee108ad2c61be + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:f53fe5482599b39ae2d1004cf09a2026fd9dd3822ab6ef46b51b4a398b0a3232 - name: kind value: task resolver: bundles @@ -299,7 +299,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:2d6e09f356059ccfd8aada165d5b020e1eb025aeac4717a1ea2de239bed2a0d7 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:fedcfe006d5040f26fb9fb5d317367bee2f2defa631e580ea4f1e763468c6dba - name: kind value: task resolver: bundles @@ -331,7 +331,7 @@ spec: - name: name value: build-image-index - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:e4871851566d8b496966b37bcb8c5ce9748a52487f116373d96c6cd28ef684c6 + value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:715fa1fd7a8ebe0da552730e564eef340717b6346f1690ebe06685a252fe88bc - name: kind value: task resolver: bundles @@ -380,7 +380,7 @@ spec: - name: name value: deprecated-image-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:b4f9599f5770ea2e6e4d031224ccc932164c1ecde7f85f68e16e99c98d754003 + value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:443ffa897ee35e416a0bfd39721c68cbf88cfa5c74c843c5183218d0cd586e82 - name: kind value: task resolver: bundles @@ -402,7 +402,7 @@ spec: - name: name value: clair-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.2@sha256:28fee4bf5da87f2388c973d9336086749cad8436003f9a514e22ac99735e056b + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.2@sha256:5948fe10f5c37b4dfb2bdb0d765d1b55e9e09f7603e79ca2cd99e88b572bd506 - name: kind value: task resolver: bundles @@ -444,7 +444,7 @@ spec: - name: name value: sast-snyk-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.2@sha256:c1ea706405f9ae146e31baef4abfea49b1e855a75bfc44c33eb0eb29516831b3 + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.3@sha256:a1205ae88927b93cf47f83627f941fb6b97376a0a7dfaed45c4d48a8024b21ed - name: kind value: task resolver: bundles @@ -469,7 +469,7 @@ spec: - name: name value: clamav-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:1e29eebe916b81b7100138d62db0e03e22d03657274d37041c59cbaca5fdbf7d + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:747b43a12eddd40aa8ff12196767ca2648956d87d331d482e8883a7530bf4d5e - name: kind value: task resolver: bundles @@ -489,7 +489,7 @@ spec: - name: name value: apply-tags - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:f485e250fb060060892b633c495a3d7e38de1ec105ae1be48608b0401530ab2c + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:87fd7fc0e937aad1a8db9b6e377d7e444f53394dafde512d68adbea6966a4702 - name: kind value: task resolver: bundles @@ -517,6 +517,23 @@ spec: workspaces: - name: workspace workspace: workspace + - name: rpms-signature-scan + params: + - name: image-digest + value: $(tasks.build-container.results.IMAGE_DIGEST) + - name: image-url + value: $(tasks.build-container.results.IMAGE_URL) + runAfter: + - build-container + taskRef: + params: + - name: name + value: rpms-signature-scan + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:0c9667fba291af05997397a32e5e938ccaa46e93a2e14bad228e64a6427c5545 + - name: kind + value: task + resolver: bundles workspaces: - name: workspace - name: git-auth diff --git a/.tekton/koku-frontend-push.yaml b/.tekton/koku-frontend-push.yaml index 84d07898d..9477f3ca4 100644 --- a/.tekton/koku-frontend-push.yaml +++ b/.tekton/koku-frontend-push.yaml @@ -42,7 +42,7 @@ spec: - name: name value: show-sbom - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:9bfc6b99ef038800fe131d7b45ff3cd4da3a415dd536f7c657b3527b01c4a13b + value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:52f8b96b96ce4203d4b74d850a85f963125bf8eef0683ea5acdd80818d335a28 - name: kind value: task resolver: bundles @@ -149,7 +149,7 @@ spec: - name: name value: init - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:092c113b614f6551113f17605ae9cb7e822aa704d07f0e37ed209da23ce392cc + value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:f239f38bba3a8351c8cb0980fde8e2ee477ded7200178b0f45175e4006ff1dca - name: kind value: task resolver: bundles @@ -191,7 +191,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:fe7234e3824d1e65d6a7aac352e7a6bbce623d90d8d7da9aceeee108ad2c61be + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:f53fe5482599b39ae2d1004cf09a2026fd9dd3822ab6ef46b51b4a398b0a3232 - name: kind value: task resolver: bundles @@ -296,7 +296,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:2d6e09f356059ccfd8aada165d5b020e1eb025aeac4717a1ea2de239bed2a0d7 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:fedcfe006d5040f26fb9fb5d317367bee2f2defa631e580ea4f1e763468c6dba - name: kind value: task resolver: bundles @@ -328,7 +328,7 @@ spec: - name: name value: build-image-index - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:e4871851566d8b496966b37bcb8c5ce9748a52487f116373d96c6cd28ef684c6 + value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:715fa1fd7a8ebe0da552730e564eef340717b6346f1690ebe06685a252fe88bc - name: kind value: task resolver: bundles @@ -377,7 +377,7 @@ spec: - name: name value: deprecated-image-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:b4f9599f5770ea2e6e4d031224ccc932164c1ecde7f85f68e16e99c98d754003 + value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:443ffa897ee35e416a0bfd39721c68cbf88cfa5c74c843c5183218d0cd586e82 - name: kind value: task resolver: bundles @@ -399,7 +399,7 @@ spec: - name: name value: clair-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.2@sha256:28fee4bf5da87f2388c973d9336086749cad8436003f9a514e22ac99735e056b + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.2@sha256:5948fe10f5c37b4dfb2bdb0d765d1b55e9e09f7603e79ca2cd99e88b572bd506 - name: kind value: task resolver: bundles @@ -441,7 +441,7 @@ spec: - name: name value: sast-snyk-check - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.2@sha256:c1ea706405f9ae146e31baef4abfea49b1e855a75bfc44c33eb0eb29516831b3 + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.3@sha256:a1205ae88927b93cf47f83627f941fb6b97376a0a7dfaed45c4d48a8024b21ed - name: kind value: task resolver: bundles @@ -466,7 +466,7 @@ spec: - name: name value: clamav-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:1e29eebe916b81b7100138d62db0e03e22d03657274d37041c59cbaca5fdbf7d + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:747b43a12eddd40aa8ff12196767ca2648956d87d331d482e8883a7530bf4d5e - name: kind value: task resolver: bundles @@ -486,7 +486,7 @@ spec: - name: name value: apply-tags - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:f485e250fb060060892b633c495a3d7e38de1ec105ae1be48608b0401530ab2c + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:87fd7fc0e937aad1a8db9b6e377d7e444f53394dafde512d68adbea6966a4702 - name: kind value: task resolver: bundles @@ -514,6 +514,23 @@ spec: workspaces: - name: workspace workspace: workspace + - name: rpms-signature-scan + params: + - name: image-digest + value: $(tasks.build-container.results.IMAGE_DIGEST) + - name: image-url + value: $(tasks.build-container.results.IMAGE_URL) + runAfter: + - build-container + taskRef: + params: + - name: name + value: rpms-signature-scan + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:0c9667fba291af05997397a32e5e938ccaa46e93a2e14bad228e64a6427c5545 + - name: kind + value: task + resolver: bundles workspaces: - name: workspace - name: git-auth diff --git a/locales/data.json b/locales/data.json index bf3cae29b..494be9b52 100644 --- a/locales/data.json +++ b/locales/data.json @@ -1103,6 +1103,18 @@ "value": "Clusters" } ], + "copied": [ + { + "type": 0, + "value": "Copied" + } + ], + "copy": [ + { + "type": 0, + "value": "Copy" + } + ], "cost": [ { "type": 0, @@ -1235,7 +1247,13 @@ "costManagement": [ { "type": 0, - "value": "Cost Management" + "value": "Cost management" + } + ], + "costManagementDocs": [ + { + "type": 0, + "value": "Cost management documentation" } ], "costModel": [ @@ -2135,6 +2153,14 @@ } ] }, + "BRL": { + "value": [ + { + "type": 0, + "value": "BRL (R$) - Brazilian Real" + } + ] + }, "CAD": { "value": [ { @@ -2191,6 +2217,14 @@ } ] }, + "INR": { + "value": [ + { + "type": 0, + "value": "INR (₹) - Indian Rupee" + } + ] + }, "JPY": { "value": [ { @@ -2266,6 +2300,14 @@ } ] }, + "BRL": { + "value": [ + { + "type": 0, + "value": "R$" + } + ] + }, "CAD": { "value": [ { @@ -2322,6 +2364,14 @@ } ] }, + "INR": { + "value": [ + { + "type": 0, + "value": "₹" + } + ] + }, "JPY": { "value": [ { @@ -3800,6 +3850,12 @@ "value": "type" } ], + "docsAccomplish": [ + { + "type": 0, + "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/getting_started_with_cost_management/about-cost-management#what_can_you_accomplish_with_cost_management" + } + ], "docsAddOcpSources": [ { "type": 0, @@ -3812,6 +3868,12 @@ "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/managing_cost_data_using_tagging/assembly-configuring-tags-and-labels-in-cost-management#configuring-categories_configuring-tags-int" } ], + "docsCostManagement": [ + { + "type": 0, + "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest" + } + ], "docsCostModelTerminology": [ { "type": 0, @@ -3842,12 +3904,66 @@ "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/using_cost_models/assembly-setting-up-cost-models#creating-an-ocp-cost-model_setting-up-cost-models" } ], + "docsIntegrations": [ + { + "type": 0, + "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/#Setting%20up%20integrations" + } + ], + "docsIntegrationsAws": [ + { + "type": 0, + "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_amazon_web_services_aws_data_into_cost_management/index" + } + ], + "docsIntegrationsAzure": [ + { + "type": 0, + "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_microsoft_azure_data_into_cost_management/index" + } + ], + "docsIntegrationsGcp": [ + { + "type": 0, + "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_google_cloud_data_into_cost_management/index" + } + ], + "docsIntegrationsOci": [ + { + "type": 0, + "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_oracle_cloud_data_into_cost_management/index" + } + ], + "docsKokuMetricsOperator": [ + { + "type": 0, + "value": "https://github.com/project-koku/koku-metrics-operator" + } + ], + "docsMetricsOperator": [ + { + "type": 0, + "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_openshift_container_platform_data_into_cost_management/assembly-adding-openshift-container-platform-int?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#installing-cost-operator_adding-an-ocp-int" + } + ], + "docsOcpCli": [ + { + "type": 0, + "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_openshift_container_platform_data_into_cost_management/assembly-adding-openshift-container-platform-int?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#installing-cost-operator-cli_adding-an-ocp-int" + } + ], "docsPlatformProjects": [ { "type": 0, "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/using_cost_models/assembly-using-cost-models#adding-openshift-projects" } ], + "docsReleases": [ + { + "type": 0, + "value": "https://github.com/project-koku/koku/releases" + } + ], "docsTagMapping": [ { "type": 0, @@ -3860,12 +3976,24 @@ "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/managing_cost_data_using_tagging/assembly-configuring-tags-and-labels-in-cost-management" } ], + "docsTroubleshooting": [ + { + "type": 0, + "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_openshift_container_platform_data_into_cost_management/index?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#verifying-cost-operator_adding-an-ocp-int" + } + ], "docsUsingCostModels": [ { "type": 0, "value": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/using_cost_models" } ], + "documentation": [ + { + "type": 0, + "value": "Documentation" + } + ], "download": [ { "type": 0, @@ -7353,157 +7481,12 @@ "value": "Export cannot be generated" } ], - "filterByButtonAriaLabel": [ - { - "options": { - "account": { - "value": [ - { - "type": 0, - "value": "Filter button for account name" - } - ] - }, - "aws_category": { - "value": [ - { - "type": 0, - "value": "Filter button for cost category name" - } - ] - }, - "cluster": { - "value": [ - { - "type": 0, - "value": "Filter button for cluster name" - } - ] - }, - "gcp_project": { - "value": [ - { - "type": 0, - "value": "Filter button for GCP project name" - } - ] - }, - "name": { - "value": [ - { - "type": 0, - "value": "Filter button for name name" - } - ] - }, - "node": { - "value": [ - { - "type": 0, - "value": "Filter button for node name" - } - ] - }, - "org_unit_id": { - "value": [ - { - "type": 0, - "value": "Filter button for organizational unit name" - } - ] - }, - "other": { - "value": [] - }, - "payer_tenant_id": { - "value": [ - { - "type": 0, - "value": "Filter button for account name" - } - ] - }, - "product_service": { - "value": [ - { - "type": 0, - "value": "Filter button for service name" - } - ] - }, - "project": { - "value": [ - { - "type": 0, - "value": "Filter button for project name" - } - ] - }, - "region": { - "value": [ - { - "type": 0, - "value": "Filter button for region name" - } - ] - }, - "resource_location": { - "value": [ - { - "type": 0, - "value": "Filter button for region name" - } - ] - }, - "service": { - "value": [ - { - "type": 0, - "value": "Filter button for service name" - } - ] - }, - "service_name": { - "value": [ - { - "type": 0, - "value": "Filter button for service_name name" - } - ] - }, - "subscription_guid": { - "value": [ - { - "type": 0, - "value": "Filter button for account name" - } - ] - }, - "tag": { - "value": [ - { - "type": 0, - "value": "Filter button for tag name" - } - ] - } - }, - "type": 5, - "value": "value" - } - ], "filterByCostCategoryKeyAriaLabel": [ { "type": 0, "value": "Cost category keys" } ], - "filterByCostCategoryValueAriaLabel": [ - { - "type": 0, - "value": "Cost category values" - } - ], "filterByCostCategoryValueButtonAriaLabel": [ { "type": 0, @@ -7956,12 +7939,6 @@ "value": "Tag values" } ], - "filterByTagValueButtonAriaLabel": [ - { - "type": 0, - "value": "Filter button for tag value" - } - ], "filterByValuePlaceholder": [ { "type": 0, @@ -10412,6 +10389,12 @@ "value": "Integrations status" } ], + "kokuMetricsOperator": [ + { + "type": 0, + "value": "Koku metrics operator" + } + ], "lastProcessed": [ { "type": 0, @@ -10973,13 +10956,27 @@ "noInstancesDesc": [ { "type": 0, - "value": "Add an Amazon EC2 instance to see a total cost breakdown of your spend by instances." + "value": "To view the cost of EC2 instances, label your resources with the following tag key and value pair in the AWS console." + } + ], + "noInstancesMoreInfo": [ + { + "type": 0, + "value": "For more information, " + }, + { + "type": 1, + "value": "seeDocumentation" + }, + { + "type": 0, + "value": "." } ], "noInstancesTitle": [ { "type": 0, - "value": "No instances available" + "value": "View cost of EC2 instances" } ], "noMappedTags": [ @@ -11012,6 +11009,170 @@ "value": "Tags must be enabled to be mapped." } ], + "noProvidersCloudCost": [ + { + "type": 0, + "value": "Include Cloud provider (AWS, GCP, Azure, OCI) cost" + } + ], + "noProvidersCloudCostDesc": [ + { + "type": 0, + "value": "If you want to do only cloud provider such as AWS, Google, Azure, or Oracle, you need to set up an integration in order to start using Cost Management service." + } + ], + "noProvidersCloudIntegration": [ + { + "type": 0, + "value": "Set up a Cloud provider integration" + } + ], + "noProvidersCloudIntegrationHelp": [ + { + "type": 0, + "value": "If you need further help setting up Cloud provider in cost management" + } + ], + "noProvidersCloudIntegrationHelpAws": [ + { + "type": 0, + "value": "Integrating Amazon Web Services data into cost management" + } + ], + "noProvidersCloudIntegrationHelpAzure": [ + { + "type": 0, + "value": "Integrating Microsoft Azure data into cost management" + } + ], + "noProvidersCloudIntegrationHelpDesc": [ + { + "type": 0, + "value": "The process to set up an integration for each provider varies. To learn how to add your specific integration to cost management, see the following guides:" + } + ], + "noProvidersCloudIntegrationHelpGcp": [ + { + "type": 0, + "value": "Integrating Google Cloud data into cost management" + } + ], + "noProvidersCloudIntegrationHelpOci": [ + { + "type": 0, + "value": "Integrating Oracle Cloud Infrastructure data into cost management" + } + ], + "noProvidersDesc": [ + { + "type": 0, + "value": "Helps you simplify the management of your resources and costs of " + }, + { + "type": 1, + "value": "ocp" + }, + { + "type": 0, + "value": ", as well as public clouds like " + }, + { + "type": 1, + "value": "aws" + }, + { + "type": 0, + "value": ", " + }, + { + "type": 1, + "value": "gcp" + }, + { + "type": 0, + "value": ", " + }, + { + "type": 1, + "value": "oci" + }, + { + "type": 0, + "value": ", and " + }, + { + "type": 1, + "value": "azure" + }, + { + "type": 0, + "value": "." + } + ], + "noProvidersGetStarted": [ + { + "type": 0, + "value": "Get started with Cost management" + } + ], + "noProvidersMetricsOperator": [ + { + "type": 0, + "value": "Install Cost Management metric operator" + } + ], + "noProvidersOcpCli": [ + { + "type": 0, + "value": "If you want to use " + }, + { + "type": 1, + "value": "cli" + }, + { + "type": 0, + "value": " to install the operator, follow " + }, + { + "type": 1, + "value": "link" + }, + { + "type": 0, + "value": "." + } + ], + "noProvidersOcpCliLink": [ + { + "type": 0, + "value": "this documentation" + } + ], + "noProvidersOcpCost": [ + { + "type": 0, + "value": "Include OpenShift cost" + } + ], + "noProvidersOcpCostDesc": [ + { + "type": 0, + "value": "Additionally to your OpenShift cluster set up, you need to set up Cost Management Metrics Operator in order to start using Cost Management service." + } + ], + "noProvidersRecommended": [ + { + "type": 0, + "value": "Recommended content" + } + ], + "noProvidersRecommendedAccomplish": [ + { + "type": 0, + "value": "What can you accomplish with cost management?" + } + ], "noProvidersStateAwsDesc": [ { "type": 0, @@ -11096,6 +11257,12 @@ "value": "Track your spending!" } ], + "noProvidersTroubleshooting": [ + { + "type": 0, + "value": "Having problem seeing data? See Troubleshooting part of the documentation" + } + ], "noResultsFound": [ { "type": 0, @@ -11220,6 +11387,18 @@ "value": "Oracle Cloud Infrastructure Details" } ], + "ocp": [ + { + "type": 0, + "value": "OpenShift Container Platform" + } + ], + "ocpCli": [ + { + "type": 0, + "value": "OpenShift CLI" + } + ], "ocpCloudDashboardComputeTitle": [ { "type": 0, @@ -11855,6 +12034,12 @@ "value": "Rate must be a positive number" } ], + "projectKoku": [ + { + "type": 0, + "value": "Upstream project Koku" + } + ], "pvcTitle": [ { "type": 0, @@ -11915,6 +12100,12 @@ "value": "https://status.redhat.com" } ], + "releaseNotes": [ + { + "type": 0, + "value": "Release notes" + } + ], "remove": [ { "type": 0, @@ -12059,6 +12250,12 @@ "value": "Save" } ], + "seeDocumentation": [ + { + "type": 0, + "value": "see documentation" + } + ], "select": [ { "type": 0, @@ -12862,6 +13059,12 @@ "value": "Value" } ], + "tagKey": [ + { + "type": 0, + "value": "Tag key:" + } + ], "tagKeyChild": [ { "type": 0, @@ -13110,6 +13313,12 @@ "value": "Tag names" } ], + "tagValue": [ + { + "type": 0, + "value": "Tag value:" + } + ], "timeOfExport": [ { "type": 0, @@ -13607,6 +13816,24 @@ "value": "View all" } ], + "viewDocumentation": [ + { + "type": 0, + "value": "View documentation" + } + ], + "viewLearningResources": [ + { + "type": 0, + "value": "View all OpenShift learning resources" + } + ], + "viewReleaseNotes": [ + { + "type": 0, + "value": "View release notes" + } + ], "volumeTitle": [ { "type": 0, diff --git a/locales/translations.json b/locales/translations.json index 4a951916d..d75c59957 100644 --- a/locales/translations.json +++ b/locales/translations.json @@ -71,6 +71,8 @@ "clusterId": "Cluster id", "clusterInfo": "Cluster information", "clusters": "Clusters", + "copied": "Copied", + "copy": "Copy", "cost": "Cost", "costBreakdownAriaDesc": "Breakdown of markup, raw, and usage costs", "costBreakdownAriaLabel": "A description of markup, raw cost and usage cost", @@ -87,7 +89,8 @@ "costDistributionLabel": "Overhead cost", "costDistributionTitle": "Overhead cost breakdown", "costDistributionType": "{value, select, distributed {Distribute through cost models} total {Don't distribute overhead costs} other {}}", - "costManagement": "Cost Management", + "costManagement": "Cost management", + "costManagementDocs": "Cost management documentation", "costModel": "Cost Model:", "costModels": "Cost Models", "costModelsActions": "Cost model actions", @@ -196,8 +199,8 @@ "currencyAbbreviations": "{symbol, select, billion {{value} B} million {{value} M} quadrillion {{value} q} thousand {{value} K} trillion {{value} t} other {}}", "currencyCalcuationsTitle": "Currency and calculations", "currencyDesc": "Select the preferred currency view for your organization", - "currencyOptions": "{units, select, AUD {AUD (A$) - Australian Dollar}CAD {CAD (CA$) - Canadian Dollar}CHF {CHF (CHF) - Swiss Franc}CNY {CNY (CN¥) - Chinese Yuan}DKK {DKK (DKK) - Danish Krone}EUR {EUR (€) - Euro}GBP {GBP (£) - British Pound}HKD {HKD (HK$) - Hong Kong Dollar}JPY {JPY (¥) - Japanese Yen}NOK {NOK (NOK) - Norwegian Krone}NZD {NZD (NZ$) - New Zealand Dollar}SEK {SEK (SEK) - Swedish Krona}SGD {SGD (SGD) - Singapore Dollar}USD {USD ($) - United States Dollar} ZAR {ZAR (ZAR) - South African Rand}other {}}", - "currencyUnits": "{units, select, AUD {A$}CAD {CA$}CHF {CHF}CNY {CN¥}DKK {DKK}EUR {€}GBP {£}HKD {HK$}JPY {¥}NOK {NOK}NZD {NZ$}SEK {SEK}SGD {SGD}USD {$} ZAR {ZAR}other {}}", + "currencyOptions": "{units, select, AUD {AUD (A$) - Australian Dollar}BRL {BRL (R$) - Brazilian Real}CAD {CAD (CA$) - Canadian Dollar}CHF {CHF (CHF) - Swiss Franc}CNY {CNY (CN¥) - Chinese Yuan}DKK {DKK (DKK) - Danish Krone}EUR {EUR (€) - Euro}GBP {GBP (£) - British Pound}HKD {HKD (HK$) - Hong Kong Dollar}INR {INR (₹) - Indian Rupee}JPY {JPY (¥) - Japanese Yen}NOK {NOK (NOK) - Norwegian Krone}NZD {NZD (NZ$) - New Zealand Dollar}SEK {SEK (SEK) - Swedish Krona}SGD {SGD (SGD) - Singapore Dollar}USD {USD ($) - United States Dollar} ZAR {ZAR (ZAR) - South African Rand}other {}}", + "currencyUnits": "{units, select, AUD {A$}BRL {R$}CAD {CA$}CHF {CHF}CNY {CN¥}DKK {DKK}EUR {€}GBP {£}HKD {HK$}INR {₹}JPY {¥}NOK {NOK}NZD {NZ$}SEK {SEK}SGD {SGD}USD {$} ZAR {ZAR}other {}}", "dashboardCumulativeCostComparison": "Cumulative cost comparison ({units})", "dashboardDailyUsageComparison": "Daily usage comparison ({units})", "dashboardDatabaseTitle": "Database services cost", @@ -258,17 +261,30 @@ "distributionModelDesc": "Choose how your raw costs are distributed at the project level.", "distributionType": "Distribution type", "distributionTypeDesc": "{type, select, cpu {Distribute costs based on CPU usage}memory {Distribute costs based on memory usage}other {}}", + "docsAccomplish": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/getting_started_with_cost_management/about-cost-management#what_can_you_accomplish_with_cost_management", "docsAddOcpSources": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_openshift_container_platform_data_into_cost_management", "docsCostCategory": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/managing_cost_data_using_tagging/assembly-configuring-tags-and-labels-in-cost-management#configuring-categories_configuring-tags-int", + "docsCostManagement": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest", "docsCostModelTerminology": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/using_cost_models/index#cost-model-terminology", "docsCostModels": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/using_cost_models/index#assembly-setting-up-cost-models", "docsCostModelsDistribution": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/using_cost_models/assembly-using-cost-models#distributing_costs", "docsCostModelsMarkup": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/using_cost_models/assembly-setting-up-cost-models#creating-an-AWS-Azure-cost-model_setting-up-cost-models", "docsCostModelsOcp": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/using_cost_models/assembly-setting-up-cost-models#creating-an-ocp-cost-model_setting-up-cost-models", + "docsIntegrations": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/#Setting%20up%20integrations", + "docsIntegrationsAws": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_amazon_web_services_aws_data_into_cost_management/index", + "docsIntegrationsAzure": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_microsoft_azure_data_into_cost_management/index", + "docsIntegrationsGcp": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_google_cloud_data_into_cost_management/index", + "docsIntegrationsOci": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_oracle_cloud_data_into_cost_management/index", + "docsKokuMetricsOperator": "https://github.com/project-koku/koku-metrics-operator", + "docsMetricsOperator": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_openshift_container_platform_data_into_cost_management/assembly-adding-openshift-container-platform-int?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#installing-cost-operator_adding-an-ocp-int", + "docsOcpCli": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_openshift_container_platform_data_into_cost_management/assembly-adding-openshift-container-platform-int?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#installing-cost-operator-cli_adding-an-ocp-int", "docsPlatformProjects": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/using_cost_models/assembly-using-cost-models#adding-openshift-projects", + "docsReleases": "https://github.com/project-koku/koku/releases", "docsTagMapping": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/managing_cost_data_using_tagging", "docsTags": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/managing_cost_data_using_tagging/assembly-configuring-tags-and-labels-in-cost-management", + "docsTroubleshooting": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_openshift_container_platform_data_into_cost_management/index?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#verifying-cost-operator_adding-an-ocp-int", "docsUsingCostModels": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/using_cost_models", + "documentation": "Documentation", "download": "Download", "edit": "Edit", "editCostModel": "Edit cost model", @@ -321,9 +337,7 @@ "exportsTableAriaLabel": "Available exports table", "exportsTitle": "All exports", "exportsUnavailable": "Export cannot be generated", - "filterByButtonAriaLabel": "{value, select, account {Filter button for account name} aws_category {Filter button for cost category name} cluster {Filter button for cluster name} gcp_project {Filter button for GCP project name} name {Filter button for name name} node {Filter button for node name} org_unit_id {Filter button for organizational unit name} payer_tenant_id {Filter button for account name} product_service {Filter button for service name} project {Filter button for project name} region {Filter button for region name} resource_location {Filter button for region name} service {Filter button for service name} service_name {Filter button for service_name name} subscription_guid {Filter button for account name} tag {Filter button for tag name} other {}}", "filterByCostCategoryKeyAriaLabel": "Cost category keys", - "filterByCostCategoryValueAriaLabel": "Cost category values", "filterByCostCategoryValueButtonAriaLabel": "Filter button for cost category value", "filterByInputAriaLabel": "{value, select, account {Input for account name} aws_category {Input for cost category name} cluster {Input for cluster name} gcp_project {Input for GCP project name} name {Input for name} node {Input for node name} org_unit_id {Input for organizational unit name} payer_tenant_id {Input for account name} product_service {Input for service_name} project {Input for project name} region {Input for region name} resource_location {Input for region name} service {Input for service name} service_name {Input for service_name} subscription_guid {Input for account name} status {Input for status value} tag {Input for tag name} tag_key {Input for tag key} tag_key_child {Input for child tag key} tag_key_parent {Input for parent tag key} other {}}", "filterByOrgUnitAriaLabel": "Organizational units", @@ -331,7 +345,6 @@ "filterByPlaceholder": "{value, select, account {Filter by account} aws_category {Filter by cost category} cluster {Filter by cluster} container {Filter by container} description {Filter by description} gcp_project {Filter by GCP project} group {Filter by group} instance {Filter by instance} name {Filter by name} node {Filter by node} operating_system {Filter by operating system} org_unit_id {Filter by organizational unit} payer_tenant_id {Filter by account} persistent_volume_claim {Filter by persistent volume claim} product_service {Filter by service} project {Filter by project} region {Filter by region} resource_location {Filter by region} service {Filter by service} service_name {Filter by service} source_type {Filter by integration} status {Filter by status} storage_class {Filter by StorageClass} subscription_guid {Filter by account} workload {Filter by workload name} workload_type {Filter by workload type} tag {Filter by tag} tag_key {Filter by tag key} tag_key_child {Filter by child tag key} tag_key_parent {Filter by parent tag key} other {}}", "filterByTagKeyAriaLabel": "Tag keys", "filterByTagValueAriaLabel": "Tag values", - "filterByTagValueButtonAriaLabel": "Filter button for tag value", "filterByValuePlaceholder": "Filter by value", "filterByValues": "{value, select, account {Account} aws_category {Cost category} cluster {Cluster} container {Container} default {Default} gcp_project {GCP project} group {Group} instance {Instance} name {Name} node {Node} org_unit_id {Organizational unit} operating_system {Operating system} payer_tenant_id {Account} persistent_volume_claim {Persistent volume claim} product_service {Service} project {Project} region {Region} resource_location {Region} service {Service} service_name {Service} source_type {Integration} status {Status} storage_class {StorageClass} subscription_guid {Account} tag {Tag} tag_key {Tag key} tag_key_child {Child tag Key} tag_key_parent {Parent tag Key} workload {Workload name} workload_type {Workload type} other {}}", "filterByValuesAriaLabel": "Values", @@ -371,6 +384,7 @@ "integration": "Integration", "integrationsDetails": "Integrations details", "integrationsStatus": "Integrations status", + "kokuMetricsOperator": "Koku metrics operator", "lastProcessed": "Last processed", "lastUpdated": "Last updated", "learnMore": "Learn more", @@ -412,11 +426,30 @@ "noDataStateRefresh": "Refresh this page", "noDataStateTitle": "Still processing the data", "noExportsStateTitle": "There are no export files available", - "noInstancesDesc": "Add an Amazon EC2 instance to see a total cost breakdown of your spend by instances.", - "noInstancesTitle": "No instances available", + "noInstancesDesc": "To view the cost of EC2 instances, label your resources with the following tag key and value pair in the AWS console.", + "noInstancesMoreInfo": "For more information, {seeDocumentation}.", + "noInstancesTitle": "View cost of EC2 instances", "noMappedTags": "No mapped tags", "noMappedTagsDesc": "Map multiple tags across data sources to be used as a single tag key for report grouping and filtering. {warning} Changes will be reflected within 24 hours. {learnMore}", "noMappedTagsWarning": "Tags must be enabled to be mapped.", + "noProvidersCloudCost": "Include Cloud provider (AWS, GCP, Azure, OCI) cost", + "noProvidersCloudCostDesc": "If you want to do only cloud provider such as AWS, Google, Azure, or Oracle, you need to set up an integration in order to start using Cost Management service.", + "noProvidersCloudIntegration": "Set up a Cloud provider integration", + "noProvidersCloudIntegrationHelp": "If you need further help setting up Cloud provider in cost management", + "noProvidersCloudIntegrationHelpAws": "Integrating Amazon Web Services data into cost management", + "noProvidersCloudIntegrationHelpAzure": "Integrating Microsoft Azure data into cost management", + "noProvidersCloudIntegrationHelpDesc": "The process to set up an integration for each provider varies. To learn how to add your specific integration to cost management, see the following guides:", + "noProvidersCloudIntegrationHelpGcp": "Integrating Google Cloud data into cost management", + "noProvidersCloudIntegrationHelpOci": "Integrating Oracle Cloud Infrastructure data into cost management", + "noProvidersDesc": "Helps you simplify the management of your resources and costs of {ocp}, as well as public clouds like {aws}, {gcp}, {oci}, and {azure}.", + "noProvidersGetStarted": "Get started with Cost management", + "noProvidersMetricsOperator": "Install Cost Management metric operator", + "noProvidersOcpCli": "If you want to use {cli} to install the operator, follow {link}.", + "noProvidersOcpCliLink": "this documentation", + "noProvidersOcpCost": "Include OpenShift cost", + "noProvidersOcpCostDesc": "Additionally to your OpenShift cluster set up, you need to set up Cost Management Metrics Operator in order to start using Cost Management service.", + "noProvidersRecommended": "Recommended content", + "noProvidersRecommendedAccomplish": "What can you accomplish with cost management?", "noProvidersStateAwsDesc": "Add an Amazon Web Services account to see a total cost breakdown of your spend by accounts, organizational units, services, regions, or tags.", "noProvidersStateAwsTitle": "Track your Amazon Web Services spending!", "noProvidersStateAzureDesc": "Add a Microsoft Azure account to see a total cost breakdown of your spend by accounts, services, regions, or tags.", @@ -431,6 +464,7 @@ "noProvidersStateOcpTitle": "Track your OpenShift spending!", "noProvidersStateOverviewDesc": "Add an integration, like an OpenShift Container Platform cluster or a cloud services account, to see a total cost breakdown as well as usage information like instance counts and storage.", "noProvidersStateOverviewTitle": "Track your spending!", + "noProvidersTroubleshooting": "Having problem seeing data? See Troubleshooting part of the documentation", "noResultsFound": "No results found", "notAuthorizedStateAws": "Amazon Web Services in Cost Management", "notAuthorizedStateAzure": "Microsoft Azure in Cost Management", @@ -449,6 +483,8 @@ "ociDashboardCostTitle": "Oracle Cloud Infrastructure cost", "ociDesc": "Raw cost from Oracle Cloud Infrastructure.", "ociDetailsTitle": "Oracle Cloud Infrastructure Details", + "ocp": "OpenShift Container Platform", + "ocpCli": "OpenShift CLI", "ocpCloudDashboardComputeTitle": "Compute services usage", "ocpCloudDashboardCostTitle": "All cloud filtered by OpenShift cost", "ocpCloudDashboardCostTrendTitle": "All cloud filtered by OpenShift cumulative cost comparison ({units})", @@ -511,6 +547,7 @@ "priceListEmptyRateDesc": "To add rates to the price list, click on the \"Add\" rate button above.", "priceListNumberRate": "Rate must be a number", "priceListPosNumberRate": "Rate must be a positive number", + "projectKoku": "Upstream project Koku", "pvcTitle": "Persistent Volume Claims", "rate": "Rate", "rawCostDesc": "The costs reported by a cloud provider without any cost model calculations applied.", @@ -521,6 +558,7 @@ "readOnlyPermissions": "You have read only permissions", "redHatIntegration": "Red Hat integration", "redHatStatusUrl": "https://status.redhat.com", + "releaseNotes": "Release notes", "remove": "Remove", "removeProjects": "Remove projects", "requestedCapacity": "Requested capacity", @@ -539,6 +577,7 @@ "rhelMemoryUsageAndRequests": "Memory usage and requests", "rhelVolumeUsageAndRequests": "Volume usage and requests", "save": "Save", + "seeDocumentation": "see documentation", "select": "Select...", "selectAll": "Select all", "selectCategories": "Select categories to enable or disable", @@ -585,6 +624,7 @@ "tagHeadingKey": "Key", "tagHeadingTitle": "Tags ({value})", "tagHeadingValue": "Value", + "tagKey": "Tag key:", "tagKeyChild": "Child tag keys", "tagKeyParent": "Parent tag key", "tagKeyParentSource": "Parent integration", @@ -617,6 +657,7 @@ "tagMappingWizardSuccess": "Tag mapping successful", "tagMappingWizardSuccessDesc": "Your tag keys were successfully mapped. Changes will be reflected in report summarizations within 24 hours.", "tagNames": "Tag names", + "tagValue": "Tag value:", "timeOfExport": "Time of export", "to": "to", "toolBarBulkSelectAll": "Select all ({value} items)", @@ -638,8 +679,11 @@ "various": "Various", "vcpuTitle": "vCPU", "viewAll": "View all", + "viewDocumentation": "View documentation", + "viewLearningResources": "View all OpenShift learning resources", + "viewReleaseNotes": "View release notes", "volumeTitle": "Volume", "workerUnallocated": "Worker unallocated", "workerUnallocatedDesc": "Distribute unused and non-reserved resource costs to projects", "yes": "Yes" -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index c3473b480..294d5837a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,20 +10,20 @@ "hasInstallScript": true, "license": "GNU AGPLv3", "dependencies": { - "@patternfly/patternfly": "5.4.1", - "@patternfly/react-charts": "7.4.3", - "@patternfly/react-component-groups": "^5.4.0", - "@patternfly/react-core": "5.4.1", + "@patternfly/patternfly": "5.4.2", + "@patternfly/react-charts": "7.4.5", + "@patternfly/react-component-groups": "5.5.3", + "@patternfly/react-core": "5.4.2", "@patternfly/react-icons": "5.4.0", - "@patternfly/react-table": "5.4.1", - "@patternfly/react-tokens": "5.4.0", - "@redhat-cloud-services/frontend-components": "^4.2.16", - "@redhat-cloud-services/frontend-components-notifications": "^4.1.0", - "@redhat-cloud-services/frontend-components-translations": "^3.2.8", - "@redhat-cloud-services/frontend-components-utilities": "^4.0.17", - "@redhat-cloud-services/rbac-client": "^2.2.5", + "@patternfly/react-table": "5.4.8", + "@patternfly/react-tokens": "5.4.1", + "@redhat-cloud-services/frontend-components": "^4.2.22", + "@redhat-cloud-services/frontend-components-notifications": "^4.1.1", + "@redhat-cloud-services/frontend-components-translations": "^3.2.9", + "@redhat-cloud-services/frontend-components-utilities": "^4.0.19", + "@redhat-cloud-services/rbac-client": "^2.2.8", "@reduxjs/toolkit": "^2.3.0", - "@unleash/proxy-client-react": "^4.3.1", + "@unleash/proxy-client-react": "^4.4.0", "axios": "^1.7.7", "date-fns": "^4.1.0", "js-file-download": "^0.4.12", @@ -31,51 +31,53 @@ "qs": "^6.13.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-intl": "6.8.0", + "react-intl": "6.8.6", "react-redux": "^9.1.2", "react-router-dom": "^6.27.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typesafe-actions": "^5.1.0", - "victory": "^37.1.2" + "victory": "^37.3.1" }, "devDependencies": { - "@eslint/compat": "^1.2.0", + "@eslint/compat": "^1.2.2", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "^9.12.0", - "@formatjs/ecma402-abstract": "^2.2.0", - "@formatjs/fast-memoize": "^2.2.1", - "@formatjs/intl-localematcher": "^0.5.5", + "@eslint/js": "^9.14.0", + "@formatjs/cli": "^6.3.7", + "@formatjs/ecma402-abstract": "^2.2.3", + "@formatjs/fast-memoize": "^2.2.3", + "@formatjs/icu-messageformat-parser": "^2.9.3", + "@formatjs/intl-localematcher": "^0.5.7", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "^2.0.4", - "@redhat-cloud-services/frontend-components-config": "^6.3.1", - "@redhat-cloud-services/tsc-transform-imports": "^1.0.16", - "@swc/core": "^1.7.26", - "@swc/jest": "^0.2.36", - "@testing-library/jest-dom": "^6.5.0", + "@redhat-cloud-services/frontend-components-config": "^6.3.3", + "@redhat-cloud-services/tsc-transform-imports": "^1.0.17", + "@swc/core": "^1.8.0", + "@swc/jest": "^0.2.37", + "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.0.1", "@testing-library/user-event": "^14.5.2", - "@types/jest": "^29.5.13", + "@types/jest": "^29.5.14", "@types/qs": "^6.9.16", - "@types/react": "^18.3.11", + "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@types/react-redux": "^7.1.34", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^8.9.0", - "@typescript-eslint/parser": "^8.9.0", + "@typescript-eslint/eslint-plugin": "^8.13.0", + "@typescript-eslint/parser": "^8.13.0", "copy-webpack-plugin": "^12.0.2", - "eslint": "^9.12.0", - "eslint-plugin-formatjs": "^5.1.0", + "eslint": "^9.14.0", + "eslint-plugin-formatjs": "^5.2.1", "eslint-plugin-jest-dom": "^5.4.0", - "eslint-plugin-jsdoc": "^50.4.1", + "eslint-plugin-jsdoc": "^50.4.3", "eslint-plugin-markdown": "^5.1.0", "eslint-plugin-patternfly-react": "^5.4.0", "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react": "^7.37.1", + "eslint-plugin-react": "^7.37.2", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-keys-fix": "^1.1.2", - "eslint-plugin-testing-library": "^6.3.0", + "eslint-plugin-testing-library": "^6.4.0", "git-revision-webpack-plugin": "^5.0.0", - "globals": "^15.11.0", + "globals": "^15.12.0", "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -84,7 +86,7 @@ "npm-run-all": "^4.1.5", "prettier": "^3.3.3", "rimraf": "^6.0.1", - "swc_mut_cjs_exports": "^0.99.0", + "swc_mut_cjs_exports": "^0.109.1", "ts-jest": "^29.2.5", "ts-patch": "^3.2.1", "typescript": "^5.6.3" @@ -696,9 +698,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", "engines": { @@ -706,9 +708,9 @@ } }, "node_modules/@eslint/compat": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.0.tgz", - "integrity": "sha512-CkPWddN7J9JPrQedEr2X7AjK9y1jaMJtxZ4A/+jTMFA2+n5BWhcKHW/EbJyARqg2zzQfgtWUtVmG3hrG6+nGpg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.2.tgz", + "integrity": "sha512-jhgiIrsw+tRfcBQ4BFl2C3vCrIUw2trCY0cnDvGZpwTtKCEDmZhAtMfrEUP/KpnwM6PrO0T+Ltm+ccW74olG3Q==", "dev": true, "license": "Apache-2.0", "engines": { @@ -763,9 +765,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -830,9 +832,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", - "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", + "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", "dev": true, "license": "MIT", "engines": { @@ -850,9 +852,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", - "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", + "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -862,56 +864,109 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@formatjs/cli": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-6.3.7.tgz", + "integrity": "sha512-sJYjXMYRMyyA2L5qbAzeNBQncnm9Cp2ZmQtNID40tWUAaKDyfNN8jXgiMte0wHZe5XFg5v97LuSVzde+TPaOxQ==", + "dev": true, + "license": "MIT", + "bin": { + "formatjs": "bin/formatjs" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "@glimmer/env": "^0.1.7", + "@glimmer/reference": "^0.91.1 || ^0.92.0", + "@glimmer/syntax": "^0.92.0", + "@glimmer/validator": "^0.92.0", + "@vue/compiler-core": "^3.4.0", + "content-tag": "^2.0.1", + "ember-template-recast": "^6.1.4", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "@glimmer/env": { + "optional": true + }, + "@glimmer/reference": { + "optional": true + }, + "@glimmer/syntax": { + "optional": true + }, + "@glimmer/validator": { + "optional": true + }, + "@vue/compiler-core": { + "optional": true + }, + "content-tag": { + "optional": true + }, + "ember-template-recast": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, "node_modules/@formatjs/ecma402-abstract": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.0.tgz", - "integrity": "sha512-IpM+ev1E4QLtstniOE29W1rqH9eTdx5hQdNL8pzrflMj/gogfaoONZqL83LUeQScHAvyMbpqP5C9MzNf+fFwhQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.3.tgz", + "integrity": "sha512-aElGmleuReGnk2wtYOzYFmNWYoiWWmf1pPPCYg0oiIQSJj0mjc4eUfzUXaSOJ4S8WzI/cLqnCTWjqz904FT2OQ==", + "license": "MIT", "dependencies": { - "@formatjs/fast-memoize": "2.2.1", - "@formatjs/intl-localematcher": "0.5.5", - "tslib": "^2.7.0" + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/intl-localematcher": "0.5.7", + "tslib": "2" } }, "node_modules/@formatjs/fast-memoize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.1.tgz", - "integrity": "sha512-XS2RcOSyWxmUB7BUjj3mlPH0exsUzlf6QfhhijgI941WaJhVxXQ6mEWkdUFIdnKi3TuTYxRdelsgv3mjieIGIA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", + "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", "license": "MIT", "dependencies": { - "tslib": "^2.7.0" + "tslib": "2" } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.7.10", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.10.tgz", - "integrity": "sha512-wlQfqCZ7PURkUNL2+8VTEFavPovtADU/isSKLFvDbdFmV7QPZIYqFMkhklaDYgMyLSBJa/h2MVQ2aFvoEJhxgg==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.3.tgz", + "integrity": "sha512-9L99QsH14XjOCIp4TmbT8wxuffJxGK8uLNO1zNhLtcZaVXvv626N0s4A2qgRCKG3dfYWx9psvGlFmvyVBa6u/w==", + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/icu-skeleton-parser": "1.8.4", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/icu-skeleton-parser": "1.8.7", + "tslib": "2" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.4.tgz", - "integrity": "sha512-LMQ1+Wk1QSzU4zpd5aSu7+w5oeYhupRwZnMQckLPRYhSjf2/8JWQ882BauY9NyHxs5igpuQIXZDgfkaH3PoATg==", + "version": "1.8.7", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.7.tgz", + "integrity": "sha512-fI+6SmS2g7h3srfAKSWa5dwreU5zNEfon2uFo99OToiLF6yxGE+WikvFSbsvMAYkscucvVmTYNlWlaDPp0n5HA==", + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.3", + "tslib": "2" } }, "node_modules/@formatjs/intl": { - "version": "2.10.8", - "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.10.8.tgz", - "integrity": "sha512-eY8r8RMmrRTTkLdbNBOZLFGXN3OnrEmInaNt8s4msIVfo+xuLqAqvB3W1jevj0I9QjU6ueIP7tEk+1rj6Xbv5A==", - "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/fast-memoize": "2.2.1", - "@formatjs/icu-messageformat-parser": "2.7.10", - "@formatjs/intl-displaynames": "6.6.10", - "@formatjs/intl-listformat": "7.5.9", - "intl-messageformat": "10.7.0", - "tslib": "^2.7.0" + "version": "2.10.13", + "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.10.13.tgz", + "integrity": "sha512-WFgLme4Ps+eaGCPBLI64LLK5FNqlCk3DAbPim01obewN3eSaJxdTvk4OrZ5ObGgp7R3aF2RBv8uKlgqoI4u5Hg==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/icu-messageformat-parser": "2.9.3", + "@formatjs/intl-displaynames": "6.8.3", + "@formatjs/intl-listformat": "7.7.3", + "intl-messageformat": "10.7.5", + "tslib": "2" }, "peerDependencies": { "typescript": "^4.7 || 5" @@ -923,46 +978,49 @@ } }, "node_modules/@formatjs/intl-displaynames": { - "version": "6.6.10", - "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.6.10.tgz", - "integrity": "sha512-tUz5qT61og1WwMM0K1/p46J69gLl1YJbty8xhtbigDA9LhbBmW2ShDg4ld+aqJTwCq4WK3Sj0VlFCKvFYeY3rQ==", + "version": "6.8.3", + "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.8.3.tgz", + "integrity": "sha512-3arubMDeod+lNHvJWVoZybUP7LLxq7vAWJ+ByP6O5/WCQGP5YjSwU07P2aJo7FqdMQzSFL1b+8RqSFIiZCGXHg==", + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/intl-localematcher": "0.5.5", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/intl-localematcher": "0.5.7", + "tslib": "2" } }, "node_modules/@formatjs/intl-listformat": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.5.9.tgz", - "integrity": "sha512-HqtGkxUh2Uz0oGVTxHAvPZ3EGxc8+ol5+Bx7S9xB97d4PEJJd9oOgHrerIghHA0gtIjsNKBFUae3P0My+F6YUA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.7.3.tgz", + "integrity": "sha512-E+UEFDovh0ADygKHYfea7tZsvfXO3O+O+u0K8+qH1hKVxksNjc94YogAujFDu94fAo50RitWJ8rWVa0zYTxoTQ==", + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/intl-localematcher": "0.5.5", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/intl-localematcher": "0.5.7", + "tslib": "2" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.5.tgz", - "integrity": "sha512-t5tOGMgZ/i5+ALl2/offNqAQq/lfUnKLEw0mXQI4N4bqpedhrSE+fyKLpwnd22sK0dif6AV+ufQcTsKShB9J1g==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.7.tgz", + "integrity": "sha512-GGFtfHGQVFe/niOZp24Kal5b2i36eE2bNL0xi9Sg/yd0TR8aLjcteApZdHmismP5QQax1cMnZM9yWySUUjJteA==", "license": "MIT", "dependencies": { - "tslib": "^2.7.0" + "tslib": "2" } }, "node_modules/@formatjs/ts-transformer": { - "version": "3.13.16", - "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.13.16.tgz", - "integrity": "sha512-ZIV7KB2EQ5w9k7yrwSsdGdoOgqlXNd2sfG317pbJPHDgIo04sxoRzZPayCiNo7VWaRyqkVYUpME94rd54FDvuw==", + "version": "3.13.22", + "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.13.22.tgz", + "integrity": "sha512-+Zfz0wZ6wkdQE2zePiIQWIf4dVWeJGFXjkZxoCwzqxXdDrRhyAsQm91kbdFRIcVrjILA6KV0gOz8X7OBbLP4fQ==", "dev": true, + "license": "MIT", "dependencies": { - "@formatjs/icu-messageformat-parser": "2.7.10", - "@types/json-stable-stringify": "^1.0.32", - "@types/node": "14 || 16 || 17 || 18", - "chalk": "^4.0.0", - "json-stable-stringify": "^1.0.1", - "tslib": "^2.7.0", + "@formatjs/icu-messageformat-parser": "2.9.3", + "@types/json-stable-stringify": "1", + "@types/node": "14 || 16 || 17 || 18 || 20 || 22", + "chalk": "4", + "json-stable-stringify": "1", + "tslib": "2", "typescript": "5" }, "peerDependencies": { @@ -974,20 +1032,12 @@ } } }, - "node_modules/@formatjs/ts-transformer/node_modules/@types/node": { - "version": "18.19.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.55.tgz", - "integrity": "sha512-zzw5Vw52205Zr/nmErSEkN5FLqXPuKX/k5d1D7RKHATGqU7y6YfX9QxZraUzUrFGqH6XzOzG196BC35ltJC4Cw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@formatjs/ts-transformer/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1003,6 +1053,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1019,6 +1070,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1030,13 +1082,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@formatjs/ts-transformer/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1046,6 +1100,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1069,9 +1124,9 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", - "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1079,19 +1134,33 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", - "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.0", + "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1107,9 +1176,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.0.tgz", + "integrity": "sha512-xnRgu9DxZbkWak/te3fcytNyp8MTbuiZIaueg2rgEvBuN55n04nwLYLU9TX/VVlusc9L2ZNXi99nUFNkHXtr5g==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2221,22 +2290,22 @@ } }, "node_modules/@patternfly/patternfly": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.4.1.tgz", - "integrity": "sha512-0+KxsQJrFzOMANALW82BHAO7bSm9tEbG1RrOlGT23ME1CaBoetGSMRLymutvojn/b/EKfJIr5rLzQa+14Lvg2g==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.4.2.tgz", + "integrity": "sha512-+BaokNR8/AmTYMESxby9UtQXPGACg449BXQd0KejAvW/uGxlgO6mY1X1205DeBEHoK3e/vXkYXjvZPpv/tcxSA==", "license": "MIT" }, "node_modules/@patternfly/react-charts": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.4.3.tgz", - "integrity": "sha512-HW55rc7UtuiUSk5kUEdCsbfU+/lVPXDruebQKxzImseiyjeLL3e3Tb8L778ga6Kt0YKaUTaqETuprR9ucRA0+w==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.4.5.tgz", + "integrity": "sha512-m6+y4FDCQm+Ql55KJQK1Yor799aaYgpVbIcqShtZ7Lidx9MFCfoCJxSrJTbfJHb46H+zv/LKxLtJ6dUx54qnjA==", "license": "MIT", "dependencies": { - "@patternfly/react-styles": "^5.4.0", - "@patternfly/react-tokens": "^5.4.0", + "@patternfly/react-styles": "^5.4.1", + "@patternfly/react-tokens": "^5.4.1", "hoist-non-react-statics": "^3.3.2", "lodash": "^4.17.21", - "tslib": "^2.6.3", + "tslib": "^2.7.0", "victory-area": "^37.1.1", "victory-axis": "^37.1.1", "victory-bar": "^37.1.1", @@ -2261,14 +2330,14 @@ } }, "node_modules/@patternfly/react-component-groups": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-component-groups/-/react-component-groups-5.4.0.tgz", - "integrity": "sha512-faRrjz/D4saTjNgQa2p8tSlEXeeyBMGK9eGqdOKc5DG0smP1e+lN7dXDYNPARpKXj9fmaUltzux+w/7NLwxUhw==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@patternfly/react-component-groups/-/react-component-groups-5.5.3.tgz", + "integrity": "sha512-u4oCihYfjhVQZyPJ9HFEdtSE0biE3RfbkmL3gaH1Dk13IXtg5Z/Ax+1udNYll2FePnDXhGAPf7vXaZkg+PX56A==", "license": "MIT", "dependencies": { - "@patternfly/react-core": "^5.3.3", + "@patternfly/react-core": "^5.4.1", "@patternfly/react-icons": "^5.4.0", - "@patternfly/react-table": "^5.3.3", + "@patternfly/react-table": "^5.4.1", "clsx": "^2.1.1", "react-jss": "^10.10.0" }, @@ -2278,9 +2347,9 @@ } }, "node_modules/@patternfly/react-core": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.4.1.tgz", - "integrity": "sha512-PJjwN4OCR7jTdWKi0RzuFdtlSQ8gBR+0REczuDHHPW8ky0bs1cIcqGsn5p/b6OgPlztl3UaXqRYLsroiEMasOw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.4.2.tgz", + "integrity": "sha512-YpynAUvka9atgrggEporp0S1oxtoAkdtFM5guM3T2zYqs8ww2TKfpn4ThxVgomwyt57zt5KOUKIAwcWWQrYTVQ==", "license": "MIT", "dependencies": { "@patternfly/react-icons": "^5.4.0", @@ -2306,33 +2375,70 @@ } }, "node_modules/@patternfly/react-styles": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.4.0.tgz", - "integrity": "sha512-4ZE0s6LkX/0KsN0FOeogrDoj18m+BPA73YKnabZGB4SDRzrBNeBh2a6bSt546ZseEjkoJ+S81kOG0G8YckPQYg==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.4.1.tgz", + "integrity": "sha512-XA8PXksD8uiA3RTwxdUwJXOCf+V6sVd+2HKapWAdRLvtSV+Sdk7NgCvalb4IAQncsddLopjPQD8gAHA298+N8w==", "license": "MIT" }, "node_modules/@patternfly/react-table": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.4.1.tgz", - "integrity": "sha512-T05djy6YPqjbGWjpnwUs9oqup8oqqIOBnDOcThnHukgzlwnZvLNywgdoMR5XAKxTcIx/iBE1cu8ieETlITOGLw==", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.4.8.tgz", + "integrity": "sha512-YVRSP6luBHsDqWeblPLfg8tXasB409SbysDECsGPMR+y87vYTa6CHwpVhImhXOlIJW7KCRCgx4T1/siAxb3XkA==", "license": "MIT", "dependencies": { - "@patternfly/react-core": "^5.4.1", - "@patternfly/react-icons": "^5.4.0", - "@patternfly/react-styles": "^5.4.0", - "@patternfly/react-tokens": "^5.4.0", + "@patternfly/react-core": "^5.4.8", + "@patternfly/react-icons": "^5.4.2", + "@patternfly/react-styles": "^5.4.1", + "@patternfly/react-tokens": "^5.4.1", "lodash": "^4.17.21", - "tslib": "^2.6.3" + "tslib": "^2.7.0" }, "peerDependencies": { "react": "^17 || ^18", "react-dom": "^17 || ^18" } }, + "node_modules/@patternfly/react-table/node_modules/@patternfly/react-core": { + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.4.8.tgz", + "integrity": "sha512-4KRsQsH39VmTiFPLdN34QqNZg6gKrTamJxKtWEPO1VKA0TpoRMwpFEGk9BDyxipxYST6WzXznAaLCidGkCDlWw==", + "license": "MIT", + "dependencies": { + "@patternfly/react-icons": "^5.4.2", + "@patternfly/react-styles": "^5.4.1", + "@patternfly/react-tokens": "^5.4.1", + "focus-trap": "7.6.0", + "react-dropzone": "^14.2.3", + "tslib": "^2.7.0" + }, + "peerDependencies": { + "react": "^17 || ^18", + "react-dom": "^17 || ^18" + } + }, + "node_modules/@patternfly/react-table/node_modules/@patternfly/react-icons": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.4.2.tgz", + "integrity": "sha512-CMQ5oHYzW6TPVTs2jpNJmP2vGCAKR/YeTPwHGO9dLkAUej1IcIxtCCWK2Fdo2UJsnBjuZihasyw2b6ehvbUm9Q==", + "license": "MIT", + "peerDependencies": { + "react": "^17 || ^18", + "react-dom": "^17 || ^18" + } + }, + "node_modules/@patternfly/react-table/node_modules/focus-trap": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.0.tgz", + "integrity": "sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ==", + "license": "MIT", + "dependencies": { + "tabbable": "^6.2.0" + } + }, "node_modules/@patternfly/react-tokens": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.4.0.tgz", - "integrity": "sha512-KONkwCVOMyklhuuaYeYgcAsGtCBQXnsBGZeolhOdSzr2Mj0RVSW0oMrQPgZuPVzhhC/kbqgClHJJl6xuG9xheA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.4.1.tgz", + "integrity": "sha512-eygdHE7Krta1mijAv/E8RHiKIgysD0eeNTo8EXUYC8/M4e5K6sqpr2p6rQBF8QiRMN8FnbXvZT3K2OQ28pYt9Q==", "license": "MIT" }, "node_modules/@pkgjs/parseargs": { @@ -2518,9 +2624,10 @@ } }, "node_modules/@redhat-cloud-services/frontend-components": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-4.2.16.tgz", - "integrity": "sha512-xtCSn4dCeyooG8czEZThoA9YWjghaXAqWt2JZVLmGdk9Gejhfco0l5Of/O3hfXgnPzXqRfOZJDA0jNVo1qKrTw==", + "version": "4.2.22", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-4.2.22.tgz", + "integrity": "sha512-FEDxxNHF0Jg6thM1IIFxHZSVbsS5Eq4QxOuPvbhlXA7ijvxzkgh5hDwBZyRSYhL2za+sZPqZzYTgwwu1Mb3MNw==", + "license": "Apache-2.0", "dependencies": { "@patternfly/react-component-groups": "^5.0.0", "@redhat-cloud-services/frontend-components-utilities": "^4.0.0", @@ -2544,9 +2651,9 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-config": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-config/-/frontend-components-config-6.3.1.tgz", - "integrity": "sha512-WLItTdGoIrc0s7QsrjGpcxELQljHSZXrPCTyf9y9fv1QopOtQRoWSIAMolDzABquWQ98HPeMyz4XsJRF7PCX1Q==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-config/-/frontend-components-config-6.3.3.tgz", + "integrity": "sha512-+vprQN6SYW8gTbv9mdwbFzfZbBziVhdpUpDstDq2rBv42Qb96WEY1titfVypCZC4iGsbRu6uYJfnWYKvpZXekQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2759,9 +2866,9 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-notifications": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-4.1.0.tgz", - "integrity": "sha512-bEoAeZMVY+UuSriSeruZ1pIesiPEjScrVFJQ5Wq/w3UFc79oXSYOgpRElxblPUH/LbKqp7inbzqRm2FxMcVxYg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-4.1.1.tgz", + "integrity": "sha512-AR/5x48MgTcZdpnwbEyHyt5KkOD56dwZ55xzLh3CI2KO3FmQzTZBjIs0hng1uPcYtKu982vYgl78MFRsuZzSeA==", "dependencies": { "@redhat-cloud-services/frontend-components": "^4.0.9", "@redhat-cloud-services/frontend-components-utilities": "^4.0.2", @@ -2778,9 +2885,9 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-translations": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-translations/-/frontend-components-translations-3.2.8.tgz", - "integrity": "sha512-7nnKpVc4zVv2TMdkHPCEr3qVsH0gtkYQGbW4Q5cgPdz3Qmcn8MYQLw+3biiFWQmImUwoDt8EWRssPG/Ilf85Yw==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-translations/-/frontend-components-translations-3.2.9.tgz", + "integrity": "sha512-hkIEV7BG5vT0CxwHiqgBkeuUGM93bZqeF6lvbq/DgOyMcevZ1eiFM0iQKPNrw8jS8UfDawaCiHhXOGGrD7T4Sw==", "optionalDependencies": { "@redhat-cloud-services/frontend-components-utilities": "^4.0.13" }, @@ -2792,13 +2899,13 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-utilities": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-utilities/-/frontend-components-utilities-4.0.17.tgz", - "integrity": "sha512-A/KIw44ZRFzd/iLNF6hLWvKPyOvnpGCKwgsT3x9EhsJBS1I7KJU+g7h4M+XDy7vwDyUTIkfnTSbaaVdNnzmEFg==", + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-utilities/-/frontend-components-utilities-4.0.19.tgz", + "integrity": "sha512-CD3tp/fHWK/qiHfxsbiKW+odlUrQM8hQ+XxhkMzLcIJFBGbH3CTSpP9ALXdO+3UsaE5h3Hk3LRoFCYWp0Aajxg==", "dependencies": { "@redhat-cloud-services/rbac-client": "^1.0.111 || 2.x", "@redhat-cloud-services/types": "^1.0.9", - "@sentry/browser": "^5.30.0", + "@sentry/browser": "^7.119.1", "awesome-debounce-promise": "^2.1.0", "axios": "^0.28.1 || ^1.7.0", "commander": "^2.20.3", @@ -2836,9 +2943,10 @@ } }, "node_modules/@redhat-cloud-services/rbac-client": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.5.tgz", - "integrity": "sha512-wY0UsCFr8B9Q81dnHIlx1vsdEV1KF5rFHsk16tH7QRF6oaXgtAxi3rpmcO10oWAqVUJ1NhdeHqOt2vMEcjiQ2Q==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.8.tgz", + "integrity": "sha512-+7GWkJv0V1htVvFX4u4M4oMj96JEOFYLHw64FX34wCtQL9F0bKpeybrJFpv800C+DbV/837HxiT1Jvj7qIJ/6Q==", + "license": "Apache-2.0", "dependencies": { "@redhat-cloud-services/javascript-clients-shared": "^1.2.4", "axios": "^1.7.2", @@ -2846,9 +2954,9 @@ } }, "node_modules/@redhat-cloud-services/tsc-transform-imports": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/tsc-transform-imports/-/tsc-transform-imports-1.0.16.tgz", - "integrity": "sha512-2GbDEV3t0E/s9v1TresBtehlXX0pLMOmlI9j1ThQUCTwQ8c5dvITu1neJIDexiZa40GaIKlPfmqkt0jxq93GYQ==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/tsc-transform-imports/-/tsc-transform-imports-1.0.17.tgz", + "integrity": "sha512-kcs0B2WdVc/SJZIkwrABFYmBca//qw//H7qj0CZOM9Wrtcqmy9f+B5yhoxgP1Rxv2wO3n+oO7usEXMCj5/goNg==", "dev": true, "dependencies": { "glob": "10.3.3" @@ -2947,106 +3055,132 @@ "tslib": "^2.6.2" } }, - "node_modules/@sentry/browser": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.30.0.tgz", - "integrity": "sha512-rOb58ZNVJWh1VuMuBG1mL9r54nZqKeaIlwSlvzJfc89vyfd7n6tQ1UXMN383QBz/MS5H5z44Hy5eE+7pCrYAfw==", + "node_modules/@sentry-internal/feedback": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.119.2.tgz", + "integrity": "sha512-bnR1yJWVBZfXGx675nMXE8hCXsxluCBfIFy9GQT8PTN/urxpoS9cGz+5F7MA7Xe3Q06/7TT0Mz3fcDvjkqTu3Q==", + "license": "MIT", "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" + "@sentry/core": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/@sentry/browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "node_modules/@sentry-internal/replay-canvas": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.119.2.tgz", + "integrity": "sha512-Lqo8IFyeKkdOrOGRqm9jCEqeBl8kINe5+c2VqULpkO/I6ql6ISwPSYnmG6yL8cCVIaT1893CLog/pS4FxCv8/Q==", + "license": "MIT", "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" + "@sentry/core": "7.119.2", + "@sentry/replay": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/@sentry-internal/tracing": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.119.2.tgz", + "integrity": "sha512-V2W+STWrafyGJhQv3ulMFXYDwWHiU6wHQAQBShsHVACiFaDrJ2kPRet38FKv4dMLlLlP2xN+ss2e5zv3tYlTiQ==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "node_modules/@sentry/browser": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.119.2.tgz", + "integrity": "sha512-Wb2RzCsJBTNCmS9KPmbVyV5GGzFXjFdUThAN9xlnN5GgemMBwdQjGu/tRYr8yJAVsRb0EOFH8IuJBNKKNnO49g==", + "license": "MIT", "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" + "@sentry-internal/feedback": "7.119.2", + "@sentry-internal/replay-canvas": "7.119.2", + "@sentry-internal/tracing": "7.119.2", + "@sentry/core": "7.119.2", + "@sentry/integrations": "7.119.2", + "@sentry/replay": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/@sentry/core": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.2.tgz", + "integrity": "sha512-hQr3d2yWq/2lMvoyBPOwXw1IHqTrCjOsU1vYKhAa6w9vGbJZFGhKGGE2KEi/92c3gqGn+gW/PC7cV6waCTDuVA==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "node_modules/@sentry/integrations": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.119.2.tgz", + "integrity": "sha512-dCuXKvbUE3gXVVa696SYMjlhSP6CxpMH/gl4Jk26naEB8Xjsn98z/hqEoXLg6Nab73rjR9c/9AdKqBbwVMHyrQ==", + "license": "MIT", "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" + "@sentry/core": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2", + "localforage": "^1.8.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/@sentry/replay": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.119.2.tgz", + "integrity": "sha512-nHDsBt0mlJXTWAHjzQdCzDbhV2fv8B62PPB5mu5SpI+G5h+ir3r5lR0lZZrMT8eurVowb/HnLXAs+XYVug3blg==", + "license": "MIT", + "dependencies": { + "@sentry-internal/tracing": "7.119.2", + "@sentry/core": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" + }, + "engines": { + "node": ">=12" + } }, "node_modules/@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.2.tgz", + "integrity": "sha512-ydq1tWsdG7QW+yFaTp0gFaowMLNVikIqM70wxWNK+u98QzKnVY/3XTixxNLsUtnAB4Y+isAzFhrc6Vb5GFdFeg==", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.2.tgz", + "integrity": "sha512-TLdUCvcNgzKP0r9YD7tgCL1PEUp42TObISridsPJ5rhpVGQJvpr+Six0zIkfDUxerLYWZoK8QMm9KgFlPLNQzA==", + "license": "MIT", "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" + "@sentry/types": "7.119.2" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -3105,15 +3239,15 @@ } }, "node_modules/@swc/core": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.26.tgz", - "integrity": "sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.8.0.tgz", + "integrity": "sha512-EF8C5lp1RKMp3426tAKwQyVbg4Zcn/2FDax3cz8EcOXYQJM/ctB687IvBm9Ciej1wMcQ/dMRg+OB4Xl8BGLBoA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" + "@swc/types": "^0.1.14" }, "engines": { "node": ">=10" @@ -3123,16 +3257,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.26", - "@swc/core-darwin-x64": "1.7.26", - "@swc/core-linux-arm-gnueabihf": "1.7.26", - "@swc/core-linux-arm64-gnu": "1.7.26", - "@swc/core-linux-arm64-musl": "1.7.26", - "@swc/core-linux-x64-gnu": "1.7.26", - "@swc/core-linux-x64-musl": "1.7.26", - "@swc/core-win32-arm64-msvc": "1.7.26", - "@swc/core-win32-ia32-msvc": "1.7.26", - "@swc/core-win32-x64-msvc": "1.7.26" + "@swc/core-darwin-arm64": "1.8.0", + "@swc/core-darwin-x64": "1.8.0", + "@swc/core-linux-arm-gnueabihf": "1.8.0", + "@swc/core-linux-arm64-gnu": "1.8.0", + "@swc/core-linux-arm64-musl": "1.8.0", + "@swc/core-linux-x64-gnu": "1.8.0", + "@swc/core-linux-x64-musl": "1.8.0", + "@swc/core-win32-arm64-msvc": "1.8.0", + "@swc/core-win32-ia32-msvc": "1.8.0", + "@swc/core-win32-x64-msvc": "1.8.0" }, "peerDependencies": { "@swc/helpers": "*" @@ -3144,9 +3278,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz", - "integrity": "sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.8.0.tgz", + "integrity": "sha512-TIus1/SE/Ud4g84hCnchcagu+LfyndSDy5r5qf64nflojejDidPU9Fp1InzQhQpEgIpntnZID/KFCP5rQnvsIw==", "cpu": [ "arm64" ], @@ -3161,9 +3295,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz", - "integrity": "sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.8.0.tgz", + "integrity": "sha512-yCb1FHCX/HUmNRGB1X3CFJ1WPKXMosZVUe3K2TrosCGvytwgaLoW5FS0bZg5Qv6cEUERQBg75cJnOUPwLLRCVg==", "cpu": [ "x64" ], @@ -3178,9 +3312,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz", - "integrity": "sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.8.0.tgz", + "integrity": "sha512-6TdjVdiLaSW+eGiHKEojMDlx673nowrPHa6nM6toWgRzy8tIZgjPOguVKJDoMnoHuvO7SkOLCUiMRw0rTskypA==", "cpu": [ "arm" ], @@ -3195,9 +3329,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz", - "integrity": "sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.8.0.tgz", + "integrity": "sha512-TU2YcTornnyZiJUabRuk7Xtvzaep11FwK77IkFomjN9/Os5s25B8ea652c2fAQMe9RsM84FPVmX303ohxavjKQ==", "cpu": [ "arm64" ], @@ -3212,9 +3346,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz", - "integrity": "sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.8.0.tgz", + "integrity": "sha512-2CdPTEKxx2hJIj/B0fn8L8k2coo/FDS95smzXyi2bov5FcrP6Ohboq8roFBYgj38fkHusXjY8qt+cCH7yXWAdg==", "cpu": [ "arm64" ], @@ -3229,9 +3363,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz", - "integrity": "sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.8.0.tgz", + "integrity": "sha512-14StQBifCs/AMsySdU95OmwNJr9LOVqo6rcTFt2b7XaWpe/AyeuMJFxcndLgUewksJHpfepzCTwNdbcYmuNo6A==", "cpu": [ "x64" ], @@ -3246,9 +3380,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz", - "integrity": "sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.8.0.tgz", + "integrity": "sha512-qemJnAQlYqKCfWNqVv5SG8uGvw8JotwU86cuFUkq35oTB+dsSFM3b83+B1giGTKKFOh2nfWT7bvPXTKk+aUjew==", "cpu": [ "x64" ], @@ -3263,9 +3397,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz", - "integrity": "sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.8.0.tgz", + "integrity": "sha512-fXt5vZbnrVdXZzGj2qRnZtY3uh+NtLCaFjS2uD9w8ssdbjhbDZYlJCj2JINOjv35ttEfAD2goiYmVa5P/Ypl+g==", "cpu": [ "arm64" ], @@ -3280,9 +3414,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz", - "integrity": "sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.8.0.tgz", + "integrity": "sha512-W4FA2vSJ+bGYiTj6gspxghSdKQNLfLMo65AH07u797x7I+YJj8amnFY/fQRlroDv5Dez/FHTv14oPlTlNFUpIw==", "cpu": [ "ia32" ], @@ -3297,9 +3431,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz", - "integrity": "sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.8.0.tgz", + "integrity": "sha512-Il4y8XwKDV0Bnk0IpA00kGcSQC6I9XOIinW5egTutnwIDfDE+qsD0j+0isW5H76GetY3/Ze0lVxeOXLAUgpegA==", "cpu": [ "x64" ], @@ -3320,10 +3454,11 @@ "dev": true }, "node_modules/@swc/jest": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.36.tgz", - "integrity": "sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==", + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.37.tgz", + "integrity": "sha512-CR2BHhmXKGxTiFr21DYPRHQunLkX3mNIFGFkxBGji6r9uyIR5zftTOVYj1e0sFNMV2H7mf/+vpaglqaryBtqfQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@swc/counter": "^0.1.3", @@ -3337,9 +3472,9 @@ } }, "node_modules/@swc/types": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.14.tgz", + "integrity": "sha512-PbSmTiYCN+GMrvfjrMo9bdY+f2COnwbdnoMw7rqU/PI5jXpKjxOGZ0qqZCImxnT81NkNsKnmEpvu+hRXLBeCJg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3443,10 +3578,11 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", - "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", + "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", "dev": true, + "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", @@ -3882,9 +4018,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.13", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", - "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -3941,10 +4077,11 @@ "dev": true }, "node_modules/@types/json-stable-stringify": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.36.tgz", - "integrity": "sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.1.0.tgz", + "integrity": "sha512-ESTsHWB72QQq+pjUFIbEz9uSCZppD31YrVkbt2rnUciTYEvcwN6uZIhX5JZeBHqRlFJ41x/7MewCs7E2Qux6Cg==", + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -4000,10 +4137,11 @@ } }, "node_modules/@types/picomatch": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.3.tgz", - "integrity": "sha512-Yll76ZHikRFCyz/pffKGjrCwe/le2CDwOP5F210KQo27kpRE46U2rDnzikNlVn6/ezH3Mhn46bJMTfeVTtcYMg==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-1MRgzpzY0hOp9pW/kLRxeQhUWwil6gnrUYd3oEpeYBqp/FexhaCPv3F8LsYr47gtUU45fO2cm1dbwkSrHEo8Uw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/prop-types": { "version": "15.7.11", @@ -4024,9 +4162,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", - "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -4173,27 +4311,336 @@ "@types/yargs-parser": "*" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.9.0.tgz", - "integrity": "sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.13.0.tgz", + "integrity": "sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/type-utils": "8.13.0", + "@typescript-eslint/utils": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", + "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", + "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", + "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.13.0.tgz", + "integrity": "sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/typescript-estree": "8.13.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", + "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.13.0.tgz", + "integrity": "sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/typescript-estree": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", + "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", + "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", + "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", + "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.12.2.tgz", + "integrity": "sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/visitor-keys": "8.12.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz", + "integrity": "sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.9.0", - "@typescript-eslint/type-utils": "8.9.0", - "@typescript-eslint/utils": "8.9.0", - "@typescript-eslint/visitor-keys": "8.9.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", + "@typescript-eslint/typescript-estree": "8.13.0", + "@typescript-eslint/utils": "8.13.0", + "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "engines": { @@ -4203,28 +4650,21 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.9.0.tgz", - "integrity": "sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", + "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.9.0", - "@typescript-eslint/types": "8.9.0", - "@typescript-eslint/typescript-estree": "8.9.0", - "@typescript-eslint/visitor-keys": "8.9.0", - "debug": "^4.3.4" + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4232,9 +4672,44 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", + "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", + "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { @@ -4242,15 +4717,17 @@ } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.9.0.tgz", - "integrity": "sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.13.0.tgz", + "integrity": "sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.9.0", - "@typescript-eslint/visitor-keys": "8.9.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/typescript-estree": "8.13.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4258,19 +4735,20 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.9.0.tgz", - "integrity": "sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", + "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.9.0", - "@typescript-eslint/utils": "8.9.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/types": "8.13.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4278,17 +4756,38 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@typescript-eslint/types": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.9.0.tgz", - "integrity": "sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.12.2.tgz", + "integrity": "sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==", "dev": true, "license": "MIT", "engines": { @@ -4300,14 +4799,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.9.0.tgz", - "integrity": "sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.2.tgz", + "integrity": "sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.9.0", - "@typescript-eslint/visitor-keys": "8.9.0", + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/visitor-keys": "8.12.2", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -4342,16 +4841,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.9.0.tgz", - "integrity": "sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.12.2.tgz", + "integrity": "sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.9.0", - "@typescript-eslint/types": "8.9.0", - "@typescript-eslint/typescript-estree": "8.9.0" + "@typescript-eslint/scope-manager": "8.12.2", + "@typescript-eslint/types": "8.12.2", + "@typescript-eslint/typescript-estree": "8.12.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4365,13 +4864,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.9.0.tgz", - "integrity": "sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.2.tgz", + "integrity": "sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/types": "8.12.2", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -4396,9 +4895,9 @@ } }, "node_modules/@unleash/proxy-client-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@unleash/proxy-client-react/-/proxy-client-react-4.3.1.tgz", - "integrity": "sha512-AZ53XY+M/TVG1LRqULiikxc+IMUZMvfr4Sb7axWBOJbNwmQ39vHOWXy19dEFS3ha2b9EpHA1bC3IdaDWzR3euQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@unleash/proxy-client-react/-/proxy-client-react-4.4.0.tgz", + "integrity": "sha512-btU/2Pho5eVOBdIYxNAeHq36lpm41/qmRVKuuLIGdg3XOZign9rA6KsarAk94W01XKulrNCrESINZMIvPoA6Cg==", "license": "Apache-2.0", "engines": { "node": ">=16.0.0" @@ -4631,10 +5130,11 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -7756,10 +8256,11 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", + "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7768,12 +8269,12 @@ "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", + "iterator.prototype": "^1.1.3", "safe-array-concat": "^1.1.2" }, "engines": { @@ -7895,22 +8396,22 @@ } }, "node_modules/eslint": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", - "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", + "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", + "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", + "@eslint/core": "^0.7.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.12.0", + "@eslint/js": "9.14.0", "@eslint/plugin-kit": "^0.2.0", - "@humanfs/node": "^0.16.5", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.1", + "@humanwhocodes/retry": "^0.4.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -7918,9 +8419,9 @@ "cross-spawn": "^7.0.2", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.1.0", - "eslint-visitor-keys": "^4.1.0", - "espree": "^10.2.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -8166,148 +8667,27 @@ } }, "node_modules/eslint-plugin-formatjs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-5.1.0.tgz", - "integrity": "sha512-IN3/MKq5XumXqgta7OnvixcEoQCyxLAsNVwzsOQIqQqughcHwkvv7JHiIurt+7V6IjBYDyfTiH7opZggR+t+7w==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-5.2.1.tgz", + "integrity": "sha512-9BlwCVxSazY9ohi9X2DHEJENA1E5gyu72WAbCKQA62y8+oJ9F2CjHg4ilxNTF+PFZ6KqKcm2+3EgyUDlRZIoRA==", "dev": true, + "license": "MIT", "dependencies": { - "@formatjs/icu-messageformat-parser": "2.7.10", - "@formatjs/ts-transformer": "3.13.16", + "@formatjs/icu-messageformat-parser": "2.9.3", + "@formatjs/ts-transformer": "3.13.22", "@types/eslint": "9", - "@types/picomatch": "^2.3.0", - "@typescript-eslint/utils": "8.5.0", - "emoji-regex": "^10.2.1", + "@types/picomatch": "3", + "@typescript-eslint/utils": "8.12.2", + "emoji-regex": "10", "magic-string": "^0.30.0", - "picomatch": "^2.3.1", - "tslib": "^2.7.0", - "typescript": "5", + "picomatch": "2 || 3 || 4", + "tslib": "2", "unicode-emoji-utils": "^1.2.0" }, "peerDependencies": { "eslint": "9" } }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-plugin-import": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", @@ -8577,9 +8957,9 @@ "dev": true }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.4.1.tgz", - "integrity": "sha512-OXIq+JJQPCLAKL473/esioFOwbXyRE5MAQ4HbZjcp3e+K3zdxt2uDpGs3FR+WezUXNStzEtTfgx15T+JFrVwBA==", + "version": "50.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.4.3.tgz", + "integrity": "sha512-uWtwFxGRv6B8sU63HZM5dAGDhgsatb+LONwmILZJhdRALLOkCX2HFZhdL/Kw2ls8SQMAVEfK+LmnEfxInRN8HA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8915,9 +9295,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", - "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "dev": true, "license": "MIT", "dependencies": { @@ -8926,7 +9306,7 @@ "array.prototype.flatmap": "^1.3.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.1.0", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", @@ -9103,20 +9483,20 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.3.0.tgz", - "integrity": "sha512-GYcEErTt6EGwE0bPDY+4aehfEBpB2gDBFKohir8jlATSUvzStEyzCx8QWB/14xeKc/AwyXkzScSzMHnFojkWrA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.4.0.tgz", + "integrity": "sha512-yeWF+YgCgvNyPNI9UKnG0FjeE2sk93N/3lsKqcmR8dSfeXJwFT5irnWo7NjLf152HkRzfoFjh3LsBUrhvFz4eA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^5.58.0" + "@typescript-eslint/utils": "^5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0", "npm": ">=6" }, "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/scope-manager": { @@ -9373,9 +9753,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", - "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9390,9 +9770,9 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -9402,24 +9782,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/espree": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", - "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9457,14 +9819,15 @@ } }, "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.12.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9474,10 +9837,11 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -10427,9 +10791,9 @@ } }, "node_modules/globals": { - "version": "15.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", - "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", "dev": true, "license": "MIT", "engines": { @@ -10440,12 +10804,14 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -11075,6 +11441,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/immer": { "version": "10.0.4", "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.4.tgz", @@ -11288,14 +11660,15 @@ } }, "node_modules/intl-messageformat": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.0.tgz", - "integrity": "sha512-2P06M9jFTqJnEQzE072VGPjbAx6ZG1YysgopAwc8ui0ajSjtwX1MeQ6bXFXIzKcNENJTizKkcJIcZ0zlpl1zSg==", + "version": "10.7.5", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.5.tgz", + "integrity": "sha512-CflbRvJiahVmnfxq/lO+DCM1/8ji4vC4rTnz6ZJEKKodViB+EWgY9M4EqXVRQ+3K0Ng5qwSyqybPP+KSfS4KZw==", + "license": "BSD-3-Clause", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/fast-memoize": "2.2.1", - "@formatjs/icu-messageformat-parser": "2.7.10", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/icu-messageformat-parser": "2.9.3", + "tslib": "2" } }, "node_modules/ipaddr.js": { @@ -11375,6 +11748,7 @@ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11535,6 +11909,7 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -12089,16 +12464,20 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "reflect.getprototypeof": "^1.0.4", "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/jackspeak": { @@ -14313,6 +14692,7 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "isarray": "^2.0.5", @@ -14375,6 +14755,7 @@ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "dev": true, + "license": "Public Domain", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14656,6 +15037,15 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -14731,6 +15121,15 @@ "node": ">=8.9.0" } }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -16837,20 +17236,21 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, "node_modules/react-intl": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.8.0.tgz", - "integrity": "sha512-rx/UcAtlmrYWaPfrgAIDu7VsJoyUPFPdftIFUnOSOj/LHR6ACTU3tunfk69c4LGygQ592YxilBXDWH6rKlTu6Q==", - "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.10", - "@formatjs/intl": "2.10.8", - "@formatjs/intl-displaynames": "6.6.10", - "@formatjs/intl-listformat": "7.5.9", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/react": "^18.3.11", - "hoist-non-react-statics": "^3.3.2", - "intl-messageformat": "10.7.0", - "tslib": "^2.7.0" + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.8.6.tgz", + "integrity": "sha512-eJpyk6oxvp1oqxEHMmlyVgQHMf2QINcBozxc2pQDB6NrwKe59dphXyUB9AiGeVAGUfgrs2Bbb10w2tb0s1wL/Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/icu-messageformat-parser": "2.9.3", + "@formatjs/intl": "2.10.13", + "@formatjs/intl-displaynames": "6.8.3", + "@formatjs/intl-listformat": "7.7.3", + "@types/hoist-non-react-statics": "3", + "@types/react": "16 || 17 || 18", + "hoist-non-react-statics": "3", + "intl-messageformat": "10.7.5", + "tslib": "2" }, "peerDependencies": { "react": "^16.6.0 || 17 || 18", @@ -17064,6 +17464,7 @@ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -18480,13 +18881,13 @@ } }, "node_modules/swc_mut_cjs_exports": { - "version": "0.99.0", - "resolved": "https://registry.npmjs.org/swc_mut_cjs_exports/-/swc_mut_cjs_exports-0.99.0.tgz", - "integrity": "sha512-v3/AiUXrM/6ELCUo7zDHszpYYK0iFmGsnFSAUTsqGFkLH6rFq055L14Wg95agAhwDxO1M7e3nQbxsIUbFv4Khg==", + "version": "0.109.1", + "resolved": "https://registry.npmjs.org/swc_mut_cjs_exports/-/swc_mut_cjs_exports-0.109.1.tgz", + "integrity": "sha512-964w4tAFD9jqEgk9igW4o4qfW9iNHhf7VdeEJcxH27XmbcWgcSwdsRg7ou4gNRoVuZNnpKMXa5sVH2HSD8yxOg==", "dev": true, "license": "MIT", "peerDependencies": { - "@swc/core": "^1.7.0", + "@swc/core": "^1.7.35", "@swc/jest": "^0.2.36" } }, @@ -19664,386 +20065,386 @@ } }, "node_modules/victory": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory/-/victory-37.1.2.tgz", - "integrity": "sha512-V1YkJiWQ/vu5MSZ/Yf9/AJQeE+N1p1eUW6r5xJgOjbhioIbnL7FBTyJW1AXqqDZN9WdyECI3TkFQ1l/QbgztoA==", - "license": "MIT", - "dependencies": { - "victory-area": "37.1.2", - "victory-axis": "37.1.2", - "victory-bar": "37.1.2", - "victory-box-plot": "37.1.2", - "victory-brush-container": "37.1.2", - "victory-brush-line": "37.1.2", - "victory-candlestick": "37.1.2", - "victory-canvas": "37.1.2", - "victory-chart": "37.1.2", - "victory-core": "37.1.2", - "victory-create-container": "37.1.2", - "victory-cursor-container": "37.1.2", - "victory-errorbar": "37.1.2", - "victory-group": "37.1.2", - "victory-histogram": "37.1.2", - "victory-legend": "37.1.2", - "victory-line": "37.1.2", - "victory-pie": "37.1.2", - "victory-polar-axis": "37.1.2", - "victory-scatter": "37.1.2", - "victory-selection-container": "37.1.2", - "victory-shared-events": "37.1.2", - "victory-stack": "37.1.2", - "victory-tooltip": "37.1.2", - "victory-voronoi": "37.1.2", - "victory-voronoi-container": "37.1.2", - "victory-zoom-container": "37.1.2" + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory/-/victory-37.3.1.tgz", + "integrity": "sha512-lAx1rgqj13xy5/rsVSHvOGJwaLPO2RgPRzb1Pm2FDEelzl2AHOs1YXmHHq7E5xG6heSYJWOm1nQsh4J/MXUv2g==", + "license": "MIT", + "dependencies": { + "victory-area": "37.3.1", + "victory-axis": "37.3.1", + "victory-bar": "37.3.1", + "victory-box-plot": "37.3.1", + "victory-brush-container": "37.3.1", + "victory-brush-line": "37.3.1", + "victory-candlestick": "37.3.1", + "victory-canvas": "37.3.1", + "victory-chart": "37.3.1", + "victory-core": "37.3.1", + "victory-create-container": "37.3.1", + "victory-cursor-container": "37.3.1", + "victory-errorbar": "37.3.1", + "victory-group": "37.3.1", + "victory-histogram": "37.3.1", + "victory-legend": "37.3.1", + "victory-line": "37.3.1", + "victory-pie": "37.3.1", + "victory-polar-axis": "37.3.1", + "victory-scatter": "37.3.1", + "victory-selection-container": "37.3.1", + "victory-shared-events": "37.3.1", + "victory-stack": "37.3.1", + "victory-tooltip": "37.3.1", + "victory-voronoi": "37.3.1", + "victory-voronoi-container": "37.3.1", + "victory-zoom-container": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-area": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-37.1.2.tgz", - "integrity": "sha512-72i02xTD47i7P+X02AHhZ32yO16VcM1h/7gulgAioLEx+8m3zShBKu46Md/vqmbyS2Bypr3xpUvd+8mCDIvCbw==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-37.3.1.tgz", + "integrity": "sha512-+D0I64HRe0hXCP8HsQIpsDmxkBsqPTZDImOfndjr/2JCXo9T/PLkUlbh/RjyOtHM66iUPjwjGJ513H3kfT4nYw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2", - "victory-vendor": "37.1.2" + "victory-core": "37.3.1", + "victory-vendor": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-axis": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-37.1.2.tgz", - "integrity": "sha512-TuivC84cHrFoDetWDhU2VXQ34froIXBrtjYYPdmwBrMEFSu+FfrakYWUr3r25XNEPyOyk4z3a8lL/sqrxWYSRQ==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-37.3.1.tgz", + "integrity": "sha512-hLLr4yAaVizGG+k50LZl7C/YJ+IUGkTFTO9cZqXJQS0c1WNYYxUC1pmDq1dugPpJLKJcbKOXHLLgswzYKAk6Jw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-bar": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-37.1.2.tgz", - "integrity": "sha512-VJDE+TGSgyIchvln189cPMuG3LYqa8zCjHa8kYValP3bFTa5c+D1Y8R/FjVger40uEL3aQz1teHJODJCOxuXGA==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-37.3.1.tgz", + "integrity": "sha512-DRfy/adNB9tl6/WNBqbWhnTXVrGraq8fsqf9SXkhtaYaQqyOAqmSZmfAiqATQWkONPXrkMKJC1urQJxJvHGLMQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2", - "victory-vendor": "37.1.2" + "victory-core": "37.3.1", + "victory-vendor": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-box-plot": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-37.1.2.tgz", - "integrity": "sha512-i7JIjpaPTr3uaoW6ibfX4PrH1QcUeLXNxeCbmPRb+Hs+ug0d16J4RELPCaeNo/ZNg4rEzfueNTvExsYFIpHaWw==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-37.3.1.tgz", + "integrity": "sha512-9KjILr5wuVkdB8C9gqYUPoqcAirDRTQ0hdjxfD627hQf0U6Uaju+FrEiigC4+Kr/HUQhQtxvklGwDypjxzj6Ng==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2", - "victory-vendor": "37.1.2" + "victory-core": "37.3.1", + "victory-vendor": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-brush-container": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-37.1.2.tgz", - "integrity": "sha512-pJrMSo815UJxOT5OTXnq1tI5qQxQLnrlgDRNF8pxVF9dSxm7BhETjZSQfZgcLmCe3N931U19j8oCxw8sMSpJJw==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-37.3.1.tgz", + "integrity": "sha512-hJlbjKQqqHEM29v7qauKuMy/UfdeqBlydM5yzMgauDEenWfs09rRO3CgJCVyu0SVEAem5Aaa7ovk5mI4/HGR6g==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-brush-line": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-brush-line/-/victory-brush-line-37.1.2.tgz", - "integrity": "sha512-Bq9JGu/o4p/NQ/ZOASUm6MmomS+2b0EvAHjULa06z7nsElNePpedTYPk2aAb7mr4sJZe6u/AsDMthG+C8Zc32Q==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-brush-line/-/victory-brush-line-37.3.1.tgz", + "integrity": "sha512-ojTk9fK9wi38w/OICceq/+zDOIfTedAE105B2XY5GYY+qE6k7dYHsIHtujhXXshPWYp5HnNPeP2xWt3Ky3B16Q==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-candlestick": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-candlestick/-/victory-candlestick-37.1.2.tgz", - "integrity": "sha512-X+pLwvdIj/+nrvk1bZxhdJ9UBj7QLN4jdkIPDl6ekjfZ9Ylhi8/I/ttAkBu+7w7ilpGudIK6fr7PVHyZyYU6TA==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-candlestick/-/victory-candlestick-37.3.1.tgz", + "integrity": "sha512-/lPUbxUmXabMqUmgsURMlpSnLOXZUTj3qPr/6rExnNS+zUyPvCfGXxca9HlB9QhP9Gmvz4RSm1lODLqDA02SNQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-canvas": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-canvas/-/victory-canvas-37.1.2.tgz", - "integrity": "sha512-4Qmz7YpFBj2KaBSe+j5zLVrKAJLG3HtXVVaKI3oUzw4GzHlYXf77dJLYe2EqJVEFCMgVsmASqE3xVTklioMV7g==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-canvas/-/victory-canvas-37.3.1.tgz", + "integrity": "sha512-z2VCde70m4AEsPDp9XJ4vxvaSqbsVRKKSk8ftgsBzGqrCtRd0TqJyyFgTnlgguCert4J03NCbZqwMra8ZTLRdg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-bar": "37.1.2", - "victory-core": "37.1.2" + "victory-bar": "37.3.1", + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-chart": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-37.1.2.tgz", - "integrity": "sha512-efV7lnqwu4+zLzB6aY3jjYbbfYJ9+1VC6uwx+8AGjbb8vGkbByUOKC6Fhdcuca2mLqNQHM0Ynvevs3+4XrBz1g==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-37.3.1.tgz", + "integrity": "sha512-mtTxmGUexmlX+IDh9GrBRIbFTFziUu08pbG9hz/io8UfBQ3f//ewPq8z8qI3apx7f/rvS6HD6NJyAew8t+nzyg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-axis": "37.1.2", - "victory-core": "37.1.2", - "victory-polar-axis": "37.1.2", - "victory-shared-events": "37.1.2" + "victory-axis": "37.3.1", + "victory-core": "37.3.1", + "victory-polar-axis": "37.3.1", + "victory-shared-events": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-core": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.2.tgz", - "integrity": "sha512-9fskAQw9MvYEBL+0cDk2lihKyECdrh+8HGicDfSKGOWtsSLk+x7R6PKCpOzhmSgc9fG+HjWYfs2uTWSPNTjF9A==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.3.1.tgz", + "integrity": "sha512-jFjqF7AVjc8OF1wuL9hFbPS+4mEH/C8LKI1/V0EJQcu5VimppF2BkbCH5+Y2lEwNNzNaqrXJnQ3Z0bzXjtplbw==", "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "37.1.2" + "victory-vendor": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-create-container": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-37.1.2.tgz", - "integrity": "sha512-GvWA+N3SXf6he+hW1IQqaRjKG7XSV9WBr06mZixRVyOeHJGGZ5g7Vsse1WrwUz5/DM8HcqF34PTfhTs39v6zaw==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-37.3.1.tgz", + "integrity": "sha512-9tkSHgt2NI28uFwcfwvcXNVVhhYQIyqk9du2AwwBdPpQUIK8GNjZvtgddZ3IdU1n9WmVqqb/Ne1l2aX+s2G0Aw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-brush-container": "37.1.2", - "victory-core": "37.1.2", - "victory-cursor-container": "37.1.2", - "victory-selection-container": "37.1.2", - "victory-voronoi-container": "37.1.2", - "victory-zoom-container": "37.1.2" + "victory-brush-container": "37.3.1", + "victory-core": "37.3.1", + "victory-cursor-container": "37.3.1", + "victory-selection-container": "37.3.1", + "victory-voronoi-container": "37.3.1", + "victory-zoom-container": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-cursor-container": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-37.1.2.tgz", - "integrity": "sha512-GqOVB/Emas/ODw7Sb7FX1FmUyH3jb5eNF+2sR+DdYfDMTFmjVUyqGkSpi1bIgHoSWTrdG9C2tkxA69gI9JDtLA==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-37.3.1.tgz", + "integrity": "sha512-PYJzGJL0tnNQrUHXHj0lP1TXYA5XUyNvfPMjUrII74BS2T6t85+gjc++s0pugpyc/NqyXwNaulJxPnjePwR1MA==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-errorbar": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-errorbar/-/victory-errorbar-37.1.2.tgz", - "integrity": "sha512-sgs1nla57Ctt9slG5WXWdxqTXtTdKcZM+u83C5j1ceKKmMjCiqiNYmMQpF7yz7Nj2ewJTrOzZON9h2zgurr2Cg==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-errorbar/-/victory-errorbar-37.3.1.tgz", + "integrity": "sha512-HDl530tRdFs9ZLZcLA6ur6lpvVaTxp17+YzlPblHhOJiEA8tMmJKYkiKNVKkbvkEmw/7CuycnEx8RyMVX2U++w==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-group": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-37.1.2.tgz", - "integrity": "sha512-Zwdvs6pSfF02xax8rQbahSqRP7eua4mS0so0gFYr/M2sNiKN4hxnM72j3dLo9nQ63kQpYhcUZe8U/hEjlhHxYQ==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-37.3.1.tgz", + "integrity": "sha512-jLAYAHtMwqLulGujirar9kIUZmxw1M1slM/5DBzDJLamTAb7OJaagDmcIiLdnC08ziV8v/MgGkgS6e3/qIe2iw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "37.1.2", - "victory-shared-events": "37.1.2" + "victory-core": "37.3.1", + "victory-shared-events": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-histogram": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-histogram/-/victory-histogram-37.1.2.tgz", - "integrity": "sha512-IGeQZ2HGuvmMyYxoKOczIILNH6ARDJaWcDG3h5BX4jP4JH2+eWeEukCVHGT3b1VM1OFxuvPijJrePXYzKgQ+AQ==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-histogram/-/victory-histogram-37.3.1.tgz", + "integrity": "sha512-7xbE/17mOJHeW9k7BrNtRm15HiUYT6wqjfQQuu49S2zWtJS7aodYbgAYJIHVCrCONzVwwdWI3hx4SX1vVBfDRw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-bar": "37.1.2", - "victory-core": "37.1.2", - "victory-vendor": "37.1.2" + "victory-bar": "37.3.1", + "victory-core": "37.3.1", + "victory-vendor": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-legend": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-37.1.2.tgz", - "integrity": "sha512-dmwwHtFpEXPIelY9iH1a2Q/V2Ji8DaF0a2g+hLH4SM/xbA9YwjP2/9DIQcwS7/OVl4l1AnSbLFcu5RyDPJ0kww==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-37.3.1.tgz", + "integrity": "sha512-R7mU4VXbT9toff9oVFfNErAxg6QziWbSiy4IzPYlqgOI+3OPOvBRi1Sbyizk28BcHVIq53iAT8YWwDXxdGwSzQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-line": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-37.1.2.tgz", - "integrity": "sha512-DjttWkQG0iZtQ9SM/KphN168dQUgw1xwyr0qR1aN12VtVb1jspI1LkBH8XqUeYXgfuI1vKQJWcV/zMOK2Q1n8g==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-37.3.1.tgz", + "integrity": "sha512-6FtKiWcCpo4rshOHyE31fO8nog9nRakujAIpdAJk/96621RqBiLQjP1jBhQmjbKCEQCTepHvLGLgx1jdUlb/9A==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2", - "victory-vendor": "37.1.2" + "victory-core": "37.3.1", + "victory-vendor": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-pie": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-37.1.2.tgz", - "integrity": "sha512-lwPMAtkcGDJ4gdpKFmR7hRnowJZIGQ6XIvyPj7Ir+QfL6ew64kl7YiIsQpDnC4zqwAjDPIbIW/kRROiSKRjXjQ==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-37.3.1.tgz", + "integrity": "sha512-Oc5lPvPbtzVqbLtjMEMiyIRbjwHXxAqIdfiVRkr9Sv36Q53rMr9a44CNuUcFeL8eR/794RKm8v5feieOPeGLaQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2", - "victory-vendor": "37.1.2" + "victory-core": "37.3.1", + "victory-vendor": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-polar-axis": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-37.1.2.tgz", - "integrity": "sha512-cvELVQ5MwDjDfC/n/g8QVfUhexLNKcp7kXxbjp6IGbzQMCfNtROHaVaHaISNH7/EV5zinwBhNj0+ISWatROtrQ==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-37.3.1.tgz", + "integrity": "sha512-Lxn911XYG2D+LX4ijhFGEXUEx5o2I1eOBlgOYmgvbRldgdCFkZGY6E6uwPbWhPnk2ZUMHVpZGXcZs/hvypC/bw==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-scatter": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-37.1.2.tgz", - "integrity": "sha512-6orfcqdfZCuTHqf/wE+B+sQbpzf2/TyEvLZhvYIXFr5GzdVu39psNl74K3GQ2Ky0db+e6oLEHV8nZYO2IvWoWg==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-37.3.1.tgz", + "integrity": "sha512-xALMB+Kufw0U9ePCNHaHNuFN0Ili+9kWy/6qjm9QKo92HiGkDQeNPWAFHFbyAErFmKkaAdVuEPx3FiU9Novb4A==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-selection-container": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-37.1.2.tgz", - "integrity": "sha512-1sp1CV9LrBADnsBcFgVQuYUNCLeANuybtOS9/5TvPPELBGWQQ55nBN3mH/laVPDy9gGyPARh1lmdPgREHmSkmQ==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-37.3.1.tgz", + "integrity": "sha512-flkh0QUbuKYSZ7t6mogKVaP3upXP5Ej9O1Dvpsn2h8CYzo933veAGVeBfOoguWieuGQbS7JbSkYjrzneXoQMyA==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-shared-events": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-37.1.2.tgz", - "integrity": "sha512-fpgpe6eI0A9dD39ZsFaid3sXdrCf1WIzFnpkNFT6hBYrDDD5Fd2/2SgqOxuul64PlYJAk6NOY+F1agmEtmB+/Q==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-37.3.1.tgz", + "integrity": "sha512-fmZZBZEw3jBYO1aD5enOljEN1cRVZBCFxMYhR5of1DGOFc2ZVhq/FK1Lhe3zd2dYGNC8IAP69kth1A+p+VZo0A==", "license": "MIT", "dependencies": { "json-stringify-safe": "^5.0.1", "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-stack": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-37.1.2.tgz", - "integrity": "sha512-H3FWiv3c6s/++PB3pBZ/9r8mcry1FHg8JK+03DZhRKHtJIti/38iIYUUiFOoQKmjVUQ7wrLdftYiemy3st77Dg==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-37.3.1.tgz", + "integrity": "sha512-VxTnIFhilG2Umg+JJXgeXEm6QbGgmXSYnAIsZT0ejp94IVsfl+f8IOrJHzUrytEeMK4t7JA/StaRlyfWShqthg==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "37.1.2", - "victory-shared-events": "37.1.2" + "victory-core": "37.3.1", + "victory-shared-events": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-tooltip": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-37.1.2.tgz", - "integrity": "sha512-j1r1t83X0epSwivhf4eYSD2DoWRVy5fkINbLk4sVnnV2EUT4Lt4yH3uelIhYQuT4Y+Ez9KFLoQvR6bfwmHyfZw==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-37.3.1.tgz", + "integrity": "sha512-C0wyyAj332XpZ5jloMCr8FEDHp6eD76vfwlif+ZcjLVhzNOxTnpjaW988wFNfJaZRgxXcq50TEJkHWvuBnHviQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-vendor": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.1.2.tgz", - "integrity": "sha512-kZ2UVcoINrisEW7JDaxws2v17D4n4ShRzsPUcYnF37/avByNbjzybhvs8JrqO6+vUmoP2W1DrTEI2L/86PEQjw==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.1.tgz", + "integrity": "sha512-ik/nlt3GgTGwyt29f2zd5Y68nNJnxtUJ2CulepE4nWTzbrbFkqhrNDTf3k+yb5ZUQBK1BLkyE79UWVNzTRCByw==", "license": "MIT AND ISC", "dependencies": { "@types/d3-array": "^3.0.3", @@ -20063,43 +20464,43 @@ } }, "node_modules/victory-voronoi": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-voronoi/-/victory-voronoi-37.1.2.tgz", - "integrity": "sha512-rbihVJMDLmrMKfm6mbzTft9BbaJWZkymFkYxZZT0ZdHjsyaFm7t3jjrtvG1cq6HsTI10AfCh7iWmD9aky69eMQ==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-voronoi/-/victory-voronoi-37.3.1.tgz", + "integrity": "sha512-bZnoCllSVVIWzewkF+BZXco/odAEX5CX7ty59FZVotzHx2q+VZpjbsjfSuRiSQ3DNHyeOdyB5tN+dsmS8teVMw==", "license": "MIT", "dependencies": { "d3-voronoi": "^1.1.4", "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-voronoi-container": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-37.1.2.tgz", - "integrity": "sha512-uFnZmRWp+QP7mH9jqetmoSR/KYhnFr4sFGR9+HrQkUbOzBQpT7Q2SNrDcr5l29Hm7Lb+3iUuF/l0E//EzuS+Ig==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-37.3.1.tgz", + "integrity": "sha512-QDA533raAk4VUvYnHNeYZY5adMcj9/zUaMFwcNkRoWH7WL8/bZR12as5hlOPLwDa3Wm0jxEYQfaqwRANaoWDyA==", "license": "MIT", "dependencies": { "delaunay-find": "0.0.6", "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "37.1.2", - "victory-tooltip": "37.1.2" + "victory-core": "37.3.1", + "victory-tooltip": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-zoom-container": { - "version": "37.1.2", - "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-37.1.2.tgz", - "integrity": "sha512-OI0AgskIpruWaFWF1BkJWi4UZGyEJ+ol3uzlIMk3tPmYkuw5Gh4pTW6kEw/0E1BP+PwJjv+IRGBbT46/YxV3UQ==", + "version": "37.3.1", + "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-37.3.1.tgz", + "integrity": "sha512-cVNSMe0q+ut8pLkJDXg31HBjnkJhehOhs7Z4x+fDM6LSESrJn2Zibp8Vn1g7fDs6kNCzqkXcpvmU3yUGFB8oWA==", "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "37.1.2" + "victory-core": "37.3.1" }, "peerDependencies": { "react": ">=16.6.0" @@ -20645,13 +21046,14 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, + "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -20660,8 +21062,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" diff --git a/package.json b/package.json index 7f6d75470..4566a5e2d 100644 --- a/package.json +++ b/package.json @@ -52,20 +52,20 @@ "verify": "npm-run-all build lint test" }, "dependencies": { - "@patternfly/patternfly": "5.4.1", - "@patternfly/react-charts": "7.4.3", - "@patternfly/react-component-groups": "^5.4.0", - "@patternfly/react-core": "5.4.1", + "@patternfly/patternfly": "5.4.2", + "@patternfly/react-charts": "7.4.5", + "@patternfly/react-component-groups": "5.5.3", + "@patternfly/react-core": "5.4.2", "@patternfly/react-icons": "5.4.0", - "@patternfly/react-table": "5.4.1", - "@patternfly/react-tokens": "5.4.0", - "@redhat-cloud-services/frontend-components": "^4.2.16", - "@redhat-cloud-services/frontend-components-notifications": "^4.1.0", - "@redhat-cloud-services/frontend-components-translations": "^3.2.8", - "@redhat-cloud-services/frontend-components-utilities": "^4.0.17", - "@redhat-cloud-services/rbac-client": "^2.2.5", + "@patternfly/react-table": "5.4.8", + "@patternfly/react-tokens": "5.4.1", + "@redhat-cloud-services/frontend-components": "^4.2.22", + "@redhat-cloud-services/frontend-components-notifications": "^4.1.1", + "@redhat-cloud-services/frontend-components-translations": "^3.2.9", + "@redhat-cloud-services/frontend-components-utilities": "^4.0.19", + "@redhat-cloud-services/rbac-client": "^2.2.8", "@reduxjs/toolkit": "^2.3.0", - "@unleash/proxy-client-react": "^4.3.1", + "@unleash/proxy-client-react": "^4.4.0", "axios": "^1.7.7", "date-fns": "^4.1.0", "js-file-download": "^0.4.12", @@ -73,51 +73,53 @@ "qs": "^6.13.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-intl": "6.8.0", + "react-intl": "6.8.6", "react-redux": "^9.1.2", "react-router-dom": "^6.27.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typesafe-actions": "^5.1.0", - "victory": "^37.1.2" + "victory": "^37.3.1" }, "devDependencies": { - "@eslint/compat": "^1.2.0", + "@eslint/compat": "^1.2.2", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "^9.12.0", - "@formatjs/ecma402-abstract": "^2.2.0", - "@formatjs/fast-memoize": "^2.2.1", - "@formatjs/intl-localematcher": "^0.5.5", + "@eslint/js": "^9.14.0", + "@formatjs/cli": "^6.3.7", + "@formatjs/ecma402-abstract": "^2.2.3", + "@formatjs/fast-memoize": "^2.2.3", + "@formatjs/icu-messageformat-parser": "^2.9.3", + "@formatjs/intl-localematcher": "^0.5.7", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "^2.0.4", - "@redhat-cloud-services/frontend-components-config": "^6.3.1", - "@redhat-cloud-services/tsc-transform-imports": "^1.0.16", - "@swc/core": "^1.7.26", - "@swc/jest": "^0.2.36", - "@testing-library/jest-dom": "^6.5.0", + "@redhat-cloud-services/frontend-components-config": "^6.3.3", + "@redhat-cloud-services/tsc-transform-imports": "^1.0.17", + "@swc/core": "^1.8.0", + "@swc/jest": "^0.2.37", + "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.0.1", "@testing-library/user-event": "^14.5.2", - "@types/jest": "^29.5.13", + "@types/jest": "^29.5.14", "@types/qs": "^6.9.16", - "@types/react": "^18.3.11", + "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@types/react-redux": "^7.1.34", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^8.9.0", - "@typescript-eslint/parser": "^8.9.0", + "@typescript-eslint/eslint-plugin": "^8.13.0", + "@typescript-eslint/parser": "^8.13.0", "copy-webpack-plugin": "^12.0.2", - "eslint": "^9.12.0", - "eslint-plugin-formatjs": "^5.1.0", + "eslint": "^9.14.0", + "eslint-plugin-formatjs": "^5.2.1", "eslint-plugin-jest-dom": "^5.4.0", - "eslint-plugin-jsdoc": "^50.4.1", + "eslint-plugin-jsdoc": "^50.4.3", "eslint-plugin-markdown": "^5.1.0", "eslint-plugin-patternfly-react": "^5.4.0", "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react": "^7.37.1", + "eslint-plugin-react": "^7.37.2", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-keys-fix": "^1.1.2", - "eslint-plugin-testing-library": "^6.3.0", + "eslint-plugin-testing-library": "^6.4.0", "git-revision-webpack-plugin": "^5.0.0", - "globals": "^15.11.0", + "globals": "^15.12.0", "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -126,14 +128,14 @@ "npm-run-all": "^4.1.5", "prettier": "^3.3.3", "rimraf": "^6.0.1", - "swc_mut_cjs_exports": "^0.99.0", + "swc_mut_cjs_exports": "^0.109.1", "ts-jest": "^29.2.5", "ts-patch": "^3.2.1", "typescript": "^5.6.3" }, "overrides": { - "@typescript-eslint/eslint-plugin": "^8.9.0", - "eslint": "^9.12.0", + "@typescript-eslint/eslint-plugin": "^8.13.0", + "eslint": "^9.14.0", "redux": "^5.0.1" }, "insights": { diff --git a/src/components/featureToggle/featureToggle.tsx b/src/components/featureToggle/featureToggle.tsx index ca7741019..043ab8762 100644 --- a/src/components/featureToggle/featureToggle.tsx +++ b/src/components/featureToggle/featureToggle.tsx @@ -15,6 +15,7 @@ export const enum FeatureToggle { finsights = 'cost-management.ui.finsights', // RHEL support for FINsights https://issues.redhat.com/browse/COST-3306 ibm = 'cost-management.ui.ibm', // IBM https://issues.redhat.com/browse/COST-935 ocpCloudGroupBys = 'cost-management.ui.ocp-cloud-group-bys', // https://issues.redhat.com/browse/COST-5514 + providerEmptyState = 'cost-management.ui.provider-empty-state', // https://issues.redhat.com/browse/COST-5613 } const useIsToggleEnabled = (toggle: FeatureToggle) => { @@ -62,6 +63,10 @@ export const useIsOcpCloudGroupBysToggleEnabled = () => { return useIsToggleEnabled(FeatureToggle.ocpCloudGroupBys); }; +export const useIsProviderEmptyStateToggleEnabled = () => { + return useIsToggleEnabled(FeatureToggle.providerEmptyState); +}; + // The FeatureToggle component saves feature toggles in store for places where Unleash hooks not available export const useFeatureToggle = () => { const dispatch = useDispatch(); @@ -77,6 +82,7 @@ export const useFeatureToggle = () => { const isFinsightsToggleEnabled = useIsFinsightsToggleEnabled(); const isIbmToggleEnabled = useIsIbmToggleEnabled(); const isOcpCloudGroupBysToggleEnabled = useIsOcpCloudGroupBysToggleEnabled(); + const isProviderEmptyStateToggleEnabled = useIsProviderEmptyStateToggleEnabled(); const fetchUser = callback => { auth.getUser().then(user => { @@ -98,6 +104,7 @@ export const useFeatureToggle = () => { isFinsightsToggleEnabled, isIbmToggleEnabled, isOcpCloudGroupBysToggleEnabled, + isProviderEmptyStateToggleEnabled, }) ); if (isDebugToggleEnabled) { @@ -115,6 +122,7 @@ export const useFeatureToggle = () => { isFinsightsToggleEnabled, isIbmToggleEnabled, isOcpCloudGroupBysToggleEnabled, + isProviderEmptyStateToggleEnabled, ]); }; diff --git a/src/locales/messages.ts b/src/locales/messages.ts index f42057b34..440fc03f6 100644 --- a/src/locales/messages.ts +++ b/src/locales/messages.ts @@ -405,6 +405,16 @@ export default defineMessages({ description: 'Clusters', id: 'clusters', }, + copied: { + defaultMessage: 'Copied', + description: 'Copied', + id: 'copied', + }, + copy: { + defaultMessage: 'Copy', + description: 'Copy', + id: 'copy', + }, cost: { defaultMessage: 'Cost', description: 'Cost', @@ -492,10 +502,15 @@ export default defineMessages({ id: 'costDistributionType', }, costManagement: { - defaultMessage: 'Cost Management', - description: 'Cost Management', + defaultMessage: 'Cost management', + description: 'Cost management', id: 'costManagement', }, + costManagementDocs: { + defaultMessage: 'Cost management documentation', + description: 'Cost management documentation', + id: 'costManagementDocs', + }, costModel: { defaultMessage: 'Cost Model:', description: 'Cost Model:', @@ -1080,6 +1095,7 @@ export default defineMessages({ defaultMessage: '{units, select, ' + 'AUD {AUD (A$) - Australian Dollar}' + + 'BRL {BRL (R$) - Brazilian Real}' + 'CAD {CAD (CA$) - Canadian Dollar}' + 'CHF {CHF (CHF) - Swiss Franc}' + 'CNY {CNY (CN¥) - Chinese Yuan}' + @@ -1087,6 +1103,7 @@ export default defineMessages({ 'EUR {EUR (€) - Euro}' + 'GBP {GBP (£) - British Pound}' + 'HKD {HKD (HK$) - Hong Kong Dollar}' + + 'INR {INR (₹) - Indian Rupee}' + 'JPY {JPY (¥) - Japanese Yen}' + 'NOK {NOK (NOK) - Norwegian Krone}' + 'NZD {NZD (NZ$) - New Zealand Dollar}' + @@ -1103,6 +1120,7 @@ export default defineMessages({ defaultMessage: '{units, select, ' + 'AUD {A$}' + + 'BRL {R$}' + 'CAD {CA$}' + 'CHF {CHF}' + 'CNY {CN¥}' + @@ -1110,6 +1128,7 @@ export default defineMessages({ 'EUR {€}' + 'GBP {£}' + 'HKD {HK$}' + + 'INR {₹}' + 'JPY {¥}' + 'NOK {NOK}' + 'NZD {NZ$}' + @@ -1522,6 +1541,12 @@ export default defineMessages({ description: 'Distribution type description', id: 'distributionTypeDesc', }, + docsAccomplish: { + defaultMessage: + 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/getting_started_with_cost_management/about-cost-management#what_can_you_accomplish_with_cost_management', + description: 'What can you accomplish with cost management?', + id: 'docsAccomplish', + }, docsAddOcpSources: { defaultMessage: 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_openshift_container_platform_data_into_cost_management', @@ -1534,6 +1559,11 @@ export default defineMessages({ description: 'Configuring Amazon Web Services cost categories in cost management', id: 'docsCostCategory', }, + docsCostManagement: { + defaultMessage: 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest', + description: 'Introduction to cost management', + id: 'docsCostManagement', + }, docsCostModelTerminology: { defaultMessage: 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/using_cost_models/index#cost-model-terminology', @@ -1564,12 +1594,64 @@ export default defineMessages({ description: 'Creating a cost model for an OpenShift Container Platform cluster', id: 'docsCostModelsOcp', }, + docsIntegrations: { + defaultMessage: + 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/#Setting%20up%20integrations', + description: 'Setting up integrations', + id: 'docsIntegrations', + }, + docsIntegrationsAws: { + defaultMessage: + 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_amazon_web_services_aws_data_into_cost_management/index', + description: 'Integrating Amazon Web Services (AWS) data into cost management', + id: 'docsIntegrationsAws', + }, + docsIntegrationsAzure: { + defaultMessage: + 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_microsoft_azure_data_into_cost_management/index', + description: 'Integrating Microsoft Azure data into cost management', + id: 'docsIntegrationsAzure', + }, + docsIntegrationsGcp: { + defaultMessage: + 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_google_cloud_data_into_cost_management/index', + description: 'Integrating Google Cloud data into cost management', + id: 'docsIntegrationsGcp', + }, + docsIntegrationsOci: { + defaultMessage: + 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_oracle_cloud_data_into_cost_management/index', + description: 'docsIntegrating Oracle Cloud data into cost management', + id: 'docsIntegrationsOci', + }, + docsKokuMetricsOperator: { + defaultMessage: 'https://github.com/project-koku/koku-metrics-operator', + description: 'Koku Metrics Operator', + id: 'docsKokuMetricsOperator', + }, + docsMetricsOperator: { + defaultMessage: + 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_openshift_container_platform_data_into_cost_management/assembly-adding-openshift-container-platform-int?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#installing-cost-operator_adding-an-ocp-int', + description: 'Installing the cost operator by using OperatorHub', + id: 'docsMetricsOperator', + }, + docsOcpCli: { + defaultMessage: + 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_openshift_container_platform_data_into_cost_management/assembly-adding-openshift-container-platform-int?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#installing-cost-operator-cli_adding-an-ocp-int', + description: 'Optional: Installing the cost management operator by using the CLI', + id: 'docsOcpCli', + }, docsPlatformProjects: { defaultMessage: 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/using_cost_models/assembly-using-cost-models#adding-openshift-projects', description: 'Adding OpenShift projects', id: 'docsPlatformProjects', }, + docsReleases: { + defaultMessage: 'https://github.com/project-koku/koku/releases', + description: 'Releases', + id: 'docsReleases', + }, docsTagMapping: { defaultMessage: 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/managing_cost_data_using_tagging', @@ -1582,12 +1664,23 @@ export default defineMessages({ description: 'Configuring tags and labels in cost management', id: 'docsTags', }, + docsTroubleshooting: { + defaultMessage: + 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/integrating_openshift_container_platform_data_into_cost_management/index?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#verifying-cost-operator_adding-an-ocp-int', + description: 'Troubleshooting issues with your Cost Management Operator', + id: 'docsTroubleshooting', + }, docsUsingCostModels: { defaultMessage: 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/using_cost_models', description: 'Using cost models', id: 'docsUsingCostModels', }, + documentation: { + defaultMessage: 'Documentation', + description: 'What can you accomplish with cost management?', + id: 'documentation', + }, download: { defaultMessage: 'Download', description: 'Download', @@ -1948,39 +2041,11 @@ export default defineMessages({ description: 'Export cannot be generated', id: 'exportsUnavailable', }, - filterByButtonAriaLabel: { - defaultMessage: - '{value, select, ' + - 'account {Filter button for account name} ' + - 'aws_category {Filter button for cost category name} ' + - 'cluster {Filter button for cluster name} ' + - 'gcp_project {Filter button for GCP project name} ' + - 'name {Filter button for name name} ' + - 'node {Filter button for node name} ' + - 'org_unit_id {Filter button for organizational unit name} ' + - 'payer_tenant_id {Filter button for account name} ' + - 'product_service {Filter button for service name} ' + - 'project {Filter button for project name} ' + - 'region {Filter button for region name} ' + - 'resource_location {Filter button for region name} ' + - 'service {Filter button for service name} ' + - 'service_name {Filter button for service_name name} ' + - 'subscription_guid {Filter button for account name} ' + - 'tag {Filter button for tag name} ' + - 'other {}}', - description: 'Filter button for "value" name', - id: 'filterByButtonAriaLabel', - }, filterByCostCategoryKeyAriaLabel: { defaultMessage: 'Cost category keys', description: 'Cost category keys', id: 'filterByCostCategoryKeyAriaLabel', }, - filterByCostCategoryValueAriaLabel: { - defaultMessage: 'Cost category values', - description: 'Cost category values', - id: 'filterByCostCategoryValueAriaLabel', - }, filterByCostCategoryValueButtonAriaLabel: { defaultMessage: 'Filter button for cost category value', description: 'Filter button for cost category value', @@ -2070,11 +2135,6 @@ export default defineMessages({ description: 'Tag values', id: 'filterByTagValueAriaLabel', }, - filterByTagValueButtonAriaLabel: { - defaultMessage: 'Filter button for tag value', - description: 'Filter button for tag value', - id: 'filterByTagValueButtonAriaLabel', - }, filterByValuePlaceholder: { defaultMessage: 'Filter by value', description: 'Filter by value', @@ -2397,6 +2457,11 @@ export default defineMessages({ description: 'Integrations status', id: 'integrationsStatus', }, + kokuMetricsOperator: { + defaultMessage: 'Koku metrics operator', + description: 'Koku metrics operator', + id: 'kokuMetricsOperator', + }, lastProcessed: { defaultMessage: 'Last processed', description: 'Last processed', @@ -2635,13 +2700,20 @@ export default defineMessages({ id: 'noExportsStateTitle', }, noInstancesDesc: { - defaultMessage: 'Add an Amazon EC2 instance to see a total cost breakdown of your spend by instances.', - description: 'Add an Amazon EC2 instance to see a total cost breakdown of your spend by instances.', + defaultMessage: + 'To view the cost of EC2 instances, label your resources with the following tag key and value pair in the AWS console.', + description: + 'To view the cost of EC2 instances, label your resources with the following tag key and value pair in the AWS console.', id: 'noInstancesDesc', }, + noInstancesMoreInfo: { + defaultMessage: 'For more information, {seeDocumentation}.', + description: 'For more information, see documentation.', + id: 'noInstancesMoreInfo', + }, noInstancesTitle: { - defaultMessage: 'No instances available', - description: 'No instances available', + defaultMessage: 'View cost of EC2 instances', + description: 'View cost of EC2 instances', id: 'noInstancesTitle', }, noMappedTags: { @@ -2661,6 +2733,104 @@ export default defineMessages({ description: 'Tags must be enabled to be mapped.', id: 'noMappedTagsWarning', }, + noProvidersCloudCost: { + defaultMessage: 'Include Cloud provider (AWS, GCP, Azure, OCI) cost', + description: 'Include Cloud provider (AWS, GCP, Azure, OCI) cost', + id: 'noProvidersCloudCost', + }, + noProvidersCloudCostDesc: { + defaultMessage: + 'If you want to do only cloud provider such as AWS, Google, Azure, or Oracle, you need to set up an integration in order to start using Cost Management service.', + description: + 'If you want to do only cloud provider such as AWS, Google, Azure, or Oracle, you need to set up an integration in order to start using Cost Management service.', + id: 'noProvidersCloudCostDesc', + }, + noProvidersCloudIntegration: { + defaultMessage: 'Set up a Cloud provider integration', + description: 'Set up a Cloud provider integration', + id: 'noProvidersCloudIntegration', + }, + noProvidersCloudIntegrationHelp: { + defaultMessage: 'If you need further help setting up Cloud provider in cost management', + description: 'If you need further help setting up Cloud provider in cost management', + id: 'noProvidersCloudIntegrationHelp', + }, + noProvidersCloudIntegrationHelpAws: { + defaultMessage: 'Integrating Amazon Web Services data into cost management', + description: 'Integrating Amazon Web Services data into cost management', + id: 'noProvidersCloudIntegrationHelpAws', + }, + noProvidersCloudIntegrationHelpAzure: { + defaultMessage: 'Integrating Microsoft Azure data into cost management', + description: 'Integrating Microsoft Azure data into cost management', + id: 'noProvidersCloudIntegrationHelpAzure', + }, + noProvidersCloudIntegrationHelpDesc: { + defaultMessage: + 'The process to set up an integration for each provider varies. To learn how to add your specific integration to cost management, see the following guides:', + description: + 'The process to set up an integration for each provider varies. To learn how to add your specific integration to cost management, see the following guides:', + id: 'noProvidersCloudIntegrationHelpDesc', + }, + noProvidersCloudIntegrationHelpGcp: { + defaultMessage: 'Integrating Google Cloud data into cost management', + description: 'Integrating Google Cloud data into cost management', + id: 'noProvidersCloudIntegrationHelpGcp', + }, + noProvidersCloudIntegrationHelpOci: { + defaultMessage: 'Integrating Oracle Cloud Infrastructure data into cost management', + description: 'Integrating Oracle Cloud Infrastructure data into cost management', + id: 'noProvidersCloudIntegrationHelpOci', + }, + noProvidersDesc: { + defaultMessage: + 'Helps you simplify the management of your resources and costs of {ocp}, as well as public clouds like {aws}, {gcp}, {oci}, and {azure}.', + description: + 'Helps you simplify the management of your resources and costs of {ocp}, as well as public clouds like {aws}, {gcp}, {oci}, and {azure}.', + id: 'noProvidersDesc', + }, + noProvidersGetStarted: { + defaultMessage: 'Get started with Cost management', + description: 'Get started with Cost management', + id: 'noProvidersGetStarted', + }, + noProvidersMetricsOperator: { + defaultMessage: 'Install Cost Management metric operator', + description: 'Install Cost Management metric operator', + id: 'noProvidersMetricsOperator', + }, + noProvidersOcpCli: { + defaultMessage: 'If you want to use {cli} to install the operator, follow {link}.', + description: 'If you want to use OpenShift CLI to install the operator, follow this documentation', + id: 'noProvidersOcpCli', + }, + noProvidersOcpCliLink: { + defaultMessage: 'this documentation', + description: 'this documentation', + id: 'noProvidersOcpCliLink', + }, + noProvidersOcpCost: { + defaultMessage: 'Include OpenShift cost', + description: 'Include OpenShift cost', + id: 'noProvidersOcpCost', + }, + noProvidersOcpCostDesc: { + defaultMessage: + 'Additionally to your OpenShift cluster set up, you need to set up Cost Management Metrics Operator in order to start using Cost Management service.', + description: + 'Additionally to your OpenShift cluster set up, you need to set up Cost Management Metrics Operator in order to start using Cost Management service.', + id: 'noProvidersOcpCostDesc', + }, + noProvidersRecommended: { + defaultMessage: 'Recommended content', + description: 'Recommended content', + id: 'noProvidersRecommended', + }, + noProvidersRecommendedAccomplish: { + defaultMessage: 'What can you accomplish with cost management?', + description: 'What can you accomplish with cost management?', + id: 'noProvidersRecommendedAccomplish', + }, noProvidersStateAwsDesc: { defaultMessage: 'Add an Amazon Web Services account to see a total cost breakdown of your spend by accounts, organizational units, services, regions, or tags.', @@ -2743,6 +2913,11 @@ export default defineMessages({ description: 'Track your spending!', id: 'noProvidersStateOverviewTitle', }, + noProvidersTroubleshooting: { + defaultMessage: 'Having problem seeing data? See Troubleshooting part of the documentation', + description: 'Having problem seeing data? See Troubleshooting part of the documentation', + id: 'noProvidersTroubleshooting', + }, noResultsFound: { defaultMessage: 'No results found', description: 'No results found', @@ -2833,6 +3008,16 @@ export default defineMessages({ description: 'Oracle Cloud Infrastructure Details', id: 'ociDetailsTitle', }, + ocp: { + defaultMessage: 'OpenShift Container Platform', + description: 'OpenShift Container Platform', + id: 'ocp', + }, + ocpCli: { + defaultMessage: 'OpenShift CLI', + description: 'OpenShift CLI', + id: 'ocpCli', + }, ocpCloudDashboardComputeTitle: { defaultMessage: 'Compute services usage', description: 'Compute services usage', @@ -3171,6 +3356,11 @@ export default defineMessages({ description: 'Rate must be a positive number', id: 'priceListPosNumberRate', }, + projectKoku: { + defaultMessage: 'Upstream project Koku', + description: 'Upstream project Koku', + id: 'projectKoku', + }, pvcTitle: { defaultMessage: 'Persistent Volume Claims', description: 'Persistent Volume Claims', @@ -3222,6 +3412,11 @@ export default defineMessages({ description: 'Red Hat status url for cloud services', id: 'redHatStatusUrl', }, + releaseNotes: { + defaultMessage: 'Release notes', + description: 'Release notes', + id: 'releaseNotes', + }, remove: { defaultMessage: 'Remove', description: 'Remove', @@ -3314,6 +3509,11 @@ export default defineMessages({ description: 'Save', id: 'save', }, + seeDocumentation: { + defaultMessage: 'see documentation', + description: 'see documentation', + id: 'seeDocumentation', + }, select: { defaultMessage: 'Select...', description: 'Select...', @@ -3584,6 +3784,11 @@ export default defineMessages({ description: 'Value', id: 'tagHeadingValue', }, + tagKey: { + defaultMessage: 'Tag key:', + description: 'Tag keys', + id: 'tagKey', + }, tagKeyChild: { defaultMessage: 'Child tag keys', description: 'Child tag keys', @@ -3758,6 +3963,11 @@ export default defineMessages({ description: 'Tag Names', id: 'tagNames', }, + tagValue: { + defaultMessage: 'Tag value:', + description: 'Tag value', + id: 'tagValue', + }, timeOfExport: { defaultMessage: 'Time of export', description: 'Time of export', @@ -3900,6 +4110,21 @@ export default defineMessages({ description: 'View all', id: 'viewAll', }, + viewDocumentation: { + defaultMessage: 'View documentation', + description: 'View documentation', + id: 'viewDocumentation', + }, + viewLearningResources: { + defaultMessage: 'View all OpenShift learning resources', + description: 'View all OpenShift learning resources', + id: 'viewLearningResources', + }, + viewReleaseNotes: { + defaultMessage: 'View release notes', + description: 'View release notes', + id: 'viewReleaseNotes', + }, volumeTitle: { defaultMessage: 'Volume', description: 'Volume', diff --git a/src/routes/components/currency/currency.tsx b/src/routes/components/currency/currency.tsx index 63213185c..de2c03655 100644 --- a/src/routes/components/currency/currency.tsx +++ b/src/routes/components/currency/currency.tsx @@ -39,6 +39,7 @@ export const currencyOptions: { value: string; }[] = [ { label: messages.currencyOptions, value: 'AUD' }, + { label: messages.currencyOptions, value: 'BRL' }, { label: messages.currencyOptions, value: 'CAD' }, { label: messages.currencyOptions, value: 'CHF' }, { label: messages.currencyOptions, value: 'CNY' }, @@ -46,6 +47,7 @@ export const currencyOptions: { { label: messages.currencyOptions, value: 'EUR' }, { label: messages.currencyOptions, value: 'GBP' }, { label: messages.currencyOptions, value: 'HKD' }, + { label: messages.currencyOptions, value: 'INR' }, { label: messages.currencyOptions, value: 'JPY' }, { label: messages.currencyOptions, value: 'NOK' }, { label: messages.currencyOptions, value: 'NZD' }, diff --git a/src/routes/components/dataToolbar/costCategoryValue.tsx b/src/routes/components/dataToolbar/costCategoryValue.tsx index 30602f1b0..f4485b47d 100644 --- a/src/routes/components/dataToolbar/costCategoryValue.tsx +++ b/src/routes/components/dataToolbar/costCategoryValue.tsx @@ -1,5 +1,4 @@ -import { Button, ButtonVariant, InputGroup, InputGroupItem, TextInput } from '@patternfly/react-core'; -import { SearchIcon } from '@patternfly/react-icons/dist/esm/icons/search-icon'; +import { SearchInput } from '@patternfly/react-core'; import type { Query } from 'api/queries/query'; import { getQuery, parseQuery } from 'api/queries/query'; import type { Resource, ResourcePathsType } from 'api/resources/resource'; @@ -131,31 +130,16 @@ class CostCategoryValueBase extends React.Component - - this.onCostCategoryValueChange(value)} - value={costCategoryKeyValue} - placeholder={intl.formatMessage(messages.filterByValuePlaceholder)} - onKeyDown={evt => onCostCategoryValueInput(evt)} - /> - - - - - + this.onCostCategoryValueChange(value)} + onClear={() => this.onCostCategoryValueChange('')} + onSearch={evt => onCostCategoryValueInput(evt)} + placeholder={intl.formatMessage(messages.filterByValuePlaceholder)} + value={costCategoryKeyValue} + /> ); } } diff --git a/src/routes/components/dataToolbar/tagValue.tsx b/src/routes/components/dataToolbar/tagValue.tsx index 4515deed7..7173a5e09 100644 --- a/src/routes/components/dataToolbar/tagValue.tsx +++ b/src/routes/components/dataToolbar/tagValue.tsx @@ -1,5 +1,4 @@ -import { Button, ButtonVariant, InputGroup, InputGroupItem, TextInput } from '@patternfly/react-core'; -import { SearchIcon } from '@patternfly/react-icons/dist/esm/icons/search-icon'; +import { SearchInput } from '@patternfly/react-core'; import type { Query } from 'api/queries/query'; import { getQuery, parseQuery } from 'api/queries/query'; import type { Tag, TagPathsType } from 'api/tags/tag'; @@ -131,31 +130,16 @@ class TagValueBase extends React.Component { ); } return ( - - - this.onTagValueChange(value)} - value={tagKeyValue} - placeholder={intl.formatMessage(messages.filterByValuePlaceholder)} - onKeyDown={evt => onTagValueInput(evt)} - /> - - - - - + this.onTagValueChange(value)} + onClear={() => this.onTagValueChange('')} + onSearch={evt => onTagValueInput(evt)} + placeholder={intl.formatMessage(messages.filterByValuePlaceholder)} + value={tagKeyValue} + /> ); } } diff --git a/src/routes/components/dataToolbar/utils/category.tsx b/src/routes/components/dataToolbar/utils/category.tsx index 6838155d4..f4fa420e0 100644 --- a/src/routes/components/dataToolbar/utils/category.tsx +++ b/src/routes/components/dataToolbar/utils/category.tsx @@ -1,15 +1,6 @@ import type { ToolbarChipGroup } from '@patternfly/react-core'; -import { - Button, - ButtonVariant, - InputGroup, - InputGroupItem, - TextInput, - ToolbarFilter, - ToolbarItem, -} from '@patternfly/react-core'; +import { SearchInput, ToolbarFilter, ToolbarItem } from '@patternfly/react-core'; import { FilterIcon } from '@patternfly/react-icons/dist/esm/icons/filter-icon'; -import { SearchIcon } from '@patternfly/react-icons/dist/esm/icons/search-icon'; import type { ResourcePathsType, ResourceType } from 'api/resources/resource'; import { isResourceTypeValid } from 'api/resources/resourceUtils'; import { intl } from 'components/i18n'; @@ -63,44 +54,28 @@ export const getCategoryInput = ({ key={categoryOption.key} showToolbarItem={currentCategory === categoryOption.key} > - - - {isResourceTypeValid(resourcePathsType, categoryOption.key as ResourceType) ? ( - onCategoryInputSelect(value, categoryOption.key)} - placeholder={intl.formatMessage(messages.filterByPlaceholder, { value: placeholderKey })} - resourceKey={categoryOption.resourceKey} - resourcePathsType={resourcePathsType} - resourceType={categoryOption.key as ResourceType} - /> - ) : ( - <> - onCategoryInputChange(value)} - value={categoryInput} - placeholder={intl.formatMessage(messages.filterByPlaceholder, { value: placeholderKey })} - onKeyDown={evt => onCategoryInput(evt, categoryOption.key)} - size={intl.formatMessage(messages.filterByPlaceholder, { value: placeholderKey }).length} - /> - - - )} - - + {isResourceTypeValid(resourcePathsType, categoryOption.key as ResourceType) ? ( + onCategoryInputSelect(value, categoryOption.key)} + placeholder={intl.formatMessage(messages.filterByPlaceholder, { value: placeholderKey })} + resourceKey={categoryOption.resourceKey} + resourcePathsType={resourcePathsType} + resourceType={categoryOption.key as ResourceType} + /> + ) : ( + onCategoryInputChange(value)} + onClear={() => onCategoryInputChange('')} + onSearch={evt => onCategoryInput(evt, categoryOption.key)} + placeholder={intl.formatMessage(messages.filterByPlaceholder, { value: placeholderKey })} + value={categoryInput} + /> + )} ); }; diff --git a/src/routes/components/dateRange/dateRange.tsx b/src/routes/components/dateRange/dateRange.tsx index 0c47c5905..a63f7c473 100644 --- a/src/routes/components/dateRange/dateRange.tsx +++ b/src/routes/components/dateRange/dateRange.tsx @@ -6,11 +6,13 @@ import { Dropdown, DropdownItem, DropdownList, MenuToggle } from '@patternfly/re import messages from 'locales/messages'; import React from 'react'; import { useIntl } from 'react-intl'; -import { getSinceDateRangeString } from 'utils/dates'; +import { DateRangeType, getDateRange } from 'routes/utils/dateRange'; interface DateRangeOwnProps { dateRangeType?: string; - isCurrentMonthData: boolean; + isCurrentMonthData?: boolean; + isDataAvailable?: boolean; + isPreviousMonthData?: boolean; isDisabled?: boolean; isExplorer?: boolean; onSelect(value: string); @@ -18,7 +20,14 @@ interface DateRangeOwnProps { type DateRangeProps = DateRangeOwnProps; -const DateRange: React.FC = ({ dateRangeType, isCurrentMonthData, isExplorer, onSelect }) => { +const DateRange: React.FC = ({ + dateRangeType, + isCurrentMonthData, + isDataAvailable, + isPreviousMonthData, + isExplorer, + onSelect, +}) => { const [isOpen, setIsOpen] = React.useState(false); const intl = useIntl(); @@ -30,18 +39,42 @@ const DateRange: React.FC = ({ dateRangeType, isCurrentMonthData const options: { isDisabled?: boolean; label: MessageDescriptor; - value: string; + value: DateRangeType; }[] = [ - { label: messages.explorerDateRange, value: 'current_month_to_date', isDisabled: isCurrentMonthData === false }, - { label: messages.explorerDateRange, value: 'previous_month' }, + { + label: messages.explorerDateRange, + value: DateRangeType.currentMonthToDate, + isDisabled: isDataAvailable === false || isCurrentMonthData === false, + }, + { + label: messages.explorerDateRange, + value: DateRangeType.previousMonth, + isDisabled: isDataAvailable === false || isPreviousMonthData === false, + }, ]; if (isExplorer) { options.push( - { label: messages.explorerDateRange, value: 'previous_month_to_date' }, - { label: messages.explorerDateRange, value: 'last_thirty_days' }, - { label: messages.explorerDateRange, value: 'last_sixty_days' }, - { label: messages.explorerDateRange, value: 'last_ninety_days' }, - { label: messages.explorerDateRange, value: 'custom' } + { + label: messages.explorerDateRange, + value: DateRangeType.previousMonthToDate, + isDisabled: isDataAvailable === false || (isCurrentMonthData === false && isPreviousMonthData === false), + }, + { + label: messages.explorerDateRange, + value: DateRangeType.lastThirtyDays, + isDisabled: isDataAvailable === false || (isCurrentMonthData === false && isPreviousMonthData === false), + }, + { + label: messages.explorerDateRange, + value: DateRangeType.lastSixtyDays, + isDisabled: isDataAvailable === false, + }, + { + label: messages.explorerDateRange, + value: DateRangeType.lastNinetyDays, + isDisabled: isDataAvailable === false, + }, + { label: messages.explorerDateRange, value: DateRangeType.custom, isDisabled: isDataAvailable === false } ); } return options; @@ -67,25 +100,30 @@ const DateRange: React.FC = ({ dateRangeType, isCurrentMonthData )} > - {getOptions().map((option, index) => ( - - {intl.formatMessage(option.label, { value: option.value })} - - ))} + {getOptions().map((option, index) => { + const { start_date, end_date } = getDateRange(option.value, false); + const dateRange = intl.formatDateTimeRange(start_date, end_date, { + day: 'numeric', + month: 'long', + }); + return ( + + {intl.formatMessage(option.label, { value: option.value })} + + ); + })} diff --git a/src/routes/components/icons/openShiftIcon/OpenShift-icon.svg b/src/routes/components/icons/openShiftIcon/OpenShift-icon.svg new file mode 100644 index 000000000..89fda126a --- /dev/null +++ b/src/routes/components/icons/openShiftIcon/OpenShift-icon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/src/routes/components/icons/openShiftIcon/index.ts b/src/routes/components/icons/openShiftIcon/index.ts new file mode 100644 index 000000000..609254e8a --- /dev/null +++ b/src/routes/components/icons/openShiftIcon/index.ts @@ -0,0 +1 @@ +export { default as OpenShiftIcon } from './openShiftIcon'; diff --git a/src/routes/components/icons/openShiftIcon/openShiftIcon.scss b/src/routes/components/icons/openShiftIcon/openShiftIcon.scss new file mode 100644 index 000000000..256162ac0 --- /dev/null +++ b/src/routes/components/icons/openShiftIcon/openShiftIcon.scss @@ -0,0 +1,5 @@ +@import url("~@patternfly/patternfly/base/patternfly-variables.css"); + +.openshift-icon { + height: 50px; +} diff --git a/src/routes/components/icons/openShiftIcon/openShiftIcon.tsx b/src/routes/components/icons/openShiftIcon/openShiftIcon.tsx new file mode 100644 index 000000000..36469ba6e --- /dev/null +++ b/src/routes/components/icons/openShiftIcon/openShiftIcon.tsx @@ -0,0 +1,25 @@ +import './openShiftIcon.scss'; + +import messages from 'locales/messages'; +import React from 'react'; +import type { WrappedComponentProps } from 'react-intl'; +import { injectIntl } from 'react-intl'; + +interface OpenShiftIconProps extends WrappedComponentProps { + className?: string; +} + +const icon = require('./OpenShift-icon.svg'); + +const OpenShiftIcon: React.FC = ({ className, intl }) => { + return ( + + ); +}; + +export default injectIntl(OpenShiftIcon); diff --git a/src/routes/components/page/noInstances/noInstances.styles.ts b/src/routes/components/page/noInstances/noInstances.styles.ts new file mode 100644 index 000000000..3990a0f51 --- /dev/null +++ b/src/routes/components/page/noInstances/noInstances.styles.ts @@ -0,0 +1,24 @@ +import global_spacer_lg from '@patternfly/react-tokens/dist/js/global_spacer_lg'; +import global_spacer_sm from '@patternfly/react-tokens/dist/js/global_spacer_sm'; +import global_spacer_xs from '@patternfly/react-tokens/dist/js/global_spacer_xs'; + +export const styles = { + clipboardContainer: { + textAlign: 'left', + }, + moreInfo: { + display: 'block', + }, + tagKey: { + marginTop: global_spacer_lg.var, + }, + tagKeyLabel: { + marginRight: global_spacer_sm.var, + }, + tagValue: { + marginTop: global_spacer_xs.var, + }, + tagValueLabel: { + marginRight: global_spacer_sm.var, + }, +} as { [className: string]: React.CSSProperties }; diff --git a/src/routes/components/page/noInstances/noInstancesState.tsx b/src/routes/components/page/noInstances/noInstancesState.tsx index 4a242d7b3..0e5d8bdde 100644 --- a/src/routes/components/page/noInstances/noInstancesState.tsx +++ b/src/routes/components/page/noInstances/noInstancesState.tsx @@ -1,16 +1,20 @@ import { + ClipboardCopy, EmptyState, EmptyStateBody, + EmptyStateFooter, EmptyStateHeader, EmptyStateIcon, EmptyStateVariant, } from '@patternfly/react-core'; -import { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon'; +import { TagIcon } from '@patternfly/react-icons/dist/esm/icons/tag-icon'; import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; import { injectIntl } from 'react-intl'; +import { styles } from './noInstances.styles'; + interface NoInstancesStateOwnProps { // TBD... } @@ -25,10 +29,49 @@ class NoInstancesStateBase extends React.Component { } + icon={} headingLevel="h1" /> - {intl.formatMessage(messages.noInstancesDesc)} + +
{intl.formatMessage(messages.noInstancesDesc)}
+
+
+ {intl.formatMessage(messages.tagKey)} + + com_redhat_insights_cost_management + +
+
+ {intl.formatMessage(messages.tagValue)} + + ec2_compute + +
+
+
+ +
+ {intl.formatMessage(messages.noInstancesMoreInfo, { + seeDocumentation: ( + + {intl.formatMessage(messages.seeDocumentation)} + + ), + })} +
+
); } diff --git a/src/routes/components/page/noProviders/noProviders.styles.ts b/src/routes/components/page/noProviders/noProviders.styles.ts new file mode 100644 index 000000000..8bf0638d2 --- /dev/null +++ b/src/routes/components/page/noProviders/noProviders.styles.ts @@ -0,0 +1,65 @@ +import { chart_color_blue_300 } from '@patternfly/react-tokens/dist/js/chart_color_blue_300'; +import { global_palette_blue_50 } from '@patternfly/react-tokens/dist/js/global_palette_blue_50'; +import global_spacer_lg from '@patternfly/react-tokens/dist/js/global_spacer_lg'; +import global_spacer_md from '@patternfly/react-tokens/dist/js/global_spacer_md'; +import global_spacer_sm from '@patternfly/react-tokens/dist/js/global_spacer_sm'; +import type React from 'react'; + +export const styles = { + card: { + minHeight: '240px', + }, + cardBodyItem: { + marginTop: global_spacer_md.var, + }, + cardTitle: { + display: 'flex', + verticalAlign: 'middle', + }, + cardTitleIcon: { + color: chart_color_blue_300.var, + marginRight: global_spacer_sm.var, + }, + divider: { + marginLeft: global_spacer_lg.var, + marginRight: global_spacer_lg.var, + }, + getStarted: { + marginBottom: global_spacer_md.var, + }, + header: { + display: 'flex', + }, + headerDesc: { + marginTop: global_spacer_md.var, + }, + headerLink: { + marginLeft: '-16px', + marginTop: global_spacer_sm.var, + }, + recommended: { + marginTop: global_spacer_md.var, + }, + recommendedCol1: { + paddingTop: '15px', + }, + recommendedCol2: { + paddingTop: '10px', + }, + recommendedCol3: { + textAlign: 'right', + marginRight: '-20px', + }, + resources: { + marginLeft: '-15px', + marginTop: global_spacer_sm.var, + }, + troubleshooting: { + backgroundColor: global_palette_blue_50.var, + marginTop: global_spacer_lg.var, + }, + troubleshootingDesc: { + display: 'flex', + justifyContent: 'space-between', + }, +} as { [className: string]: React.CSSProperties }; diff --git a/src/routes/components/page/noProviders/noProviders.tsx b/src/routes/components/page/noProviders/noProviders.tsx index 3aea1200e..eb21d4c68 100644 --- a/src/routes/components/page/noProviders/noProviders.tsx +++ b/src/routes/components/page/noProviders/noProviders.tsx @@ -1,27 +1,310 @@ -import { PageSection } from '@patternfly/react-core'; +import { + Button, + Card, + CardBody, + CardTitle, + DataList, + DataListCell, + DataListItem, + DataListItemCells, + DataListItemRow, + Divider, + ExpandableSection, + Grid, + GridItem, + Icon, + Label, + List, + ListItem, + PageSection, + Stack, + StackItem, + Title, + TitleSizes, +} from '@patternfly/react-core'; +import { AddCircleOIcon } from '@patternfly/react-icons/dist/esm/icons/add-circle-o-icon'; +import { ExternalLinkAltIcon } from '@patternfly/react-icons/dist/esm/icons/external-link-alt-icon'; import { PageHeader, PageHeaderTitle } from '@redhat-cloud-services/frontend-components/PageHeader'; -import type { ProviderType } from 'api/providers'; +import messages from 'locales/messages'; import React from 'react'; +import { useIntl } from 'react-intl'; +import { OpenShiftIcon } from 'routes/components/icons/openShiftIcon'; +import { getReleasePath } from 'utils/paths'; -import { NoProvidersState } from './noProvidersState'; +import { styles } from './noProviders.styles'; -interface NoProvidersOwnProps { - providerType?: ProviderType; - title?: string; -} +const NoProviders = () => { + const intl = useIntl(); -type NoProvidersProps = NoProvidersOwnProps; + const getCloudCard = () => { + return ( + + +
+ + + + {intl.formatMessage(messages.noProvidersCloudCost)} +
+
+ + {intl.formatMessage(messages.noProvidersCloudCostDesc)} +
+ +
+ +
+
+ ); + }; + + const getHeaderTitle = () => { + return ( +
+ +
+ {intl.formatMessage(messages.noProvidersDesc, { + ocp: {intl.formatMessage(messages.ocp)}, + aws: {intl.formatMessage(messages.aws)}, + gcp: {intl.formatMessage(messages.gcp)}, + oci: {intl.formatMessage(messages.oci)}, + azure: {intl.formatMessage(messages.azure)}, + })} +
+
+ +
+
+ ); + }; + + const getLearningResources = () => { + const release = getReleasePath(); + + return ( + + ); + }; + + const getOcpCard = () => { + return ( + + +
+ + + + {intl.formatMessage(messages.noProvidersOcpCost)} +
+
+ + {intl.formatMessage(messages.noProvidersOcpCostDesc)} +
+ +
+
+ {intl.formatMessage(messages.noProvidersOcpCli, { + cli: {intl.formatMessage(messages.ocpCli)}, + link: ( + + {intl.formatMessage(messages.noProvidersOcpCliLink)} + + ), + })} +
+
+
+ ); + }; + + const getRecommended = () => { + return ( + + + + + {intl.formatMessage(messages.noProvidersRecommendedAccomplish)} + , + + + , + + + , + ]} + /> + + + + + + {intl.formatMessage(messages.projectKoku)} + , + , + + + , + ]} + /> + + + + + + {intl.formatMessage(messages.releaseNotes)} + , + + + , + + + , + ]} + /> + + + + ); + }; + + const getTroubleshooting = () => { + return ( + + + {intl.formatMessage(messages.noProvidersTroubleshooting)} + + {intl.formatMessage(messages.learnMore)} + + + + ); + }; -const NoProviders = ({ providerType, title }: NoProvidersProps) => { return ( <> - {title && ( - - - - )} + +
+ + + {getHeaderTitle()} +
+
- + + + + {intl.formatMessage(messages.noProvidersGetStarted)} + + + + + + {getOcpCard()} + + + {getCloudCard()} + + + + {getTroubleshooting()} + + + {intl.formatMessage(messages.noProvidersRecommended)} + + + {getRecommended()} + {getLearningResources()} + ); diff --git a/src/routes/components/page/noProvidersOld/index.ts b/src/routes/components/page/noProvidersOld/index.ts new file mode 100644 index 000000000..bc01af166 --- /dev/null +++ b/src/routes/components/page/noProvidersOld/index.ts @@ -0,0 +1 @@ +export { default as NoProvidersOld } from './noProviders'; diff --git a/src/routes/components/page/noProvidersOld/noProviders.tsx b/src/routes/components/page/noProvidersOld/noProviders.tsx new file mode 100644 index 000000000..3aea1200e --- /dev/null +++ b/src/routes/components/page/noProvidersOld/noProviders.tsx @@ -0,0 +1,30 @@ +import { PageSection } from '@patternfly/react-core'; +import { PageHeader, PageHeaderTitle } from '@redhat-cloud-services/frontend-components/PageHeader'; +import type { ProviderType } from 'api/providers'; +import React from 'react'; + +import { NoProvidersState } from './noProvidersState'; + +interface NoProvidersOwnProps { + providerType?: ProviderType; + title?: string; +} + +type NoProvidersProps = NoProvidersOwnProps; + +const NoProviders = ({ providerType, title }: NoProvidersProps) => { + return ( + <> + {title && ( + + + + )} + + + + + ); +}; + +export default NoProviders; diff --git a/src/routes/components/page/noProviders/noProvidersState.styles.ts b/src/routes/components/page/noProvidersOld/noProvidersState.styles.ts similarity index 100% rename from src/routes/components/page/noProviders/noProvidersState.styles.ts rename to src/routes/components/page/noProvidersOld/noProvidersState.styles.ts diff --git a/src/routes/components/page/noProviders/noProvidersState.tsx b/src/routes/components/page/noProvidersOld/noProvidersState.tsx similarity index 100% rename from src/routes/components/page/noProviders/noProvidersState.tsx rename to src/routes/components/page/noProvidersOld/noProvidersState.tsx diff --git a/src/routes/details/awsBreakdown/awsBreakdown.tsx b/src/routes/details/awsBreakdown/awsBreakdown.tsx index 983283e4f..807773fe2 100644 --- a/src/routes/details/awsBreakdown/awsBreakdown.tsx +++ b/src/routes/details/awsBreakdown/awsBreakdown.tsx @@ -128,6 +128,7 @@ const mapStateToProps = createMapStateToProps ) : undefined, isAwsEc2InstancesToggleEnabled: FeatureToggleSelectors.selectIsAwsEc2InstancesToggleEnabled(state), + isProviderEmptyStateToggleEnabled: FeatureToggleSelectors.selectIsProviderEmptyStateToggleEnabled(state), providers: filterProviders(providers, ProviderType.aws), providersError, providersFetchStatus, diff --git a/src/routes/details/awsBreakdown/instances/instances.tsx b/src/routes/details/awsBreakdown/instances/instances.tsx index 73aeb6d73..322126417 100644 --- a/src/routes/details/awsBreakdown/instances/instances.tsx +++ b/src/routes/details/awsBreakdown/instances/instances.tsx @@ -45,6 +45,7 @@ export interface InstancesStateProps { reportError: AxiosError; reportFetchStatus: FetchStatus; reportQueryString: string; + timeScopeValue?: number; } export interface InstancesMapProps { @@ -92,12 +93,20 @@ const Instances: React.FC = ({ costType, currency }) => { const [selectedItems, setSelectedItems] = useState([]); const [query, setQuery] = useState({ ...baseQuery }); - const { hasAccountFilter, hasRegionFilter, hasTagFilter, report, reportError, reportFetchStatus, reportQueryString } = - useMapToProps({ - costType, - currency, - query, - }); + const { + hasAccountFilter, + hasRegionFilter, + hasTagFilter, + report, + reportError, + reportFetchStatus, + reportQueryString, + timeScopeValue, + } = useMapToProps({ + costType, + currency, + query, + }); const getColumnManagementModal = () => { const options = cloneDeep(defaultColumnOptions); @@ -218,6 +227,7 @@ const Instances: React.FC = ({ costType, currency }) => { pagination={getPagination(isDisabled)} query={query} selectedItems={selectedItems} + timeScopeValue={timeScopeValue} /> ); }; @@ -303,7 +313,7 @@ const Instances: React.FC = ({ costType, currency }) => { const itemsTotal = report?.meta ? report.meta.count : 0; const isDisabled = itemsTotal === 0; - const hasInstances = report?.meta && report.meta.count > 0; + const hasInstances = report?.meta?.count > 0; if (reportError) { return ; @@ -311,6 +321,7 @@ const Instances: React.FC = ({ costType, currency }) => { if (!query.filter_by && !hasInstances && reportFetchStatus === FetchStatus.complete) { return ; } + const computedItems = getComputedItems(); return ( @@ -387,6 +398,7 @@ const useMapToProps = ({ costType, currency, query }): InstancesStateProps => { reportError, reportFetchStatus, reportQueryString, + timeScopeValue, }; }; diff --git a/src/routes/details/awsBreakdown/instances/instancesToolbar.tsx b/src/routes/details/awsBreakdown/instances/instancesToolbar.tsx index 2903c3e3b..b4d4fb2b0 100644 --- a/src/routes/details/awsBreakdown/instances/instancesToolbar.tsx +++ b/src/routes/details/awsBreakdown/instances/instancesToolbar.tsx @@ -13,11 +13,9 @@ import { DataToolbar } from 'routes/components/dataToolbar'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { isEqual } from 'routes/utils/equal'; import type { Filter } from 'routes/utils/filter'; -import { getTimeScopeValue } from 'routes/utils/timeScope'; import type { FetchStatus } from 'store/common'; import { createMapStateToProps } from 'store/common'; import { tagActions, tagSelectors } from 'store/tags'; -import { useQueryState } from 'utils/hooks'; import { accountKey, regionKey, tagKey } from 'utils/props'; interface InstancesToolbarOwnProps { @@ -39,6 +37,7 @@ interface InstancesToolbarOwnProps { pagination?: React.ReactNode; query?: AwsQuery; selectedItems?: ComputedReportItem[]; + timeScopeValue?: number; } interface InstancesToolbarStateProps { @@ -187,35 +186,33 @@ export class InstancesToolbarBase extends React.Component((state, props) => { - const queryState = useQueryState('details'); - const timeScopeValue = getTimeScopeValue(queryState); - - // Note: Omitting key_only would help to share a single, cached request. Only the toolbar requires key values; - // however, for better server-side performance, we chose to use key_only here. - const baseQuery = { - filter: { - resolution: 'monthly', - time_scope_units: 'month', - time_scope_value: timeScopeValue !== undefined ? timeScopeValue : -1, - }, - key_only: true, - limit: 1000, - }; +const mapStateToProps = createMapStateToProps( + (state, { timeScopeValue }) => { + // Note: Omitting key_only would help to share a single, cached request. Only the toolbar requires key values; + // however, for better server-side performance, we chose to use key_only here. + const baseQuery = { + filter: { + resolution: 'monthly', + time_scope_units: 'month', + time_scope_value: timeScopeValue !== undefined ? timeScopeValue : -1, + }, + key_only: true, + limit: 1000, + }; - const tagQueryString = getQuery({ - ...baseQuery, - }); - const tagReport = tagSelectors.selectTag(state, tagPathsType, tagType, tagQueryString); - const tagReportFetchStatus = tagSelectors.selectTagFetchStatus(state, tagPathsType, tagType, tagQueryString); + const tagQueryString = getQuery({ + ...baseQuery, + }); + const tagReport = tagSelectors.selectTag(state, tagPathsType, tagType, tagQueryString); + const tagReportFetchStatus = tagSelectors.selectTagFetchStatus(state, tagPathsType, tagType, tagQueryString); - return { - tagReport, - tagReportFetchStatus, - tagQueryString, - }; -}); + return { + tagReport, + tagReportFetchStatus, + tagQueryString, + }; + } +); const mapDispatchToProps: InstancesToolbarDispatchProps = { fetchTag: tagActions.fetchTag, diff --git a/src/routes/details/awsDetails/awsDetails.tsx b/src/routes/details/awsDetails/awsDetails.tsx index 72dca13cb..f67d3af64 100644 --- a/src/routes/details/awsDetails/awsDetails.tsx +++ b/src/routes/details/awsDetails/awsDetails.tsx @@ -19,6 +19,7 @@ import { ExportModal } from 'routes/components/export'; import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; +import { NoProvidersOld } from 'routes/components/page/noProvidersOld'; import { NotAvailable } from 'routes/components/page/notAvailable'; import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedAwsReportItems'; @@ -60,6 +61,7 @@ interface AwsDetailsStateProps { isCurrentMonthData?: boolean; isDetailsDateRangeToggleEnabled?: boolean; isPreviousMonthData?: boolean; + isProviderEmptyStateToggleEnabled?: boolean; providers: Providers; providersError: AxiosError; providersFetchStatus: FetchStatus; @@ -373,6 +375,7 @@ class AwsDetails extends React.Component { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isPreviousMonthData, + isProviderEmptyStateToggleEnabled, providers, providersFetchStatus, query, @@ -398,7 +401,11 @@ class AwsDetails extends React.Component { const noProviders = providers && providers.meta && providers.meta.count === 0; if (noProviders) { - return ; + return isProviderEmptyStateToggleEnabled ? ( + + ) : ( + + ); } if (isDetailsDateRangeToggleEnabled ? !isCurrentMonthData && !isPreviousMonthData : !isCurrentMonthData) { return ( @@ -419,6 +426,7 @@ class AwsDetails extends React.Component { currency={currency} groupBy={groupById} isCurrentMonthData={isCurrentMonthData} + isPreviousMonthData={isPreviousMonthData} onCostTypeSelect={() => handleOnCostTypeSelect(query, router)} onCurrencySelect={() => handleOnCurrencySelect(query, router)} onGroupBySelect={this.handleOnGroupBySelect} @@ -528,6 +536,7 @@ const mapStateToProps = createMapStateToProps { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isExportsToggleEnabled, + isPreviousMonthData, onCurrencySelect, onGroupBySelect, providers, @@ -177,6 +179,7 @@ class DetailsHeaderBase extends React.Component { dateRangeType={currentDateRangeType} isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} + isPreviousMonthData={isPreviousMonthData} onSelect={this.handleOnDateRangeSelected} /> diff --git a/src/routes/details/azureBreakdown/azureBreakdown.tsx b/src/routes/details/azureBreakdown/azureBreakdown.tsx index 3ad1ad55c..b7cbf91be 100644 --- a/src/routes/details/azureBreakdown/azureBreakdown.tsx +++ b/src/routes/details/azureBreakdown/azureBreakdown.tsx @@ -17,6 +17,7 @@ import { filterProviders } from 'routes/utils/providers'; import { getQueryState } from 'routes/utils/queryState'; import { getTimeScopeValue } from 'routes/utils/timeScope'; import { createMapStateToProps } from 'store/common'; +import { FeatureToggleSelectors } from 'store/featureToggle'; import { providersQuery, providersSelectors } from 'store/providers'; import { reportActions, reportSelectors } from 'store/reports'; import { formatPath } from 'utils/paths'; @@ -101,6 +102,7 @@ const mapStateToProps = createMapStateToProps, + isProviderEmptyStateToggleEnabled: FeatureToggleSelectors.selectIsProviderEmptyStateToggleEnabled(state), providers: filterProviders(providers, ProviderType.azure), providersError, providersFetchStatus, diff --git a/src/routes/details/azureDetails/azureDetails.tsx b/src/routes/details/azureDetails/azureDetails.tsx index 10105c4c4..fc75c96b8 100644 --- a/src/routes/details/azureDetails/azureDetails.tsx +++ b/src/routes/details/azureDetails/azureDetails.tsx @@ -17,6 +17,7 @@ import { ExportModal } from 'routes/components/export'; import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; +import { NoProvidersOld } from 'routes/components/page/noProvidersOld'; import { NotAvailable } from 'routes/components/page/notAvailable'; import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedAzureReportItems'; @@ -56,6 +57,7 @@ interface AzureDetailsStateProps { isCurrentMonthData?: boolean; isDetailsDateRangeToggleEnabled?: boolean; isPreviousMonthData?: boolean; + isProviderEmptyStateToggleEnabled?: boolean; providers: Providers; providersError: AxiosError; providersFetchStatus: FetchStatus; @@ -331,6 +333,7 @@ class AzureDetails extends React.Component isCurrentMonthData, isDetailsDateRangeToggleEnabled, isPreviousMonthData, + isProviderEmptyStateToggleEnabled, providers, providersFetchStatus, query, @@ -356,7 +359,11 @@ class AzureDetails extends React.Component const noProviders = providers && providers.meta && providers.meta.count === 0; if (noProviders) { - return ; + return isProviderEmptyStateToggleEnabled ? ( + + ) : ( + + ); } if (isDetailsDateRangeToggleEnabled ? !isCurrentMonthData && !isPreviousMonthData : !isCurrentMonthData) { return ( @@ -376,6 +383,7 @@ class AzureDetails extends React.Component currency={currency} groupBy={groupById} isCurrentMonthData={isCurrentMonthData} + isPreviousMonthData={isPreviousMonthData} onCurrencySelect={() => handleOnCurrencySelect(query, router)} onGroupBySelect={this.handleOnGroupBySelect} query={query} @@ -472,6 +480,7 @@ const mapStateToProps = createMapStateToProps { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isExportsToggleEnabled, + isPreviousMonthData, onCurrencySelect, onGroupBySelect, providers, @@ -154,6 +156,7 @@ class DetailsHeaderBase extends React.Component { dateRangeType={currentDateRangeType} isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} + isPreviousMonthData={isPreviousMonthData} onSelect={this.handleOnDateRangeSelected} /> diff --git a/src/routes/details/components/breakdown/breakdownBase.tsx b/src/routes/details/components/breakdown/breakdownBase.tsx index 7b488e1db..230e25927 100644 --- a/src/routes/details/components/breakdown/breakdownBase.tsx +++ b/src/routes/details/components/breakdown/breakdownBase.tsx @@ -14,6 +14,7 @@ import { injectIntl } from 'react-intl'; import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; +import { NoProvidersOld } from 'routes/components/page/noProvidersOld'; import { NotAvailable } from 'routes/components/page/notAvailable'; import { hasCurrentMonthData, hasPreviousMonthData } from 'routes/utils/providers'; import { @@ -72,6 +73,7 @@ export interface BreakdownStateProps { isAwsEc2InstancesToggleEnabled?: boolean; isDetailsDateRangeToggleEnabled?: boolean; isOptimizationsTab?: boolean; + isProviderEmptyStateToggleEnabled?: boolean; optimizationsBadgeComponent?: React.ReactNode; optimizationsComponent?: React.ReactNode; providers?: Providers; @@ -292,6 +294,7 @@ class BreakdownBase extends React.Component { emptyStateTitle, groupBy, isDetailsDateRangeToggleEnabled, + isProviderEmptyStateToggleEnabled, optimizationsComponent, providers, providersFetchStatus, @@ -322,7 +325,11 @@ class BreakdownBase extends React.Component { providers && providers.meta && providers.meta.count === 0 && providersFetchStatus === FetchStatus.complete; if (noProviders) { - return ; + return isProviderEmptyStateToggleEnabled ? ( + + ) : ( + + ); } if ( isDetailsDateRangeToggleEnabled diff --git a/src/routes/details/components/breakdown/breakdownHeader.tsx b/src/routes/details/components/breakdown/breakdownHeader.tsx index 541505091..bb8be8b29 100644 --- a/src/routes/details/components/breakdown/breakdownHeader.tsx +++ b/src/routes/details/components/breakdown/breakdownHeader.tsx @@ -302,7 +302,7 @@ class BreakdownHeader extends React.Component { -
+
{tabs}
{showTags && }
diff --git a/src/routes/details/gcpBreakdown/gcpBreakdown.tsx b/src/routes/details/gcpBreakdown/gcpBreakdown.tsx index e5bba0acf..3cac7f94f 100644 --- a/src/routes/details/gcpBreakdown/gcpBreakdown.tsx +++ b/src/routes/details/gcpBreakdown/gcpBreakdown.tsx @@ -101,6 +101,7 @@ const mapStateToProps = createMapStateToProps, isDetailsDateRangeToggleEnabled: FeatureToggleSelectors.selectIsDetailsDateRangeToggleEnabled(state), + isProviderEmptyStateToggleEnabled: FeatureToggleSelectors.selectIsProviderEmptyStateToggleEnabled(state), providers: filterProviders(providers, ProviderType.gcp), providersError, providersFetchStatus, diff --git a/src/routes/details/gcpDetails/detailsHeader.tsx b/src/routes/details/gcpDetails/detailsHeader.tsx index 8c5056494..33ce28827 100644 --- a/src/routes/details/gcpDetails/detailsHeader.tsx +++ b/src/routes/details/gcpDetails/detailsHeader.tsx @@ -36,6 +36,7 @@ interface DetailsHeaderOwnProps { currency?: string; groupBy?: string; isCurrentMonthData?: boolean; + isPreviousMonthData?: boolean; onCurrencySelect(value: string); onGroupBySelect(value: string); query?: Query; @@ -103,6 +104,7 @@ class DetailsHeaderBase extends React.Component { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isExportsToggleEnabled, + isPreviousMonthData, onCurrencySelect, onGroupBySelect, providers, @@ -155,6 +157,7 @@ class DetailsHeaderBase extends React.Component { dateRangeType={currentDateRangeType} isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} + isPreviousMonthData={isPreviousMonthData} onSelect={this.handleOnDateRangeSelected} /> diff --git a/src/routes/details/gcpDetails/gcpDetails.tsx b/src/routes/details/gcpDetails/gcpDetails.tsx index 47d558765..bce977329 100644 --- a/src/routes/details/gcpDetails/gcpDetails.tsx +++ b/src/routes/details/gcpDetails/gcpDetails.tsx @@ -17,6 +17,7 @@ import { ExportModal } from 'routes/components/export'; import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; +import { NoProvidersOld } from 'routes/components/page/noProvidersOld'; import { NotAvailable } from 'routes/components/page/notAvailable'; import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedGcpReportItems'; @@ -56,6 +57,7 @@ interface GcpDetailsStateProps { isCurrentMonthData?: boolean; isDetailsDateRangeToggleEnabled?: boolean; isPreviousMonthData?: boolean; + isProviderEmptyStateToggleEnabled?: boolean; providers: Providers; providersError: AxiosError; providersFetchStatus: FetchStatus; @@ -331,6 +333,7 @@ class GcpDetails extends React.Component { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isPreviousMonthData, + isProviderEmptyStateToggleEnabled, providers, providersFetchStatus, query, @@ -356,7 +359,11 @@ class GcpDetails extends React.Component { const noProviders = providers && providers.meta && providers.meta.count === 0; if (noProviders) { - return ; + return isProviderEmptyStateToggleEnabled ? ( + + ) : ( + + ); } if (isDetailsDateRangeToggleEnabled ? !isCurrentMonthData && !isPreviousMonthData : !isCurrentMonthData) { return ( @@ -376,6 +383,7 @@ class GcpDetails extends React.Component { currency={currency} groupBy={groupById} isCurrentMonthData={isCurrentMonthData} + isPreviousMonthData={isPreviousMonthData} onCurrencySelect={() => handleOnCurrencySelect(query, router)} onGroupBySelect={this.handleOnGroupBySelect} query={query} @@ -473,6 +481,7 @@ const mapStateToProps = createMapStateToProps, + isProviderEmptyStateToggleEnabled: FeatureToggleSelectors.selectIsProviderEmptyStateToggleEnabled(state), providers: filterProviders(providers, ProviderType.ibm), providersError, providersFetchStatus, diff --git a/src/routes/details/ibmDetails/detailsHeader.tsx b/src/routes/details/ibmDetails/detailsHeader.tsx index ebb4b2f8f..68ed915cb 100644 --- a/src/routes/details/ibmDetails/detailsHeader.tsx +++ b/src/routes/details/ibmDetails/detailsHeader.tsx @@ -36,6 +36,7 @@ interface DetailsHeaderOwnProps { currency?: string; groupBy?: string; isCurrentMonthData?: boolean; + isPreviousMonthData?: boolean; onCurrencySelect(value: string); onGroupBySelect(value: string); query?: Query; @@ -103,6 +104,7 @@ class DetailsHeaderBase extends React.Component { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isExportsToggleEnabled, + isPreviousMonthData, onCurrencySelect, onGroupBySelect, providers, @@ -155,6 +157,7 @@ class DetailsHeaderBase extends React.Component { dateRangeType={currentDateRangeType} isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} + isPreviousMonthData={isPreviousMonthData} onSelect={this.handleOnDateRangeSelected} /> diff --git a/src/routes/details/ibmDetails/ibmDetails.tsx b/src/routes/details/ibmDetails/ibmDetails.tsx index 2c3e319ae..6c304a707 100644 --- a/src/routes/details/ibmDetails/ibmDetails.tsx +++ b/src/routes/details/ibmDetails/ibmDetails.tsx @@ -17,6 +17,7 @@ import { ExportModal } from 'routes/components/export'; import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; +import { NoProvidersOld } from 'routes/components/page/noProvidersOld'; import { NotAvailable } from 'routes/components/page/notAvailable'; import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedIbmReportItems'; @@ -57,6 +58,7 @@ interface IbmDetailsStateProps { isCurrentMonthData?: boolean; isDetailsDateRangeToggleEnabled?: boolean; isPreviousMonthData?: boolean; + isProviderEmptyStateToggleEnabled?: boolean; providers: Providers; providersError: AxiosError; providersFetchStatus: FetchStatus; @@ -333,6 +335,7 @@ class IbmDetails extends React.Component { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isPreviousMonthData, + isProviderEmptyStateToggleEnabled, providers, providersFetchStatus, query, @@ -358,7 +361,11 @@ class IbmDetails extends React.Component { const noProviders = providers && providers.meta && providers.meta.count === 0; if (noProviders) { - return ; + return isProviderEmptyStateToggleEnabled ? ( + + ) : ( + + ); } if (isDetailsDateRangeToggleEnabled ? !isCurrentMonthData && !isPreviousMonthData : !isCurrentMonthData) { return ( @@ -378,6 +385,7 @@ class IbmDetails extends React.Component { currency={currency} groupBy={groupById} isCurrentMonthData={isCurrentMonthData} + isPreviousMonthData={isPreviousMonthData} onCurrencySelect={() => handleOnCurrencySelect(query, router)} onGroupBySelect={this.handleOnGroupBySelect} query={query} @@ -475,6 +483,7 @@ const mapStateToProps = createMapStateToProps( groupBy, groupByValue, historicalDataComponent: , + isProviderEmptyStateToggleEnabled: FeatureToggleSelectors.selectIsProviderEmptyStateToggleEnabled(state), providers: filterProviders(providers, ProviderType.oci), providersError, providersFetchStatus, diff --git a/src/routes/details/ociDetails/detailsHeader.tsx b/src/routes/details/ociDetails/detailsHeader.tsx index 6b130c8d5..dd1ff7548 100644 --- a/src/routes/details/ociDetails/detailsHeader.tsx +++ b/src/routes/details/ociDetails/detailsHeader.tsx @@ -36,6 +36,7 @@ interface DetailsHeaderOwnProps { currency?: string; groupBy?: string; isCurrentMonthData?: boolean; + isPreviousMonthData?: boolean; onCurrencySelect(value: string); onGroupBySelect(value: string); query?: Query; @@ -102,6 +103,7 @@ class DetailsHeaderBase extends React.Component { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isExportsToggleEnabled, + isPreviousMonthData, onCurrencySelect, onGroupBySelect, providers, @@ -154,6 +156,7 @@ class DetailsHeaderBase extends React.Component { dateRangeType={currentDateRangeType} isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} + isPreviousMonthData={isPreviousMonthData} onSelect={this.handleOnDateRangeSelected} /> diff --git a/src/routes/details/ociDetails/ociDetails.tsx b/src/routes/details/ociDetails/ociDetails.tsx index 7fe9de029..5096e8978 100644 --- a/src/routes/details/ociDetails/ociDetails.tsx +++ b/src/routes/details/ociDetails/ociDetails.tsx @@ -17,6 +17,7 @@ import { ExportModal } from 'routes/components/export'; import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; +import { NoProvidersOld } from 'routes/components/page/noProvidersOld'; import { NotAvailable } from 'routes/components/page/notAvailable'; import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedOciReportItems'; @@ -56,6 +57,7 @@ interface OciDetailsStateProps { isCurrentMonthData?: boolean; isDetailsDateRangeToggleEnabled?: boolean; isPreviousMonthData?: boolean; + isProviderEmptyStateToggleEnabled?: boolean; providers: Providers; providersError: AxiosError; providersFetchStatus: FetchStatus; @@ -332,6 +334,7 @@ class OciDetails extends React.Component { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isPreviousMonthData, + isProviderEmptyStateToggleEnabled, providers, providersFetchStatus, query, @@ -357,7 +360,11 @@ class OciDetails extends React.Component { const noProviders = providers && providers.meta && providers.meta.count === 0; if (noProviders) { - return ; + return isProviderEmptyStateToggleEnabled ? ( + + ) : ( + + ); } if (isDetailsDateRangeToggleEnabled ? !isCurrentMonthData && !isPreviousMonthData : !isCurrentMonthData) { return ( @@ -377,6 +384,7 @@ class OciDetails extends React.Component { currency={currency} groupBy={groupById} isCurrentMonthData={isCurrentMonthData} + isPreviousMonthData={isPreviousMonthData} onCurrencySelect={() => handleOnCurrencySelect(query, router)} onGroupBySelect={this.handleOnGroupBySelect} query={query} @@ -474,6 +482,7 @@ const mapStateToProps = createMapStateToProps ), isOptimizationsTab: queryFromRoute.optimizationsTab !== undefined, + isProviderEmptyStateToggleEnabled: FeatureToggleSelectors.selectIsProviderEmptyStateToggleEnabled(state), optimizationsComponent: groupBy === 'project' && groupByValue !== '*' ? : undefined, providers: filterProviders(providers, ProviderType.ocp), providersFetchStatus, diff --git a/src/routes/details/ocpDetails/detailsHeader.tsx b/src/routes/details/ocpDetails/detailsHeader.tsx index 49ec67ab6..f2dba9c35 100644 --- a/src/routes/details/ocpDetails/detailsHeader.tsx +++ b/src/routes/details/ocpDetails/detailsHeader.tsx @@ -40,6 +40,7 @@ interface DetailsHeaderOwnProps { currency?: string; groupBy?: string; isCurrentMonthData?: boolean; + isPreviousMonthData?: boolean; onCurrencySelect(value: string); onCostDistributionSelect(value: string); onDateRangeSelected(value: string); @@ -109,6 +110,7 @@ class DetailsHeaderBase extends React.Component diff --git a/src/routes/details/ocpDetails/ocpDetails.tsx b/src/routes/details/ocpDetails/ocpDetails.tsx index 276b6e5f0..09dcdeade 100644 --- a/src/routes/details/ocpDetails/ocpDetails.tsx +++ b/src/routes/details/ocpDetails/ocpDetails.tsx @@ -19,6 +19,7 @@ import { ExportModal } from 'routes/components/export'; import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; +import { NoProvidersOld } from 'routes/components/page/noProvidersOld'; import { NotAvailable } from 'routes/components/page/notAvailable'; import type { ColumnManagementModalOption } from 'routes/details/components/columnManagement'; import { ColumnManagementModal, initHiddenColumns } from 'routes/details/components/columnManagement'; @@ -63,6 +64,7 @@ export interface OcpDetailsStateProps { isCurrentMonthData?: boolean; isDetailsDateRangeToggleEnabled?: boolean; isPreviousMonthData?: boolean; + isProviderEmptyStateToggleEnabled?: boolean; providers: Providers; providersFetchStatus: FetchStatus; query: OcpQuery; @@ -407,6 +409,7 @@ class OcpDetails extends React.Component { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isPreviousMonthData, + isProviderEmptyStateToggleEnabled, providers, providersFetchStatus, query, @@ -432,7 +435,11 @@ class OcpDetails extends React.Component { const noProviders = providers && providers.meta && providers.meta.count === 0; if (noProviders) { - return ; + return isProviderEmptyStateToggleEnabled ? ( + + ) : ( + + ); } if (isDetailsDateRangeToggleEnabled ? !isCurrentMonthData && !isPreviousMonthData : !isCurrentMonthData) { return ( @@ -453,6 +460,7 @@ class OcpDetails extends React.Component { currency={currency} groupBy={groupById} isCurrentMonthData={isCurrentMonthData} + isPreviousMonthData={isPreviousMonthData} onCostDistributionSelect={() => handleOnCostDistributionSelect(query, router)} onCurrencySelect={() => handleOnCurrencySelect(query, router)} onGroupBySelect={this.handleOnGroupBySelect} @@ -560,6 +568,7 @@ const mapStateToProps = createMapStateToProps, + isProviderEmptyStateToggleEnabled: FeatureToggleSelectors.selectIsProviderEmptyStateToggleEnabled(state), providers: filterProviders(providers, ProviderType.rhel), providersFetchStatus, providerType: ProviderType.rhel, diff --git a/src/routes/details/rhelDetails/detailsHeader.tsx b/src/routes/details/rhelDetails/detailsHeader.tsx index 746640e75..66429bf77 100644 --- a/src/routes/details/rhelDetails/detailsHeader.tsx +++ b/src/routes/details/rhelDetails/detailsHeader.tsx @@ -37,6 +37,7 @@ interface DetailsHeaderOwnProps { currency?: string; groupBy?: string; isCurrentMonthData?: boolean; + isPreviousMonthData?: boolean; onCurrencySelect(value: string); onGroupBySelect(value: string); query?: Query; @@ -105,6 +106,7 @@ class DetailsHeaderBase extends React.Component { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isExportsToggleEnabled, + isPreviousMonthData, onCurrencySelect, onGroupBySelect, providers, @@ -178,6 +180,7 @@ class DetailsHeaderBase extends React.Component { dateRangeType={currentDateRangeType} isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} + isPreviousMonthData={isPreviousMonthData} onSelect={this.handleOnDateRangeSelected} /> diff --git a/src/routes/details/rhelDetails/rhelDetails.tsx b/src/routes/details/rhelDetails/rhelDetails.tsx index 952840e91..5ca176ed3 100644 --- a/src/routes/details/rhelDetails/rhelDetails.tsx +++ b/src/routes/details/rhelDetails/rhelDetails.tsx @@ -18,6 +18,7 @@ import { ExportModal } from 'routes/components/export'; import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; +import { NoProvidersOld } from 'routes/components/page/noProvidersOld'; import { NotAvailable } from 'routes/components/page/notAvailable'; import type { ColumnManagementModalOption } from 'routes/details/components/columnManagement'; import { ColumnManagementModal, initHiddenColumns } from 'routes/details/components/columnManagement'; @@ -59,6 +60,7 @@ interface RhelDetailsStateProps { isCurrentMonthData?: boolean; isDetailsDateRangeToggleEnabled?: boolean; isPreviousMonthData?: boolean; + isProviderEmptyStateToggleEnabled?: boolean; providers: Providers; providersFetchStatus: FetchStatus; query: RhelQuery; @@ -386,6 +388,7 @@ class RhelDetails extends React.Component { isCurrentMonthData, isDetailsDateRangeToggleEnabled, isPreviousMonthData, + isProviderEmptyStateToggleEnabled, providers, providersFetchStatus, query, @@ -411,7 +414,11 @@ class RhelDetails extends React.Component { const noProviders = providers && providers.meta && providers.meta.count === 0; if (noProviders) { - return ; + return isProviderEmptyStateToggleEnabled ? ( + + ) : ( + + ); } if (isDetailsDateRangeToggleEnabled ? !isCurrentMonthData && !isPreviousMonthData : !isCurrentMonthData) { return ( @@ -431,6 +438,7 @@ class RhelDetails extends React.Component { currency={currency} groupBy={groupById} isCurrentMonthData={isCurrentMonthData} + isPreviousMonthData={isPreviousMonthData} onCurrencySelect={() => handleOnCurrencySelect(query, router)} onGroupBySelect={this.handleOnGroupBySelect} query={query} @@ -528,6 +536,7 @@ const mapStateToProps = createMapStateToProps { isCurrentMonthData, isDataAvailable, isDetailsDateRangeToggleEnabled, + isPreviousMonthData, ocpProviders, providersFetchStatus, perspective, @@ -546,7 +548,7 @@ class Explorer extends React.Component { } else if (isLoading) { return ; } else if (noProviders) { - return ; + return ; } else if ( !( hasData(awsProviders) || @@ -578,6 +580,8 @@ class Explorer extends React.Component { : groupById } isCurrentMonthData={isCurrentMonthData} + isDataAvailable={isDataAvailable} + isPreviousMonthData={isPreviousMonthData} onCostDistributionSelect={() => handleOnCostDistributionSelect(query, router)} onCostTypeSelect={() => handleOnCostTypeSelect(query, router)} onCurrencySelect={() => handleOnCurrencySelect(query, router)} @@ -724,7 +728,7 @@ const mapStateToProps = createMapStateToProps { - const { dateRangeType, isCurrentMonthData, isDisabled } = this.props; + const { dateRangeType, isCurrentMonthData, isDataAvailable, isPreviousMonthData, isDisabled } = this.props; return ( ); diff --git a/src/routes/explorer/explorerHeader.tsx b/src/routes/explorer/explorerHeader.tsx index a6d23ad0c..00de88155 100644 --- a/src/routes/explorer/explorerHeader.tsx +++ b/src/routes/explorer/explorerHeader.tsx @@ -66,6 +66,8 @@ interface ExplorerHeaderOwnProps extends RouterComponentProps, WrappedComponentP endDate?: string; groupBy?: string; isCurrentMonthData?: boolean; + isDataAvailable?: boolean; + isPreviousMonthData?: boolean; onCostDistributionSelect(value: string); onCostTypeSelect(value: string); onCurrencySelect(value: string); @@ -264,8 +266,10 @@ class ExplorerHeaderBase extends React.Component { if (isLoading) { return ; } else if (noProviders) { - return ; + return ; } return ( <> diff --git a/src/routes/settings/costModels/costModel/assignSourcesModalToolbar.tsx b/src/routes/settings/costModels/costModel/assignSourcesModalToolbar.tsx index 6c3d80b12..7ca9a3df9 100644 --- a/src/routes/settings/costModels/costModel/assignSourcesModalToolbar.tsx +++ b/src/routes/settings/costModels/costModel/assignSourcesModalToolbar.tsx @@ -1,10 +1,7 @@ import type { PaginationProps } from '@patternfly/react-core'; +import { SearchInput } from '@patternfly/react-core'; import { - InputGroup, - InputGroupItem, - InputGroupText, Pagination, - TextInput, Toolbar, ToolbarContent, ToolbarFilter, @@ -12,7 +9,6 @@ import { ToolbarToggleGroup, } from '@patternfly/react-core'; import { FilterIcon } from '@patternfly/react-icons/dist/esm/icons/filter-icon'; -import { SearchIcon } from '@patternfly/react-icons/dist/esm/icons/search-icon'; import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; @@ -22,31 +18,21 @@ interface FilterInputProps { id: string; value: string; onChange: (value: string) => void; - onSearch: (event: React.KeyboardEvent) => void; + onSearch: (event, value: string) => void; placeholder?: string; } const FilterInput: React.FC = ({ id, placeholder = '', value, onChange, onSearch }) => { return ( - - - onChange(val)} - onKeyPress={(evt: React.KeyboardEvent) => { - if (evt.key !== 'Enter' || value === '') { - return; - } - onSearch(evt); - }} - /> - - - - - + onChange(val)} + onClear={() => onChange('')} + onSearch={onSearch} + placeholder={placeholder} + value={value} + /> ); }; diff --git a/src/routes/settings/costModels/costModel/sourcesToolbar.tsx b/src/routes/settings/costModels/costModel/sourcesToolbar.tsx index 57cbd8414..8380f6d84 100644 --- a/src/routes/settings/costModels/costModel/sourcesToolbar.tsx +++ b/src/routes/settings/costModels/costModel/sourcesToolbar.tsx @@ -1,12 +1,8 @@ -import type { ButtonProps } from '@patternfly/react-core'; -import type { PaginationProps } from '@patternfly/react-core'; +import type { ButtonProps, PaginationProps } from '@patternfly/react-core'; +import { SearchInput } from '@patternfly/react-core'; import { Button, - InputGroup, - InputGroupItem, - InputGroupText, Pagination, - TextInput, Toolbar, ToolbarContent, ToolbarFilter, @@ -14,7 +10,6 @@ import { ToolbarToggleGroup, } from '@patternfly/react-core'; import { FilterIcon } from '@patternfly/react-icons/dist/esm/icons/filter-icon'; -import { SearchIcon } from '@patternfly/react-icons/dist/esm/icons/search-icon'; import React from 'react'; import { ReadOnlyTooltip } from 'routes/settings/costModels/components/readOnlyTooltip'; @@ -22,31 +17,20 @@ interface FilterInputProps { id: string; value: string; onChange: (value: string) => void; - onSearch: (event: React.KeyboardEvent) => void; + onSearch: (event, value: string) => void; placeholder?: string; } const FilterInput: React.FC = ({ id, placeholder = '', value, onChange, onSearch }) => { return ( - - - onChange(val)} - onKeyPress={(evt: React.KeyboardEvent) => { - if (evt.key !== 'Enter' || value === '') { - return; - } - onSearch(evt); - }} - /> - - - - - + onChange(val)} + onClear={() => onChange('')} + onSearch={onSearch} + placeholder={placeholder} + value={value} + /> ); }; diff --git a/src/routes/settings/costModels/costModelWizard/assignSourcesToolbar.tsx b/src/routes/settings/costModels/costModelWizard/assignSourcesToolbar.tsx index 3d49c4940..9d21e7616 100644 --- a/src/routes/settings/costModels/costModelWizard/assignSourcesToolbar.tsx +++ b/src/routes/settings/costModels/costModelWizard/assignSourcesToolbar.tsx @@ -1,10 +1,7 @@ import type { PaginationProps } from '@patternfly/react-core'; +import { SearchInput } from '@patternfly/react-core'; import { - InputGroup, - InputGroupItem, - InputGroupText, Pagination, - TextInput, Toolbar, ToolbarContent, ToolbarFilter, @@ -12,7 +9,6 @@ import { ToolbarToggleGroup, } from '@patternfly/react-core'; import { FilterIcon } from '@patternfly/react-icons/dist/esm/icons/filter-icon'; -import { SearchIcon } from '@patternfly/react-icons/dist/esm/icons/search-icon'; import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; @@ -22,31 +18,21 @@ interface FilterInputProps { id: string; value: string; onChange: (value: string) => void; - onSearch: (event: React.KeyboardEvent) => void; + onSearch: (event, value) => void; placeholder?: string; } const FilterInput: React.FC = ({ id, placeholder = '', value, onChange, onSearch }) => { return ( - - - onChange(val)} - onKeyPress={(evt: React.KeyboardEvent) => { - if (evt.key !== 'Enter' || value === '') { - return; - } - onSearch(evt); - }} - /> - - - - - + onChange(val)} + onClear={() => onChange('')} + onSearch={onSearch} + placeholder={placeholder} + value={value} + /> ); }; diff --git a/src/routes/settings/costModels/costModelsDetails/utils/filters.tsx b/src/routes/settings/costModels/costModelsDetails/utils/filters.tsx index 269e62918..824a4580f 100644 --- a/src/routes/settings/costModels/costModelsDetails/utils/filters.tsx +++ b/src/routes/settings/costModels/costModelsDetails/utils/filters.tsx @@ -1,6 +1,6 @@ import type { ToolbarProps } from '@patternfly/react-core'; -import { InputGroup, InputGroupItem, InputGroupText, TextInput, Toolbar, ToolbarFilter } from '@patternfly/react-core'; -import { SearchIcon } from '@patternfly/react-icons/dist/esm/icons/search-icon'; +import { SearchInput } from '@patternfly/react-core'; +import { Toolbar, ToolbarFilter } from '@patternfly/react-core'; import { intl as defaultIntl } from 'components/i18n'; import messages from 'locales/messages'; import React, { useState } from 'react'; @@ -21,47 +21,36 @@ import type { Inputer } from './types'; interface FilterInputProps { value: string; onChange: (value: string) => void; - onKeyPress: (event: React.KeyboardEvent) => void; + onSearch: (event, value: string) => void; placeholder?: string; } -const FilterInput: React.FC = ({ placeholder = '', value, onChange, onKeyPress }) => { +const FilterInput: React.FC = ({ placeholder = '', value, onChange, onSearch }) => { return ( - - - onChange(val)} - onKeyPress={(evt: React.KeyboardEvent) => { - if (evt.key !== 'Enter' || value === '') { - return; - } - onKeyPress(evt); - }} - /> - - - - - + onChange(val)} + onClear={() => onChange('')} + onSearch={onSearch} + placeholder={placeholder} + value={value} + /> ); }; -export const onKeyPress = - (router, key: string, query: CostModelsQuery, inputer: Inputer) => (event: React.KeyboardEvent) => { - if (event.key === 'Enter' && inputer.value !== '') { - const currentValue = inputer.value; - router.navigate( - stringifySearch({ - ...query, - [key]: query[key] ? `${query[key]},${currentValue}` : currentValue, - }) - ); - inputer.setValue(''); - } - }; +export const onSearch = (router, key: string, query: CostModelsQuery, inputer: Inputer) => () => { + if (inputer.value !== '') { + const currentValue = inputer.value; + router.navigate( + stringifySearch({ + ...query, + [key]: query[key] ? `${query[key]},${currentValue}` : currentValue, + }) + ); + inputer.setValue(''); + } +}; export const onDeleteChip = (router, key, query: CostModelsQuery) => { return (_filterName: string, chipName: string) => { @@ -139,7 +128,7 @@ const DescriptionFilterBase: React.FC = ({ placeholder={intl.formatMessage(messages.filterByPlaceholder, { value: filterType }) as string} value={value} onChange={(val: string) => setValue(val)} - onKeyPress={onKeyPress(router, 'description', { ...initialCostModelsQuery, ...query }, { value, setValue })} + onSearch={onSearch(router, 'description', { ...initialCostModelsQuery, ...query }, { value, setValue })} /> ) : null; return ( @@ -214,7 +203,7 @@ const NameFilterBase: React.FC = ({ placeholder={intl.formatMessage(messages.filterByPlaceholder, { value: filterType }) as string} value={value} onChange={(val: string) => setValue(val)} - onKeyPress={onKeyPress(router, 'name', { ...initialCostModelsQuery, ...query }, { value, setValue })} + onSearch={onSearch(router, 'name', { ...initialCostModelsQuery, ...query }, { value, setValue })} /> ) : null; return ( diff --git a/src/routes/settings/settings.scss b/src/routes/settings/settings.scss deleted file mode 100644 index 41f95abea..000000000 --- a/src/routes/settings/settings.scss +++ /dev/null @@ -1,5 +0,0 @@ -.tabsOverride { - .pf-v5-c-tabs { - --pf-v5-c-tabs--before--border-width--base: 0px; - } -} diff --git a/src/routes/settings/settings.tsx b/src/routes/settings/settings.tsx index 563de7688..10588c9cc 100644 --- a/src/routes/settings/settings.tsx +++ b/src/routes/settings/settings.tsx @@ -1,5 +1,3 @@ -import './settings.scss'; - import { Tab, TabContent, Tabs, TabTitleText, Title, TitleSizes } from '@patternfly/react-core'; import { getUserAccessQuery } from 'api/queries/userAccessQuery'; import type { UserAccess } from 'api/userAccess'; diff --git a/src/routes/settings/tagLabels/tagLabels.tsx b/src/routes/settings/tagLabels/tagLabels.tsx index ccec295d9..bb9f14a6c 100644 --- a/src/routes/settings/tagLabels/tagLabels.tsx +++ b/src/routes/settings/tagLabels/tagLabels.tsx @@ -1,29 +1,28 @@ -import { Accordion, AccordionContent, AccordionItem, AccordionToggle, PageSection } from '@patternfly/react-core'; +import { Card, CardBody, CardTitle, PageSection, Tab, TabContent, Tabs, TabTitleText } from '@patternfly/react-core'; import messages from 'locales/messages'; -import React, { useState } from 'react'; +import React, { type RefObject, useState } from 'react'; import { useIntl } from 'react-intl'; -import { styles } from './tagLabels.styles'; import TagMapping from './tagMapping/tagMapping'; import { Tags } from './tags'; -const enum TagLabelsItem { +const enum TagLabelsTab { tagMapping = 'tagMapping', tags = 'tags', } -const getIdKeyForItem = (item: TagLabelsItem) => { - switch (item) { - case TagLabelsItem.tagMapping: +export const getIdKeyForTab = (tab: TagLabelsTab) => { + switch (tab) { + case TagLabelsTab.tagMapping: return 'tagMapping'; - case TagLabelsItem.tags: + case TagLabelsTab.tags: return 'tags'; } }; -interface AvailableItem { - item: TagLabelsItem; - label: string; +interface AvailableTab { + contentRef: RefObject; + tab: TagLabelsTab; } interface TagLabelsOwnProps { @@ -33,76 +32,97 @@ interface TagLabelsOwnProps { type TagLabelsProps = TagLabelsOwnProps; const TagLabels: React.FC = ({ canWrite }) => { - const [activeKey, setActiveKey] = useState(0); + const [activeTabKey, setActiveTabKey] = useState(0); const intl = useIntl(); - const getAvailableItems = () => { - const availableItems: AvailableItem[] = [ + const getAvailableTabs = () => { + const availableTabs: AvailableTab[] = [ { - item: TagLabelsItem.tags, - label: intl.formatMessage(messages.tagLabelsEnable), + contentRef: React.createRef(), + tab: TagLabelsTab.tags, }, { - item: TagLabelsItem.tagMapping, - label: intl.formatMessage(messages.tagLabelsMap), + contentRef: React.createRef(), + tab: TagLabelsTab.tagMapping, }, ]; - return availableItems; + return availableTabs; }; - const handleOnToggle = (event, index) => { - const isOpen = activeKey === index; - if (isOpen) { - setActiveKey(index === 0 ? 1 : 0); - } else { - setActiveKey(index); - } + const getTab = (tab: TagLabelsTab, contentRef, index: number) => { + return ( + {getTabTitle(tab)}} + /> + ); + }; + + const getTabContent = (availableTabs: AvailableTab[]) => { + return availableTabs.map((val, index) => { + return ( + + {getTabItem(val.tab, index)} + + ); + }); }; - const getAccordionContent = (item: TagLabelsItem, index: number) => { + const getTabItem = (tab: TagLabelsTab, index: number) => { const emptyTab = <>; // Lazily load tabs - if (activeKey !== index) { + if (activeTabKey !== index) { return emptyTab; } - const currentItem = getIdKeyForItem(item); - if (currentItem === TagLabelsItem.tagMapping) { + const currentTab = getIdKeyForTab(tab); + if (currentTab === TagLabelsTab.tagMapping) { return ; - } else if (currentItem === TagLabelsItem.tags) { + } else if (currentTab === TagLabelsTab.tags) { return ; } else { return emptyTab; } }; - const getAccordionItem = (availableItems: AvailableItem[]) => { - return availableItems.map((val, index) => { - const isExpanded = activeKey === index; - return ( - - { - handleOnToggle(_evt, index); - }} - > - {val.label} - - {getAccordionContent(val.item, index)} - - ); - }); + const getTabs = (availableTabs: AvailableTab[]) => { + return ( + + {availableTabs.map((val, index) => getTab(val.tab, val.contentRef, index))} + + ); + }; + + const getTabTitle = (tab: TagLabelsTab) => { + if (tab === TagLabelsTab.tagMapping) { + return intl.formatMessage(messages.tagLabelsMap); + } else if (tab === TagLabelsTab.tags) { + return intl.formatMessage(messages.tagLabelsEnable); + } + }; + + const handleTabClick = (event, tabIndex) => { + if (activeTabKey !== tabIndex) { + setActiveTabKey(tabIndex); + } }; - const availableItems = getAvailableItems(); + const availableTabs = getAvailableTabs(); return ( - -
- {getAccordionItem(availableItems)} -
+ + + {getTabs(availableTabs)} + {getTabContent(availableTabs)} + ); }; diff --git a/src/routes/utils/computedReport/getComputedReportItems.ts b/src/routes/utils/computedReport/getComputedReportItems.ts index 6321ee83b..eca1692de 100644 --- a/src/routes/utils/computedReport/getComputedReportItems.ts +++ b/src/routes/utils/computedReport/getComputedReportItems.ts @@ -319,7 +319,7 @@ export function initReportItems({ idKey, isDateMap, itemMap, report, type, val } const default_project = val.default_project && val.default_project.toLowerCase() === 'true'; let label; - if (report.meta && report.meta.others && (id === 'Other' || id === 'Others')) { + if (report?.meta?.others && (id === 'Other' || id === 'Others')) { // Add count to "Others" label label = intl.formatMessage(messages.chartOthers, { count: report.meta.others }); } else { diff --git a/src/routes/utils/computedReport/getItemLabel.ts b/src/routes/utils/computedReport/getItemLabel.ts index 69ed1c410..c49f9cca8 100644 --- a/src/routes/utils/computedReport/getItemLabel.ts +++ b/src/routes/utils/computedReport/getItemLabel.ts @@ -8,7 +8,7 @@ export interface GetItemLabelParams { export function getItemLabel({ idKey, report, value }: GetItemLabelParams) { let itemLabelKey = String(idKey); - if (report.meta && report.meta.group_by) { + if (report?.meta?.group_by) { const group_by = report.meta.group_by; for (const key of Object.keys(group_by)) { if (key.indexOf(tagPrefix)) { diff --git a/src/store/featureToggle/__snapshots__/featureToggle.test.ts.snap b/src/store/featureToggle/__snapshots__/featureToggle.test.ts.snap index 3964d3add..4119edd17 100644 --- a/src/store/featureToggle/__snapshots__/featureToggle.test.ts.snap +++ b/src/store/featureToggle/__snapshots__/featureToggle.test.ts.snap @@ -13,5 +13,6 @@ exports[`default state 1`] = ` "isFinsightsToggleEnabled": false, "isIbmToggleEnabled": false, "isOcpCloudGroupBysToggleEnabled": false, + "isProviderEmptyStateToggleEnabled": false, } `; diff --git a/src/store/featureToggle/featureToggleActions.ts b/src/store/featureToggle/featureToggleActions.ts index 7b26bacaa..638181d0b 100644 --- a/src/store/featureToggle/featureToggleActions.ts +++ b/src/store/featureToggle/featureToggleActions.ts @@ -11,6 +11,7 @@ export interface FeatureToggleActionMeta { isFinsightsToggleEnabled?: boolean; isIbmToggleEnabled?: boolean; isOcpCloudGroupBysToggleEnabled?: boolean; + isProviderEmptyStateToggleEnabled?: boolean; } export const setFeatureToggle = createAction('feature/init_feature_toggle')(); diff --git a/src/store/featureToggle/featureToggleReducer.ts b/src/store/featureToggle/featureToggleReducer.ts index 9b9cdf954..a033cc696 100644 --- a/src/store/featureToggle/featureToggleReducer.ts +++ b/src/store/featureToggle/featureToggleReducer.ts @@ -18,6 +18,7 @@ export type FeatureToggleState = Readonly<{ isFinsightsToggleEnabled: boolean; isIbmToggleEnabled: boolean; isOcpCloudGroupBysToggleEnabled: boolean; + isProviderEmptyStateToggleEnabled: boolean; }>; export const defaultState: FeatureToggleState = { @@ -32,6 +33,7 @@ export const defaultState: FeatureToggleState = { isFinsightsToggleEnabled: false, isIbmToggleEnabled: false, isOcpCloudGroupBysToggleEnabled: false, + isProviderEmptyStateToggleEnabled: false, }; export const stateKey = 'FeatureToggle'; @@ -52,6 +54,7 @@ export function FeatureToggleReducer(state = defaultState, action: FeatureToggle isFinsightsToggleEnabled: action.payload.isFinsightsToggleEnabled, isIbmToggleEnabled: action.payload.isIbmToggleEnabled, isOcpCloudGroupBysToggleEnabled: action.payload.isOcpCloudGroupBysToggleEnabled, + isProviderEmptyStateToggleEnabled: action.payload.isProviderEmptyStateToggleEnabled, }; default: diff --git a/src/store/featureToggle/featureToggleSelectors.ts b/src/store/featureToggle/featureToggleSelectors.ts index 9018b2579..e8cbd90f4 100644 --- a/src/store/featureToggle/featureToggleSelectors.ts +++ b/src/store/featureToggle/featureToggleSelectors.ts @@ -24,3 +24,5 @@ export const selectIsFinsightsToggleEnabled = (state: RootState) => export const selectIsIbmToggleEnabled = (state: RootState) => selectFeatureToggleState(state).isIbmToggleEnabled; export const selectIsOcpCloudGroupBysToggleEnabled = (state: RootState) => selectFeatureToggleState(state).isOcpCloudGroupBysToggleEnabled; +export const selectIsProviderEmptyStateToggleEnabled = (state: RootState) => + selectFeatureToggleState(state).isProviderEmptyStateToggleEnabled;