diff --git a/.tekton/koku-frontend-pull-request.yaml b/.tekton/koku-frontend-pull-request.yaml new file mode 100644 index 000000000..d0afbcd08 --- /dev/null +++ b/.tekton/koku-frontend-pull-request.yaml @@ -0,0 +1,542 @@ +apiVersion: tekton.dev/v1 +kind: PipelineRun +metadata: + annotations: + build.appstudio.openshift.io/repo: https://github.com/project-koku/koku-ui?rev={{revision}} + build.appstudio.redhat.com/commit_sha: '{{revision}}' + build.appstudio.redhat.com/pull_request_number: '{{pull_request_number}}' + build.appstudio.redhat.com/target_branch: '{{target_branch}}' + pipelinesascode.tekton.dev/max-keep-runs: "3" + pipelinesascode.tekton.dev/on-cel-expression: >- + event == "pull_request" + && ( + target_branch == "main" + || target_branch == "prod-stable" + ) + creationTimestamp: null + labels: + appstudio.openshift.io/application: koku-frontend + appstudio.openshift.io/component: koku-frontend + pipelines.appstudio.openshift.io/type: build + name: koku-frontend-on-pull-request + namespace: cost-mgmt-dev-tenant +spec: + params: + - name: git-url + value: '{{source_url}}' + - name: revision + value: '{{revision}}' + - name: output-image + value: quay.io/redhat-user-workloads/cost-mgmt-dev-tenant/koku-frontend:on-pr-{{revision}} + - name: image-expires-after + value: 5d + - name: dockerfile + value: Dockerfile + - name: path-context + value: . + pipelineSpec: + finally: + - name: show-sbom + params: + - name: IMAGE_URL + value: $(tasks.build-image-index.results.IMAGE_URL) + taskRef: + params: + - name: name + value: show-sbom + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:9bfc6b99ef038800fe131d7b45ff3cd4da3a415dd536f7c657b3527b01c4a13b + - name: kind + value: task + resolver: bundles + - name: show-summary + params: + - name: pipelinerun-name + value: $(context.pipelineRun.name) + - name: git-url + value: $(tasks.clone-repository.results.url)?rev=$(tasks.clone-repository.results.commit) + - name: image-url + value: $(params.output-image) + - name: build-task-status + value: $(tasks.build-image-index.status) + taskRef: + params: + - name: name + value: summary + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:d97c04ab42f277b1103eb6f3a053b247849f4f5b3237ea302a8ecada3b24e15b + - name: kind + value: task + resolver: bundles + workspaces: + - name: workspace + workspace: workspace + params: + - description: Source Repository URL + name: git-url + type: string + - default: "" + description: Revision of the Source Repository + name: revision + type: string + - description: Fully Qualified Output Image + name: output-image + type: string + - default: . + description: Path to the source code of an application's component from where to build image. + name: path-context + type: string + - default: Dockerfile + description: Path to the Dockerfile inside the context specified by parameter path-context + name: dockerfile + type: string + - default: "false" + description: Force rebuild image + name: rebuild + type: string + - default: "false" + description: Skip checks against built image + name: skip-checks + type: string + - default: "false" + description: Execute the build with network isolation + name: hermetic + type: string + - default: "" + description: Build dependencies to be prefetched by Cachi2 + name: prefetch-input + type: string + - default: "" + description: Image tag expiration time, time values could be something like 1h, 2d, 3w for hours, days, and weeks, respectively. + name: image-expires-after + - default: "false" + description: Build a source image. + name: build-source-image + type: string + - default: "false" + description: Add built image into an OCI image index + name: build-image-index + type: string + - default: [] + description: Array of --build-arg values ("arg=value" strings) for buildah + name: build-args + type: array + - default: "" + description: Path to a file with build arguments for buildah, see https://www.mankier.com/1/buildah-build#--build-arg-file + name: build-args-file + type: string + results: + - description: "" + name: IMAGE_URL + value: $(tasks.build-image-index.results.IMAGE_URL) + - description: "" + name: IMAGE_DIGEST + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + - description: "" + name: CHAINS-GIT_URL + value: $(tasks.clone-repository.results.url) + - description: "" + name: CHAINS-GIT_COMMIT + value: $(tasks.clone-repository.results.commit) + tasks: + - name: init + params: + - name: image-url + value: $(params.output-image) + - name: rebuild + value: $(params.rebuild) + - name: skip-checks + value: $(params.skip-checks) + taskRef: + params: + - name: name + value: init + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:092c113b614f6551113f17605ae9cb7e822aa704d07f0e37ed209da23ce392cc + - name: kind + value: task + resolver: bundles + - name: clone-repository + params: + - name: url + value: $(params.git-url) + - name: revision + value: $(params.revision) + runAfter: + - init + taskRef: + params: + - name: name + value: git-clone + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:0bb1be8363557e8e07ec34a3c5daaaaa23c9d533f0bb12f00dc604d00de50814 + - name: kind + value: task + resolver: bundles + when: + - input: $(tasks.init.results.build) + operator: in + values: + - "true" + workspaces: + - name: output + workspace: workspace + - name: basic-auth + workspace: git-auth + - name: prefetch-dependencies + params: + - name: input + value: $(params.prefetch-input) + runAfter: + - clone-repository + taskRef: + params: + - name: name + value: prefetch-dependencies + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:058a59f72997c9cf1be20978eb6a145d8d4d436c6098f2460bd96766bb363b20 + - name: kind + value: task + resolver: bundles + when: + - input: $(params.prefetch-input) + operator: notin + values: + - "" + workspaces: + - name: source + workspace: workspace + - name: git-basic-auth + workspace: git-auth + - name: netrc + workspace: netrc + - name: parse-build-deploy-script + params: + - name: path-context + value: $(params.path-context) + taskRef: + resolver: git + params: + - name: url + value: https://github.com/RedHatInsights/konflux-consoledot-frontend-build + - name: revision + value: c0ff4861d5aa77584f51576b65f2eb9e12e1ded8 + - name: pathInRepo + value: tasks/parse-build-deploy-script/parse-build-deploy-script.yaml + workspaces: + - name: source + workspace: workspace + runAfter: + - clone-repository + - name: create-frontend-dockerfile + taskRef: + resolver: git + params: + - name: url + value: https://github.com/RedHatInsights/konflux-consoledot-frontend-build + - name: revision + value: a6838b71b88dc1e84f11764c9734e4880096585d # replace with the latest commit from https://github.com/RedHatInsights/konflux-consoledot-frontend-build/commits + - name: pathInRepo + value: tasks/create-frontend-dockerfile/create-frontend-dockerfile.yaml + workspaces: + - name: source + workspace: workspace + params: + - name: path-context + value: $(params.path-context) + - name: component + value: $(tasks.parse-build-deploy-script.results.component) + - name: image + value: $(tasks.parse-build-deploy-script.results.image) + - name: node-build-version + value: $(tasks.parse-build-deploy-script.results.node-build-version) + - name: quay-expire-time + value: $(tasks.parse-build-deploy-script.results.quay-expire-time) + - name: npm-build-script + value: $(tasks.parse-build-deploy-script.results.npm-build-script) + - name: yarn-build-script + value: $(tasks.parse-build-deploy-script.results.yarn-build-script) + - name: route-path + value: $(tasks.parse-build-deploy-script.results.route-path) + - name: beta-route-path + value: $(tasks.parse-build-deploy-script.results.beta-route-path) + - name: preview-route-path + value: $(tasks.parse-build-deploy-script.results.preview-route-path) + - name: ci-root + value: $(tasks.parse-build-deploy-script.results.ci-root) + - name: server-name + value: $(tasks.parse-build-deploy-script.results.server-name) + - name: dist-folder + value: $(tasks.parse-build-deploy-script.results.dist-folder) + runAfter: + - parse-build-deploy-script + - name: build-container + params: + - name: IMAGE + value: $(params.output-image) + - name: DOCKERFILE + value: $(params.dockerfile) + - name: CONTEXT + value: $(params.path-context) + - name: HERMETIC + value: $(params.hermetic) + - name: PREFETCH_INPUT + value: $(params.prefetch-input) + - name: IMAGE_EXPIRES_AFTER + value: $(params.image-expires-after) + - name: COMMIT_SHA + value: $(tasks.clone-repository.results.commit) + - name: BUILD_ARGS + value: + - $(params.build-args[*]) + - name: BUILD_ARGS_FILE + value: $(params.build-args-file) + runAfter: + - prefetch-dependencies + - create-frontend-dockerfile + taskRef: + params: + - name: name + value: buildah + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:a523f60203d90e149f96ec776b47ce85a7acfd6d634ddfc18f4a03f14e08ea0e + - name: kind + value: task + resolver: bundles + when: + - input: $(tasks.init.results.build) + operator: in + values: + - "true" + workspaces: + - name: source + workspace: workspace + - name: build-image-index + params: + - name: IMAGE + value: $(params.output-image) + - name: COMMIT_SHA + value: $(tasks.clone-repository.results.commit) + - name: IMAGE_EXPIRES_AFTER + value: $(params.image-expires-after) + - name: ALWAYS_BUILD_INDEX + value: $(params.build-image-index) + - name: IMAGES + value: + - $(tasks.build-container.results.IMAGE_URL)@$(tasks.build-container.results.IMAGE_DIGEST) + runAfter: + - build-container + taskRef: + params: + - name: name + value: build-image-index + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:18eecec92fcdb96dc346aecbbe88fb5fd95e34ee6ef4ad714dc1303723a8e4ea + - name: kind + value: task + resolver: bundles + when: + - input: $(tasks.init.results.build) + operator: in + values: + - "true" + - name: build-source-image + params: + - name: BINARY_IMAGE + value: $(params.output-image) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: source-build + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:21cb5ebaff7a9216903cf78933dc4ec4dd6283a52636b16590a5f52ceb278269 + - name: kind + value: task + resolver: bundles + when: + - input: $(tasks.init.results.build) + operator: in + values: + - "true" + - input: $(params.build-source-image) + operator: in + values: + - "true" + workspaces: + - name: workspace + workspace: workspace + - name: deprecated-base-image-check + params: + - name: IMAGE_URL + value: $(tasks.build-image-index.results.IMAGE_URL) + - name: IMAGE_DIGEST + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: deprecated-image-check + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:d98fa9daf5ee12dfbf00880b83d092d01ce9994d79836548d2f82748bb0c64a2 + - name: kind + value: task + resolver: bundles + when: + - input: $(params.skip-checks) + operator: in + values: + - "false" + - name: clair-scan + params: + - name: image-digest + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + - name: image-url + value: $(tasks.build-image-index.results.IMAGE_URL) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: clair-scan + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:baea4be429cf8d91f7c758378cea42819fe324f25a7f957bf9805409cab6d123 + - name: kind + value: task + resolver: bundles + when: + - input: $(params.skip-checks) + operator: in + values: + - "false" + - name: ecosystem-cert-preflight-checks + params: + - name: image-url + value: $(tasks.build-image-index.results.IMAGE_URL) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: ecosystem-cert-preflight-checks + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.1@sha256:5131cce0f93d0b728c7bcc0d6cee4c61d4c9f67c6d619c627e41e3c9775b497d + - name: kind + value: task + resolver: bundles + when: + - input: $(params.skip-checks) + operator: in + values: + - "false" + - name: sast-snyk-check + params: + - name: image-digest + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + - name: image-url + value: $(tasks.build-image-index.results.IMAGE_URL) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: sast-snyk-check + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.2@sha256:82c42d27c9c59db6cf6c235e89f7b37f5cdfc75d0d361ca0ee91ae703ba72301 + - name: kind + value: task + resolver: bundles + when: + - input: $(params.skip-checks) + operator: in + values: + - "false" + workspaces: + - name: workspace + workspace: workspace + - name: clamav-scan + params: + - name: image-digest + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + - name: image-url + value: $(tasks.build-image-index.results.IMAGE_URL) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: clamav-scan + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:7bb17b937c9342f305468e8a6d0a22493e3ecde58977bd2ffc8b50e2fa234d58 + - name: kind + value: task + resolver: bundles + when: + - input: $(params.skip-checks) + operator: in + values: + - "false" + - name: apply-tags + params: + - name: IMAGE + value: $(tasks.build-image-index.results.IMAGE_URL) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: apply-tags + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:e6beb161ed59d7be26317da03e172137b31b26648d3e139558e9a457bc56caff + - name: kind + value: task + resolver: bundles + - name: push-dockerfile + params: + - name: IMAGE + value: $(tasks.build-image-index.results.IMAGE_URL) + - name: IMAGE_DIGEST + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + - name: DOCKERFILE + value: $(params.dockerfile) + - name: CONTEXT + value: $(params.path-context) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: push-dockerfile + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-push-dockerfile:0.1@sha256:92d63edd09636f97961ca18fac14b67935179d2c14b4a4d5f8087c614e8c2bd9 + - name: kind + value: task + resolver: bundles + workspaces: + - name: workspace + workspace: workspace + workspaces: + - name: workspace + - name: git-auth + optional: true + - name: netrc + optional: true + taskRunTemplate: {} + workspaces: + - name: workspace + volumeClaimTemplate: + metadata: + creationTimestamp: null + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + status: {} + - name: git-auth + secret: + secretName: '{{ git_auth_secret }}' +status: {} diff --git a/.tekton/koku-frontend-push.yaml b/.tekton/koku-frontend-push.yaml new file mode 100644 index 000000000..f0471f1f8 --- /dev/null +++ b/.tekton/koku-frontend-push.yaml @@ -0,0 +1,539 @@ +apiVersion: tekton.dev/v1 +kind: PipelineRun +metadata: + annotations: + build.appstudio.openshift.io/repo: https://github.com/project-koku/koku-ui?rev={{revision}} + build.appstudio.redhat.com/commit_sha: '{{revision}}' + build.appstudio.redhat.com/target_branch: '{{target_branch}}' + pipelinesascode.tekton.dev/max-keep-runs: "3" + pipelinesascode.tekton.dev/on-cel-expression: >- + event == "push" + && ( + target_branch == "main" + || target_branch == "prod-stable" + ) + creationTimestamp: null + labels: + appstudio.openshift.io/application: koku-frontend + appstudio.openshift.io/component: koku-frontend + pipelines.appstudio.openshift.io/type: build + name: koku-frontend-on-push + namespace: cost-mgmt-dev-tenant +spec: + params: + - name: git-url + value: '{{source_url}}' + - name: revision + value: '{{revision}}' + - name: output-image + value: quay.io/redhat-user-workloads/cost-mgmt-dev-tenant/koku-frontend:{{revision}} + - name: dockerfile + value: Dockerfile + - name: path-context + value: . + pipelineSpec: + finally: + - name: show-sbom + params: + - name: IMAGE_URL + value: $(tasks.build-image-index.results.IMAGE_URL) + taskRef: + params: + - name: name + value: show-sbom + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-show-sbom:0.1@sha256:9bfc6b99ef038800fe131d7b45ff3cd4da3a415dd536f7c657b3527b01c4a13b + - name: kind + value: task + resolver: bundles + - name: show-summary + params: + - name: pipelinerun-name + value: $(context.pipelineRun.name) + - name: git-url + value: $(tasks.clone-repository.results.url)?rev=$(tasks.clone-repository.results.commit) + - name: image-url + value: $(params.output-image) + - name: build-task-status + value: $(tasks.build-image-index.status) + taskRef: + params: + - name: name + value: summary + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-summary:0.2@sha256:d97c04ab42f277b1103eb6f3a053b247849f4f5b3237ea302a8ecada3b24e15b + - name: kind + value: task + resolver: bundles + workspaces: + - name: workspace + workspace: workspace + params: + - description: Source Repository URL + name: git-url + type: string + - default: "" + description: Revision of the Source Repository + name: revision + type: string + - description: Fully Qualified Output Image + name: output-image + type: string + - default: . + description: Path to the source code of an application's component from where to build image. + name: path-context + type: string + - default: Dockerfile + description: Path to the Dockerfile inside the context specified by parameter path-context + name: dockerfile + type: string + - default: "false" + description: Force rebuild image + name: rebuild + type: string + - default: "false" + description: Skip checks against built image + name: skip-checks + type: string + - default: "false" + description: Execute the build with network isolation + name: hermetic + type: string + - default: "" + description: Build dependencies to be prefetched by Cachi2 + name: prefetch-input + type: string + - default: "" + description: Image tag expiration time, time values could be something like 1h, 2d, 3w for hours, days, and weeks, respectively. + name: image-expires-after + - default: "false" + description: Build a source image. + name: build-source-image + type: string + - default: "false" + description: Add built image into an OCI image index + name: build-image-index + type: string + - default: [] + description: Array of --build-arg values ("arg=value" strings) for buildah + name: build-args + type: array + - default: "" + description: Path to a file with build arguments for buildah, see https://www.mankier.com/1/buildah-build#--build-arg-file + name: build-args-file + type: string + results: + - description: "" + name: IMAGE_URL + value: $(tasks.build-image-index.results.IMAGE_URL) + - description: "" + name: IMAGE_DIGEST + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + - description: "" + name: CHAINS-GIT_URL + value: $(tasks.clone-repository.results.url) + - description: "" + name: CHAINS-GIT_COMMIT + value: $(tasks.clone-repository.results.commit) + tasks: + - name: init + params: + - name: image-url + value: $(params.output-image) + - name: rebuild + value: $(params.rebuild) + - name: skip-checks + value: $(params.skip-checks) + taskRef: + params: + - name: name + value: init + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:092c113b614f6551113f17605ae9cb7e822aa704d07f0e37ed209da23ce392cc + - name: kind + value: task + resolver: bundles + - name: clone-repository + params: + - name: url + value: $(params.git-url) + - name: revision + value: $(params.revision) + runAfter: + - init + taskRef: + params: + - name: name + value: git-clone + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-git-clone:0.1@sha256:0bb1be8363557e8e07ec34a3c5daaaaa23c9d533f0bb12f00dc604d00de50814 + - name: kind + value: task + resolver: bundles + when: + - input: $(tasks.init.results.build) + operator: in + values: + - "true" + workspaces: + - name: output + workspace: workspace + - name: basic-auth + workspace: git-auth + - name: prefetch-dependencies + params: + - name: input + value: $(params.prefetch-input) + runAfter: + - clone-repository + taskRef: + params: + - name: name + value: prefetch-dependencies + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:058a59f72997c9cf1be20978eb6a145d8d4d436c6098f2460bd96766bb363b20 + - name: kind + value: task + resolver: bundles + when: + - input: $(params.prefetch-input) + operator: notin + values: + - "" + workspaces: + - name: source + workspace: workspace + - name: git-basic-auth + workspace: git-auth + - name: netrc + workspace: netrc + - name: parse-build-deploy-script + params: + - name: path-context + value: $(params.path-context) + taskRef: + resolver: git + params: + - name: url + value: https://github.com/RedHatInsights/konflux-consoledot-frontend-build + - name: revision + value: c0ff4861d5aa77584f51576b65f2eb9e12e1ded8 + - name: pathInRepo + value: tasks/parse-build-deploy-script/parse-build-deploy-script.yaml + workspaces: + - name: source + workspace: workspace + runAfter: + - clone-repository + - name: create-frontend-dockerfile + taskRef: + resolver: git + params: + - name: url + value: https://github.com/RedHatInsights/konflux-consoledot-frontend-build + - name: revision + value: a6838b71b88dc1e84f11764c9734e4880096585d # replace with the latest commit from https://github.com/RedHatInsights/konflux-consoledot-frontend-build/commits + - name: pathInRepo + value: tasks/create-frontend-dockerfile/create-frontend-dockerfile.yaml + workspaces: + - name: source + workspace: workspace + params: + - name: path-context + value: $(params.path-context) + - name: component + value: $(tasks.parse-build-deploy-script.results.component) + - name: image + value: $(tasks.parse-build-deploy-script.results.image) + - name: node-build-version + value: $(tasks.parse-build-deploy-script.results.node-build-version) + - name: quay-expire-time + value: $(tasks.parse-build-deploy-script.results.quay-expire-time) + - name: npm-build-script + value: $(tasks.parse-build-deploy-script.results.npm-build-script) + - name: yarn-build-script + value: $(tasks.parse-build-deploy-script.results.yarn-build-script) + - name: route-path + value: $(tasks.parse-build-deploy-script.results.route-path) + - name: beta-route-path + value: $(tasks.parse-build-deploy-script.results.beta-route-path) + - name: preview-route-path + value: $(tasks.parse-build-deploy-script.results.preview-route-path) + - name: ci-root + value: $(tasks.parse-build-deploy-script.results.ci-root) + - name: server-name + value: $(tasks.parse-build-deploy-script.results.server-name) + - name: dist-folder + value: $(tasks.parse-build-deploy-script.results.dist-folder) + runAfter: + - parse-build-deploy-script + - name: build-container + params: + - name: IMAGE + value: $(params.output-image) + - name: DOCKERFILE + value: $(params.dockerfile) + - name: CONTEXT + value: $(params.path-context) + - name: HERMETIC + value: $(params.hermetic) + - name: PREFETCH_INPUT + value: $(params.prefetch-input) + - name: IMAGE_EXPIRES_AFTER + value: $(params.image-expires-after) + - name: COMMIT_SHA + value: $(tasks.clone-repository.results.commit) + - name: BUILD_ARGS + value: + - $(params.build-args[*]) + - name: BUILD_ARGS_FILE + value: $(params.build-args-file) + runAfter: + - prefetch-dependencies + - create-frontend-dockerfile + taskRef: + params: + - name: name + value: buildah + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:a523f60203d90e149f96ec776b47ce85a7acfd6d634ddfc18f4a03f14e08ea0e + - name: kind + value: task + resolver: bundles + when: + - input: $(tasks.init.results.build) + operator: in + values: + - "true" + workspaces: + - name: source + workspace: workspace + - name: build-image-index + params: + - name: IMAGE + value: $(params.output-image) + - name: COMMIT_SHA + value: $(tasks.clone-repository.results.commit) + - name: IMAGE_EXPIRES_AFTER + value: $(params.image-expires-after) + - name: ALWAYS_BUILD_INDEX + value: $(params.build-image-index) + - name: IMAGES + value: + - $(tasks.build-container.results.IMAGE_URL)@$(tasks.build-container.results.IMAGE_DIGEST) + runAfter: + - build-container + taskRef: + params: + - name: name + value: build-image-index + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:18eecec92fcdb96dc346aecbbe88fb5fd95e34ee6ef4ad714dc1303723a8e4ea + - name: kind + value: task + resolver: bundles + when: + - input: $(tasks.init.results.build) + operator: in + values: + - "true" + - name: build-source-image + params: + - name: BINARY_IMAGE + value: $(params.output-image) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: source-build + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:21cb5ebaff7a9216903cf78933dc4ec4dd6283a52636b16590a5f52ceb278269 + - name: kind + value: task + resolver: bundles + when: + - input: $(tasks.init.results.build) + operator: in + values: + - "true" + - input: $(params.build-source-image) + operator: in + values: + - "true" + workspaces: + - name: workspace + workspace: workspace + - name: deprecated-base-image-check + params: + - name: IMAGE_URL + value: $(tasks.build-image-index.results.IMAGE_URL) + - name: IMAGE_DIGEST + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: deprecated-image-check + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-deprecated-image-check:0.4@sha256:d98fa9daf5ee12dfbf00880b83d092d01ce9994d79836548d2f82748bb0c64a2 + - name: kind + value: task + resolver: bundles + when: + - input: $(params.skip-checks) + operator: in + values: + - "false" + - name: clair-scan + params: + - name: image-digest + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + - name: image-url + value: $(tasks.build-image-index.results.IMAGE_URL) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: clair-scan + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.1@sha256:baea4be429cf8d91f7c758378cea42819fe324f25a7f957bf9805409cab6d123 + - name: kind + value: task + resolver: bundles + when: + - input: $(params.skip-checks) + operator: in + values: + - "false" + - name: ecosystem-cert-preflight-checks + params: + - name: image-url + value: $(tasks.build-image-index.results.IMAGE_URL) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: ecosystem-cert-preflight-checks + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.1@sha256:5131cce0f93d0b728c7bcc0d6cee4c61d4c9f67c6d619c627e41e3c9775b497d + - name: kind + value: task + resolver: bundles + when: + - input: $(params.skip-checks) + operator: in + values: + - "false" + - name: sast-snyk-check + params: + - name: image-digest + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + - name: image-url + value: $(tasks.build-image-index.results.IMAGE_URL) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: sast-snyk-check + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check:0.2@sha256:82c42d27c9c59db6cf6c235e89f7b37f5cdfc75d0d361ca0ee91ae703ba72301 + - name: kind + value: task + resolver: bundles + when: + - input: $(params.skip-checks) + operator: in + values: + - "false" + workspaces: + - name: workspace + workspace: workspace + - name: clamav-scan + params: + - name: image-digest + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + - name: image-url + value: $(tasks.build-image-index.results.IMAGE_URL) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: clamav-scan + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:7bb17b937c9342f305468e8a6d0a22493e3ecde58977bd2ffc8b50e2fa234d58 + - name: kind + value: task + resolver: bundles + when: + - input: $(params.skip-checks) + operator: in + values: + - "false" + - name: apply-tags + params: + - name: IMAGE + value: $(tasks.build-image-index.results.IMAGE_URL) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: apply-tags + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-apply-tags:0.1@sha256:e6beb161ed59d7be26317da03e172137b31b26648d3e139558e9a457bc56caff + - name: kind + value: task + resolver: bundles + - name: push-dockerfile + params: + - name: IMAGE + value: $(tasks.build-image-index.results.IMAGE_URL) + - name: IMAGE_DIGEST + value: $(tasks.build-image-index.results.IMAGE_DIGEST) + - name: DOCKERFILE + value: $(params.dockerfile) + - name: CONTEXT + value: $(params.path-context) + runAfter: + - build-image-index + taskRef: + params: + - name: name + value: push-dockerfile + - name: bundle + value: quay.io/konflux-ci/tekton-catalog/task-push-dockerfile:0.1@sha256:92d63edd09636f97961ca18fac14b67935179d2c14b4a4d5f8087c614e8c2bd9 + - name: kind + value: task + resolver: bundles + workspaces: + - name: workspace + workspace: workspace + workspaces: + - name: workspace + - name: git-auth + optional: true + - name: netrc + optional: true + taskRunTemplate: {} + workspaces: + - name: workspace + volumeClaimTemplate: + metadata: + creationTimestamp: null + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + status: {} + - name: git-auth + secret: + secretName: '{{ git_auth_secret }}' +status: {} diff --git a/eslint.config.mjs b/eslint.config.mjs index 268786edb..81aa1cfff 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -100,7 +100,6 @@ export default [{ rules: { '@typescript-eslint/adjacent-overload-signatures': 'error', '@typescript-eslint/array-type': 'error', - '@typescript-eslint/ban-types': 'error', '@typescript-eslint/camelcase': 'off', '@typescript-eslint/consistent-type-assertions': 'error', '@typescript-eslint/consistent-type-definitions': 'error', @@ -111,8 +110,11 @@ export default [{ '@typescript-eslint/indent': 'off', '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/no-empty-object-type': 'off', '@typescript-eslint/no-misused-new': 'error', '@typescript-eslint/no-namespace': 'error', + '@typescript-eslint/no-require-imports': 'off', + '@typescript-eslint/no-unused-expressions': 'warn', '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/prefer-for-of': 'error', '@typescript-eslint/prefer-function-type': 'error', diff --git a/locales/data.json b/locales/data.json index 4ad373213..f56421dd8 100644 --- a/locales/data.json +++ b/locales/data.json @@ -3663,6 +3663,24 @@ "value": "value" } ], + "distributeCostsToProjects": [ + { + "type": 0, + "value": "Distribute these costs to projects, based on the above description type" + } + ], + "distributeNetwork": [ + { + "type": 0, + "value": "Network traffic" + } + ], + "distributePlatform": [ + { + "type": 0, + "value": "Platform overhead (OpenShift services)" + } + ], "distributePlatformCosts": [ { "options": { @@ -3690,6 +3708,12 @@ "value": "value" } ], + "distributeStorage": [ + { + "type": 0, + "value": "Storage" + } + ], "distributeUnallocatedCapacity": [ { "options": { @@ -3717,6 +3741,12 @@ "value": "value" } ], + "distributeWorker": [ + { + "type": 0, + "value": "Worker unallowcated (unused and non-reserved resources)" + } + ], "distributionModelDesc": [ { "type": 0, @@ -3756,12 +3786,6 @@ "value": "type" } ], - "doNotDistribute": [ - { - "type": 0, - "value": "Do not distribute" - } - ], "docsAddOcpSources": [ { "type": 0, @@ -4872,6 +4896,67 @@ } ] }, + "resource_id": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "_resources_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "_resources_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, "resource_location": { "value": [ { @@ -8122,6 +8207,12 @@ "value": "This page shows filtered results. To undo filters, clear filters on the previous page." } ], + "finalization": [ + { + "type": 0, + "value": "Finalization" + } + ], "forDate": [ { "type": 1, @@ -10273,12 +10364,24 @@ "value": "Instances" } ], + "integration": [ + { + "type": 0, + "value": "Integration" + } + ], "lastProcessed": [ { "type": 0, "value": "Last processed" } ], + "lastUpdated": [ + { + "type": 0, + "value": "Last updated" + } + ], "learnMore": [ { "type": 0, @@ -10745,16 +10848,16 @@ "value": "count" } ], - "network": [ + "networkUnattributedDistributed": [ { "type": 0, - "value": "Network" + "value": "Network unattributed" } ], - "networkDesc": [ + "networkUnattributedDistributedDesc": [ { "type": 0, - "value": "Distribute the cost of network traffic to projects based on distribution type." + "value": "Costs associated with ingress and egress network traffic for individual nodes." } ], "next": [ @@ -10782,7 +10885,7 @@ "noDataStateDesc": [ { "type": 0, - "value": "We have detected an integration, but we are not done processing the incoming data. The time to process could take up to 24 hours. Try refreshing the page at a later time." + "value": "We have detected an integration, but we are not done processing the incoming data." } ], "noDataStateRefresh": [ @@ -10791,6 +10894,12 @@ "value": "Refresh this page" } ], + "noDataStateRefreshDesc": [ + { + "type": 0, + "value": "The time to process could take up to 24 hours. Try refreshing the page at a later time." + } + ], "noDataStateTitle": [ { "type": 0, @@ -11228,13 +11337,17 @@ "overhead": [ { "type": 0, - "value": "Overhead" + "value": "Includes overhead" } ], "overheadDesc": [ { "type": 0, - "value": "Includes distributed costs" + "value": "Includes distributed costs " + }, + { + "type": 1, + "value": "value" } ], "overviewInfoArialLabel": [ @@ -11684,6 +11797,12 @@ "value": "Rate must be a positive number" } ], + "providerDetails": [ + { + "type": 0, + "value": "Integrations details" + } + ], "pvcTitle": [ { "type": 0, @@ -12502,6 +12621,69 @@ } ], "status": [ + { + "type": 0, + "value": "Status" + } + ], + "statusActions": [ + { + "type": 0, + "value": "Status/Actions" + } + ], + "statusMsg": [ + { + "options": { + "complete": { + "value": [ + { + "type": 0, + "value": "Complete" + } + ] + }, + "failed": { + "value": [ + { + "type": 0, + "value": "Failed" + } + ] + }, + "in_progress": { + "value": [ + { + "type": 0, + "value": "in-Progress" + } + ] + }, + "other": { + "value": [] + }, + "paused": { + "value": [ + { + "type": 0, + "value": "Paused" + } + ] + }, + "pending": { + "value": [ + { + "type": 0, + "value": "Pending" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "statusStates": [ { "options": { "failed": { @@ -12536,12 +12718,6 @@ "value": "value" } ], - "statusActions": [ - { - "type": 0, - "value": "Status/Actions" - } - ], "storage": [ { "type": 0, @@ -12554,10 +12730,16 @@ "value": "StorageClass" } ], - "storageDesc": [ + "storageUnattributedDistributed": [ + { + "type": 0, + "value": "Storage unattributed" + } + ], + "storageUnattributedDistributedDesc": [ { "type": 0, - "value": "Distribute the cost of storage to projects based on distribution type." + "value": "A type of project that gets created when cost management is unable to correlate a portion of the cloud cost to an OpenShift namespace" } ], "suggestions": [ @@ -13391,5 +13573,13534 @@ "value": "Yes" } ] + }, + "fr": { + "addProjects": [ + { + "type": 0, + "value": "FR Add projects" + } + ], + "allOtherProjectCosts": [ + { + "type": 0, + "value": "FR Project (All other costs)" + } + ], + "assignCostModel": [ + { + "type": 0, + "value": "FR Assign cost model" + } + ], + "aws": [ + { + "type": 0, + "value": "FR Amazon Web Services" + } + ], + "awsComputeTitle": [ + { + "type": 0, + "value": "FR Compute (EC2) instances usage" + } + ], + "awsCostTrendTitle": [ + { + "type": 0, + "value": "FR Amazon Web Services cumulative cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "awsDailyCostTrendTitle": [ + { + "type": 0, + "value": "FR Amazon Web Services daily cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "awsDashboardCostTitle": [ + { + "type": 0, + "value": "FR Amazon Web Services cost" + } + ], + "awsDesc": [ + { + "type": 0, + "value": "FR Raw cost from Amazon Web Services infrastructure." + } + ], + "awsDetailsTitle": [ + { + "type": 0, + "value": "FR Amazon Web Services Details" + } + ], + "awsOcpDashboardCostTitle": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift cost" + } + ], + "azure": [ + { + "type": 0, + "value": "FR Microsoft Azure" + } + ], + "azureComputeTitle": [ + { + "type": 0, + "value": "FR Virtual machines usage" + } + ], + "azureCostTrendTitle": [ + { + "type": 0, + "value": "FR Microsoft Azure cumulative cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "azureDailyCostTrendTitle": [ + { + "type": 0, + "value": "FR Microsoft Azure daily cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "azureDashboardCostTitle": [ + { + "type": 0, + "value": "FR Microsoft Azure cost" + } + ], + "azureDesc": [ + { + "type": 0, + "value": "FR Raw cost from Azure infrastructure." + } + ], + "azureDetailsTitle": [ + { + "type": 0, + "value": "FR Microsoft Azure Details" + } + ], + "azureOcpDashboardCostTitle": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift cost" + } + ], + "back": [ + { + "type": 0, + "value": "FR Back" + } + ], + "breakdownBackToDetails": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " account details" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " cost category details" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " cluster details" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " GCP project details" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " node details" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " organizational unit details" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " account details" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " service details" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " project details" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " region details" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " region details" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " service details" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " service details" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " account details" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR Back to " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " tag details" + } + ] + } + }, + "type": 5, + "value": "groupBy" + } + ], + "breakdownBackToDetailsAriaLabel": [ + { + "type": 0, + "value": "FR Back to details" + } + ], + "breakdownBackToOptimizations": [ + { + "type": 0, + "value": "FR Back to optimizations" + } + ], + "breakdownBackToOptimizationsProject": [ + { + "type": 0, + "value": "FR Back to optimizations for project " + }, + { + "type": 1, + "value": "value" + } + ], + "breakdownBackToTitles": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud - Top 5 Costliest" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "value" + } + ], + "breakdownCostOverviewTitle": [ + { + "type": 0, + "value": "FR Cost overview" + } + ], + "breakdownHistoricalDataTitle": [ + { + "type": 0, + "value": "FR Historical data" + } + ], + "breakdownSummaryTitle": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by accounts" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by category" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by clusters" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by GCP projects" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by Node" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by organizational units" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by accounts" + } + ] + }, + "platform": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by default projects" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by services" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by projects" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by regions" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by regions" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by services" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by services" + } + ] + }, + "storageclass": { + "value": [ + { + "type": 0, + "value": "FR Storage cost breakdown by type" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by accounts" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR Cost breakdown by tags" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "breakdownTitle": [ + { + "type": 1, + "value": "value" + } + ], + "breakdownTotalCostDate": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR total cost (" + }, + { + "type": 1, + "value": "dateRange" + }, + { + "type": 0, + "value": ")" + } + ], + "calculationType": [ + { + "type": 0, + "value": "FR Calculation type" + } + ], + "cancel": [ + { + "type": 0, + "value": "FR Cancel" + } + ], + "chartCostForecastConeLabel": [ + { + "type": 0, + "value": "FR Cost confidence (" + }, + { + "type": 1, + "value": "dateRange" + }, + { + "type": 0, + "value": ")" + } + ], + "chartCostForecastConeLabelNoData": [ + { + "type": 0, + "value": "FR Cost confidence (no data)" + } + ], + "chartCostForecastConeRangeTooltip": [ + { + "type": 1, + "value": "value0" + }, + { + "type": 0, + "value": "FR - " + }, + { + "type": 1, + "value": "value1" + } + ], + "chartCostForecastConeTooltip": [ + { + "type": 0, + "value": "FR Cost confidence (" + }, + { + "type": 1, + "value": "month" + }, + { + "type": 0, + "value": ")" + } + ], + "chartCostForecastLabel": [ + { + "type": 0, + "value": "FR Cost forecast (" + }, + { + "type": 1, + "value": "dateRange" + }, + { + "type": 0, + "value": ")" + } + ], + "chartCostForecastLabelNoData": [ + { + "type": 0, + "value": "FR Cost forecast (no data)" + } + ], + "chartCostForecastTooltip": [ + { + "type": 0, + "value": "FR Cost forecast (" + }, + { + "type": 1, + "value": "month" + }, + { + "type": 0, + "value": ")" + } + ], + "chartCostLabel": [ + { + "type": 0, + "value": "FR Cost (" + }, + { + "type": 1, + "value": "dateRange" + }, + { + "type": 0, + "value": ")" + } + ], + "chartCostLabelNoData": [ + { + "type": 0, + "value": "FR Cost (no data)" + } + ], + "chartCostTooltip": [ + { + "type": 0, + "value": "FR Cost (" + }, + { + "type": 1, + "value": "month" + }, + { + "type": 0, + "value": ")" + } + ], + "chartDataInLabel": [ + { + "type": 0, + "value": "FR Data in (" + }, + { + "type": 1, + "value": "dateRange" + }, + { + "type": 0, + "value": ")" + } + ], + "chartDataInLabelNoData": [ + { + "type": 0, + "value": "FR Data in (no data)" + } + ], + "chartDataInTooltip": [ + { + "type": 0, + "value": "FR Data in (" + }, + { + "type": 1, + "value": "month" + }, + { + "type": 0, + "value": ")" + } + ], + "chartDataOutLabel": [ + { + "type": 0, + "value": "FR Data out (" + }, + { + "type": 1, + "value": "dateRange" + }, + { + "type": 0, + "value": ")" + } + ], + "chartDataOutLabelNoData": [ + { + "type": 0, + "value": "FR Data out (no data)" + } + ], + "chartDataOutTooltip": [ + { + "type": 0, + "value": "FR Data out (" + }, + { + "type": 1, + "value": "month" + }, + { + "type": 0, + "value": ")" + } + ], + "chartDayOfTheMonth": [ + { + "type": 0, + "value": "FR Day " + }, + { + "type": 1, + "value": "day" + } + ], + "chartLimitLabel": [ + { + "type": 0, + "value": "FR Limit (" + }, + { + "type": 1, + "value": "dateRange" + }, + { + "type": 0, + "value": ")" + } + ], + "chartLimitLabelNoData": [ + { + "type": 0, + "value": "FR Limit (no data)" + } + ], + "chartLimitTooltip": [ + { + "type": 0, + "value": "FR Limit (" + }, + { + "type": 1, + "value": "month" + }, + { + "type": 0, + "value": ")" + } + ], + "chartNoData": [ + { + "type": 0, + "value": "FR no data" + } + ], + "chartOthers": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR Other" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR Others" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ], + "chartRequestsLabel": [ + { + "type": 0, + "value": "FR Requests (" + }, + { + "type": 1, + "value": "dateRange" + }, + { + "type": 0, + "value": ")" + } + ], + "chartRequestsLabelNoData": [ + { + "type": 0, + "value": "FR Requests (no data)" + } + ], + "chartRequestsTooltip": [ + { + "type": 0, + "value": "FR Requests (" + }, + { + "type": 1, + "value": "month" + }, + { + "type": 0, + "value": ")" + } + ], + "chartSupplementaryCostLabel": [ + { + "type": 0, + "value": "FR Supplementary cost (" + }, + { + "type": 1, + "value": "dateRange" + }, + { + "type": 0, + "value": ")" + } + ], + "chartSupplementaryCostLabelNoData": [ + { + "type": 0, + "value": "FR Supplementary cost (no data)" + } + ], + "chartSupplementaryCostTooltip": [ + { + "type": 0, + "value": "FR Supplementary cost (" + }, + { + "type": 1, + "value": "month" + }, + { + "type": 0, + "value": ")" + } + ], + "chartUsageLabel": [ + { + "type": 0, + "value": "FR Usage (" + }, + { + "type": 1, + "value": "dateRange" + }, + { + "type": 0, + "value": ")" + } + ], + "chartUsageLabelNoData": [ + { + "type": 0, + "value": "FR Usage (no data)" + } + ], + "chartUsageTooltip": [ + { + "type": 0, + "value": "FR Usage (" + }, + { + "type": 1, + "value": "month" + }, + { + "type": 0, + "value": ")" + } + ], + "chooseKeyPlaceholder": [ + { + "type": 0, + "value": "FR Choose key" + } + ], + "chooseValuePlaceholder": [ + { + "type": 0, + "value": "FR Choose value" + } + ], + "close": [ + { + "type": 0, + "value": "FR Close" + } + ], + "cloudIntegration": [ + { + "type": 0, + "value": "FR Cloud integration" + } + ], + "cluster": [ + { + "type": 0, + "value": "FR Cluster" + } + ], + "clusterId": [ + { + "type": 0, + "value": "FR Cluster id" + } + ], + "clusterInfo": [ + { + "type": 0, + "value": "FR Cluster information" + } + ], + "clusters": [ + { + "type": 0, + "value": "FR Clusters" + } + ], + "cost": [ + { + "type": 0, + "value": "FR Cost" + } + ], + "costBreakdownAriaDesc": [ + { + "type": 0, + "value": "FR Breakdown of markup, raw, and usage costs" + } + ], + "costBreakdownAriaLabel": [ + { + "type": 0, + "value": "FR A description of markup, raw cost and usage cost" + } + ], + "costBreakdownTitle": [ + { + "type": 0, + "value": "FR Cost breakdown" + } + ], + "costBreakdownTooltip": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR : " + }, + { + "type": 1, + "value": "value" + } + ], + "costCalculations": [ + { + "type": 0, + "value": "FR Cost calculations" + } + ], + "costCalculationsOptional": [ + { + "type": 0, + "value": "FR Cost calculations (optional)" + } + ], + "costCategoryDesc": [ + { + "type": 0, + "value": "FR Enable your AWS cost categories to be used for report grouping and filtering. Changes will be reflected within 24 hours. " + }, + { + "type": 1, + "value": "learnMore" + } + ], + "costCategoryNames": [ + { + "type": 0, + "value": "FR Cost category names" + } + ], + "costCategoryTitle": [ + { + "type": 0, + "value": "FR Cost categories" + } + ], + "costDistribution": [ + { + "type": 0, + "value": "FR Cost distribution" + } + ], + "costDistributionAriaDesc": [ + { + "type": 0, + "value": "FR Overhead cost breakdown of platform, worker unallocated, and total costs" + } + ], + "costDistributionAriaLabel": [ + { + "type": 0, + "value": "FR A description of platform, worker unallocated, and total costs" + } + ], + "costDistributionLabel": [ + { + "type": 0, + "value": "FR Overhead cost" + } + ], + "costDistributionTitle": [ + { + "type": 0, + "value": "FR Overhead cost breakdown" + } + ], + "costDistributionType": [ + { + "options": { + "distributed": { + "value": [ + { + "type": 0, + "value": "FR Distribute through cost models" + } + ] + }, + "other": { + "value": [] + }, + "total": { + "value": [ + { + "type": 0, + "value": "FR Don't distribute overhead costs" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "costManagement": [ + { + "type": 0, + "value": "FR Cost Management" + } + ], + "costModel": [ + { + "type": 0, + "value": "FR Cost Model:" + } + ], + "costModels": [ + { + "type": 0, + "value": "FR Cost Models" + } + ], + "costModelsActions": [ + { + "type": 0, + "value": "FR Cost model actions" + } + ], + "costModelsAddTagValues": [ + { + "type": 0, + "value": "FR Add more tag values" + } + ], + "costModelsAssignSources": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Assign integration" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Assign integrations" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ], + "costModelsAssignSourcesErrorDesc": [ + { + "type": 0, + "value": "FR You cannot assign a integration at this time. Try refreshing this page. If the problem persists, contact your organization administrator or visit our " + }, + { + "type": 1, + "value": "url" + }, + { + "type": 0, + "value": " for known outages." + } + ], + "costModelsAssignSourcesErrorTitle": [ + { + "type": 0, + "value": "FR This action is temporarily unavailable" + } + ], + "costModelsAssignSourcesParen": [ + { + "type": 0, + "value": "FR Assign integrations" + } + ], + "costModelsAssignedSources": [ + { + "type": 0, + "value": "FR Assigned integrations" + } + ], + "costModelsAvailableSources": [ + { + "type": 0, + "value": "FR The following integrations are assigned to my production cost model:" + } + ], + "costModelsCanDelete": [ + { + "type": 0, + "value": "FR This action will delete " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " cost model from the system. This action cannot be undone" + } + ], + "costModelsCanNotDelete": [ + { + "type": 0, + "value": "FR The following integrations are assigned to " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " cost model:" + } + ], + "costModelsDelete": [ + { + "type": 0, + "value": "FR Delete cost model" + } + ], + "costModelsDeleteDesc": [ + { + "type": 0, + "value": "FR This action will delete " + }, + { + "type": 1, + "value": "costModel" + }, + { + "type": 0, + "value": " cost model from the system. This action cannot be undone." + } + ], + "costModelsDeleteSource": [ + { + "type": 0, + "value": "FR You must unassign any integrations before you can delete this cost model." + } + ], + "costModelsDesc": [ + { + "type": 0, + "value": "FR Cost models can help you analyze and predict future costs. Associate a price to metrics provided by your integrations to calculate your charges for resource usage. " + }, + { + "type": 1, + "value": "learnMore" + } + ], + "costModelsDescTooLong": [ + { + "type": 0, + "value": "FR Should not exceed 500 characters" + } + ], + "costModelsDetailsTitle": [ + { + "type": 0, + "value": "FR Cost Model Details" + } + ], + "costModelsDistributionDesc": [ + { + "type": 0, + "value": "FR The following is the type of metric that is set to be used when distributing costs to the project level breakdowns." + } + ], + "costModelsDistributionEdit": [ + { + "type": 0, + "value": "FR Edit distribution" + } + ], + "costModelsEmptyState": [ + { + "type": 0, + "value": "FR What is your hybrid cloud costing you?" + } + ], + "costModelsEmptyStateDesc": [ + { + "type": 0, + "value": "FR Create a cost model to start calculating your hybrid cloud costs using custom price lists, markups, or both. Click on the button below to begin the journey." + } + ], + "costModelsEmptyStateLearnMore": [ + { + "type": 0, + "value": "FR Read about setting up a cost model" + } + ], + "costModelsEnterTagDesc": [ + { + "type": 0, + "value": "FR Enter a tag description" + } + ], + "costModelsEnterTagKey": [ + { + "type": 0, + "value": "FR Enter a tag key" + } + ], + "costModelsEnterTagRate": [ + { + "type": 0, + "value": "FR Enter rate by tag" + } + ], + "costModelsEnterTagValue": [ + { + "type": 0, + "value": "FR Enter a tag value" + } + ], + "costModelsExamplesDoubleMarkup": [ + { + "type": 0, + "value": "FR A markup rate of (+) 100% doubles the base costs of your integrations." + } + ], + "costModelsExamplesNoAdjust": [ + { + "type": 0, + "value": "FR A markup or discount rate of (+/-) 0% (the default) makes no adjustments to the base costs of your integrations." + } + ], + "costModelsExamplesReduceSeventyfive": [ + { + "type": 0, + "value": "FR A discount rate of (-) 25% reduces the base costs of your integrations to 75% of the original value." + } + ], + "costModelsExamplesReduceZero": [ + { + "type": 0, + "value": "FR A discount rate of (-) 100% reduces the base costs of your integrations to 0." + } + ], + "costModelsFilterPlaceholder": [ + { + "type": 0, + "value": "FR Filter by name..." + } + ], + "costModelsFilterTagKey": [ + { + "type": 0, + "value": "FR Filter by tag key" + } + ], + "costModelsInfoTooLong": [ + { + "type": 0, + "value": "FR Should not exceed 100 characters" + } + ], + "costModelsLastUpdated": [ + { + "type": 0, + "value": "FR Last updated" + } + ], + "costModelsRateTooLong": [ + { + "type": 0, + "value": "FR Should not exceed 10 decimals" + } + ], + "costModelsRefreshDialog": [ + { + "type": 0, + "value": "FR Refresh this dialog" + } + ], + "costModelsRemoveTagLabel": [ + { + "type": 0, + "value": "FR Remove tag value" + } + ], + "costModelsRequiredField": [ + { + "type": 0, + "value": "FR This field is required" + } + ], + "costModelsRouterErrorTitle": [ + { + "type": 0, + "value": "FR Fail routing to cost model" + } + ], + "costModelsRouterServerError": [ + { + "type": 0, + "value": "FR Server error: could not get the cost model." + } + ], + "costModelsSelectMeasurement": [ + { + "type": 0, + "value": "FR Select Measurement" + } + ], + "costModelsSelectMetric": [ + { + "type": 0, + "value": "FR Select Metric" + } + ], + "costModelsSourceDelete": [ + { + "type": 0, + "value": "FR Unassign" + } + ], + "costModelsSourceDeleteSource": [ + { + "type": 0, + "value": "FR Unassign integration" + } + ], + "costModelsSourceDeleteSourceDesc": [ + { + "type": 0, + "value": "FR This will remove the assignment of " + }, + { + "type": 1, + "value": "source" + }, + { + "type": 0, + "value": " from the " + }, + { + "type": 1, + "value": "costModel" + }, + { + "type": 0, + "value": " cost model. You can then assign the cost model to a new integration." + } + ], + "costModelsSourceEmptyStateDesc": [ + { + "type": 0, + "value": "FR Select the integrations you want to apply this cost model to." + } + ], + "costModelsSourceEmptyStateTitle": [ + { + "type": 0, + "value": "FR No integrations are assigned" + } + ], + "costModelsSourceTableAriaLabel": [ + { + "type": 0, + "value": "FR Integrations table" + } + ], + "costModelsTableAriaLabel": [ + { + "type": 0, + "value": "FR Cost models table" + } + ], + "costModelsTagRateTableKey": [ + { + "type": 0, + "value": "FR Tag key" + } + ], + "costModelsTagRateTableValue": [ + { + "type": 0, + "value": "FR Tag value" + } + ], + "costModelsUUIDEmptyState": [ + { + "type": 0, + "value": "FR Cost model can not be found" + } + ], + "costModelsUUIDEmptyStateDesc": [ + { + "type": 0, + "value": "FR Cost model with uuid: " + }, + { + "type": 1, + "value": "uuid" + }, + { + "type": 0, + "value": " does not exist." + } + ], + "costModelsWizardCreateCostModel": [ + { + "type": 0, + "value": "FR Create cost model" + } + ], + "costModelsWizardCreatePriceList": [ + { + "type": 0, + "value": "FR Create a price list" + } + ], + "costModelsWizardCurrencyToggleLabel": [ + { + "type": 0, + "value": "FR Select currency" + } + ], + "costModelsWizardEmptySourceTypeLabel": [ + { + "type": 0, + "value": "FR Select integration" + } + ], + "costModelsWizardEmptyStateOtherTime": [ + { + "type": 0, + "value": "FR You can create a price list or modify one at a later time." + } + ], + "costModelsWizardEmptyStateSkipStep": [ + { + "type": 0, + "value": "FR To skip this step, click the " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " button." + } + ], + "costModelsWizardEmptyStateTitle": [ + { + "type": 0, + "value": "FR A price list has not been created." + } + ], + "costModelsWizardGeneralInfoTitle": [ + { + "type": 0, + "value": "FR Enter general information" + } + ], + "costModelsWizardNoRatesAdded": [ + { + "type": 0, + "value": "FR No rates were added to the price list" + } + ], + "costModelsWizardOnboardAws": [ + { + "type": 0, + "value": "FR Amazon Web Services (AWS)" + } + ], + "costModelsWizardOnboardOcp": [ + { + "type": 0, + "value": "FR Red Hat OpenShift Container Platform" + } + ], + "costModelsWizardPriceListMetric": [ + { + "type": 0, + "value": "FR Select the metric you want to assign a price to, and specify a measurement unit and rate. You can optionally set multiple rates for particular tags." + } + ], + "costModelsWizardRateAriaLabel": [ + { + "type": 0, + "value": "FR Assign rate" + } + ], + "costModelsWizardReviewMarkDiscount": [ + { + "type": 0, + "value": "FR Markup/Discount" + } + ], + "costModelsWizardReviewStatusSubDetails": [ + { + "type": 0, + "value": "FR Review and confirm your cost model configuration and assignments. Click " + }, + { + "type": 1, + "value": "create" + }, + { + "type": 0, + "value": " to create the cost model, or " + }, + { + "type": 1, + "value": "back" + }, + { + "type": 0, + "value": " to revise." + } + ], + "costModelsWizardReviewStatusSubTitle": [ + { + "type": 0, + "value": "FR Costs for resources connected to the assigned integrations will now be calculated using the newly created " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " cost model." + } + ], + "costModelsWizardReviewStatusTitle": [ + { + "type": 0, + "value": "FR Creation successful" + } + ], + "costModelsWizardSourceCaption": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Select from the following Amazon Web Services integrations:" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Select from the following Microsoft Azure integrations:" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Select from the following Google Cloud Platform integrations:" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Select from the following Oracle Cloud Infrastructure integrations:" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR Select from the following Red Hat OpenShift integrations:" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "value" + } + ], + "costModelsWizardSourceErrorDesc": [ + { + "type": 0, + "value": "FR Try refreshing this step or you can skip this step (as it is optional) and assign the integration to the cost model at a later time. If the problem persists, contact your organization administrator or visit our " + }, + { + "type": 1, + "value": "url" + }, + { + "type": 0, + "value": " for known outages." + } + ], + "costModelsWizardSourceErrorTitle": [ + { + "type": 0, + "value": "FR This step is temporarily unavailable" + } + ], + "costModelsWizardSourceSubtitle": [ + { + "type": 0, + "value": "FR Select one or more integrations to this cost model. You can skip this step and assign the cost model to a integration at a later time. An integration will be unavailable for selection if a cost model is already assigned to it." + } + ], + "costModelsWizardSourceTableAriaLabel": [ + { + "type": 0, + "value": "FR Assign integrations to cost model table" + } + ], + "costModelsWizardSourceTableCostModel": [ + { + "type": 0, + "value": "FR Cost model assigned" + } + ], + "costModelsWizardSourceTableDefaultCostModel": [ + { + "type": 0, + "value": "FR Default cost model" + } + ], + "costModelsWizardSourceTitle": [ + { + "type": 0, + "value": "FR Assign integrations to the cost model (optional)" + } + ], + "costModelsWizardSourceWarning": [ + { + "type": 0, + "value": "FR This integration is assigned to " + }, + { + "type": 1, + "value": "costModel" + }, + { + "type": 0, + "value": " cost model. You will have to unassigned it first" + } + ], + "costModelsWizardStepsGenInfo": [ + { + "type": 0, + "value": "FR Enter information" + } + ], + "costModelsWizardStepsReview": [ + { + "type": 0, + "value": "FR Review details" + } + ], + "costModelsWizardStepsSources": [ + { + "type": 0, + "value": "FR Assign an integration to the cost model" + } + ], + "costModelsWizardSubTitleTable": [ + { + "type": 0, + "value": "FR The following is a list of rates you have set so far for this price list." + } + ], + "costModelsWizardWarningSources": [ + { + "type": 0, + "value": "FR Cannot assign cost model to an integration that is already assigned to another one" + } + ], + "costTypeAmortized": [ + { + "type": 0, + "value": "FR Amortized" + } + ], + "costTypeAmortizedDesc": [ + { + "type": 0, + "value": "FR Recurring and/or upfront costs are distributed evenly across the month" + } + ], + "costTypeBlended": [ + { + "type": 0, + "value": "FR Blended" + } + ], + "costTypeBlendedDesc": [ + { + "type": 0, + "value": "FR Using a blended rate to calcuate cost usage" + } + ], + "costTypeLabel": [ + { + "type": 0, + "value": "FR Show cost as" + } + ], + "costTypeSettingsDesc": [ + { + "type": 0, + "value": "FR Select the preferred way of calculating upfront costs of savings plans or subscription fees. This feature is available for Amazon Web Services cost only." + } + ], + "costTypeSettingsLabel": [ + { + "type": 0, + "value": "FR Show cost as (Amazon Web Services only)" + } + ], + "costTypeUnblended": [ + { + "type": 0, + "value": "FR Unblended" + } + ], + "costTypeUnblendedDesc": [ + { + "type": 0, + "value": "FR Usage cost on the day you are charged" + } + ], + "cpuTitle": [ + { + "type": 0, + "value": "FR CPU" + } + ], + "create": [ + { + "type": 0, + "value": "FR Create" + } + ], + "createCostModelConfirmMsg": [ + { + "type": 0, + "value": "FR Are you sure you want to stop creating a cost model? All settings will be discarded." + } + ], + "createCostModelDesc": [ + { + "type": 0, + "value": "FR A cost model allows you to associate a price to metrics provided by your integrations to charge for utilization of resources." + } + ], + "createCostModelExit": [ + { + "type": 0, + "value": "FR Exit cost model creation" + } + ], + "createCostModelExitYes": [ + { + "type": 0, + "value": "FR Yes, I want to exit" + } + ], + "createCostModelNoContinue": [ + { + "type": 0, + "value": "FR No, I want to continue" + } + ], + "createCostModelTitle": [ + { + "type": 0, + "value": "FR Create a cost model" + } + ], + "createRate": [ + { + "type": 0, + "value": "FR Create rate" + } + ], + "createTagMapping": [ + { + "type": 0, + "value": "FR Create tag mapping" + } + ], + "currency": [ + { + "type": 0, + "value": "FR Currency" + } + ], + "currencyAbbreviations": [ + { + "options": { + "billion": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR B" + } + ] + }, + "million": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR M" + } + ] + }, + "other": { + "value": [] + }, + "quadrillion": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR q" + } + ] + }, + "thousand": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR K" + } + ] + }, + "trillion": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR t" + } + ] + } + }, + "type": 5, + "value": "symbol" + } + ], + "currencyCalcuationsTitle": [ + { + "type": 0, + "value": "FR Currency and calculations" + } + ], + "currencyDesc": [ + { + "type": 0, + "value": "FR Select the preferred currency view for your organization" + } + ], + "currencyOptions": [ + { + "options": { + "AUD": { + "value": [ + { + "type": 0, + "value": "FR AUD (A$) - Australian Dollar" + } + ] + }, + "CAD": { + "value": [ + { + "type": 0, + "value": "FR CAD (CA$) - Canadian Dollar" + } + ] + }, + "CHF": { + "value": [ + { + "type": 0, + "value": "FR CHF (CHF) - Swiss Franc" + } + ] + }, + "CNY": { + "value": [ + { + "type": 0, + "value": "FR CNY (CN¥) - Chinese Yuan" + } + ] + }, + "DKK": { + "value": [ + { + "type": 0, + "value": "FR DKK (DKK) - Danish Krone" + } + ] + }, + "EUR": { + "value": [ + { + "type": 0, + "value": "FR EUR (€) - Euro" + } + ] + }, + "GBP": { + "value": [ + { + "type": 0, + "value": "FR GBP (£) - British Pound" + } + ] + }, + "HKD": { + "value": [ + { + "type": 0, + "value": "FR HKD (HK$) - Hong Kong Dollar" + } + ] + }, + "JPY": { + "value": [ + { + "type": 0, + "value": "FR JPY (¥) - Japanese Yen" + } + ] + }, + "NOK": { + "value": [ + { + "type": 0, + "value": "FR NOK (NOK) - Norwegian Krone" + } + ] + }, + "NZD": { + "value": [ + { + "type": 0, + "value": "FR NZD (NZ$) - New Zealand Dollar" + } + ] + }, + "SEK": { + "value": [ + { + "type": 0, + "value": "FR SEK (SEK) - Swedish Krona" + } + ] + }, + "SGD": { + "value": [ + { + "type": 0, + "value": "FR SGD (SGD) - Singapore Dollar" + } + ] + }, + "USD": { + "value": [ + { + "type": 0, + "value": "FR USD ($) - United States Dollar" + } + ] + }, + "ZAR": { + "value": [ + { + "type": 0, + "value": "FR ZAR (ZAR) - South African Rand" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "units" + } + ], + "currencyUnits": [ + { + "options": { + "AUD": { + "value": [ + { + "type": 0, + "value": "FR A$" + } + ] + }, + "CAD": { + "value": [ + { + "type": 0, + "value": "FR CA$" + } + ] + }, + "CHF": { + "value": [ + { + "type": 0, + "value": "FR CHF" + } + ] + }, + "CNY": { + "value": [ + { + "type": 0, + "value": "FR CN¥" + } + ] + }, + "DKK": { + "value": [ + { + "type": 0, + "value": "FR DKK" + } + ] + }, + "EUR": { + "value": [ + { + "type": 0, + "value": "FR €" + } + ] + }, + "GBP": { + "value": [ + { + "type": 0, + "value": "FR £" + } + ] + }, + "HKD": { + "value": [ + { + "type": 0, + "value": "FR HK$" + } + ] + }, + "JPY": { + "value": [ + { + "type": 0, + "value": "FR ¥" + } + ] + }, + "NOK": { + "value": [ + { + "type": 0, + "value": "FR NOK" + } + ] + }, + "NZD": { + "value": [ + { + "type": 0, + "value": "FR NZ$" + } + ] + }, + "SEK": { + "value": [ + { + "type": 0, + "value": "FR SEK" + } + ] + }, + "SGD": { + "value": [ + { + "type": 0, + "value": "FR SGD" + } + ] + }, + "USD": { + "value": [ + { + "type": 0, + "value": "FR $" + } + ] + }, + "ZAR": { + "value": [ + { + "type": 0, + "value": "FR ZAR" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "units" + } + ], + "dashboardCumulativeCostComparison": [ + { + "type": 0, + "value": "FR Cumulative cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "dashboardDailyUsageComparison": [ + { + "type": 0, + "value": "FR Daily usage comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "dashboardDatabaseTitle": [ + { + "type": 0, + "value": "FR Database services cost" + } + ], + "dashboardNetworkTitle": [ + { + "type": 0, + "value": "FR Network services cost" + } + ], + "dashboardStorageTitle": [ + { + "type": 0, + "value": "FR Storage services usage" + } + ], + "dashboardTotalCostTooltip": [ + { + "type": 0, + "value": "FR This total cost is the sum of the infrastructure cost " + }, + { + "type": 1, + "value": "infrastructureCost" + }, + { + "type": 0, + "value": " and supplementary cost " + }, + { + "type": 1, + "value": "supplementaryCost" + } + ], + "dataDetails": [ + { + "type": 0, + "value": "FR Data details" + } + ], + "dataDetailsAvailability": [ + { + "type": 0, + "value": "FR Data availability" + } + ], + "dataDetailsCloudData": [ + { + "type": 0, + "value": "FR Cloud data" + } + ], + "dataDetailsCloudIntegration": [ + { + "type": 0, + "value": "FR Cloud integration data" + } + ], + "dataDetailsCloudIntegrationStatus": [ + { + "type": 0, + "value": "FR Cloud integration status" + } + ], + "dataDetailsClusterData": [ + { + "type": 0, + "value": "FR Cluster data" + } + ], + "dataDetailsCostManagementData": [ + { + "type": 0, + "value": "FR Cost Management data" + } + ], + "dataDetailsIntegrationAndFinalization": [ + { + "type": 0, + "value": "FR Data integration and finalization" + } + ], + "dataDetailsIntegrationStatus": [ + { + "type": 0, + "value": "FR Red Hat integration status" + } + ], + "dataDetailsProcessing": [ + { + "type": 0, + "value": "FR Data processing" + } + ], + "dataDetailsRetrieval": [ + { + "type": 0, + "value": "FR Data retrieval" + } + ], + "dataTableAriaLabel": [ + { + "type": 0, + "value": "FR Details table" + } + ], + "datePickerAfterError": [ + { + "type": 0, + "value": "FR Date is after the allowable range" + } + ], + "datePickerBeforeError": [ + { + "type": 0, + "value": "FR Date is before the allowable range" + } + ], + "datePickerEndDateAriaLabel": [ + { + "type": 0, + "value": "FR End date" + } + ], + "datePickerStartDateAriaLabel": [ + { + "type": 0, + "value": "FR Start date" + } + ], + "default": [ + { + "type": 0, + "value": "FR Default" + } + ], + "delete": [ + { + "type": 0, + "value": "FR Delete" + } + ], + "description": [ + { + "type": 0, + "value": "FR Description" + } + ], + "deselectTags": [ + { + "type": 0, + "value": "FR Your account is limited to " + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": " active tags at a time. You must disable some tags to enable others" + } + ], + "detailsActionsExport": [ + { + "type": 0, + "value": "FR Export data" + } + ], + "detailsActionsPriceList": [ + { + "type": 0, + "value": "FR View all price lists" + } + ], + "detailsClustersModalTitle": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR account " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR cost category " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR cluster " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "clusters": { + "value": [ + { + "type": 0, + "value": "FR Clusters" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR GCP project " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR node " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR organizational unit " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR account " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR service " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR project " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR region " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR region " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR service " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR service " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR account " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR tags " + }, + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": " clusters" + } + ] + } + }, + "type": 5, + "value": "groupBy" + } + ], + "detailsColumnManagementTitle": [ + { + "type": 0, + "value": "FR Manage columns" + } + ], + "detailsCostValue": [ + { + "type": 0, + "value": "FR Cost: " + }, + { + "type": 1, + "value": "value" + } + ], + "detailsEmptyState": [ + { + "type": 0, + "value": "FR Processing data to generate a list of all services that sums to a total cost..." + } + ], + "detailsMore": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR more..." + } + ], + "detailsMoreClusters": [ + { + "type": 0, + "value": "FR , " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " more..." + } + ], + "detailsResourceNames": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR Account names" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR Cost category names" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Cluster names" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR GCP project names" + } + ] + }, + "group": { + "value": [ + { + "type": 0, + "value": "FR Group" + } + ] + }, + "instance": { + "value": [ + { + "type": 0, + "value": "FR Instance names" + } + ] + }, + "instance_type": { + "value": [ + { + "type": 0, + "value": "FR Instance type" + } + ] + }, + "memory": { + "value": [ + { + "type": 0, + "value": "FR Memory" + } + ] + }, + "name": { + "value": [ + { + "type": 0, + "value": "FR Name" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Node names" + } + ] + }, + "operating_system": { + "value": [ + { + "type": 0, + "value": "FR Operating system" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR Organizational unit names" + } + ] + }, + "os": { + "value": [ + { + "type": 0, + "value": "FR OS" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR Account names" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR Service names" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR Project names" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR Region names" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR Region names" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR Service names" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR Service names" + } + ] + }, + "source_type": { + "value": [ + { + "type": 0, + "value": "FR Integration" + } + ] + }, + "status": { + "value": [ + { + "type": 0, + "value": "FR Status" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR Account names" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR Tag names" + } + ] + }, + "tag_key": { + "value": [ + { + "type": 0, + "value": "FR Tag keys" + } + ] + }, + "tags": { + "value": [ + { + "type": 0, + "value": "FR Tags" + } + ] + }, + "vcpu": { + "value": [ + { + "type": 0, + "value": "FR vCPU" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "detailsSummaryModalTitle": [ + { + "options": { + "account": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR accounts" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR cost categories" + } + ] + }, + "cluster": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR clusters" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR GCP projects" + } + ] + }, + "node": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR nodes" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR organizational units" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR accounts" + } + ] + }, + "product_service": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR services" + } + ] + }, + "project": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR projects" + } + ] + }, + "region": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR regions" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR regions" + } + ] + }, + "service": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR services" + } + ] + }, + "service_name": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR services" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR accounts" + } + ] + }, + "tag": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR tags" + } + ] + } + }, + "type": 5, + "value": "groupBy" + } + ], + "detailsUnusedCapacityLabel": [ + { + "type": 0, + "value": "FR Unused capacity" + } + ], + "detailsUnusedRequestsLabel": [ + { + "type": 0, + "value": "FR Unused requests" + } + ], + "detailsUnusedUnits": [ + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": "FR (" + }, + { + "type": 1, + "value": "percentage" + }, + { + "type": 0, + "value": "% of capacity)" + } + ], + "detailsUsageCapacity": [ + { + "type": 0, + "value": "FR Capacity - " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " " + }, + { + "type": 1, + "value": "units" + } + ], + "detailsUsageLimit": [ + { + "type": 0, + "value": "FR Limit - " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " " + }, + { + "type": 1, + "value": "units" + } + ], + "detailsUsageRequests": [ + { + "type": 0, + "value": "FR Requests - " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " " + }, + { + "type": 1, + "value": "units" + } + ], + "detailsUsageUsage": [ + { + "type": 0, + "value": "FR Usage - " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " " + }, + { + "type": 1, + "value": "units" + } + ], + "detailsViewAll": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR View all accounts" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR View all cost categories" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR View all clusters" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR View all GCP projects" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR View all nodes" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR View all organizational units" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR View all accounts" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR View all services" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR View all projects" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR View all regions" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR View all regions" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR View all Services" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR View all services" + } + ] + }, + "storageclass": { + "value": [ + { + "type": 0, + "value": "FR View all storage types" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR View all accounts" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR View all tags" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "disableCategories": [ + { + "type": 0, + "value": "FR Disable categories" + } + ], + "disableTags": [ + { + "type": 0, + "value": "FR Disable tags" + } + ], + "disabled": [ + { + "type": 0, + "value": "FR Disabled" + } + ], + "discountMinus": [ + { + "type": 0, + "value": "FR Discount (-)" + } + ], + "distribute": [ + { + "type": 0, + "value": "FR Distribute" + } + ], + "distributeCosts": [ + { + "options": { + "false": { + "value": [ + { + "type": 0, + "value": "FR Do not distribute " + }, + { + "options": { + "network": { + "value": [ + { + "type": 0, + "value": "network" + } + ] + }, + "other": { + "value": [] + }, + "storage": { + "value": [ + { + "type": 0, + "value": "storage" + } + ] + } + }, + "type": 5, + "value": "type" + }, + { + "type": 0, + "value": " costs" + } + ] + }, + "other": { + "value": [] + }, + "true": { + "value": [ + { + "type": 0, + "value": "FR Distribute " + }, + { + "options": { + "network": { + "value": [ + { + "type": 0, + "value": "network" + } + ] + }, + "other": { + "value": [] + }, + "storage": { + "value": [ + { + "type": 0, + "value": "storage" + } + ] + } + }, + "type": 5, + "value": "type" + }, + { + "type": 0, + "value": " costs" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "distributeCostsToProjects": [ + { + "type": 0, + "value": "FR Distribute these costs to projects, based on the above description type" + } + ], + "distributeNetwork": [ + { + "type": 0, + "value": "FR Network traffic" + } + ], + "distributePlatform": [ + { + "type": 0, + "value": "FR Platform overhead (OpenShift services)" + } + ], + "distributePlatformCosts": [ + { + "options": { + "false": { + "value": [ + { + "type": 0, + "value": "FR Do not distribute platform costs" + } + ] + }, + "other": { + "value": [] + }, + "true": { + "value": [ + { + "type": 0, + "value": "FR Distribute platform costs" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "distributeStorage": [ + { + "type": 0, + "value": "FR Storage" + } + ], + "distributeUnallocatedCapacity": [ + { + "options": { + "false": { + "value": [ + { + "type": 0, + "value": "FR Do not distribute worker unallocated capacity" + } + ] + }, + "other": { + "value": [] + }, + "true": { + "value": [ + { + "type": 0, + "value": "FR Distribute worker unallocated capacity" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "distributeWorker": [ + { + "type": 0, + "value": "FR Worker unallowcated (unused and non-reserved resources)" + } + ], + "distributionModelDesc": [ + { + "type": 0, + "value": "FR Choose how your raw costs are distributed at the project level." + } + ], + "distributionType": [ + { + "type": 0, + "value": "FR Distribution type" + } + ], + "distributionTypeDesc": [ + { + "options": { + "cpu": { + "value": [ + { + "type": 0, + "value": "FR Distribute costs based on CPU usage" + } + ] + }, + "memory": { + "value": [ + { + "type": 0, + "value": "FR Distribute costs based on memory usage" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "type" + } + ], + "docsAddOcpSources": [ + { + "type": 0, + "value": "FR https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_openshift_container_platform_data_into_cost_management" + } + ], + "docsCostCategory": [ + { + "type": 0, + "value": "FR 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" + } + ], + "docsCostModelTerminology": [ + { + "type": 0, + "value": "FR https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/using_cost_models/index#cost-model-terminology" + } + ], + "docsCostModels": [ + { + "type": 0, + "value": "FR https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/using_cost_models/index#assembly-setting-up-cost-models" + } + ], + "docsCostModelsDistribution": [ + { + "type": 0, + "value": "FR https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/using_cost_models/assembly-using-cost-models#distributing_costs" + } + ], + "docsCostModelsMarkup": [ + { + "type": 0, + "value": "FR 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": [ + { + "type": 0, + "value": "FR 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" + } + ], + "docsPlatformProjects": [ + { + "type": 0, + "value": "FR https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/using_cost_models/assembly-using-cost-models#adding-openshift-projects" + } + ], + "docsTagMapping": [ + { + "type": 0, + "value": "FR https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/managing_cost_data_using_tagging" + } + ], + "docsTags": [ + { + "type": 0, + "value": "FR 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" + } + ], + "docsUsingCostModels": [ + { + "type": 0, + "value": "FR https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/using_cost_models" + } + ], + "download": [ + { + "type": 0, + "value": "FR Download" + } + ], + "edit": [ + { + "type": 0, + "value": "FR Edit" + } + ], + "editCostModel": [ + { + "type": 0, + "value": "FR Edit cost model" + } + ], + "editMarkup": [ + { + "type": 0, + "value": "FR Edit markup" + } + ], + "editMarkupOrDiscount": [ + { + "type": 0, + "value": "FR Edit markup or discount" + } + ], + "emptyFilterSourceStateSubtitle": [ + { + "type": 0, + "value": "FR Sorry, no source with the given filter was found." + } + ], + "emptyFilterStateSubtitle": [ + { + "type": 0, + "value": "FR Sorry, no data with the given filter was found." + } + ], + "emptyFilterStateTitle": [ + { + "type": 0, + "value": "FR No match found" + } + ], + "enableCategories": [ + { + "type": 0, + "value": "FR Enable categories" + } + ], + "enableTags": [ + { + "type": 0, + "value": "FR Enable tags" + } + ], + "enabled": [ + { + "type": 0, + "value": "FR Enabled" + } + ], + "end": [ + { + "type": 0, + "value": "FR End" + } + ], + "equalsSymbol": [ + { + "type": 0, + "value": "FR =" + } + ], + "errorStateNotAuthorizedDesc": [ + { + "type": 0, + "value": "FR Contact the cost management administrator to provide access to this application" + } + ], + "errorStateNotAuthorizedTitle": [ + { + "type": 0, + "value": "FR You don't have access to the Cost management application" + } + ], + "errorStateUnexpectedDesc": [ + { + "type": 0, + "value": "FR We encountered an unexpected error. Contact your administrator." + } + ], + "errorStateUnexpectedTitle": [ + { + "type": 0, + "value": "FR Oops!" + } + ], + "examplesTitle": [ + { + "type": 0, + "value": "FR Examples" + } + ], + "excludeLabel": [ + { + "type": 0, + "value": "FR Excludes: " + }, + { + "type": 1, + "value": "value" + } + ], + "excludeValues": [ + { + "options": { + "excludes": { + "value": [ + { + "type": 0, + "value": "FR excludes" + } + ] + }, + "includes": { + "value": [ + { + "type": 0, + "value": "FR includes" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "value" + } + ], + "expiresOn": [ + { + "type": 0, + "value": "FR Expires on" + } + ], + "explorerChartAriaTitle": [ + { + "type": 0, + "value": "FR Cost Explorer Chart" + } + ], + "explorerChartTitle": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services - Top 5 Costliest" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift - Top 5 Costliest" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure - Top 5 Costliest" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift - Top 5 Costliest" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform - Top 5 Costliest" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift - Top 5 Costliest" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud - Top 5 Costliest" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift - Top 5 Costliest" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure - Top 5 Costliest" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR All OpenShift - Top 5 Costliest" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift - Top 5 Costliest" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "value" + } + ], + "explorerDateRange": [ + { + "options": { + "current_month_to_date": { + "value": [ + { + "type": 0, + "value": "FR Month to date" + } + ] + }, + "custom": { + "value": [ + { + "type": 0, + "value": "FR Custom" + } + ] + }, + "last_ninety_days": { + "value": [ + { + "type": 0, + "value": "FR Last 90 days" + } + ] + }, + "last_sixty_days": { + "value": [ + { + "type": 0, + "value": "FR Last 60 days" + } + ] + }, + "last_thirty_days": { + "value": [ + { + "type": 0, + "value": "FR Last 30 days" + } + ] + }, + "other": { + "value": [] + }, + "previous_month": { + "value": [ + { + "type": 0, + "value": "FR Previous month" + } + ] + }, + "previous_month_to_date": { + "value": [ + { + "type": 0, + "value": "FR Previous month and month to date" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "explorerTableAriaLabel": [ + { + "type": 0, + "value": "FR Cost Explorer table" + } + ], + "explorerTitle": [ + { + "type": 0, + "value": "FR Cost Explorer" + } + ], + "exportAggregateType": [ + { + "type": 0, + "value": "FR Aggregate type" + } + ], + "exportAll": [ + { + "type": 0, + "value": "FR Export all" + } + ], + "exportDesc": [ + { + "type": 0, + "value": "FR The active selections from the table plus the values here will be used to generate an export file. When the file is available, download it from the " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " view." + } + ], + "exportError": [ + { + "type": 0, + "value": "FR Something went wrong, please try fewer selections" + } + ], + "exportFileName": [ + { + "options": { + "account": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _accounts_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _accounts_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "aws_category": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _cost_category_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _cost_category_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "cluster": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _clusters_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _clusters_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "gcp_project": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _gcp-projects_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _gcp-projects_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "instance": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _instances_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _instances_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "node": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _node_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _node_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "org_unit_id": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _orgs_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _orgs_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _accounts_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _accounts_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "product_service": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _services_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _services_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "project": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _projects_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _projects_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "region": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _regions_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _regions_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "resource_id": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _resources_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _resources_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "resource_location": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _regions_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _regions_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "service": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _services_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _services_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "service_name": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _services_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _services_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "subscription_guid": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _accounts_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _accounts_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + }, + "tag": { + "value": [ + { + "options": { + "daily": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _tags_daily_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "monthly": { + "value": [ + { + "type": 1, + "value": "provider" + }, + { + "type": 0, + "value": "FR _tags_monthly_" + }, + { + "type": 1, + "value": "startDate" + }, + { + "type": 0, + "value": "_" + }, + { + "type": 1, + "value": "endDate" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "resolution" + } + ] + } + }, + "type": 5, + "value": "groupBy" + } + ], + "exportFormatType": [ + { + "options": { + "csv": { + "value": [ + { + "type": 0, + "value": "FR CSV" + } + ] + }, + "json": { + "value": [ + { + "type": 0, + "value": "FR JSON" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "value" + } + ], + "exportFormatTypeTitle": [ + { + "type": 0, + "value": "FR Format type" + } + ], + "exportGenerate": [ + { + "type": 0, + "value": "FR Generate export" + } + ], + "exportHeading": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following accounts will be exported to a .csv file." + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following cost categories will be exported to a .csv file." + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following clusters will be exported to a .csv file." + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following GCP projects will be exported to a .csv file." + } + ] + }, + "instance": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following instances will be exported to a .csv file." + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following nodes will be exported to a .csv file." + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following organizational units will be exported to a .csv file." + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following accounts will be exported to a .csv file." + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following services will be exported to a .csv file." + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following projects will be exported to a .csv file." + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following regions will be exported to a .csv file." + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the regions will be exported to a .csv file." + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following services will be exported to a .csv file." + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following services will be exported to a .csv file." + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following accounts will be exported to a .csv file." + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR Aggregates of the following tags will be exported to a .csv file." + } + ] + } + }, + "type": 5, + "value": "groupBy" + } + ], + "exportName": [ + { + "options": { + "account": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Account" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Account" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Account" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Account" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Account" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Account" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Account" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Account" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Account" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Account" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Account" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "aws_category": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Cost category" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Cost category" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Cost category" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Cost category" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Cost category" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Cost category" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Cost category" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Cost category" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Cost category" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Cost category" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Cost category" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "cluster": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Cluster" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Cluster" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Cluster" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Cluster" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Cluster" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Cluster" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Cluster" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Cluster" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Cluster" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Cluster" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Cluster" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "gcp_project": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by GCP Project" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by GCP Project" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by GCP Project" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by GCP Project" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by GCP Project" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by GCP Project" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by GCP Project" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by GCP Project" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by GCP Project" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by GCP Project" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by GCP Project" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "instance": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by instance" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by instance" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by instance" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by instance" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by instance" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by instance" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by instance" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by instance" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by instance" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by instance" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by instance" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "node": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Node" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Node" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Node" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Node" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Node" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Node" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Node" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Node" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Node" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Node" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Node" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "org_unit_id": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Organizational unit" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Organizational unit" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Organizational unit" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Organizational unit" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Organizational unit" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Organizational unit" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Organizational unit" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Organizational unit" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Organizational unit" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Organizational unit" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Organizational unit" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "options": { + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Account" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "product_service": { + "value": [ + { + "options": { + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Service" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "project": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Project" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Project" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Project" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Project" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Project" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Project" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Project" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Project" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Project" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Project" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Project" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "region": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Region" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Region" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Region" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Region" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Region" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Region" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Region" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Region" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Region" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Region" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Region" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "resource_location": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Region" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Region" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Region" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Region" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Region" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Region" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Region" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Region" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Region" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Region" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Region" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "service": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Service" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Service" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Service" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Service" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Service" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Service" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Service" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Service" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Service" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Service" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Service" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "service_name": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Service" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Service" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Service" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Service" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Service" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Service" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Service" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Service" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Service" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Service" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Service" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "subscription_guid": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Account" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Account" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Account" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Account" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Account" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Account" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Account" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Account" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Account" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Account" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Account" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + }, + "tag": { + "value": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services grouped by Tag" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift grouped by Tag" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure grouped by Tag" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift grouped by Tag" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform grouped by Tag" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift grouped by Tag" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud grouped by Tag" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud filtered by OpenShift grouped by Tag" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure grouped by Tag" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift grouped by Tag" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift grouped by Tag" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "provider" + } + ] + } + }, + "type": 5, + "value": "groupBy" + } + ], + "exportNameRequired": [ + { + "type": 0, + "value": "FR Please enter a name for the export" + } + ], + "exportNameTooLong": [ + { + "type": 0, + "value": "FR Should not exceed 255 characters" + } + ], + "exportResolution": [ + { + "options": { + "daily": { + "value": [ + { + "type": 0, + "value": "FR Daily" + } + ] + }, + "monthly": { + "value": [ + { + "type": 0, + "value": "FR Monthly" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "value" + } + ], + "exportSelected": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR Selected accounts (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR Selected cost categories (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Selected clusters (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR Selected GCP projects (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "instance": { + "value": [ + { + "type": 0, + "value": "FR Selected instances (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Selected nodes (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR Selected organizational units (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR Selected accounts (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR Selected services (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR Selected projects (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR Selected regions (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR Selected regions (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR Selected services (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR Selected services (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR Selected accounts (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR Selected tags (" + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": ")" + } + ] + } + }, + "type": 5, + "value": "groupBy" + } + ], + "exportTimeScope": [ + { + "options": { + "current": { + "value": [ + { + "type": 0, + "value": "FR Current (" + }, + { + "type": 1, + "value": "date" + }, + { + "type": 0, + "value": ")" + } + ] + }, + "other": { + "value": [] + }, + "previous": { + "value": [ + { + "type": 0, + "value": "FR Previous (" + }, + { + "type": 1, + "value": "date" + }, + { + "type": 0, + "value": ")" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "exportTimeScopeTitle": [ + { + "type": 0, + "value": "FR Month" + } + ], + "exportTitle": [ + { + "type": 0, + "value": "FR Export" + } + ], + "exportsDesc": [ + { + "type": 0, + "value": "FR Exports are available for download from the time that they are generated up to 7 days later. After 7 days, the export file will be removed." + } + ], + "exportsEmptyState": [ + { + "type": 0, + "value": "FR To get started, close this view and select rows in the table you want to export and click the export button to start the journey." + } + ], + "exportsFailed": [ + { + "type": 0, + "value": "FR Could not create export file" + } + ], + "exportsFailedDesc": [ + { + "type": 0, + "value": "FR Something went wrong with the generation of this export file. Try exporting again." + } + ], + "exportsSuccess": [ + { + "type": 0, + "value": "FR Export preparing for download" + } + ], + "exportsSuccessDesc": [ + { + "type": 0, + "value": "FR The export is preparing for download. It will be accessible from " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " view. " + }, + { + "type": 1, + "value": "link" + } + ], + "exportsTableAriaLabel": [ + { + "type": 0, + "value": "FR Available exports table" + } + ], + "exportsTitle": [ + { + "type": 0, + "value": "FR All exports" + } + ], + "exportsUnavailable": [ + { + "type": 0, + "value": "FR Export cannot be generated" + } + ], + "filterByButtonAriaLabel": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR Filter button for account name" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR Filter button for cost category name" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Filter button for cluster name" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR Filter button for GCP project name" + } + ] + }, + "name": { + "value": [ + { + "type": 0, + "value": "FR Filter button for name name" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Filter button for node name" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR Filter button for organizational unit name" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR Filter button for account name" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR Filter button for service name" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR Filter button for project name" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR Filter button for region name" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR Filter button for region name" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR Filter button for service name" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR Filter button for service_name name" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR Filter button for account name" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR Filter button for tag name" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "filterByCostCategoryKeyAriaLabel": [ + { + "type": 0, + "value": "FR Cost category keys" + } + ], + "filterByCostCategoryValueAriaLabel": [ + { + "type": 0, + "value": "FR Cost category values" + } + ], + "filterByCostCategoryValueButtonAriaLabel": [ + { + "type": 0, + "value": "FR Filter button for cost category value" + } + ], + "filterByInputAriaLabel": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR Input for account name" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR Input for cost category name" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Input for cluster name" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR Input for GCP project name" + } + ] + }, + "name": { + "value": [ + { + "type": 0, + "value": "FR Input for name" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Input for node name" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR Input for organizational unit name" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR Input for account name" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR Input for service_name" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR Input for project name" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR Input for region name" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR Input for region name" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR Input for service name" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR Input for service_name" + } + ] + }, + "status": { + "value": [ + { + "type": 0, + "value": "FR Input for status value" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR Input for account name" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR Input for tag name" + } + ] + }, + "tag_key": { + "value": [ + { + "type": 0, + "value": "FR Input for tag key" + } + ] + }, + "tag_key_child": { + "value": [ + { + "type": 0, + "value": "FR Input for child tag key" + } + ] + }, + "tag_key_parent": { + "value": [ + { + "type": 0, + "value": "FR Input for parent tag key" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "filterByOrgUnitAriaLabel": [ + { + "type": 0, + "value": "FR Organizational units" + } + ], + "filterByOrgUnitPlaceholder": [ + { + "type": 0, + "value": "FR Choose unit" + } + ], + "filterByPlaceholder": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR Filter by account" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR Filter by cost category" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Filter by cluster" + } + ] + }, + "container": { + "value": [ + { + "type": 0, + "value": "FR Filter by container" + } + ] + }, + "description": { + "value": [ + { + "type": 0, + "value": "FR Filter by description" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR Filter by GCP project" + } + ] + }, + "group": { + "value": [ + { + "type": 0, + "value": "FR Filter by group" + } + ] + }, + "name": { + "value": [ + { + "type": 0, + "value": "FR Filter by name" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Filter by node" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR Filter by organizational unit" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR Filter by account" + } + ] + }, + "persistent_volume_claim": { + "value": [ + { + "type": 0, + "value": "FR Filter by persistent volume claim" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR Filter by service" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR Filter by project" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR Filter by region" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR Filter by region" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR Filter by service" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR Filter by service" + } + ] + }, + "source_type": { + "value": [ + { + "type": 0, + "value": "FR Filter by integration" + } + ] + }, + "status": { + "value": [ + { + "type": 0, + "value": "FR Filter by status" + } + ] + }, + "storage_class": { + "value": [ + { + "type": 0, + "value": "FR Filter by StorageClass" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR Filter by account" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR Filter by tag" + } + ] + }, + "tag_key": { + "value": [ + { + "type": 0, + "value": "FR Filter by tag key" + } + ] + }, + "tag_key_child": { + "value": [ + { + "type": 0, + "value": "FR Filter by child tag key" + } + ] + }, + "tag_key_parent": { + "value": [ + { + "type": 0, + "value": "FR Filter by parent tag key" + } + ] + }, + "workload": { + "value": [ + { + "type": 0, + "value": "FR Filter by workload name" + } + ] + }, + "workload_type": { + "value": [ + { + "type": 0, + "value": "FR Filter by workload type" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "filterByTagKeyAriaLabel": [ + { + "type": 0, + "value": "FR Tag keys" + } + ], + "filterByTagValueAriaLabel": [ + { + "type": 0, + "value": "FR Tag values" + } + ], + "filterByTagValueButtonAriaLabel": [ + { + "type": 0, + "value": "FR Filter button for tag value" + } + ], + "filterByValuePlaceholder": [ + { + "type": 0, + "value": "FR Filter by value" + } + ], + "filterByValues": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR Account" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR Cost category" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Cluster" + } + ] + }, + "container": { + "value": [ + { + "type": 0, + "value": "FR Container" + } + ] + }, + "default": { + "value": [ + { + "type": 0, + "value": "FR Default" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR GCP project" + } + ] + }, + "group": { + "value": [ + { + "type": 0, + "value": "FR Group" + } + ] + }, + "instance": { + "value": [ + { + "type": 0, + "value": "FR Instance" + } + ] + }, + "name": { + "value": [ + { + "type": 0, + "value": "FR Name" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Node" + } + ] + }, + "operating_system": { + "value": [ + { + "type": 0, + "value": "FR Operating system" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR Organizational unit" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR Account" + } + ] + }, + "persistent_volume_claim": { + "value": [ + { + "type": 0, + "value": "FR Persistent volume claim" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR Service" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR Project" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR Region" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR Region" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR Service" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR Service" + } + ] + }, + "source_type": { + "value": [ + { + "type": 0, + "value": "FR Integration" + } + ] + }, + "status": { + "value": [ + { + "type": 0, + "value": "FR Status" + } + ] + }, + "storage_class": { + "value": [ + { + "type": 0, + "value": "FR StorageClass" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR Account" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR Tag" + } + ] + }, + "tag_key": { + "value": [ + { + "type": 0, + "value": "FR Tag key" + } + ] + }, + "tag_key_child": { + "value": [ + { + "type": 0, + "value": "FR Child tag Key" + } + ] + }, + "tag_key_parent": { + "value": [ + { + "type": 0, + "value": "FR Parent tag Key" + } + ] + }, + "workload": { + "value": [ + { + "type": 0, + "value": "FR Workload name" + } + ] + }, + "workload_type": { + "value": [ + { + "type": 0, + "value": "FR Workload type" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "filterByValuesAriaLabel": [ + { + "type": 0, + "value": "FR Values" + } + ], + "filteredBy": [ + { + "type": 0, + "value": "FR Filtered by" + } + ], + "filteredByWarning": [ + { + "type": 0, + "value": "FR This page shows filtered results. To undo filters, clear filters on the previous page." + } + ], + "forDate": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR for " + }, + { + "type": 1, + "value": "dateRange" + } + ], + "gcp": [ + { + "type": 0, + "value": "FR Google Cloud Platform" + } + ], + "gcpComputeTitle": [ + { + "type": 0, + "value": "FR Compute instances usage" + } + ], + "gcpCostTitle": [ + { + "type": 0, + "value": "FR Google Cloud Platform Services cost" + } + ], + "gcpCostTrendTitle": [ + { + "type": 0, + "value": "FR Google Cloud Platform Services cumulative cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "gcpDailyCostTrendTitle": [ + { + "type": 0, + "value": "FR Google Cloud Platform Services daily cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "gcpDesc": [ + { + "type": 0, + "value": "FR Raw cost from Google Cloud Platform infrastructure." + } + ], + "gcpDetailsTitle": [ + { + "type": 0, + "value": "FR Google Cloud Platform Details" + } + ], + "groupByAll": [ + { + "options": { + "account": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "aws_category": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All cost category" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All cost categories" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "cluster": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All cluster" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All clusters" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "gcp_project": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All GCP project" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All GCP projects" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "node": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All node" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All nodes" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "org_unit_id": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All organizational unit" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All organizational units" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "product_service": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "project": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All project" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All projects" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "region": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All region" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All regions" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "resource_location": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All region" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All regions" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "service": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "service_name": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "subscription_guid": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "tag": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR All tag" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR All tags" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "groupByLabel": [ + { + "type": 0, + "value": "FR Group by" + } + ], + "groupByTop": [ + { + "options": { + "account": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "aws_category": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top cost category" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top cost categories" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "cluster": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top cluster" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top clusters" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "gcp_project": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top GCP project" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top GCP projects" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "node": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top node" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top node" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "org_unit_id": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top organizational unit" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top organizational units" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "product_service": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "project": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top project" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top projects" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "region": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top region" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top regions" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "resource_location": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top region" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top regions" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "service": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "service_name": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "subscription_guid": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "tag": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Top tag" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Top tags" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "groupByValueNames": [ + { + "options": { + "account": { + "value": [ + { + "type": 0, + "value": "FR Account names" + } + ] + }, + "aws_category": { + "value": [ + { + "type": 0, + "value": "FR Cost category names" + } + ] + }, + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Cluster names" + } + ] + }, + "gcp_project": { + "value": [ + { + "type": 0, + "value": "FR GCP project names" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Node names" + } + ] + }, + "org_unit_id": { + "value": [ + { + "type": 0, + "value": "FR Organizational unit names" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "type": 0, + "value": "FR Account names" + } + ] + }, + "product_service": { + "value": [ + { + "type": 0, + "value": "FR Service names" + } + ] + }, + "project": { + "value": [ + { + "type": 0, + "value": "FR Project names" + } + ] + }, + "region": { + "value": [ + { + "type": 0, + "value": "FR Region names" + } + ] + }, + "resource_location": { + "value": [ + { + "type": 0, + "value": "FR Region names" + } + ] + }, + "service": { + "value": [ + { + "type": 0, + "value": "FR Service names" + } + ] + }, + "service_name": { + "value": [ + { + "type": 0, + "value": "FR Service names" + } + ] + }, + "subscription_guid": { + "value": [ + { + "type": 0, + "value": "FR Account names" + } + ] + }, + "tag": { + "value": [ + { + "type": 0, + "value": "FR Tag names" + } + ] + } + }, + "type": 5, + "value": "groupBy" + } + ], + "groupByValues": [ + { + "options": { + "account": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "aws_category": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR cost category" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR cost categories" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "cluster": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR cluster" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR clusters" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "gcp_project": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR GCP project" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR GCP projects" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "node": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR node" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR node" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "org_unit_id": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR organizational unit" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR organizational units" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "product_service": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "project": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR project" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR projects" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "region": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR region" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR regions" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "resource_location": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR region" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR regions" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "service": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "service_name": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "subscription_guid": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "tag": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR tag" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR tags" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "groupByValuesTitleCase": [ + { + "options": { + "account": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "aws_category": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Cost category" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Cost categories" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "cluster": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Cluster" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Clusters" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "gcp_project": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR GCP project" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR GCP projects" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "node": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Node" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Node" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "org_unit_id": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Organizational unit" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Organizational units" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "other": { + "value": [] + }, + "payer_tenant_id": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "product_service": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "project": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Project" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Projects" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "region": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Region" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Regions" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "resource_location": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Region" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Regions" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "service": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "service_name": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Service" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Services" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "subscription_guid": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Account" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Accounts" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "tag": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Tag" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Tags" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "historicalChartCostLabel": [ + { + "type": 0, + "value": "FR Cost (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "historicalChartDayOfMonthLabel": [ + { + "type": 0, + "value": "FR Day of Month" + } + ], + "historicalChartTitle": [ + { + "options": { + "cost": { + "value": [ + { + "type": 0, + "value": "FR Cost comparison" + } + ] + }, + "cpu": { + "value": [ + { + "type": 0, + "value": "FR CPU usage, request, and limit comparison" + } + ] + }, + "instance_type": { + "value": [ + { + "type": 0, + "value": "FR Compute usage comparison" + } + ] + }, + "memory": { + "value": [ + { + "type": 0, + "value": "FR Memory usage, request, and limit comparison" + } + ] + }, + "modal": { + "value": [ + { + "type": 1, + "value": "name" + }, + { + "type": 0, + "value": "FR daily usage comparison" + } + ] + }, + "network": { + "value": [ + { + "type": 0, + "value": "FR Network usage comparison" + } + ] + }, + "other": { + "value": [] + }, + "storage": { + "value": [ + { + "type": 0, + "value": "FR Storage usage comparison" + } + ] + }, + "virtual_machine": { + "value": [ + { + "type": 0, + "value": "FR Virtual machine usage comparison" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "historicalChartUsageLabel": [ + { + "options": { + "instance_type": { + "value": [ + { + "type": 0, + "value": "FR hrs" + } + ] + }, + "other": { + "value": [] + }, + "storage": { + "value": [ + { + "type": 0, + "value": "FR gb-mo" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "ibm": [ + { + "type": 0, + "value": "FR IBM Cloud" + } + ], + "ibmComputeTitle": [ + { + "type": 0, + "value": "FR Compute instances usage" + } + ], + "ibmCostTitle": [ + { + "type": 0, + "value": "FR IBM Cloud Services cost" + } + ], + "ibmCostTrendTitle": [ + { + "type": 0, + "value": "FR IBM Cloud Services cumulative cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "ibmDailyCostTrendTitle": [ + { + "type": 0, + "value": "FR IBM Cloud Services daily cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "ibmDesc": [ + { + "type": 0, + "value": "FR Raw cost from IBM Cloud infrastructure." + } + ], + "ibmDetailsTitle": [ + { + "type": 0, + "value": "FR IBM Cloud Details" + } + ], + "inactiveSourcesGoTo": [ + { + "type": 0, + "value": "FR Go to Integrations for more information" + } + ], + "inactiveSourcesTitle": [ + { + "type": 0, + "value": "FR A problem was detected with " + }, + { + "type": 1, + "value": "value" + } + ], + "inactiveSourcesTitleMultiplier": [ + { + "type": 0, + "value": "FR A problem was detected with the following integrations" + } + ], + "infrastructure": [ + { + "type": 0, + "value": "FR Infrastructure" + } + ], + "instances": [ + { + "type": 0, + "value": "FR Instances" + } + ], + "integration": [ + { + "type": 0, + "value": "FR Integration" + } + ], + "lastProcessed": [ + { + "type": 0, + "value": "FR Last processed" + } + ], + "lastUpdated": [ + { + "type": 0, + "value": "FR Last updated" + } + ], + "learnMore": [ + { + "type": 0, + "value": "FR Learn more" + } + ], + "loadingStateDesc": [ + { + "type": 0, + "value": "FR Searching for your integrations. Do not refresh the browser" + } + ], + "loadingStateTitle": [ + { + "type": 0, + "value": "FR Looking for integrations..." + } + ], + "maintenanceEmptyStateDesc": [ + { + "type": 0, + "value": "FR Cost Management is currently undergoing scheduled maintenance and will be unavailable from 13:00 - 19:00 UTC (09:00 AM - 03:00 PM EDT)." + } + ], + "maintenanceEmptyStateInfo": [ + { + "type": 0, + "value": "FR For more information visit " + }, + { + "type": 1, + "value": "url" + } + ], + "maintenanceEmptyStateThanks": [ + { + "type": 0, + "value": "FR We will be back soon. Thank you for your patience!" + } + ], + "manageColumnsAriaLabel": [ + { + "type": 0, + "value": "FR Table column management" + } + ], + "manageColumnsDesc": [ + { + "type": 0, + "value": "FR Selected categories will be displayed in the table" + } + ], + "manageColumnsTitle": [ + { + "type": 0, + "value": "FR Manage columns" + } + ], + "markupDesc": [ + { + "type": 0, + "value": "FR The portion of cost calculated by applying markup or discount to infrastructure raw cost in the cost management application" + } + ], + "markupOrDiscount": [ + { + "type": 0, + "value": "FR Markup or Discount" + } + ], + "markupOrDiscountDesc": [ + { + "type": 0, + "value": "FR This Percentage is applied to raw cost calculations by multiplying the cost with this percentage. Costs calculated from price list rates will not be effected." + } + ], + "markupOrDiscountModalDesc": [ + { + "type": 0, + "value": "FR Use markup/discount to manipulate how the raw costs are being calculated for your integrations. Note, costs calculated from price list rates will not be affected by this." + } + ], + "markupOrDiscountNumber": [ + { + "type": 0, + "value": "FR Markup or discount must be a number" + } + ], + "markupOrDiscountTooLong": [ + { + "type": 0, + "value": "FR Should not exceed 10 decimals" + } + ], + "markupPlus": [ + { + "type": 0, + "value": "FR Markup (+)" + } + ], + "markupTitle": [ + { + "type": 0, + "value": "FR Markup" + } + ], + "measurement": [ + { + "type": 0, + "value": "FR Measurement" + } + ], + "measurementPlaceholder": [ + { + "type": 0, + "value": "FR Filter by measurements" + } + ], + "measurementValues": [ + { + "options": { + "count": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Count" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Count (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "effective_usage": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Request" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Effective-usage (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "other": { + "value": [] + }, + "request": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Request" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Request (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "usage": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Usage" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Usage (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "measurementValuesDesc": [ + { + "options": { + "count": { + "value": [ + { + "options": { + "cluster_month": { + "value": [ + { + "type": 0, + "value": "FR The distinct number of clusters identified during the month" + } + ] + }, + "node_month": { + "value": [ + { + "type": 0, + "value": "FR The distinct number of nodes identified during the month" + } + ] + }, + "other": { + "value": [] + }, + "pvc_month": { + "value": [ + { + "type": 0, + "value": "FR The distinct number of volume claims identified during the month" + } + ] + } + }, + "type": 5, + "value": "units" + } + ] + }, + "effective_usage": { + "value": [ + { + "type": 0, + "value": "FR The greater of usage and request each hour" + } + ] + }, + "other": { + "value": [] + }, + "request": { + "value": [ + { + "type": 0, + "value": "FR The pod resources requested, as reported by OpenShift" + } + ] + }, + "usage": { + "value": [ + { + "type": 0, + "value": "FR The pod resources used, as reported by OpenShift" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "memoryTitle": [ + { + "type": 0, + "value": "FR Memory" + } + ], + "metric": [ + { + "type": 0, + "value": "FR Metric" + } + ], + "metricPlaceholder": [ + { + "type": 0, + "value": "FR Filter by metrics" + } + ], + "metricValues": [ + { + "options": { + "cluster": { + "value": [ + { + "type": 0, + "value": "FR Cluster" + } + ] + }, + "cpu": { + "value": [ + { + "type": 0, + "value": "FR CPU" + } + ] + }, + "memory": { + "value": [ + { + "type": 0, + "value": "FR Memory" + } + ] + }, + "node": { + "value": [ + { + "type": 0, + "value": "FR Node" + } + ] + }, + "other": { + "value": [] + }, + "persistent_volume_claims": { + "value": [ + { + "type": 0, + "value": "FR Persistent volume claims" + } + ] + }, + "storage": { + "value": [ + { + "type": 0, + "value": "FR Storage" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "metricsOperatorVersion": [ + { + "type": 0, + "value": "FR Cost Management operator version" + } + ], + "monthOverMonthChange": [ + { + "type": 0, + "value": "FR Month over month change" + } + ], + "moreOptions": [ + { + "type": 0, + "value": "FR More options" + } + ], + "names": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR Name" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR Names" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ], + "next": [ + { + "type": 0, + "value": "FR next" + } + ], + "no": [ + { + "type": 0, + "value": "FR No" + } + ], + "noDataForDate": [ + { + "type": 0, + "value": "FR No data available for " + }, + { + "type": 1, + "value": "dateRange" + } + ], + "noDataStateDesc": [ + { + "type": 0, + "value": "FR We have detected an integration, but we are not done processing the incoming data. The time to process could take up to 24 hours. Try refreshing the page at a later time." + } + ], + "noDataStateRefresh": [ + { + "type": 0, + "value": "FR Refresh this page" + } + ], + "noDataStateTitle": [ + { + "type": 0, + "value": "FR Still processing the data" + } + ], + "noExportsStateTitle": [ + { + "type": 0, + "value": "FR There are no export files available" + } + ], + "noInstancesDesc": [ + { + "type": 0, + "value": "FR Add an Amazon EC2 instance to see a total cost breakdown of your spend by instances." + } + ], + "noInstancesTitle": [ + { + "type": 0, + "value": "FR No instances available" + } + ], + "noMappedTags": [ + { + "type": 0, + "value": "FR No mapped tags" + } + ], + "noMappedTagsDesc": [ + { + "type": 0, + "value": "FR Map multiple tags across data sources to be used as a single tag key for report grouping and filtering. " + }, + { + "type": 1, + "value": "warning" + }, + { + "type": 0, + "value": " Changes will be reflected within 24 hours. " + }, + { + "type": 1, + "value": "learnMore" + } + ], + "noMappedTagsWarning": [ + { + "type": 0, + "value": "FR Tags must be enabled to be mapped." + } + ], + "noProvidersStateAwsDesc": [ + { + "type": 0, + "value": "FR Add an Amazon Web Services account to see a total cost breakdown of your spend by accounts, organizational units, services, regions, or tags." + } + ], + "noProvidersStateAwsTitle": [ + { + "type": 0, + "value": "FR Track your Amazon Web Services spending!" + } + ], + "noProvidersStateAzureDesc": [ + { + "type": 0, + "value": "FR Add a Microsoft Azure account to see a total cost breakdown of your spend by accounts, services, regions, or tags." + } + ], + "noProvidersStateAzureTitle": [ + { + "type": 0, + "value": "FR Track your Microsoft Azure spending!" + } + ], + "noProvidersStateGcpDesc": [ + { + "type": 0, + "value": "FR Add a Google Cloud Platform account to see a total cost breakdown of your spend by accounts, services, regions, or tags." + } + ], + "noProvidersStateGcpTitle": [ + { + "type": 0, + "value": "FR Track your Google Cloud Platform spending!" + } + ], + "noProvidersStateGetStarted": [ + { + "type": 0, + "value": "FR Get started with Integrations" + } + ], + "noProvidersStateIbmDesc": [ + { + "type": 0, + "value": "FR Add an IBM Cloud account to see a total cost breakdown of your spend by accounts, services, regions, or tags." + } + ], + "noProvidersStateIbmTitle": [ + { + "type": 0, + "value": "FR Track your IBM Cloud spending!" + } + ], + "noProvidersStateOcpAddSources": [ + { + "type": 0, + "value": "FR Add an OpenShift cluster to Cost Management" + } + ], + "noProvidersStateOcpDesc": [ + { + "type": 0, + "value": "FR Add an OpenShift Container Platform cluster to see a total cost breakdown of your pods by cluster, node, project, or labels." + } + ], + "noProvidersStateOcpTitle": [ + { + "type": 0, + "value": "FR Track your OpenShift spending!" + } + ], + "noProvidersStateOverviewDesc": [ + { + "type": 0, + "value": "FR 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": [ + { + "type": 0, + "value": "FR Track your spending!" + } + ], + "noResultsFound": [ + { + "type": 0, + "value": "FR No results found" + } + ], + "notAuthorizedStateAws": [ + { + "type": 0, + "value": "FR Amazon Web Services in Cost Management" + } + ], + "notAuthorizedStateAzure": [ + { + "type": 0, + "value": "FR Microsoft Azure in Cost Management" + } + ], + "notAuthorizedStateCostModels": [ + { + "type": 0, + "value": "FR Cost Models in Cost Management" + } + ], + "notAuthorizedStateGcp": [ + { + "type": 0, + "value": "FR Google Cloud Platform in Cost Management" + } + ], + "notAuthorizedStateIbm": [ + { + "type": 0, + "value": "FR IBM Cloud in Cost Management" + } + ], + "notAuthorizedStateOci": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure in Cost Management" + } + ], + "notAuthorizedStateOcp": [ + { + "type": 0, + "value": "FR OpenShift in Cost Management" + } + ], + "notAuthorizedStateOptimizations": [ + { + "type": 0, + "value": "FR Optimizations in Cost Management" + } + ], + "notAuthorizedStateRhel": [ + { + "type": 0, + "value": "FR RHEL in Cost Management" + } + ], + "notAuthorizedStateSettings": [ + { + "type": 0, + "value": "FR Settings in Cost Management" + } + ], + "oci": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure" + } + ], + "ociComputeTitle": [ + { + "type": 0, + "value": "FR Virtual machines usage" + } + ], + "ociCostTrendTitle": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure cumulative cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "ociDailyCostTrendTitle": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure daily cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "ociDashboardCostTitle": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure cost" + } + ], + "ociDesc": [ + { + "type": 0, + "value": "FR Raw cost from Oracle Cloud Infrastructure." + } + ], + "ociDetailsTitle": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure Details" + } + ], + "ocpCloudDashboardComputeTitle": [ + { + "type": 0, + "value": "FR Compute services usage" + } + ], + "ocpCloudDashboardCostTitle": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift cost" + } + ], + "ocpCloudDashboardCostTrendTitle": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift cumulative cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "ocpCloudDashboardDailyCostTrendTitle": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift daily cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "ocpClusterDetails": [ + { + "type": 0, + "value": "FR OpenShift cluster details" + } + ], + "ocpCpuUsageAndRequests": [ + { + "type": 0, + "value": "FR CPU usage and requests" + } + ], + "ocpDailyUsageAndRequestComparison": [ + { + "type": 0, + "value": "FR Daily usage and requests comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "ocpDashboardCostTitle": [ + { + "type": 0, + "value": "FR All OpenShift cost" + } + ], + "ocpDashboardCostTrendTitle": [ + { + "type": 0, + "value": "FR All OpenShift cumulative cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "ocpDashboardDailyCostTitle": [ + { + "type": 0, + "value": "FR All OpenShift daily cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "ocpDetailsInfrastructureCost": [ + { + "type": 0, + "value": "FR Infrastructure cost" + } + ], + "ocpDetailsInfrastructureCostDesc": [ + { + "type": 0, + "value": "FR The cost based on raw usage data from the underlying infrastructure." + } + ], + "ocpDetailsSupplementaryCost": [ + { + "type": 0, + "value": "FR Supplementary cost" + } + ], + "ocpDetailsSupplementaryCostDesc": [ + { + "type": 0, + "value": "FR All costs not directly attributed to the infrastructure. These costs are determined by applying a price list within a cost model to OpenShift cluster metrics." + } + ], + "ocpDetailsTitle": [ + { + "type": 0, + "value": "FR OpenShift Details" + } + ], + "ocpMemoryUsageAndRequests": [ + { + "type": 0, + "value": "FR Memory usage and requests" + } + ], + "ocpVolumeUsageAndRequests": [ + { + "type": 0, + "value": "FR Volume usage and requests" + } + ], + "openShift": [ + { + "type": 0, + "value": "FR OpenShift" + } + ], + "openShiftCloudInfrastructure": [ + { + "type": 0, + "value": "FR OpenShift cloud infrastructure" + } + ], + "openShiftCloudInfrastructureDesc": [ + { + "type": 0, + "value": "FR Infrastructure cost attributed to OpenShift Container Platform, based on a subset of cloud cost data." + } + ], + "openShiftDesc": [ + { + "type": 0, + "value": "FR Total cost for OpenShift Container Platform, comprising the infrastructure cost and cost calculated from metrics." + } + ], + "optimizations": [ + { + "type": 0, + "value": "FR Optimizations" + } + ], + "overhead": [ + { + "type": 0, + "value": "FR Overhead" + } + ], + "overheadDesc": [ + { + "type": 0, + "value": "FR Includes distributed costs" + } + ], + "overviewInfoArialLabel": [ + { + "type": 0, + "value": "FR A description of perspectives" + } + ], + "overviewInfoButtonArialLabel": [ + { + "type": 0, + "value": "FR A dialog with a description of perspectives" + } + ], + "overviewTitle": [ + { + "type": 0, + "value": "FR Cost Management Overview" + } + ], + "pageTitleAws": [ + { + "type": 0, + "value": "FR Amazon Web Services - Cost Management | OpenShift" + } + ], + "pageTitleAzure": [ + { + "type": 0, + "value": "FR Microsoft Azure - Cost Management | OpenShift" + } + ], + "pageTitleCostModels": [ + { + "type": 0, + "value": "FR Cost Models - Cost Management | OpenShift" + } + ], + "pageTitleDefault": [ + { + "type": 0, + "value": "FR Cost Management | OpenShift" + } + ], + "pageTitleExplorer": [ + { + "type": 0, + "value": "FR Cost Explorer - Cost Management | OpenShift" + } + ], + "pageTitleGcp": [ + { + "type": 0, + "value": "FR Google Cloud Platform - Cost Management | OpenShift" + } + ], + "pageTitleIbm": [ + { + "type": 0, + "value": "FR IBM Cloud - Cost Management | OpenShift" + } + ], + "pageTitleOci": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure - Cost Management | OpenShift" + } + ], + "pageTitleOcp": [ + { + "type": 0, + "value": "FR OpenShift - Cost Management | OpenShift" + } + ], + "pageTitleOptimizations": [ + { + "type": 0, + "value": "FR Optimizations - Cost Management | OpenShift" + } + ], + "pageTitleOverview": [ + { + "type": 0, + "value": "FR Overview - Cost Management | OpenShift" + } + ], + "pageTitleRhel": [ + { + "type": 0, + "value": "FR RHEL - Cost Management | OpenShift" + } + ], + "pageTitleSettings": [ + { + "type": 0, + "value": "FR Settings - Cost Management | OpenShift" + } + ], + "paginationTitle": [ + { + "options": { + "bottom": { + "value": [ + { + "type": 1, + "value": "title" + }, + { + "type": 0, + "value": "FR bottom pagination" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "title" + }, + { + "type": 0, + "value": "FR pagination" + } + ] + }, + "top": { + "value": [ + { + "type": 1, + "value": "title" + }, + { + "type": 0, + "value": "FR top pagination" + } + ] + } + }, + "type": 5, + "value": "placement" + } + ], + "percent": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR %" + } + ], + "percentOfCost": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR % of cost" + } + ], + "percentSymbol": [ + { + "type": 0, + "value": "FR %" + } + ], + "percentTotalCost": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR " + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": " (" + }, + { + "type": 1, + "value": "percent" + }, + { + "type": 0, + "value": " %)" + } + ], + "perspective": [ + { + "type": 0, + "value": "FR Perspective" + } + ], + "perspectiveValues": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services" + } + ] + }, + "aws_ocp": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services filtered by OpenShift" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure" + } + ] + }, + "azure_ocp": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure filtered by OpenShift" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform" + } + ] + }, + "gcp_ocp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform filtered by OpenShift" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud" + } + ] + }, + "ibm_ocp": { + "value": [ + { + "type": 0, + "value": "FR IBM filtered by OpenShift" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR All OpenShift" + } + ] + }, + "ocp_cloud": { + "value": [ + { + "type": 0, + "value": "FR All cloud filtered by OpenShift" + } + ] + }, + "other": { + "value": [] + }, + "rhel": { + "value": [ + { + "type": 0, + "value": "FR All RHEL" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "platform": [ + { + "type": 0, + "value": "FR Platform" + } + ], + "platformDesc": [ + { + "type": 0, + "value": "FR Distribute the cost of running the OpenShift services to projects" + } + ], + "platformDistributed": [ + { + "type": 0, + "value": "FR Platform distributed" + } + ], + "platformProjectsDesc": [ + { + "type": 0, + "value": "FR Associate additional projects with OpenShift Platform project costs to charge for utilization of resources. Changes will be reflected in this month's cost calculations within 24 hrs. " + }, + { + "type": 1, + "value": "learnMore" + } + ], + "platformProjectsTitle": [ + { + "type": 0, + "value": "FR Platform projects" + } + ], + "priceList": [ + { + "type": 0, + "value": "FR Price list" + } + ], + "priceListAddRate": [ + { + "type": 0, + "value": "FR Add rate" + } + ], + "priceListDeleteRate": [ + { + "type": 0, + "value": "FR Delete rate" + } + ], + "priceListDeleteRateDesc": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 0, + "value": "FR This action will remove " + }, + { + "type": 1, + "value": "metric" + }, + { + "type": 0, + "value": " rate from " + }, + { + "type": 1, + "value": "costModel" + } + ] + }, + "other": { + "value": [ + { + "type": 0, + "value": "FR This action will remove " + }, + { + "type": 1, + "value": "metric" + }, + { + "type": 0, + "value": " rate from " + }, + { + "type": 1, + "value": "costModel" + }, + { + "type": 0, + "value": ", which is assigned to the following integrations:" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ], + "priceListDuplicate": [ + { + "type": 0, + "value": "FR This tag key is already in use" + } + ], + "priceListEditRate": [ + { + "type": 0, + "value": "FR Edit rate" + } + ], + "priceListEmptyRate": [ + { + "type": 0, + "value": "FR No rates are set" + } + ], + "priceListEmptyRateDesc": [ + { + "type": 0, + "value": "FR To add rates to the price list, click on the \"Add\" rate button above." + } + ], + "priceListNumberRate": [ + { + "type": 0, + "value": "FR Rate must be a number" + } + ], + "priceListPosNumberRate": [ + { + "type": 0, + "value": "FR Rate must be a positive number" + } + ], + "pvcTitle": [ + { + "type": 0, + "value": "FR Persistent Volume Claims" + } + ], + "rate": [ + { + "type": 0, + "value": "FR Rate" + } + ], + "rawCostDesc": [ + { + "type": 0, + "value": "FR The costs reported by a cloud provider without any cost model calculations applied." + } + ], + "rawCostTitle": [ + { + "type": 0, + "value": "FR Raw cost" + } + ], + "rbacErrorDesc": [ + { + "type": 0, + "value": "FR There was a problem receiving user permissions. Refreshing this page may fix it. If it does not, please contact your admin." + } + ], + "rbacErrorTitle": [ + { + "type": 0, + "value": "FR Failed to get RBAC information" + } + ], + "readOnly": [ + { + "type": 0, + "value": "FR Read only" + } + ], + "readOnlyPermissions": [ + { + "type": 0, + "value": "FR You have read only permissions" + } + ], + "redHatIntegration": [ + { + "type": 0, + "value": "FR Red Hat integration" + } + ], + "redHatStatusUrl": [ + { + "type": 0, + "value": "FR https://status.redhat.com" + } + ], + "remove": [ + { + "type": 0, + "value": "FR Remove" + } + ], + "removeProjects": [ + { + "type": 0, + "value": "FR Remove projects" + } + ], + "requestedCapacity": [ + { + "type": 0, + "value": "FR Requested capacity" + } + ], + "requestedCapacityValue": [ + { + "type": 0, + "value": "FR Requested capacity - " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " " + }, + { + "type": 1, + "value": "units" + } + ], + "requests": [ + { + "type": 0, + "value": "FR Requests" + } + ], + "rhel": [ + { + "type": 0, + "value": "FR RHEL" + } + ], + "rhelCpuUsageAndRequests": [ + { + "type": 0, + "value": "FR CPU usage and requests" + } + ], + "rhelDailyUsageAndRequestComparison": [ + { + "type": 0, + "value": "FR Daily usage and requests comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "rhelDashboardCostTitle": [ + { + "type": 0, + "value": "FR All RHEL cost" + } + ], + "rhelDashboardCostTrendTitle": [ + { + "type": 0, + "value": "FR All RHEL cumulative cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "rhelDashboardDailyCostTitle": [ + { + "type": 0, + "value": "FR All RHEL daily cost comparison (" + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": ")" + } + ], + "rhelDesc": [ + { + "type": 0, + "value": "FR Total cost for Red Hat Enterprise Linux, comprising the infrastructure cost and cost calculated from metrics." + } + ], + "rhelDetailsInfrastructureCost": [ + { + "type": 0, + "value": "FR Infrastructure cost" + } + ], + "rhelDetailsSupplementaryCost": [ + { + "type": 0, + "value": "FR Supplementary cost" + } + ], + "rhelDetailsTitle": [ + { + "type": 0, + "value": "FR RHEL Details" + } + ], + "rhelMemoryUsageAndRequests": [ + { + "type": 0, + "value": "FR Memory usage and requests" + } + ], + "rhelVolumeUsageAndRequests": [ + { + "type": 0, + "value": "FR Volume usage and requests" + } + ], + "save": [ + { + "type": 0, + "value": "FR Save" + } + ], + "select": [ + { + "type": 0, + "value": "FR Select..." + } + ], + "selectAll": [ + { + "type": 0, + "value": "FR Select all" + } + ], + "selectCategories": [ + { + "type": 0, + "value": "FR Select categories to enable or disable" + } + ], + "selectClearAriaLabel": [ + { + "type": 0, + "value": "FR Clear input value" + } + ], + "selectProjects": [ + { + "type": 0, + "value": "FR Select projects to add or remove" + } + ], + "selectRow": [ + { + "type": 0, + "value": "FR Select row " + }, + { + "type": 1, + "value": "value" + } + ], + "selectTags": [ + { + "type": 0, + "value": "FR Select tags to enable or disable" + } + ], + "selectableTableAriaLabel": [ + { + "type": 0, + "value": "FR Selectable table" + } + ], + "selectableTableHeaderAriaLabel": [ + { + "type": 0, + "value": "FR Select to open the optimizations drawer" + } + ], + "selectableTableRowAriaLabel": [ + { + "type": 0, + "value": "FR Selectable table row" + } + ], + "selected": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR selected" + } + ], + "settingsErrorDesc": [ + { + "type": 0, + "value": "FR Failed to update settings" + } + ], + "settingsErrorTitle": [ + { + "type": 0, + "value": "FR Unable to save application settings" + } + ], + "settingsSuccessChanges": [ + { + "type": 0, + "value": "FR Changes will be reflected in report summarizations within 24 hours" + } + ], + "settingsSuccessCostCategories": [ + { + "options": { + "disable": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR cost category key disabled" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR cost category keys disabled" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "enable": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR cost category key enabled" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR cost category keys enabled" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "value" + } + ], + "settingsSuccessDesc": [ + { + "type": 0, + "value": "FR Settings for Cost Management were replaced with new values" + } + ], + "settingsSuccessPlatformProjects": [ + { + "options": { + "add": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR projects added to Platform projects" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR project added to Platform projects" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "other": { + "value": [] + }, + "remove": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR projects removed from Platform projects" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR project removed from Platform projects" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "settingsSuccessTags": [ + { + "options": { + "add": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR tag key added" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR tag key added" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "disable": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR tag disabled" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR tags disabled" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "enable": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR tag enabled" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR tags enabled" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + }, + "other": { + "value": [] + }, + "remove": { + "value": [ + { + "offset": 0, + "options": { + "one": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR tag key removed" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": "FR tag key removed" + } + ] + } + }, + "pluralType": "cardinal", + "type": 6, + "value": "count" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "settingsSuccessTitle": [ + { + "type": 0, + "value": "FR Application settings saved" + } + ], + "settingsTagMappingDisableErrorDesc": [ + { + "type": 0, + "value": "FR You have selected " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " tag mappings" + } + ], + "settingsTagMappingDisableErrorTitle": [ + { + "type": 0, + "value": "FR Can not disable a key associated with a tag mapping" + } + ], + "settingsTagsErrorDesc": [ + { + "type": 0, + "value": "FR You currently have " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " tags enabled" + } + ], + "settingsTagsErrorTitle": [ + { + "type": 0, + "value": "FR You can not enable more than " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " tags total" + } + ], + "settingsTitle": [ + { + "type": 0, + "value": "FR Cost Management Settings" + } + ], + "sinceDate": [ + { + "type": 1, + "value": "dateRange" + } + ], + "source": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services source:" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure source:" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform source:" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure source:" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift source:" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "value" + } + ], + "sourceType": [ + { + "type": 0, + "value": "FR Integration" + } + ], + "sourceTypes": [ + { + "options": { + "aws": { + "value": [ + { + "type": 0, + "value": "FR Amazon Web Services" + } + ] + }, + "azure": { + "value": [ + { + "type": 0, + "value": "FR Microsoft Azure" + } + ] + }, + "gcp": { + "value": [ + { + "type": 0, + "value": "FR Google Cloud Platform" + } + ] + }, + "ibm": { + "value": [ + { + "type": 0, + "value": "FR IBM Cloud" + } + ] + }, + "oci": { + "value": [ + { + "type": 0, + "value": "FR Oracle Cloud Infrastructure" + } + ] + }, + "ocp": { + "value": [ + { + "type": 0, + "value": "FR OpenShift" + } + ] + }, + "other": { + "value": [] + } + }, + "type": 5, + "value": "value" + } + ], + "sources": [ + { + "type": 0, + "value": "FR Integrations" + } + ], + "start": [ + { + "type": 0, + "value": "FR Start" + } + ], + "status": [ + { + "type": 0, + "value": "FR Status" + } + ], + "statusActions": [ + { + "type": 0, + "value": "FR Status/Actions" + } + ], + "statusMsg": [ + { + "options": { + "complete": { + "value": [ + { + "type": 0, + "value": "FR Complete" + } + ] + }, + "failed": { + "value": [ + { + "type": 0, + "value": "FR Failed" + } + ] + }, + "in_progress": { + "value": [ + { + "type": 0, + "value": "FR in-Progress" + } + ] + }, + "other": { + "value": [] + }, + "paused": { + "value": [ + { + "type": 0, + "value": "FR Paused" + } + ] + }, + "pending": { + "value": [ + { + "type": 0, + "value": "FR Pending" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "statusStates": [ + { + "options": { + "failed": { + "value": [ + { + "type": 0, + "value": "FR Failed" + } + ] + }, + "other": { + "value": [] + }, + "pending": { + "value": [ + { + "type": 0, + "value": "FR Pending" + } + ] + }, + "running": { + "value": [ + { + "type": 0, + "value": "FR Running" + } + ] + } + }, + "type": 5, + "value": "value" + } + ], + "storage": [ + { + "type": 0, + "value": "FR Storage" + } + ], + "storageClass": [ + { + "type": 0, + "value": "FR StorageClass" + } + ], + "suggestions": [ + { + "type": 0, + "value": "FR Suggestions" + } + ], + "sumPlatformCosts": [ + { + "type": 0, + "value": "FR Sum platform costs" + } + ], + "summary": [ + { + "type": 0, + "value": "FR Summary" + } + ], + "supplementary": [ + { + "type": 0, + "value": "FR Supplementary" + } + ], + "tagDesc": [ + { + "type": 0, + "value": "FR Enable your tags and labels to be used as tag keys for report grouping and filtering. Your account is limited to " + }, + { + "type": 1, + "value": "count" + }, + { + "type": 0, + "value": " active tags at a time. Changes will be reflected within 24 hours. " + }, + { + "type": 1, + "value": "learnMore" + } + ], + "tagHeadingKey": [ + { + "type": 0, + "value": "FR Key" + } + ], + "tagHeadingTitle": [ + { + "type": 0, + "value": "FR Tags (" + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": ")" + } + ], + "tagHeadingValue": [ + { + "type": 0, + "value": "FR Value" + } + ], + "tagKeyChild": [ + { + "type": 0, + "value": "FR Child tag keys" + } + ], + "tagKeyParent": [ + { + "type": 0, + "value": "FR Parent tag key" + } + ], + "tagKeyParentSource": [ + { + "type": 0, + "value": "FR Parent integration" + } + ], + "tagLabels": [ + { + "type": 0, + "value": "FR Tags and labels" + } + ], + "tagLabelsEnable": [ + { + "type": 0, + "value": "FR Enable tags and labels" + } + ], + "tagLabelsMap": [ + { + "type": 0, + "value": "FR Map tags and labels" + } + ], + "tagMappingAddChildTags": [ + { + "type": 0, + "value": "FR Add child tags" + } + ], + "tagMappingAddChildTagsDesc": [ + { + "type": 0, + "value": "FR Select additional tag key(s) that will be mapped to the " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " tag map. Tags that have been already mapped will not be available for selection." + } + ], + "tagMappingAddErrorDesc": [ + { + "type": 0, + "value": "FR Failed to add tags" + } + ], + "tagMappingAddErrorTitle": [ + { + "type": 0, + "value": "FR Unable to create tag mapping" + } + ], + "tagMappingDelete": [ + { + "type": 0, + "value": "FR Delete tag mapping" + } + ], + "tagMappingDeleteDesc": [ + { + "type": 0, + "value": "FR Deleting " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " will queue a resummarization. Changes will be reflected within 24 hours." + } + ], + "tagMappingDeleteTitle": [ + { + "type": 0, + "value": "FR Delete tag mapping?" + } + ], + "tagMappingDesc": [ + { + "type": 0, + "value": "FR Combine multiple tags across your cloud integrations to group and filter similar tags with one tag key. " + }, + { + "type": 1, + "value": "warning" + }, + { + "type": 0, + "value": " Changes will be reflected within 24 hours. " + }, + { + "type": 1, + "value": "learnMore" + } + ], + "tagMappingRemove": [ + { + "type": 0, + "value": "FR Remove child tag" + } + ], + "tagMappingRemoveDesc": [ + { + "type": 0, + "value": "FR Removing " + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " will queue a resummarization. Changes will be reflected within 24 hours." + } + ], + "tagMappingRemoveTitle": [ + { + "type": 0, + "value": "FR Remove child tag?" + } + ], + "tagMappingSelectChildTags": [ + { + "type": 0, + "value": "FR Select child tags" + } + ], + "tagMappingSelectChildTagsDesc": [ + { + "type": 0, + "value": "FR Select the child tags that you want to map to the parent key you selected in the previous step. Tags that have been already mapped will not be available for selection. " + }, + { + "type": 1, + "value": "learnMore" + } + ], + "tagMappingSelectParentTags": [ + { + "type": 0, + "value": "FR Select parent tag" + } + ], + "tagMappingSelectParentTagsDesc": [ + { + "type": 0, + "value": "FR Select a parent tag key that will be mapped to child tags in the next step. This tag will be available for filtering in Cost Management." + } + ], + "tagMappingWarning": [ + { + "type": 0, + "value": "FR You must enable tags to use tag mapping." + } + ], + "tagMappingWizardDesc": [ + { + "type": 0, + "value": "FR Map multiple tags across data sources to be used as a single tag key for report grouping and filtering. Changes will be reflected within 24 hours." + } + ], + "tagMappingWizardNavToCreateTagMapping": [ + { + "type": 0, + "value": "FR Create another tag mapping" + } + ], + "tagMappingWizardNavToTagMapping": [ + { + "type": 0, + "value": "FR Go back to Cost Management Settings" + } + ], + "tagMappingWizardReview": [ + { + "type": 0, + "value": "FR Review details" + } + ], + "tagMappingWizardReviewDesc": [ + { + "type": 0, + "value": "FR Review and confirm the tag mappings. Click " + }, + { + "type": 1, + "value": "create" + }, + { + "type": 0, + "value": " to create the mappings, or " + }, + { + "type": 1, + "value": "back" + }, + { + "type": 0, + "value": " to revise. Changes to the reports will be reflected within 24 hours." + } + ], + "tagMappingWizardSelectChildTags": [ + { + "type": 0, + "value": "FR Select child tags" + } + ], + "tagMappingWizardSelectParentTag": [ + { + "type": 0, + "value": "FR Select parent tag" + } + ], + "tagMappingWizardSuccess": [ + { + "type": 0, + "value": "FR Tag mapping successful" + } + ], + "tagMappingWizardSuccessDesc": [ + { + "type": 0, + "value": "FR Your tag keys were successfully mapped. Changes will be reflected in report summarizations within 24 hours." + } + ], + "tagNames": [ + { + "type": 0, + "value": "FR Tag names" + } + ], + "timeOfExport": [ + { + "type": 0, + "value": "FR Time of export" + } + ], + "to": [ + { + "type": 0, + "value": "FR to" + } + ], + "toolBarBulkSelectAll": [ + { + "type": 0, + "value": "FR Select all (" + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " items)" + } + ], + "toolBarBulkSelectAriaDeselect": [ + { + "type": 0, + "value": "FR Deselect all items" + } + ], + "toolBarBulkSelectAriaSelect": [ + { + "type": 0, + "value": "FR Select all items" + } + ], + "toolBarBulkSelectNone": [ + { + "type": 0, + "value": "FR Select none (0 items)" + } + ], + "toolBarBulkSelectPage": [ + { + "type": 0, + "value": "FR Select page (" + }, + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": " items)" + } + ], + "toolBarPriceListMeasurementPlaceHolder": [ + { + "type": 0, + "value": "FR Filter by measurements" + } + ], + "toolBarPriceListMetricPlaceHolder": [ + { + "type": 0, + "value": "FR Filter by metrics" + } + ], + "typeaheadAriaClear": [ + { + "type": 0, + "value": "FR Clear button and input" + } + ], + "unitTooltips": [ + { + "options": { + "byte_ms": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR Byte-ms" + } + ] + }, + "cluster_month": { + "value": [ + { + "type": 0, + "value": "FR cluster-month" + } + ] + }, + "core_hours": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR core-hours" + } + ] + }, + "gb": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR GB" + } + ] + }, + "gb_hours": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR GB-hours" + } + ] + }, + "gb_month": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR GB-month" + } + ] + }, + "gb_ms": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR GB-ms" + } + ] + }, + "gib_hours": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR GiB-hours" + } + ] + }, + "gib_month": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR GiB-month" + } + ] + }, + "gibibyte_month": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR GiB-month" + } + ] + }, + "hour": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR hours" + } + ] + }, + "hrs": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR hours" + } + ] + }, + "ms": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR milliseconds" + } + ] + }, + "other": { + "value": [ + { + "type": 1, + "value": "value" + } + ] + }, + "pvc_month": { + "value": [ + { + "type": 0, + "value": "FR PVC-month" + } + ] + }, + "tag_month": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR tag-month" + } + ] + }, + "vm_hours": { + "value": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR VM-hours" + } + ] + } + }, + "type": 5, + "value": "units" + } + ], + "units": [ + { + "options": { + "byte_ms": { + "value": [ + { + "type": 0, + "value": "FR Byte-ms" + } + ] + }, + "cluster_month": { + "value": [ + { + "type": 0, + "value": "FR cluster-month" + } + ] + }, + "core": { + "value": [ + { + "type": 0, + "value": "FR core" + } + ] + }, + "core_hours": { + "value": [ + { + "type": 0, + "value": "FR core-hours" + } + ] + }, + "gb": { + "value": [ + { + "type": 0, + "value": "FR GB" + } + ] + }, + "gb_hours": { + "value": [ + { + "type": 0, + "value": "FR GB-hours" + } + ] + }, + "gb_month": { + "value": [ + { + "type": 0, + "value": "FR GB-month" + } + ] + }, + "gb_ms": { + "value": [ + { + "type": 0, + "value": "FR GB-ms" + } + ] + }, + "gib_hours": { + "value": [ + { + "type": 0, + "value": "FR GiB-hours" + } + ] + }, + "gib_month": { + "value": [ + { + "type": 0, + "value": "FR GiB-month" + } + ] + }, + "gibibyte_month": { + "value": [ + { + "type": 0, + "value": "FR GiB-month" + } + ] + }, + "hour": { + "value": [ + { + "type": 0, + "value": "FR hours" + } + ] + }, + "hrs": { + "value": [ + { + "type": 0, + "value": "FR hours" + } + ] + }, + "ms": { + "value": [ + { + "type": 0, + "value": "FR milliseconds" + } + ] + }, + "other": { + "value": [] + }, + "pvc_month": { + "value": [ + { + "type": 0, + "value": "FR PVC-month" + } + ] + }, + "tag_month": { + "value": [ + { + "type": 0, + "value": "FR tag-month" + } + ] + }, + "vm_hours": { + "value": [ + { + "type": 0, + "value": "FR VM-hours" + } + ] + } + }, + "type": 5, + "value": "units" + } + ], + "updateAvailable": [ + { + "type": 0, + "value": "FR Update available" + } + ], + "usage": [ + { + "type": 0, + "value": "FR Usage" + } + ], + "usageCostDesc": [ + { + "type": 0, + "value": "FR The portion of cost calculated by applying hourly and/or monthly price list rates to metrics." + } + ], + "usageCostTitle": [ + { + "type": 0, + "value": "FR Usage cost" + } + ], + "usageSubtitle": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR " + }, + { + "type": 1, + "value": "units" + }, + { + "type": 0, + "value": " maximum" + } + ], + "valueUnits": [ + { + "type": 1, + "value": "value" + }, + { + "type": 0, + "value": "FR " + }, + { + "type": 1, + "value": "units" + } + ], + "various": [ + { + "type": 0, + "value": "FR Various" + } + ], + "vcpuTitle": [ + { + "type": 0, + "value": "FR vCPU" + } + ], + "volumeTitle": [ + { + "type": 0, + "value": "FR Volume" + } + ], + "workerUnallocated": [ + { + "type": 0, + "value": "FR Worker unallocated" + } + ], + "workerUnallocatedDesc": [ + { + "type": 0, + "value": "FR Distribute unused and non-reserved resource costs to projects" + } + ], + "yes": [ + { + "type": 0, + "value": "FR Yes" + } + ] } } \ No newline at end of file diff --git a/locales/translations.json b/locales/translations.json index 9fcf8c837..c88905491 100644 --- a/locales/translations.json +++ b/locales/translations.json @@ -247,12 +247,16 @@ "discountMinus": "Discount (-)", "distribute": "Distribute", "distributeCosts": "{value, select, true {Distribute {type, select, network {network} storage {storage} other {}} costs}false {Do not distribute {type, select, network {network} storage {storage} other {}} costs}other {}}", + "distributeCostsToProjects": "Distribute these costs to projects, based on the above description type", + "distributeNetwork": "Network traffic", + "distributePlatform": "Platform overhead (OpenShift services)", "distributePlatformCosts": "{value, select, true {Distribute platform costs}false {Do not distribute platform costs}other {}}", + "distributeStorage": "Storage", "distributeUnallocatedCapacity": "{value, select, true {Distribute worker unallocated capacity}false {Do not distribute worker unallocated capacity}other {}}", + "distributeWorker": "Worker unallowcated (unused and non-reserved resources)", "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 {}}", - "doNotDistribute": "Do not distribute", "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", "docsCostModelTerminology": "https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html-single/using_cost_models/index#cost-model-terminology", @@ -294,7 +298,7 @@ "exportAll": "Export all", "exportDesc": "The active selections from the table plus the values here will be used to generate an export file. When the file is available, download it from the {value} view.", "exportError": "Something went wrong, please try fewer selections", - "exportFileName": "{groupBy, select, account {{resolution, select, daily {{provider}_accounts_daily_{startDate}_{endDate}} monthly {{provider}_accounts_monthly_{startDate}_{endDate}} other {}}} aws_category {{resolution, select, daily {{provider}_cost_category_daily_{startDate}_{endDate}} monthly {{provider}_cost_category_monthly_{startDate}_{endDate}} other {}}} cluster {{resolution, select, daily {{provider}_clusters_daily_{startDate}_{endDate}} monthly {{provider}_clusters_monthly_{startDate}_{endDate}} other {}}} gcp_project {{resolution, select, daily {{provider}_gcp-projects_daily_{startDate}_{endDate}} monthly {{provider}_gcp-projects_monthly_{startDate}_{endDate}} other {}}} instance {{resolution, select, daily {{provider}_instances_daily_{startDate}_{endDate}} monthly {{provider}_instances_monthly_{startDate}_{endDate}} other {}}} node {{resolution, select, daily {{provider}_node_daily_{startDate}_{endDate}} monthly {{provider}_node_monthly_{startDate}_{endDate}} other {}}} org_unit_id {{resolution, select, daily {{provider}_orgs_daily_{startDate}_{endDate}} monthly {{provider}_orgs_monthly_{startDate}_{endDate}} other {}}} payer_tenant_id {{resolution, select, daily {{provider}_accounts_daily_{startDate}_{endDate}} monthly {{provider}_accounts_monthly_{startDate}_{endDate}} other {}}} product_service {{resolution, select, daily {{provider}_services_daily_{startDate}_{endDate}} monthly {{provider}_services_monthly_{startDate}_{endDate}} other {}}} project {{resolution, select, daily {{provider}_projects_daily_{startDate}_{endDate}} monthly {{provider}_projects_monthly_{startDate}_{endDate}} other {}}} region {{resolution, select, daily {{provider}_regions_daily_{startDate}_{endDate}} monthly {{provider}_regions_monthly_{startDate}_{endDate}} other {}}} resource_location {{resolution, select, daily {{provider}_regions_daily_{startDate}_{endDate}} monthly {{provider}_regions_monthly_{startDate}_{endDate}} other {}}} service {{resolution, select, daily {{provider}_services_daily_{startDate}_{endDate}} monthly {{provider}_services_monthly_{startDate}_{endDate}} other {}}} service_name {{resolution, select, daily {{provider}_services_daily_{startDate}_{endDate}} monthly {{provider}_services_monthly_{startDate}_{endDate}} other {}}} subscription_guid {{resolution, select, daily {{provider}_accounts_daily_{startDate}_{endDate}} monthly {{provider}_accounts_monthly_{startDate}_{endDate}} other {}}} tag {{resolution, select, daily {{provider}_tags_daily_{startDate}_{endDate}} monthly {{provider}_tags_monthly_{startDate}_{endDate}} other {}}} other {}}", + "exportFileName": "{groupBy, select, account {{resolution, select, daily {{provider}_accounts_daily_{startDate}_{endDate}} monthly {{provider}_accounts_monthly_{startDate}_{endDate}} other {}}} aws_category {{resolution, select, daily {{provider}_cost_category_daily_{startDate}_{endDate}} monthly {{provider}_cost_category_monthly_{startDate}_{endDate}} other {}}} cluster {{resolution, select, daily {{provider}_clusters_daily_{startDate}_{endDate}} monthly {{provider}_clusters_monthly_{startDate}_{endDate}} other {}}} gcp_project {{resolution, select, daily {{provider}_gcp-projects_daily_{startDate}_{endDate}} monthly {{provider}_gcp-projects_monthly_{startDate}_{endDate}} other {}}} instance {{resolution, select, daily {{provider}_instances_daily_{startDate}_{endDate}} monthly {{provider}_instances_monthly_{startDate}_{endDate}} other {}}} node {{resolution, select, daily {{provider}_node_daily_{startDate}_{endDate}} monthly {{provider}_node_monthly_{startDate}_{endDate}} other {}}} org_unit_id {{resolution, select, daily {{provider}_orgs_daily_{startDate}_{endDate}} monthly {{provider}_orgs_monthly_{startDate}_{endDate}} other {}}} payer_tenant_id {{resolution, select, daily {{provider}_accounts_daily_{startDate}_{endDate}} monthly {{provider}_accounts_monthly_{startDate}_{endDate}} other {}}} product_service {{resolution, select, daily {{provider}_services_daily_{startDate}_{endDate}} monthly {{provider}_services_monthly_{startDate}_{endDate}} other {}}} project {{resolution, select, daily {{provider}_projects_daily_{startDate}_{endDate}} monthly {{provider}_projects_monthly_{startDate}_{endDate}} other {}}} region {{resolution, select, daily {{provider}_regions_daily_{startDate}_{endDate}} monthly {{provider}_regions_monthly_{startDate}_{endDate}} other {}}} resource_id {{resolution, select, daily {{provider}_resources_daily_{startDate}_{endDate}} monthly {{provider}_resources_monthly_{startDate}_{endDate}} other {}}} resource_location {{resolution, select, daily {{provider}_regions_daily_{startDate}_{endDate}} monthly {{provider}_regions_monthly_{startDate}_{endDate}} other {}}} service {{resolution, select, daily {{provider}_services_daily_{startDate}_{endDate}} monthly {{provider}_services_monthly_{startDate}_{endDate}} other {}}} service_name {{resolution, select, daily {{provider}_services_daily_{startDate}_{endDate}} monthly {{provider}_services_monthly_{startDate}_{endDate}} other {}}} subscription_guid {{resolution, select, daily {{provider}_accounts_daily_{startDate}_{endDate}} monthly {{provider}_accounts_monthly_{startDate}_{endDate}} other {}}} tag {{resolution, select, daily {{provider}_tags_daily_{startDate}_{endDate}} monthly {{provider}_tags_monthly_{startDate}_{endDate}} other {}}} other {}}", "exportFormatType": "{value, select, csv {CSV} json {JSON} other {}}", "exportFormatTypeTitle": "Format type", "exportGenerate": "Generate export", @@ -332,6 +336,7 @@ "filterByValuesAriaLabel": "Values", "filteredBy": "Filtered by", "filteredByWarning": "This page shows filtered results. To undo filters, clear filters on the previous page.", + "finalization": "Finalization", "forDate": "{value} for {dateRange}", "gcp": "Google Cloud Platform", "gcpComputeTitle": "Compute instances usage", @@ -362,7 +367,9 @@ "inactiveSourcesTitleMultiplier": "A problem was detected with the following integrations", "infrastructure": "Infrastructure", "instances": "Instances", + "integration": "Integration", "lastProcessed": "Last processed", + "lastUpdated": "Last updated", "learnMore": "Learn more", "loadingStateDesc": "Searching for your integrations. Do not refresh the browser", "loadingStateTitle": "Looking for integrations...", @@ -392,13 +399,14 @@ "monthOverMonthChange": "Month over month change", "moreOptions": "More options", "names": "{count, plural, one {Name} other {Names}}", - "network": "Network", - "networkDesc": "Distribute the cost of network traffic to projects based on distribution type.", + "networkUnattributedDistributed": "Network unattributed", + "networkUnattributedDistributedDesc": "Costs associated with ingress and egress network traffic for individual nodes.", "next": "next", "no": "No", "noDataForDate": "No data available for {dateRange}", - "noDataStateDesc": "We have detected an integration, but we are not done processing the incoming data. The time to process could take up to 24 hours. Try refreshing the page at a later time.", + "noDataStateDesc": "We have detected an integration, but we are not done processing the incoming data.", "noDataStateRefresh": "Refresh this page", + "noDataStateRefreshDesc": "The time to process could take up to 24 hours. Try refreshing the page at a later time.", "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.", @@ -460,8 +468,8 @@ "openShiftCloudInfrastructureDesc": "Infrastructure cost attributed to OpenShift Container Platform, based on a subset of cloud cost data.", "openShiftDesc": "Total cost for OpenShift Container Platform, comprising the infrastructure cost and cost calculated from metrics.", "optimizations": "Optimizations", - "overhead": "Overhead", - "overheadDesc": "Includes distributed costs", + "overhead": "Includes overhead", + "overheadDesc": "Includes distributed costs {value}", "overviewInfoArialLabel": "A description of perspectives", "overviewInfoButtonArialLabel": "A dialog with a description of perspectives", "overviewTitle": "Cost Management Overview", @@ -500,6 +508,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", + "providerDetails": "Integrations details", "pvcTitle": "Persistent Volume Claims", "rate": "Rate", "rawCostDesc": "The costs reported by a cloud provider without any cost model calculations applied.", @@ -558,11 +567,14 @@ "sourceTypes": "{value, select, aws {Amazon Web Services} azure {Microsoft Azure} oci {Oracle Cloud Infrastructure} gcp {Google Cloud Platform} ibm {IBM Cloud} ocp {OpenShift} other {}}", "sources": "Integrations", "start": "Start", - "status": "{value, select, pending {Pending} running {Running} failed {Failed} other {}}", + "status": "Status", "statusActions": "Status/Actions", + "statusMsg": "{value, select, complete {Complete} failed {Failed} in_progress {in-Progress} paused {Paused} pending {Pending} other {}}", + "statusStates": "{value, select, pending {Pending} running {Running} failed {Failed} other {}}", "storage": "Storage", "storageClass": "StorageClass", - "storageDesc": "Distribute the cost of storage to projects based on distribution type.", + "storageUnattributedDistributed": "Storage unattributed", + "storageUnattributedDistributedDesc": "A type of project that gets created when cost management is unable to correlate a portion of the cloud cost to an OpenShift namespace", "suggestions": "Suggestions", "sumPlatformCosts": "Sum platform costs", "summary": "Summary", diff --git a/package-lock.json b/package-lock.json index 208498c10..f405c5292 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,73 +10,76 @@ "hasInstallScript": true, "license": "GNU AGPLv3", "dependencies": { - "@patternfly/patternfly": "5.3.1", - "@patternfly/react-charts": "7.3.0", + "@patternfly/patternfly": "5.4.0", + "@patternfly/react-charts": "7.4.0", "@patternfly/react-component-groups": "^5.2.0", - "@patternfly/react-core": "5.3.4", - "@patternfly/react-icons": "5.3.2", - "@patternfly/react-table": "5.3.4", - "@patternfly/react-tokens": "5.3.1", - "@redhat-cloud-services/frontend-components": "^4.2.13", + "@patternfly/react-core": "5.4.0", + "@patternfly/react-icons": "5.4.0", + "@patternfly/react-table": "5.4.0", + "@patternfly/react-tokens": "5.4.0", + "@redhat-cloud-services/frontend-components": "^4.2.14", "@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.13", - "@redhat-cloud-services/rbac-client": "^2.0.4", - "@reduxjs/toolkit": "^2.2.6", - "@unleash/proxy-client-react": "^4.3.0", - "axios": "^1.7.2", + "@redhat-cloud-services/frontend-components-utilities": "^4.0.17", + "@redhat-cloud-services/rbac-client": "^2.2.2", + "@reduxjs/toolkit": "^2.2.7", + "@unleash/proxy-client-react": "^4.3.1", + "axios": "^1.7.7", "date-fns": "^3.6.0", "js-file-download": "^0.4.12", "lodash": "^4.17.21", - "qs": "^6.12.3", + "qs": "^6.13.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-intl": "^6.6.8", "react-redux": "^9.1.2", - "react-router-dom": "^6.25.1", + "react-router-dom": "^6.26.1", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typesafe-actions": "^5.1.0", - "victory-core": "^37.0.2" + "victory-core": "37.0.2", + "victory-create-container": "37.0.2", + "victory-cursor-container": "37.0.2", + "victory-voronoi-container": "37.0.2" }, "devDependencies": { "@eslint/compat": "^1.1.1", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "^9.7.0", + "@eslint/js": "^9.9.1", "@formatjs/cli": "^6.2.12", "@formatjs/ecma402-abstract": "^2.0.0", "@formatjs/icu-messageformat-parser": "^2.7.8", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "^2.0.4", - "@redhat-cloud-services/frontend-components-config": "^6.1.2", + "@redhat-cloud-services/frontend-components-config": "^6.2.8", "@redhat-cloud-services/tsc-transform-imports": "^1.0.16", - "@swc/core": "^1.7.0", + "@swc/core": "^1.7.23", "@swc/jest": "^0.2.36", - "@testing-library/jest-dom": "^6.4.6", - "@testing-library/react": "^16.0.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.12", "@types/qs": "^6.9.15", - "@types/react": "^18.3.3", + "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.33", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^7.16.1", - "@typescript-eslint/parser": "^7.16.1", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", "aphrodite": "^2.4.0", "copy-webpack-plugin": "^12.0.2", - "eslint": "^9.7.0", + "eslint": "^9.9.1", "eslint-plugin-formatjs": "^4.13.3", "eslint-plugin-jest-dom": "^5.4.0", - "eslint-plugin-jsdoc": "^48.7.0", + "eslint-plugin-jsdoc": "^50.2.2", "eslint-plugin-markdown": "^5.1.0", - "eslint-plugin-patternfly-react": "^5.3.0", + "eslint-plugin-patternfly-react": "^5.4.0", "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react": "^7.34.4", + "eslint-plugin-react": "^7.35.2", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-keys-fix": "^1.1.2", - "eslint-plugin-testing-library": "^6.2.2", + "eslint-plugin-testing-library": "^6.3.0", "git-revision-webpack-plugin": "^5.0.0", - "globals": "^15.8.0", + "globals": "^15.9.0", "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -87,9 +90,9 @@ "prettier": "^3.3.3", "rimraf": "^6.0.1", "swc_mut_cjs_exports": "^0.99.0", - "ts-jest": "^29.2.2", + "ts-jest": "^29.2.5", "ts-patch": "^3.2.1", - "typescript": "^5.5.3", + "typescript": "^5.5.4", "webpack-bundle-analyzer": "^4.10.2" }, "engines": { @@ -169,10 +172,11 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.23.10", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz", - "integrity": "sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz", + "integrity": "sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==", "dev": true, + "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -183,7 +187,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/generator": { @@ -657,14 +661,14 @@ "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==" }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.46.0.tgz", - "integrity": "sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz", + "integrity": "sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==", "dev": true, "dependencies": { "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.0.0" + "jsdoc-type-pratt-parser": "~4.1.0" }, "engines": { "node": ">=16" @@ -717,9 +721,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.0.tgz", - "integrity": "sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -813,9 +817,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz", - "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz", + "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2110,6 +2114,7 @@ "resolved": "https://registry.npmjs.org/@openshift/dynamic-plugin-sdk-webpack/-/dynamic-plugin-sdk-webpack-4.1.0.tgz", "integrity": "sha512-Pkq6R+fkoE0llgv9WJBcotViAPywrzDkpWK0HSTmrVyfEuWS5cuZUs8ono6L5w9BqDBRXm3ceEuUAZA/Zrar1w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "lodash": "^4.17.21", "semver": "^7.3.7", @@ -2123,10 +2128,11 @@ } }, "node_modules/@openshift/dynamic-plugin-sdk-webpack/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "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" }, @@ -2146,55 +2152,50 @@ } }, "node_modules/@patternfly/patternfly": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.3.1.tgz", - "integrity": "sha512-KYIr9pKRTzHZNGuDuaa5j5CaZyLltvotPFGG1BiJalBDBGSOyk0BZCgHLowm4txKZXrLhorEuuv9XLrMQL8eoA==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.4.0.tgz", + "integrity": "sha512-9B33M4N0/KDyss6NpCwAhz18za7R+sXYiFrUObhGoJ1Cmg06SeScVrEAjT4yJwAClWUlKh604Af9wE4D7IF8Lg==", + "license": "MIT" }, "node_modules/@patternfly/react-charts": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.3.0.tgz", - "integrity": "sha512-J6d/bFolI3zUOvJoK4lEveNeXZeJNfBq+iXgQ/mImESyW0H7MSebMcVB4d+NC6JX0QykuaOEn/7YMJMU9K73tw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-7.4.0.tgz", + "integrity": "sha512-2nvjoGw+ndAwiSFds041wMb4c1BnflyWLAutyC1kYTawhlKrSDGsd4heKWmquzg7GTLBzr1w6YbxKv2i2l7Z7g==", + "license": "MIT", "dependencies": { - "@patternfly/react-styles": "^5.3.0", - "@patternfly/react-tokens": "^5.3.0", - "hoist-non-react-statics": "^3.3.0", + "@patternfly/react-styles": "^5.4.0", + "@patternfly/react-tokens": "^5.4.0", + "hoist-non-react-statics": "^3.3.2", "lodash": "^4.17.21", - "tslib": "^2.5.0", - "victory-area": "^36.9.1", - "victory-axis": "^36.9.1", - "victory-bar": "^36.9.1", - "victory-box-plot": "^36.9.1", - "victory-chart": "^36.9.1", - "victory-core": "^36.9.1", - "victory-create-container": "^36.9.1", - "victory-cursor-container": "^36.9.1", - "victory-group": "^36.9.1", - "victory-legend": "^36.9.1", - "victory-line": "^36.9.1", - "victory-pie": "^36.9.1", - "victory-scatter": "^36.9.1", - "victory-stack": "^36.9.1", - "victory-tooltip": "^36.9.1", - "victory-voronoi-container": "^36.9.1", - "victory-zoom-container": "^36.9.1" + "tslib": "^2.6.3", + "victory-area": "^37.0.2", + "victory-axis": "^37.0.2", + "victory-bar": "^37.0.2", + "victory-box-plot": "^37.0.2", + "victory-chart": "^37.0.2", + "victory-core": "^37.0.2", + "victory-create-container": "^37.0.2", + "victory-cursor-container": "^37.0.2", + "victory-group": "^37.0.2", + "victory-legend": "^37.0.2", + "victory-line": "^37.0.2", + "victory-pie": "^37.0.2", + "victory-scatter": "^37.0.2", + "victory-stack": "^37.0.2", + "victory-tooltip": "^37.0.2", + "victory-voronoi-container": "^37.0.2", + "victory-zoom-container": "^37.0.2" }, "peerDependencies": { "react": "^17 || ^18", "react-dom": "^17 || ^18" } }, - "node_modules/@patternfly/react-charts/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", - "dependencies": { - "lodash": "^4.17.21", - "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } + "node_modules/@patternfly/react-charts/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" }, "node_modules/@patternfly/react-component-groups": { "version": "5.2.0", @@ -2213,57 +2214,74 @@ } }, "node_modules/@patternfly/react-core": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.3.4.tgz", - "integrity": "sha512-zr2yeilIoFp8MFOo0vNgI8XuM+P2466zHvy4smyRNRH2/but2WObqx7Wu4ftd/eBMYdNqmTeuXe6JeqqRqnPMQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.4.0.tgz", + "integrity": "sha512-Tz2Y9V4G2pnwrylc/4/FyxIRFvxiA8BEBIG6UBwXxrstnJmJaHgAIy6QJdJmERzVx3GVDz6/rM0PnMqa5R6auQ==", + "license": "MIT", "dependencies": { - "@patternfly/react-icons": "^5.3.2", - "@patternfly/react-styles": "^5.3.1", - "@patternfly/react-tokens": "^5.3.1", - "focus-trap": "7.5.2", + "@patternfly/react-icons": "^5.4.0", + "@patternfly/react-styles": "^5.4.0", + "@patternfly/react-tokens": "^5.4.0", + "focus-trap": "7.5.4", "react-dropzone": "^14.2.3", - "tslib": "^2.5.0" + "tslib": "^2.6.3" }, "peerDependencies": { "react": "^17 || ^18", "react-dom": "^17 || ^18" } }, + "node_modules/@patternfly/react-core/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, "node_modules/@patternfly/react-icons": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.3.2.tgz", - "integrity": "sha512-GEygYbl0H4zD8nZuTQy2dayKIrV2bMMeWKSOEZ16Y3EYNgYVUOUnN+J0naAEuEGH39Xb1DE9n+XUbE1PC4CxPA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.4.0.tgz", + "integrity": "sha512-2M3qN/naultvRHeG2laJMmoIroFCGAyfwTVrnCjSkG6/KnRoXV0+dqd+Xrh7xzpzvIJB1klvifC0oX42cEkDrA==", + "license": "MIT", "peerDependencies": { "react": "^17 || ^18", "react-dom": "^17 || ^18" } }, "node_modules/@patternfly/react-styles": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.3.1.tgz", - "integrity": "sha512-H6uBoFH3bJjD6PP75qZ4k+2TtF59vxf9sIVerPpwrGJcRgBZbvbMZCniSC3+S2LQ8DgXLnDvieq78jJzHz0hiA==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.4.0.tgz", + "integrity": "sha512-4ZE0s6LkX/0KsN0FOeogrDoj18m+BPA73YKnabZGB4SDRzrBNeBh2a6bSt546ZseEjkoJ+S81kOG0G8YckPQYg==", + "license": "MIT" }, "node_modules/@patternfly/react-table": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.3.4.tgz", - "integrity": "sha512-jGaiuo02scaC1HdGNHuYVRjtQCOB+vtvfbgS7nl1Y8ZcJ08wyUGhGSrEpNHfGAQ1XDSSoELAxj0cjOQwAAQw1A==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.4.0.tgz", + "integrity": "sha512-HkXxVEPeI6nRVSUSHb5BungF41IfjB8W2VqaA3SX+6fGxQAW0e/Hb58ctUdPR2VJ/S2YZFcIcqCCWQtQEf+xKA==", + "license": "MIT", "dependencies": { - "@patternfly/react-core": "^5.3.4", - "@patternfly/react-icons": "^5.3.2", - "@patternfly/react-styles": "^5.3.1", - "@patternfly/react-tokens": "^5.3.1", - "lodash": "^4.17.19", - "tslib": "^2.5.0" + "@patternfly/react-core": "^5.4.0", + "@patternfly/react-icons": "^5.4.0", + "@patternfly/react-styles": "^5.4.0", + "@patternfly/react-tokens": "^5.4.0", + "lodash": "^4.17.21", + "tslib": "^2.6.3" }, "peerDependencies": { "react": "^17 || ^18", "react-dom": "^17 || ^18" } }, + "node_modules/@patternfly/react-table/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, "node_modules/@patternfly/react-tokens": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.3.1.tgz", - "integrity": "sha512-VYK0uVP2/2RJ7ZshJCCLeq0Boih5I1bv+9Z/Bg6h12dCkLs85XsxAX9Ve+BGIo5DF54/mzcRHE1RKYap4ISXuw==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.4.0.tgz", + "integrity": "sha512-KONkwCVOMyklhuuaYeYgcAsGtCBQXnsBGZeolhOdSzr2Mj0RVSW0oMrQPgZuPVzhhC/kbqgClHJJl6xuG9xheA==", + "license": "MIT" }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", @@ -2398,9 +2416,9 @@ } }, "node_modules/@redhat-cloud-services/frontend-components": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-4.2.13.tgz", - "integrity": "sha512-k72Yf6jvAt1zb5QJBvqyYue0e0I0QxF6685OcSduML5Zm6mqvSQEi7yFyqe7RcZ1DB4bGHSxt49AeNT2iR7YIQ==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-4.2.14.tgz", + "integrity": "sha512-q3RgMJiJ4Zk4Qim0sKbCzn9IJtQT9oJWetu11FbHwYZV2w25mORM22QA9LS1jOsaywJJJc4J453CPVRBQhrkGw==", "dependencies": { "@patternfly/react-component-groups": "^5.0.0", "@redhat-cloud-services/frontend-components-utilities": "^4.0.0", @@ -2424,13 +2442,14 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-config": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-config/-/frontend-components-config-6.1.2.tgz", - "integrity": "sha512-+18PYpNbocXkQ37F9na+JlUP5OJrEjUHgKPIjxVh9/28qIYl7gPW4jcPrC7weTnhR1SrgZo6goqhZB/JOoy6oQ==", + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-config/-/frontend-components-config-6.2.8.tgz", + "integrity": "sha512-1B8DFu8kSfcxuc7AULKzLulnaN3HfQwQcArDBLGz/uN8hRmBxe02ZER23HptNieXlzKQ3zt1d6vTMey0AbfSEw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@pmmmwh/react-refresh-webpack-plugin": "^0.5.8", - "@redhat-cloud-services/frontend-components-config-utilities": "^3.1.0", + "@redhat-cloud-services/frontend-components-config-utilities": "^3.2.2", "@redhat-cloud-services/tsc-transform-imports": "^1.0.12", "@swc/core": "^1.3.76", "assert": "^2.0.0", @@ -2447,7 +2466,7 @@ "glob": "^7.2.3", "html-replace-webpack-plugin": "^2.6.0", "html-webpack-plugin": "^5.5.0", - "http-server": "^13.1.0", + "http-server": "^14.0.0", "https-proxy-agent": "^5.0.1", "inquirer": "^8.2.4", "js-yaml": "^4.1.0", @@ -2477,10 +2496,11 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-config-utilities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-config-utilities/-/frontend-components-config-utilities-3.1.0.tgz", - "integrity": "sha512-55ooVQXv8qvs3zbBza8Bg9yLPwgFnz6AkG6gAGSoaIUyymvezvBq5FlXRPFMr+tcaRwkgxRqsL2x/GTvtUD81w==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-config-utilities/-/frontend-components-config-utilities-3.2.2.tgz", + "integrity": "sha512-Zfc1lEvvhZcRWklSZCa17UlytCjCEh/cn3umEEpx7LLcBYfRRIQjNc7L/iKxGpA1mJUVOaNk1G7i1oO39D7FCQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@openshift/dynamic-plugin-sdk-webpack": "^4.0.1", "chalk": "^4.1.2", @@ -2495,6 +2515,7 @@ "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" }, @@ -2510,6 +2531,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" @@ -2526,6 +2548,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" }, @@ -2537,13 +2560,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/@redhat-cloud-services/frontend-components-config-utilities/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" } @@ -2553,6 +2578,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" }, @@ -2673,9 +2699,9 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-utilities": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-utilities/-/frontend-components-utilities-4.0.13.tgz", - "integrity": "sha512-UBvfUlrf0IVPRcqhipRXGBNIuMP1+CG4FRNyGKCb8PuZM/iPX951JmEbelgBAyEwKGffnEPojP0A+9Xu6iFlJg==", + "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==", "dependencies": { "@redhat-cloud-services/rbac-client": "^1.0.111 || 2.x", "@redhat-cloud-services/types": "^1.0.9", @@ -2725,9 +2751,9 @@ } }, "node_modules/@redhat-cloud-services/rbac-client": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.0.4.tgz", - "integrity": "sha512-8oRCASjBYoqt06GQ+euC8IvSLLV3ODkIdpsvRhW5aMkA55LJtszuvVTt8olC3S7ThYGwVogj3XyQPUB5d1o6Uw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.2.tgz", + "integrity": "sha512-GsHHRyYcfh8BJaW9jdBuKLnA+n2YpfGU4kfibCS04BWQz+g8F6jF6gHhJAymHicN+lgvFo8Z1WvF4TRfI17qNg==", "dependencies": { "@redhat-cloud-services/javascript-clients-shared": "^1.2.2", "axios": "^1.7.2", @@ -2769,9 +2795,9 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.6.tgz", - "integrity": "sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz", + "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==", "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", @@ -2792,9 +2818,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", - "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", + "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -2981,15 +3007,15 @@ } }, "node_modules/@swc/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.0.tgz", - "integrity": "sha512-d4vMzH6ICllDwlPuhset2h8gu/USHdbyfJim+2hQEdxC0UONtfpmu38XBgNqRjStrji1Q5M10jfeUZL3cu1i8g==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.23.tgz", + "integrity": "sha512-VDNkpDvDlreGh2E3tlDj8B3piiuLhhQA/7rIVZpiLUvG1YpucAa6N7iDXA7Gc/+Hah8spaCg/qvEaBkCmcIYCQ==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.9" + "@swc/types": "^0.1.12" }, "engines": { "node": ">=10" @@ -2999,16 +3025,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.0", - "@swc/core-darwin-x64": "1.7.0", - "@swc/core-linux-arm-gnueabihf": "1.7.0", - "@swc/core-linux-arm64-gnu": "1.7.0", - "@swc/core-linux-arm64-musl": "1.7.0", - "@swc/core-linux-x64-gnu": "1.7.0", - "@swc/core-linux-x64-musl": "1.7.0", - "@swc/core-win32-arm64-msvc": "1.7.0", - "@swc/core-win32-ia32-msvc": "1.7.0", - "@swc/core-win32-x64-msvc": "1.7.0" + "@swc/core-darwin-arm64": "1.7.23", + "@swc/core-darwin-x64": "1.7.23", + "@swc/core-linux-arm-gnueabihf": "1.7.23", + "@swc/core-linux-arm64-gnu": "1.7.23", + "@swc/core-linux-arm64-musl": "1.7.23", + "@swc/core-linux-x64-gnu": "1.7.23", + "@swc/core-linux-x64-musl": "1.7.23", + "@swc/core-win32-arm64-msvc": "1.7.23", + "@swc/core-win32-ia32-msvc": "1.7.23", + "@swc/core-win32-x64-msvc": "1.7.23" }, "peerDependencies": { "@swc/helpers": "*" @@ -3020,9 +3046,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.0.tgz", - "integrity": "sha512-2ylhM7f0HwUwLrFYZAe/dse8PCbPsYcJS3Dt7Q8NT3PUn7vy6QOMxNcOPPuDrnmaXqQQO3oxdmRapguTxaat9g==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.23.tgz", + "integrity": "sha512-yyOHPfti6yKlQulfVWMt7BVKst+SyEZYCWuQSGMn1KgmNCH/bYufRWfQXIhkGSj44ZkEepJmsJ8tDyIb4k5WyA==", "cpu": [ "arm64" ], @@ -3037,9 +3063,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.0.tgz", - "integrity": "sha512-SgVnN4gT1Rb9YfTkp4FCUITqSs7Yj0uB2SUciu5CV3HuGvS5YXCUzh+KrwpLFtx8NIgivISKcNnb41mJi98X8Q==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.23.tgz", + "integrity": "sha512-GzqHwQ0Y1VyjdI/bBKFX2GKm5HD3PIB6OhuAQtWZMTtEr2yIrlT0YK2T+XKh7oIg31JwxGBeQdBk3KTI7DARmQ==", "cpu": [ "x64" ], @@ -3054,9 +3080,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.0.tgz", - "integrity": "sha512-+Z9Dayart1iKJQEJJ9N/KS4z5EdXJE3WPFikY0jonKTo4Dd8RuyVz5yLvqcIMeVdz/SwximATaL6iJXw7hZS9A==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.23.tgz", + "integrity": "sha512-qwX4gB41OS6/OZkHcpTqLFGsdmvoZyffnJIlgB/kZKwH3lfeJWzv6vx57zXtNpM/t7GoQEe0VZUVdmNjxSxBZw==", "cpu": [ "arm" ], @@ -3071,9 +3097,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.0.tgz", - "integrity": "sha512-UnLrCiZ1EI4shznJn0xP6DLgsXUSwtfsdgHhGYCrvbgVBBve3S9iFgVFEB3SPl7Q/TdowNbrN4zHU0oChfiNfw==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.23.tgz", + "integrity": "sha512-TsrbUZdMaUwzI7+g/8rHPLWbntMKYSu5Bn5IBSqVKPeyqaXxNnlIUnWXgXcUcRAc+T+Y8ADfr7EiFz9iz5DuSA==", "cpu": [ "arm64" ], @@ -3088,9 +3114,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.0.tgz", - "integrity": "sha512-H724UANA+ptsfwKRr9mnaDa9cb5fw0oFysiGKTgb3DMYcgk3Od0jMTnXVPFSVpo7FlmyxeC9K8ueUPBOoOK6XA==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.23.tgz", + "integrity": "sha512-JEdtwdthazKq4PBz53KSubwwK8MvqODAihGSAzc8u3Unq4ojcvaS8b0CwLBeD+kTQ78HpxOXTt3DsFIxpgaCAA==", "cpu": [ "arm64" ], @@ -3105,9 +3131,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.0.tgz", - "integrity": "sha512-SY3HA0K0Dpqt1HIfMLGpwL4hd4UaL2xHP5oZXPlRQPhUDZrbb4PbI3ZJnh66c63eL4ZR8EJ+HRFI0Alx5p69Zw==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.23.tgz", + "integrity": "sha512-V51gFPWaVAHbI1yg9ahsoya3aB4uawye3SZ5uQWgcP7wdCdiv60dw4F5nuPJf5Z1oXD3U/BslXuamv8Oh9vXqQ==", "cpu": [ "x64" ], @@ -3122,9 +3148,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.0.tgz", - "integrity": "sha512-cEJ2ebtV1v/5Ilb55E05J6F5SrHKQWzUttIhR5Mkayyo+yvPslcpByuFC3D+J7X1ebziTOBpWuMpUdjLfh3SMQ==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.23.tgz", + "integrity": "sha512-BBqQi4+UdeRqag3yM4IJjaHG4yc1o3l9ksENHToE0o/u2DT0FY5+K/DiYGZLC1JHbSFzNqRCYsa7DIzRtZ0A1A==", "cpu": [ "x64" ], @@ -3139,9 +3165,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.0.tgz", - "integrity": "sha512-ecQOOmzEssz+m0pR4xDYCGuvn3E/l0nQ3tk5jp1NA1lsAy4bMV0YbYCHjptYvWL/UjhIerIp3IlCJ8x5DodSog==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.23.tgz", + "integrity": "sha512-JPk6pvCKncL6bXG7p+NLZf8PWx4FakVvKNdwGeMrYunb+yk1IZf7qf9LJk8+GDGF5QviDXPs8opZrTrfsW80fA==", "cpu": [ "arm64" ], @@ -3156,9 +3182,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.0.tgz", - "integrity": "sha512-gz81seZkRn3zMnVOc7L5k6F4vQC82gIxmHiL+GedK+A37XI/X26AASU3zxvORnqQbwQYXQ+AEVckxBmFlz3v2g==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.23.tgz", + "integrity": "sha512-2Whxi8d+bLQBzJcQ5qYPHlk02YYVGsMVav0fWk+FnX2z1QRREIu1L1xvrpi7gBpjXp6BIU40ya8GiKeekNT2bg==", "cpu": [ "ia32" ], @@ -3173,9 +3199,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.0.tgz", - "integrity": "sha512-b5Fd1xEOw9uqBpj2lqsaR4Iq9UhiL84hNDcEsi6DQA7Y1l85waQAslTbS0E4/pJ1PISAs0jW0zIGLco1eaWBOg==", + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.23.tgz", + "integrity": "sha512-82fARk4/yJ40kwWKY/gdKDisPdtgJE9jgpl/vkNG3alyJxrCzuNM7+CtiKoYbXLeqM8GQTS3wlvCaJu9oQ8dag==", "cpu": [ "x64" ], @@ -3213,10 +3239,11 @@ } }, "node_modules/@swc/types": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.9.tgz", - "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", + "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" } @@ -3318,13 +3345,12 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.6.tgz", - "integrity": "sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", "dev": true, "dependencies": { "@adobe/css-tools": "^4.4.0", - "@babel/runtime": "^7.9.2", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", @@ -3336,30 +3362,6 @@ "node": ">=14", "npm": ">=6", "yarn": ">=1" - }, - "peerDependencies": { - "@jest/globals": ">= 28", - "@types/bun": "latest", - "@types/jest": ">= 28", - "jest": ">= 28", - "vitest": ">= 0.32" - }, - "peerDependenciesMeta": { - "@jest/globals": { - "optional": true - }, - "@types/bun": { - "optional": true - }, - "@types/jest": { - "optional": true - }, - "jest": { - "optional": true - }, - "vitest": { - "optional": true - } } }, "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { @@ -3436,10 +3438,11 @@ } }, "node_modules/@testing-library/react": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz", - "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", + "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -3573,22 +3576,26 @@ "node_modules/@types/d3-array": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", "dependencies": { "@types/d3-color": "*" } @@ -3596,12 +3603,14 @@ "node_modules/@types/d3-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "license": "MIT", "dependencies": { "@types/d3-time": "*" } @@ -3610,6 +3619,7 @@ "version": "3.1.6", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "license": "MIT", "dependencies": { "@types/d3-path": "*" } @@ -3617,12 +3627,14 @@ "node_modules/@types/d3-time": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" }, "node_modules/@types/debounce-promise": { "version": "3.1.9", @@ -3639,16 +3651,6 @@ "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -3903,9 +3905,10 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz", + "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==", + "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4116,32 +4119,32 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", - "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.4.0.tgz", + "integrity": "sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/type-utils": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/type-utils": "8.4.0", + "@typescript-eslint/utils": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.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.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4150,27 +4153,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz", - "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.4.0.tgz", + "integrity": "sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/typescript-estree": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4179,17 +4181,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz", - "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz", + "integrity": "sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1" + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4197,27 +4199,24 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", - "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.4.0.tgz", + "integrity": "sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/utils": "7.16.1", + "@typescript-eslint/typescript-estree": "8.4.0", + "@typescript-eslint/utils": "8.4.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -4225,13 +4224,13 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", - "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz", + "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4239,23 +4238,23 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", - "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz", + "integrity": "sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "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.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4297,40 +4296,40 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", - "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.4.0.tgz", + "integrity": "sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1" + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/typescript-estree": "8.4.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz", - "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz", + "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/types": "8.4.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4351,14 +4350,15 @@ } }, "node_modules/@unleash/proxy-client-react": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@unleash/proxy-client-react/-/proxy-client-react-4.3.0.tgz", - "integrity": "sha512-WCsTcuxIcchW8j5g1vSKZZ1C2yRU9cJog0PVgUSgqLQE01bDXLmo4Nhx2vE8d4XQ3o2bC5FxPa9g87ipuObMCA==", + "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==", + "license": "Apache-2.0", "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "unleash-proxy-client": "^3.5.1" + "unleash-proxy-client": "^3.5.2" } }, "node_modules/@webassemblyjs/ast": { @@ -4605,10 +4605,10 @@ "acorn-walk": "^8.0.2" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -4958,18 +4958,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", @@ -5104,18 +5092,19 @@ } }, "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", "dev": true, + "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -5123,12 +5112,13 @@ } }, "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "dequal": "^2.0.3" + "deep-equal": "^2.0.5" } }, "node_modules/babel-jest": { @@ -5335,14 +5325,25 @@ ] }, "node_modules/basic-auth": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", - "integrity": "sha512-CtGuTyWf3ig+sgRyC7uP6DM3N+5ur/p8L+FPfsd+BbIfIs74TFfCajZTHnCw6K5dqM0bZEbRIqRy1fAdiUJhTA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -6497,6 +6498,7 @@ "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -6791,6 +6793,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -6802,6 +6805,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -6810,6 +6814,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", "engines": { "node": ">=12" } @@ -6818,6 +6823,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -6826,6 +6832,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -6837,6 +6844,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -6845,6 +6853,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -6860,6 +6869,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -6871,6 +6881,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -6882,6 +6893,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -6893,6 +6905,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -6989,9 +7002,9 @@ "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -7025,6 +7038,39 @@ } } }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -7220,12 +7266,14 @@ "node_modules/delaunator": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", - "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==", + "license": "ISC" }, "node_modules/delaunay-find": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/delaunay-find/-/delaunay-find-0.0.6.tgz", "integrity": "sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==", + "license": "ISC", "dependencies": { "delaunator": "^4.0.0" } @@ -7501,9 +7549,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -7639,6 +7687,27 @@ "node": ">= 0.4" } }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-iterator-helpers": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", @@ -7778,17 +7847,17 @@ } }, "node_modules/eslint": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.7.0.tgz", - "integrity": "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz", + "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.0", + "@eslint/config-array": "^0.18.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.7.0", + "@eslint/js": "9.9.1", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", @@ -7827,6 +7896,14 @@ }, "funding": { "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-compat-utils": { @@ -8018,25 +8095,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, "node_modules/eslint-plugin-es-x": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", @@ -8494,21 +8552,22 @@ "dev": true }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.7.0.tgz", - "integrity": "sha512-5oiVf7Y+ZxGYQTlLq81X72n+S+hjvS/u0upAdbpPEeaIZILK3MKN8lm/6QqKioBjm/qZ0B5XpMQUtc2fUkqXAg==", + "version": "50.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.2.2.tgz", + "integrity": "sha512-i0ZMWA199DG7sjxlzXn5AeYZxpRfMJjDPUl7lL9eJJX8TPRoIaxJU4ys/joP5faM5AXE1eqW/dslCj3uj4Nqpg==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.46.0", + "@es-joy/jsdoccomment": "~0.48.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.3.5", + "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", + "espree": "^10.1.0", "esquery": "^1.6.0", "parse-imports": "^2.1.1", - "semver": "^7.6.2", + "semver": "^7.6.3", "spdx-expression-parse": "^4.0.0", - "synckit": "^0.9.0" + "synckit": "^0.9.1" }, "engines": { "node": ">=18" @@ -8517,23 +8576,6 @@ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -8547,9 +8589,9 @@ } }, "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "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" @@ -8559,27 +8601,28 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" }, "engines": { "node": ">=4.0" @@ -8588,6 +8631,16 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8749,73 +8802,31 @@ "dev": true, "peer": true }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-node/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-patternfly-react": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-patternfly-react/-/eslint-plugin-patternfly-react-5.3.0.tgz", - "integrity": "sha512-6i/13l7NLUcjTvtgvZ5GUF6b/jwcjKK97MkvsLU5sw66Vh2Bk/R+eC5AjMF9fz9g2saRB/wBt1PiZMlYo+QX6Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-patternfly-react/-/eslint-plugin-patternfly-react-5.4.0.tgz", + "integrity": "sha512-9x7So55+lw5Jnv7CXE9yJf73tqKJiyeFh70iXAyXWYWhcRW9CtYkwdoU6eA9l/NBWt7lHcjXIPH7oqoinORBCA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/eslint-parser": "^7.19.1", + "@babel/eslint-parser": "^7.24.7", "eslint-config-airbnb": "^19.0.4", - "eslint-config-prettier": "^9.0.0", - "eslint-config-standard": "^17.0.0", + "eslint-config-prettier": "^9.1.0", + "eslint-config-standard": "^17.1.0", "eslint-config-standard-jsx": "^11.0.0", "eslint-config-standard-react": "^13.0.0", - "eslint-plugin-import": "^2.13.0", - "eslint-plugin-jest": "^27.0.0", - "eslint-plugin-jsx-a11y": "^6.0.3", - "eslint-plugin-node": "^11.0.0", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.0.0", - "eslint-plugin-react": "^7.7.0", - "eslint-plugin-react-hooks": "^4.1.2", - "eslint-plugin-rulesdir": "^0.2.0", - "eslint-plugin-standard": "^4.0.0" + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jsx-a11y": "^6.9.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-promise": "^6.4.0", + "eslint-plugin-react": "^7.34.4", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-rulesdir": "^0.2.2", + "eslint-plugin-standard": "^4.1.0" }, "peerDependencies": { - "eslint": ">=5" + "eslint": ">=5.16.0" } }, "node_modules/eslint-plugin-patternfly-react/node_modules/eslint-config-prettier": { @@ -8862,27 +8873,31 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, + "license": "ISC", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-react": { - "version": "7.34.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.4.tgz", - "integrity": "sha512-Np+jo9bUwJNxCsT12pXtrGhJgT3T44T1sHhn1Ssr42XFn8TES0267wPGo5nNrMHi8qkyimDAX2BUmkf9pSaVzA==", + "version": "7.35.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz", + "integrity": "sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", @@ -8903,14 +8918,15 @@ "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9061,10 +9077,11 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.2.2.tgz", - "integrity": "sha512-1E94YOTUDnOjSLyvOwmbVDzQi/WkKm3WVrMXu6SmBr6DN95xTGZmI6HJ/eOkSXh/DlheRsxaPsJvZByDBhWLVQ==", + "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==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^5.58.0" }, @@ -9243,30 +9260,6 @@ "node": ">=4.0" } }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -9894,9 +9887,10 @@ "license": "ISC" }, "node_modules/focus-trap": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz", - "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "license": "MIT", "dependencies": { "tabbable": "^6.2.0" } @@ -10402,9 +10396,9 @@ } }, "node_modules/globals": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.8.0.tgz", - "integrity": "sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==", + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", + "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", "dev": true, "engines": { "node": ">=18" @@ -10857,29 +10851,31 @@ } }, "node_modules/http-server": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-13.1.0.tgz", - "integrity": "sha512-MLqBMXeY/YN0FYMz4ifeOQCcg8pKj8YdmzX1pr/Vb2VrNnbxHN1s4K9BuZRVSyK/j3DQ8UVrrABb8m6EmFjWog==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, + "license": "MIT", "dependencies": { - "basic-auth": "^1.0.3", + "basic-auth": "^2.0.1", "chalk": "^4.1.2", "corser": "^2.0.1", - "he": "^1.1.0", - "http-proxy": "^1.18.0", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", "mime": "^1.6.0", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "opener": "^1.5.1", - "portfinder": "^1.0.25", + "portfinder": "^1.0.28", "secure-compare": "3.0.1", "union": "~0.5.0", - "url-join": "^2.0.5" + "url-join": "^4.0.1" }, "bin": { "http-server": "bin/http-server" }, "engines": { - "node": ">=6" + "node": ">=12" } }, "node_modules/http-server/node_modules/ansi-styles": { @@ -10887,6 +10883,7 @@ "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" }, @@ -10902,6 +10899,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" @@ -10918,6 +10916,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" }, @@ -10929,13 +10928,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/http-server/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" } @@ -10945,6 +10946,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" }, @@ -11242,6 +11244,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -14154,9 +14157,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true, "engines": { "node": ">=12.0.0" @@ -14272,7 +14275,8 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", @@ -15298,6 +15302,7 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -15317,19 +15322,22 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -16275,6 +16283,7 @@ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, + "license": "MIT", "dependencies": { "async": "^2.6.4", "debug": "^3.2.7", @@ -16289,6 +16298,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.14" } @@ -16298,6 +16308,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -16307,6 +16318,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -16603,9 +16615,9 @@ ] }, "node_modules/qs": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", - "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { "side-channel": "^1.0.6" }, @@ -16819,12 +16831,12 @@ } }, "node_modules/react-router": { - "version": "6.25.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.25.1.tgz", - "integrity": "sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz", + "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.18.0" + "@remix-run/router": "1.19.1" }, "engines": { "node": ">=14.0.0" @@ -16834,13 +16846,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.25.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.25.1.tgz", - "integrity": "sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz", + "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.18.0", - "react-router": "6.25.1" + "@remix-run/router": "1.19.1", + "react-router": "6.26.1" }, "engines": { "node": ">=14.0.0" @@ -17001,18 +17013,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -17548,7 +17548,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/select-hose": { "version": "2.0.0", @@ -18067,6 +18068,19 @@ "node": ">= 0.8" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -18146,6 +18160,17 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", @@ -18403,7 +18428,8 @@ "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" }, "node_modules/tapable": { "version": "2.2.1", @@ -18599,6 +18625,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "license": "MIT", "peer": true }, "node_modules/tiny-warning": { @@ -18714,20 +18741,20 @@ } }, "node_modules/ts-jest": { - "version": "29.2.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.2.tgz", - "integrity": "sha512-sSW7OooaKT34AAngP6k1VS669a0HdLxkQZnlC7T76sckGCokXFnvJ3yRlQZGRTAoV5K19HfSgCiSwWOSIfcYlg==", + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", "dev": true, "dependencies": { - "bs-logger": "0.x", - "ejs": "^3.0.0", - "fast-json-stable-stringify": "2.x", + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", "jest-util": "^29.0.0", "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" }, "bin": { "ts-jest": "cli.js" @@ -18761,26 +18788,11 @@ } } }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -18788,12 +18800,6 @@ "node": ">=10" } }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/ts-loader": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", @@ -19226,9 +19232,9 @@ } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -19315,9 +19321,10 @@ } }, "node_modules/unleash-proxy-client": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/unleash-proxy-client/-/unleash-proxy-client-3.5.1.tgz", - "integrity": "sha512-vfWAozp5O16ZedPPH7wFobsZaj8TQQEp/pfj+4jpWZTnOXyFpH6fAgrztRHO26bQ6iC95vVtfeVRQvgw9lo5zA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/unleash-proxy-client/-/unleash-proxy-client-3.5.2.tgz", + "integrity": "sha512-fbxTmNyJ/B6uKAZSRcfzZ9IXHokPikWgI14/6DQU3poJjZr+P7hX2KyZbkucd1/0VFYWnNTPAn+ihwyV3C8F/Q==", + "license": "Apache-2.0", "peer": true, "dependencies": { "tiny-emitter": "^2.1.0", @@ -19332,6 +19339,7 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "peer": true, "bin": { "uuid": "dist/bin/uuid" @@ -19396,10 +19404,11 @@ } }, "node_modules/url-join": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", - "integrity": "sha512-c2H1fIgpUdwFRIru9HFno5DT73Ok8hg5oOb5AT3ayIgvCRfxgs2jyt5Slw8kEB7j3QUr6yJmMPDT/odjk7jXow==", - "dev": true + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" }, "node_modules/url-parse": { "version": "1.5.10", @@ -19511,158 +19520,170 @@ } }, "node_modules/victory-area": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-36.9.2.tgz", - "integrity": "sha512-32aharvPf2RgdQB+/u1j3/ajYFNH/7ugLX9ZRpdd65gP6QEbtXL+58gS6CxvFw6gr/y8a0xMlkMKkpDVacXLpw==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-37.1.0.tgz", + "integrity": "sha512-SfXlOl2Tg700/2+yuq4sNUP2x0VvsZeQz07QohnN4n9ag17Vj650gp8Yx5vj+CWRSZKWd77OcWiQ5FvBAZbr6A==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2", - "victory-vendor": "^36.9.2" + "victory-core": "37.1.0", + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-area/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-axis": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-36.9.2.tgz", - "integrity": "sha512-4Odws+IAjprJtBg2b2ZCxEPgrQ6LgIOa22cFkGghzOSfTyNayN4M3AauNB44RZyn2O/hDiM1gdBkEg1g9YDevQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-37.1.0.tgz", + "integrity": "sha512-7c0zWLEX+L7GzQ6gNUnJHnCnRkgSU57KU41w95XYfmNOpT9bsPwAGmVRfMEvZVWlhpiWshNRzaW2RQ9wSrNZPA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-axis/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-bar": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-36.9.2.tgz", - "integrity": "sha512-R3LFoR91FzwWcnyGK2P8DHNVv9gsaWhl5pSr2KdeNtvLbZVEIvUkTeVN9RMBMzterSFPw0mbWhS1Asb3sV6PPw==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-37.1.0.tgz", + "integrity": "sha512-vww8UGioxXC8+zV0dzPOVBkk6Dzd+SQcGF+SzFVg3rPyVvTDf5ALL3Hp8Qt6rIkV2rWLjSVh2H3RcEHtkffPEw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2", - "victory-vendor": "^36.9.2" + "victory-core": "37.1.0", + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-bar/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-box-plot": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-36.9.2.tgz", - "integrity": "sha512-nUD45V/YHDkAKZyak7YDsz+Vk1F9N0ica3jWQe0AY0JqD9DleHa8RY/olSVws26kLyEj1I+fQqva6GodcLaIqQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-37.1.0.tgz", + "integrity": "sha512-26RRltwrvs3hU7I5x1VHF71eDdVdYpfOfWDbQlte73/sfJotkOI2s8GApkG7fxLbuoYfu4n+2eOPM6FIbFdbtA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2", - "victory-vendor": "^36.9.2" + "victory-core": "37.1.0", + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-box-plot/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-brush-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-36.9.2.tgz", - "integrity": "sha512-KcQjzFeo40tn52cJf1A02l5MqeR9GKkk3loDqM3T2hfi1PCyUrZXEUjGN5HNlLizDRvtcemaAHNAWlb70HbG/g==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-37.1.0.tgz", + "integrity": "sha512-TYw/7ujVvBNwbjzefnPWQj8K+IqyX62G4JNWw+M83ZTnetuN7yZBhch57JCHCh6tCBll9HZijzvuw4ftt8x+sA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "^36.9.2" + "victory-core": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-brush-container/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-chart": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-36.9.2.tgz", - "integrity": "sha512-dMNcS0BpqL3YiGvI4BSEmPR76FCksCgf3K4CSZ7C/MGyrElqB6wWwzk7afnlB1Qr71YIHXDmdwsPNAl/iEwTtA==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-37.1.0.tgz", + "integrity": "sha512-3wCOLCyJ94o03Uvj2XvNyY3AiFvGfVgq/8PZDnPu649ntSOG3MRGgwiazq8BHkPy9Im9MXN0dZ+WcemhPRZfPA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-axis": "^36.9.2", - "victory-core": "^36.9.2", - "victory-polar-axis": "^36.9.2", - "victory-shared-events": "^36.9.2" + "victory-axis": "37.1.0", + "victory-core": "37.1.0", + "victory-polar-axis": "37.1.0", + "victory-shared-events": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-chart/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" @@ -19672,6 +19693,7 @@ "version": "37.0.2", "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.0.2.tgz", "integrity": "sha512-B3A3yCanjskShZTFtA1Bp8BLXniaTtjzaKHOChjCkay8oRkWjGMy0aZdCL7ezfUWVHAaFUIw248PgqApMn1K/w==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", @@ -19681,344 +19703,320 @@ "react": ">=16.6.0" } }, - "node_modules/victory-core/node_modules/victory-vendor": { - "version": "37.0.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.0.2.tgz", - "integrity": "sha512-Mjs+00QR256itUM/jVqGJkAw5OADpwjQj7sOEqLqJQfnj9uuf7cPto1KCjrS5d+E6lb0mE5kYwUfzBq0BrMa8Q==", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, "node_modules/victory-create-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-36.9.2.tgz", - "integrity": "sha512-uA0dh1R0YDzuXyE/7StZvq4qshet+WYceY7R1UR5mR/F9079xy+iQsa2Ca4h97/GtVZoLO6r1eKLWBt9TN+U7A==", + "version": "37.0.2", + "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-37.0.2.tgz", + "integrity": "sha512-cojSUT/TWunznM3rMlchlYZ+QdTLKHQE519ZQdomA04rKdU+rK/X+XaeMHDWZVRZHp4YrfUmR7OfOb4AHBTm7w==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-brush-container": "^36.9.2", - "victory-core": "^36.9.2", - "victory-cursor-container": "^36.9.2", - "victory-selection-container": "^36.9.2", - "victory-voronoi-container": "^36.9.2", - "victory-zoom-container": "^36.9.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-create-container/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", - "dependencies": { - "lodash": "^4.17.21", - "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-brush-container": "^37.0.2", + "victory-core": "^37.0.2", + "victory-cursor-container": "^37.0.2", + "victory-selection-container": "^37.0.2", + "victory-voronoi-container": "^37.0.2", + "victory-zoom-container": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-cursor-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-36.9.2.tgz", - "integrity": "sha512-jidab4j3MaciF3fGX70jTj4H9rrLcY8o2LUrhJ67ZLvEFGGmnPtph+p8Fe97Umrag7E/DszjNxQZolpwlgUh3g==", + "version": "37.0.2", + "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-37.0.2.tgz", + "integrity": "sha512-07PB8XNYi9AqnwZjCxQ6gKcJip6p2fwUT1+aHYDUAy/ncL6xBZD4t3sXErPHT3ha/itx7I861OsehDLZCjnkHA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-cursor-container/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", - "dependencies": { - "lodash": "^4.17.21", - "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-core": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-group": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-36.9.2.tgz", - "integrity": "sha512-wBmpsjBTKva8mxHvHNY3b8RE58KtnpLLItEyyAHaYkmExwt3Uj8Cld3sF3vmeuijn2iR64NPKeMbgMbfZJzycw==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-37.1.0.tgz", + "integrity": "sha512-PXR9BJEeMONej3N9kRk6xPD07o7Umes9HsSNvcm6TV4K86VuMXzLuYg5Q3PmknWnDF1eECDr1pfWZbLy1vTi/Q==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "^36.9.2", - "victory-shared-events": "^36.9.2" + "victory-core": "37.1.0", + "victory-shared-events": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-group/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-legend": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-36.9.2.tgz", - "integrity": "sha512-cucFJpv6fty+yXp5pElQFQnHBk1TqA4guGUMI+XF/wLlnuM4bhdAtASobRIIBkz0mHGBaCAAV4PzL9azPU/9dg==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-37.1.0.tgz", + "integrity": "sha512-fxxvSkq6AUgEZawfgo4gJtNleFATwwICkad+6JxRii0F73YY0hzbfbkC2YrLSK920JxbnzLWf0ixMtbFzT/yew==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-legend/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-line": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-36.9.2.tgz", - "integrity": "sha512-kmYFZUo0o2xC8cXRsmt/oUBRQSZJVT2IJnAkboUepypoj09e6CY5tRH4TSdfEDGkBk23xQkn7d4IFgl4kAGnSA==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-37.1.0.tgz", + "integrity": "sha512-5IejHIbYrDjsOFdbftG+NhBf1mcAb9YNwrV14SGNN9PMejeCS7PN4nT+tC8BFdGF17ORS0gDP464AvVIn7jlbg==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2", - "victory-vendor": "^36.9.2" + "victory-core": "37.1.0", + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-line/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-pie": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-36.9.2.tgz", - "integrity": "sha512-i3zWezvy5wQEkhXKt4rS9ILGH7Vr9Q5eF9fKO4GMwDPBdYOTE3Dh2tVaSrfDC8g9zFIc0DKzOtVoJRTb+0AkPg==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-37.1.0.tgz", + "integrity": "sha512-6wLs/XBrp+nq8U7L81TiEQGIqn+InTCiNMBMbABRWdsQQVviysovoZ0Q+GhEcGl5+BWhbRPe3LGMfEQTwQYX/Q==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2", - "victory-vendor": "^36.9.2" + "victory-core": "37.1.0", + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-pie/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-polar-axis": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-36.9.2.tgz", - "integrity": "sha512-HBR90FF4M56yf/atXjSmy3DMps1vSAaLXmdVXLM/A5g+0pUS7HO719r5x6dsR3I6Rm+8x6Kk8xJs0qgpnGQIEw==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-37.1.0.tgz", + "integrity": "sha512-NY5RPLRFqeGDWMTlZ8EZERtMS7gcviBtcO7h9lvDbUHFrrDdxBe4YwzgEgdzIdwVJpV9bSngVjBaOrDb8NPXyw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-polar-axis/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-scatter": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-36.9.2.tgz", - "integrity": "sha512-hK9AtbJQfaW05i8BH7Lf1HK7vWMAfQofj23039HEQJqTKbCL77YT+Q0LhZw1a1BRCpC/5aSg9EuqblhfIYw2wg==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-37.1.0.tgz", + "integrity": "sha512-movtEagWZjFnI4Wbrn1zb2rgV5UTnCwipVnj+Rj8IEu7NUIjuA1B8ZQsdo6yJs1JzMQeslfbuN1PP3dWiJ/MvA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-scatter/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-selection-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-36.9.2.tgz", - "integrity": "sha512-chboroEwqqVlMB60kveXM2WznJ33ZM00PWkFVCoJDzHHlYs7TCADxzhqet2S67SbZGSyvSprY2YztSxX8kZ+XQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-37.1.0.tgz", + "integrity": "sha512-AXBWydZAlVV+Vo6Hj9IskTHijnhA/rcrjxwk1kfbhClPDFwnREtkdzO8r6BLqlFlAQlXYK5vDONBzpLR0q22FA==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-selection-container/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-shared-events": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-36.9.2.tgz", - "integrity": "sha512-W/atiw3Or6MnpBuhluFv6007YrixIRh5NtiRvtFLGxNuQJLYjaSh6koRAih5xJer5Pj7YUx0tL9x67jTRcJ6Dg==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-37.1.0.tgz", + "integrity": "sha512-j7ppVc14UeOXr3l2xZEtSxochlOcHq875MfuDjyzZUsAkpIgJ+fFwUUYVn9Inzi0iuJwghXWki/916IQjOTqvQ==", + "license": "MIT", "dependencies": { "json-stringify-safe": "^5.0.1", "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "^36.9.2" + "victory-core": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-shared-events/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-stack": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-36.9.2.tgz", - "integrity": "sha512-imR6FniVlDFlBa/B3Est8kTryNhWj2ZNpivmVOebVDxkKcVlLaDg3LotCUOI7NzOhBQaro0UzeE9KmZV93JcYA==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-37.1.0.tgz", + "integrity": "sha512-Mipm4Lzn7Ely1qHCTZRRC/ug4zIueNFzlgHHXObMgjt9iXz2sBAYe8eJXNkdJIDo67XTU8nTVLgzXsuiyz++eg==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "^36.9.2", - "victory-shared-events": "^36.9.2" + "victory-core": "37.1.0", + "victory-shared-events": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-stack/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-tooltip": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-36.9.2.tgz", - "integrity": "sha512-76seo4TWD1WfZHJQH87IP3tlawv38DuwrUxpnTn8+uW6/CUex82poQiVevYdmJzhataS9jjyCWv3w7pOmLBCLg==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-37.1.0.tgz", + "integrity": "sha512-OiXZ40dC/XTaW05oiwm8V4JJATfnedCrvuSCE/yiRp/RPysw5ZhbgAdVFDglJnT5aTxKcafRrr8NTy6nNNLgCw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-tooltip/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-vendor": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", - "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.1.0.tgz", + "integrity": "sha512-ecXgkii9uNdLQvEmRQgSawdGLVLT5jAbSuyIyDeS0T5O3diTEW/UcyK+JmXJxVaNb1ZHPZ+zEW/bNg2pyGraIw==", + "license": "MIT AND ISC", "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", @@ -20037,53 +20035,43 @@ } }, "node_modules/victory-voronoi-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-36.9.2.tgz", - "integrity": "sha512-NIVYqck9N4OQnEz9mgQ4wILsci3OBWWK7RLuITGHyoD7Ne/+WH1i0Pv2y9eIx+f55rc928FUTugPPhkHvXyH3A==", + "version": "37.0.2", + "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-37.0.2.tgz", + "integrity": "sha512-iqx/35Rx9vMDKkHw+2xibAF8OT4MTHZk9GG7sPxnlYWoZqDSuuaqR5SmrHosDmw2oqXbj7AqG2wqfxmbMp7ZhA==", + "license": "MIT", "dependencies": { "delaunay-find": "0.0.6", "lodash": "^4.17.19", "react-fast-compare": "^3.2.0", - "victory-core": "^36.9.2", - "victory-tooltip": "^36.9.2" - }, - "peerDependencies": { - "react": ">=16.6.0" - } - }, - "node_modules/victory-voronoi-container/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", - "dependencies": { - "lodash": "^4.17.21", - "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-core": "^37.0.2", + "victory-tooltip": "^37.0.2" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-zoom-container": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-36.9.2.tgz", - "integrity": "sha512-pXa2Ji6EX/pIarKT6Hcmmu2n7IG/x8Vs0D2eACQ/nbpvZa+DXWIxCRW4hcg2Va35fmXcDIEpGaX3/soXzZ+pbw==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-37.1.0.tgz", + "integrity": "sha512-GTW15lHBj+YVDAu2ONIPteVKzPbRWt/Lhzc/9p1e+VOvkfQtL+skZLt1Pq6diYZzcqyimzk6Z+FeipXiig8AMQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.19", - "victory-core": "^36.9.2" + "victory-core": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" } }, "node_modules/victory-zoom-container/node_modules/victory-core": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.9.2.tgz", - "integrity": "sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==", + "version": "37.1.0", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.1.0.tgz", + "integrity": "sha512-K1PVc0AIO+p5XmmgjK1L87MXZS+UKyguohTR1dNT1Ltveerj9TR5hys8DTdMPpWhR+W7R6U9RLQeACbQSOcbnQ==", + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "react-fast-compare": "^3.2.0", - "victory-vendor": "^36.9.2" + "victory-vendor": "37.1.0" }, "peerDependencies": { "react": ">=16.6.0" @@ -20170,26 +20158,25 @@ } }, "node_modules/webpack": { - "version": "5.90.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", - "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -20197,7 +20184,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { diff --git a/package.json b/package.json index 0fa81ea88..e8cae8521 100644 --- a/package.json +++ b/package.json @@ -50,73 +50,76 @@ "verify": "npm-run-all build lint test" }, "dependencies": { - "@patternfly/patternfly": "5.3.1", - "@patternfly/react-charts": "7.3.0", + "@patternfly/patternfly": "5.4.0", + "@patternfly/react-charts": "7.4.0", "@patternfly/react-component-groups": "^5.2.0", - "@patternfly/react-core": "5.3.4", - "@patternfly/react-icons": "5.3.2", - "@patternfly/react-table": "5.3.4", - "@patternfly/react-tokens": "5.3.1", - "@redhat-cloud-services/frontend-components": "^4.2.13", + "@patternfly/react-core": "5.4.0", + "@patternfly/react-icons": "5.4.0", + "@patternfly/react-table": "5.4.0", + "@patternfly/react-tokens": "5.4.0", + "@redhat-cloud-services/frontend-components": "^4.2.14", "@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.13", - "@redhat-cloud-services/rbac-client": "^2.0.4", - "@reduxjs/toolkit": "^2.2.6", - "@unleash/proxy-client-react": "^4.3.0", - "axios": "^1.7.2", + "@redhat-cloud-services/frontend-components-utilities": "^4.0.17", + "@redhat-cloud-services/rbac-client": "^2.2.2", + "@reduxjs/toolkit": "^2.2.7", + "@unleash/proxy-client-react": "^4.3.1", + "axios": "^1.7.7", "date-fns": "^3.6.0", "js-file-download": "^0.4.12", "lodash": "^4.17.21", - "qs": "^6.12.3", + "qs": "^6.13.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-intl": "^6.6.8", "react-redux": "^9.1.2", - "react-router-dom": "^6.25.1", + "react-router-dom": "^6.26.1", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typesafe-actions": "^5.1.0", - "victory-core": "^37.0.2" + "victory-core": "37.0.2", + "victory-create-container": "37.0.2", + "victory-cursor-container": "37.0.2", + "victory-voronoi-container": "37.0.2" }, "devDependencies": { "@eslint/compat": "^1.1.1", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "^9.7.0", + "@eslint/js": "^9.9.1", "@formatjs/cli": "^6.2.12", "@formatjs/ecma402-abstract": "^2.0.0", "@formatjs/icu-messageformat-parser": "^2.7.8", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "^2.0.4", - "@redhat-cloud-services/frontend-components-config": "^6.1.2", + "@redhat-cloud-services/frontend-components-config": "^6.2.8", "@redhat-cloud-services/tsc-transform-imports": "^1.0.16", - "@swc/core": "^1.7.0", + "@swc/core": "^1.7.23", "@swc/jest": "^0.2.36", - "@testing-library/jest-dom": "^6.4.6", - "@testing-library/react": "^16.0.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.12", "@types/qs": "^6.9.15", - "@types/react": "^18.3.3", + "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.33", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^7.16.1", - "@typescript-eslint/parser": "^7.16.1", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", "aphrodite": "^2.4.0", "copy-webpack-plugin": "^12.0.2", - "eslint": "^9.7.0", + "eslint": "^9.9.1", "eslint-plugin-formatjs": "^4.13.3", "eslint-plugin-jest-dom": "^5.4.0", - "eslint-plugin-jsdoc": "^48.7.0", + "eslint-plugin-jsdoc": "^50.2.2", "eslint-plugin-markdown": "^5.1.0", - "eslint-plugin-patternfly-react": "^5.3.0", + "eslint-plugin-patternfly-react": "^5.4.0", "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react": "^7.34.4", + "eslint-plugin-react": "^7.35.2", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-keys-fix": "^1.1.2", - "eslint-plugin-testing-library": "^6.2.2", + "eslint-plugin-testing-library": "^6.3.0", "git-revision-webpack-plugin": "^5.0.0", - "globals": "^15.8.0", + "globals": "^15.9.0", "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -127,13 +130,14 @@ "prettier": "^3.3.3", "rimraf": "^6.0.1", "swc_mut_cjs_exports": "^0.99.0", - "ts-jest": "^29.2.2", + "ts-jest": "^29.2.5", "ts-patch": "^3.2.1", - "typescript": "^5.5.3", + "typescript": "^5.5.4", "webpack-bundle-analyzer": "^4.10.2" }, "overrides": { - "eslint": "^9.7.0", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "eslint": "^9.9.1", "redux": "^5.0.1" }, "insights": { diff --git a/renovate.json b/renovate.json new file mode 100644 index 000000000..3e7b57768 --- /dev/null +++ b/renovate.json @@ -0,0 +1,13 @@ +{ + "extends": [ + "github>konflux-ci/mintmaker//config/renovate/renovate.json" + ], + "schedule": [ + "on Tuesday after 3am and before 10am" + ], + "timezone": "America/New_York", + "ignorePaths": [ + "**/.archive/**", + "**/node_modules/**" + ] +} diff --git a/scripts/release-branch.sh b/scripts/release-branch.sh index 8f59d8871..01b02f1b0 100755 --- a/scripts/release-branch.sh +++ b/scripts/release-branch.sh @@ -11,9 +11,7 @@ default() TMP_DIR="/tmp/$SCRIPT.$$" MAIN_BRANCH="main" - PROD_BETA_BRANCH="prod-beta" - PROD_STABLE_BRANCH="prod-stable" - STAGE_STABLE_BRANCH="stage-stable" + PROD_BRANCH="prod-stable" UI_DIR="$TMP_DIR/koku-ui" UI_REPO="git@github.com:project-koku/koku-ui.git" @@ -27,17 +25,11 @@ cat <<- EEOOFF This script will merge the following branches and create a pull request (default) or push upstream - stage-stage is merged from stage-beta - prod-beta is merged from stage-stable - prod-stable is merged from prod-beta - sh [-x] $SCRIPT [-h|u] - OPTIONS: h Display this message - b Prod beta - p Prod stable - s Stage stable + p Merge $MAIN_BRANCH to $PROD_BRANCH u Push to upstream EEOOFF @@ -108,11 +100,7 @@ push() while getopts hbpsu c; do case $c in - b) BRANCH=$PROD_BETA_BRANCH - REMOTE_BRANCH=$STAGE_STABLE_BRANCH;; - p) BRANCH=$PROD_STABLE_BRANCH - REMOTE_BRANCH=$PROD_BETA_BRANCH;; - s) BRANCH=$STAGE_STABLE_BRANCH + p) BRANCH=$PROD_BRANCH REMOTE_BRANCH=$MAIN_BRANCH;; u) PUSH=true;; h) usage; exit 0;; diff --git a/src/api/accountSettings.ts b/src/api/accountSettings.ts index 59405dca3..b0f1c5ee6 100644 --- a/src/api/accountSettings.ts +++ b/src/api/accountSettings.ts @@ -23,7 +23,6 @@ export interface AccountSettingsPayload { currency?: string; } -// eslint-disable-next-line no-shadow export const enum AccountSettingsType { settings = 'settings', costType = 'costType', diff --git a/src/api/costModels.data.ts b/src/api/costModels.data.ts index b4ecce286..347e7b857 100644 --- a/src/api/costModels.data.ts +++ b/src/api/costModels.data.ts @@ -104,7 +104,7 @@ export const page1 = { name: 'memory_gb_usage_per_hour', label_metric: 'Memory', label_measurement: 'Usage', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', }, description: '', tiered_rates: [ @@ -125,7 +125,7 @@ export const page1 = { name: 'memory_gb_request_per_hour', label_metric: 'Memory', label_measurement: 'Request', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', }, description: '', tiered_rates: [ diff --git a/src/api/forecasts/forecast.ts b/src/api/forecasts/forecast.ts index 02141d622..1e518b172 100644 --- a/src/api/forecasts/forecast.ts +++ b/src/api/forecasts/forecast.ts @@ -25,16 +25,14 @@ export interface ForecastData { values?: ForecastItem[]; } -export interface Forecast extends PagedResponse {} +export type Forecast = PagedResponse; -// eslint-disable-next-line no-shadow export const enum ForecastType { cost = 'cost', infrastructure = 'infrastructure', supplementary = 'supplementary', } -// eslint-disable-next-line no-shadow export const enum ForecastPathsType { aws = 'aws', awsOcp = 'aws_ocp', diff --git a/src/api/orgs/awsOrgs.ts b/src/api/orgs/awsOrgs.ts index 75d8ca143..802a1c234 100644 --- a/src/api/orgs/awsOrgs.ts +++ b/src/api/orgs/awsOrgs.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Org } from './org'; import { OrgType } from './org'; -export interface AwsOrg extends Org {} - -export const OrgTypePaths: Partial> = { +export const AwsOrgTypePaths: Partial> = { [OrgType.org]: 'organizations/aws/', }; export function runOrg(orgType: OrgType, query: string) { - const path = OrgTypePaths[orgType]; - return axiosInstance.get(`${path}?${query}`); + const path = AwsOrgTypePaths[orgType]; + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/orgs/org.ts b/src/api/orgs/org.ts index 0e9e61ee9..7911902d4 100644 --- a/src/api/orgs/org.ts +++ b/src/api/orgs/org.ts @@ -22,14 +22,12 @@ export interface OrgMeta extends PagedMetaData { }; } -export interface Org extends PagedResponse {} +export type Org = PagedResponse; -// eslint-disable-next-line no-shadow export const enum OrgType { org = 'org', } -// eslint-disable-next-line no-shadow export const enum OrgPathsType { aws = 'aws', } diff --git a/src/api/providers.ts b/src/api/providers.ts index e10b7bf2f..961916611 100644 --- a/src/api/providers.ts +++ b/src/api/providers.ts @@ -88,9 +88,8 @@ export interface Provider { uuid?: string; } -export interface Providers extends PagedResponse {} +export type Providers = PagedResponse; -// eslint-disable-next-line no-shadow export const enum ProviderType { all = 'all', aws = 'aws', diff --git a/src/api/reports/awsReports.ts b/src/api/reports/awsReports.ts index 98104ff26..1014664fd 100644 --- a/src/api/reports/awsReports.ts +++ b/src/api/reports/awsReports.ts @@ -1,5 +1,4 @@ import { axiosInstance } from 'api'; -import { default as devAxiosInstance } from 'api/apiDev'; import type { Report, ReportData, ReportItem, ReportItemValue, ReportMeta, ReportValue } from './report'; import { ReportType } from './report'; @@ -63,9 +62,9 @@ export const ReportTypePaths: Partial> = { export function runReport(reportType: ReportType, query: string) { const path = ReportTypePaths[reportType]; - // For use with API development - if (reportType === ReportType.ec2Compute) { - return devAxiosInstance.get(`${path}?${query}`); - } + // For use with API development -- see 'api/apiDev' + // if (reportType === ReportType.ec2Compute) { + // return devAxiosInstance.get(`${path}?${query}`); + // } return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/reports/ocpReports.ts b/src/api/reports/ocpReports.ts index 56ec64c07..e52e757d7 100644 --- a/src/api/reports/ocpReports.ts +++ b/src/api/reports/ocpReports.ts @@ -28,9 +28,7 @@ export interface GroupByProjectData extends Omit { account: string; } -export interface GroupByPvcData extends Omit { - // TBD... -} +export type GroupByPvcData = Omit; export interface OcpReportData extends ReportData { cluster_alias?: string; diff --git a/src/api/reports/report.ts b/src/api/reports/report.ts index e4884fce3..7e6b58540 100644 --- a/src/api/reports/report.ts +++ b/src/api/reports/report.ts @@ -15,8 +15,10 @@ export interface ReportUsageValue extends ReportValue { export interface ReportItemValue { distributed?: ReportValue; markup?: ReportValue; + network_unattributed_distributed?: ReportValue; platform_distributed?: ReportValue; raw?: ReportValue; + storage_unattributed_distributed?: ReportValue; total?: ReportValue; usage?: ReportValue; worker_unallocated_distributed?: ReportValue; @@ -159,9 +161,8 @@ export interface ReportMeta extends PagedMetaData { }; } -export interface Report extends PagedResponse {} +export type Report = PagedResponse; -// eslint-disable-next-line no-shadow export const enum ReportType { cost = 'cost', cpu = 'cpu', @@ -175,7 +176,6 @@ export const enum ReportType { volume = 'volume', } -// eslint-disable-next-line no-shadow export const enum ReportPathsType { aws = 'aws', awsOcp = 'aws_ocp', diff --git a/src/api/resources/awsResource.ts b/src/api/resources/awsResource.ts index b955c84fe..a08b1345f 100644 --- a/src/api/resources/awsResource.ts +++ b/src/api/resources/awsResource.ts @@ -6,6 +6,8 @@ import { ResourceType } from './resource'; export const ResourceTypePaths: Partial> = { [ResourceType.account]: 'resource-types/aws-accounts/', [ResourceType.aws_category]: 'resource-types/aws-categories/', + [ResourceType.aws_ec2_instance]: 'resource-types/aws-ec2-compute-instances/', + [ResourceType.aws_ec2_os]: 'resource-types/aws-ec2-compute-os/', [ResourceType.region]: 'resource-types/aws-regions/', [ResourceType.service]: 'resource-types/aws-services/', }; diff --git a/src/api/resources/resource.ts b/src/api/resources/resource.ts index 72866d563..076859a5c 100644 --- a/src/api/resources/resource.ts +++ b/src/api/resources/resource.ts @@ -3,16 +3,18 @@ import type { PagedMetaData, PagedResponse } from 'api/api'; export interface ResourceData { account_alias?: string; cluster_alias?: string; + instance_name?: string; key?: string; value?: string | string[]; } -export interface Resource extends PagedResponse {} +export type Resource = PagedResponse; -// eslint-disable-next-line no-shadow export const enum ResourceType { account = 'account', aws_category = 'aws_category', + aws_ec2_instance = 'instance_name', + aws_ec2_os = 'operating_system', cluster = 'cluster', gcpProject = 'gcp_project', node = 'node', @@ -26,7 +28,6 @@ export const enum ResourceType { subscriptionGuid = 'subscription_guid', } -// eslint-disable-next-line no-shadow export const enum ResourcePathsType { aws = 'aws', awsOcp = 'aws_ocp', diff --git a/src/api/resources/resourceUtils.ts b/src/api/resources/resourceUtils.ts index e8e699370..0de641df3 100644 --- a/src/api/resources/resourceUtils.ts +++ b/src/api/resources/resourceUtils.ts @@ -32,6 +32,8 @@ export function isResourceTypeValid(resourcePathsType: ResourcePathsType, resour switch (resourceType) { case ResourceType.account: case ResourceType.aws_category: + case ResourceType.aws_ec2_instance: + case ResourceType.aws_ec2_os: case ResourceType.cluster: case ResourceType.gcpProject: case ResourceType.node: diff --git a/src/api/settings.ts b/src/api/settings.ts index 39c8ac023..450309db3 100644 --- a/src/api/settings.ts +++ b/src/api/settings.ts @@ -32,7 +32,6 @@ export interface SettingsPayload { ids?: string[]; } -// eslint-disable-next-line no-shadow export const enum SettingsType { costCategories = 'costCategories', costCategoriesEnable = 'costCategoriesEnable', @@ -56,17 +55,17 @@ export const SettingsTypePaths: Partial> = { [SettingsType.costCategoriesEnable]: 'settings/aws_category_keys/enable/', [SettingsType.costCategoriesDisable]: 'settings/aws_category_keys/disable/', [SettingsType.platformProjects]: 'settings/cost-groups/', - [SettingsType.platformProjectsAdd]: 'settings/cost-groups/add', - [SettingsType.platformProjectsRemove]: 'settings/cost-groups/remove', - [SettingsType.tags]: 'settings/tags', + [SettingsType.platformProjectsAdd]: 'settings/cost-groups/add/', + [SettingsType.platformProjectsRemove]: 'settings/cost-groups/remove/', + [SettingsType.tags]: 'settings/tags/', [SettingsType.tagsEnable]: 'settings/tags/enable/', [SettingsType.tagsDisable]: 'settings/tags/disable/', - [SettingsType.tagsMappings]: 'settings/tags/mappings', - [SettingsType.tagsMappingsChild]: 'settings/tags/mappings/child', - [SettingsType.tagsMappingsChildAdd]: 'settings/tags/mappings/child/add', - [SettingsType.tagsMappingsChildRemove]: 'settings/tags/mappings/child/remove', - [SettingsType.tagsMappingsParent]: 'settings/tags/mappings/parent', - [SettingsType.tagsMappingsParentRemove]: 'settings/tags/mappings/parent/remove', + [SettingsType.tagsMappings]: 'settings/tags/mappings/', + [SettingsType.tagsMappingsChild]: 'settings/tags/mappings/child/', + [SettingsType.tagsMappingsChildAdd]: 'settings/tags/mappings/child/add/', + [SettingsType.tagsMappingsChildRemove]: 'settings/tags/mappings/child/remove/', + [SettingsType.tagsMappingsParent]: 'settings/tags/mappings/parent/', + [SettingsType.tagsMappingsParentRemove]: 'settings/tags/mappings/parent/remove/', }; export function fetchSettings(settingsType: SettingsType, query: string) { diff --git a/src/api/tags/awsOcpTags.ts b/src/api/tags/awsOcpTags.ts index 7b466cc1f..769ec7668 100644 --- a/src/api/tags/awsOcpTags.ts +++ b/src/api/tags/awsOcpTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface AwsOcpTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/openshift/infrastructures/aws/', }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/awsTags.ts b/src/api/tags/awsTags.ts index bed3c0eec..3e8d05f76 100644 --- a/src/api/tags/awsTags.ts +++ b/src/api/tags/awsTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface AwsTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/aws/', }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/azureOcpTags.ts b/src/api/tags/azureOcpTags.ts index 0d81334b7..7485480a1 100644 --- a/src/api/tags/azureOcpTags.ts +++ b/src/api/tags/azureOcpTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface AzureOcpTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/openshift/infrastructures/azure/', }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/azureTags.ts b/src/api/tags/azureTags.ts index 392ab9a3d..12275fb5e 100644 --- a/src/api/tags/azureTags.ts +++ b/src/api/tags/azureTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface AzureTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/azure/', }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/gcpOcpTags.ts b/src/api/tags/gcpOcpTags.ts index 11e200012..0ac0a7069 100644 --- a/src/api/tags/gcpOcpTags.ts +++ b/src/api/tags/gcpOcpTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface GcpOcpTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/openshift/infrastructures/gcp/', }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/gcpTags.ts b/src/api/tags/gcpTags.ts index 9bf15cf25..2c8c354fe 100644 --- a/src/api/tags/gcpTags.ts +++ b/src/api/tags/gcpTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface GcpTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/gcp/', }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/ibmTags.ts b/src/api/tags/ibmTags.ts index 34747d601..c81622178 100644 --- a/src/api/tags/ibmTags.ts +++ b/src/api/tags/ibmTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface IbmTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/gcp/', // Todo: update to use ibm APIs are available }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/ociTags.ts b/src/api/tags/ociTags.ts index 14b23b9fb..c26de54b2 100644 --- a/src/api/tags/ociTags.ts +++ b/src/api/tags/ociTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface OciTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/oci/', }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/ocpCloudTags.ts b/src/api/tags/ocpCloudTags.ts index 10b1da9c5..ea848801b 100644 --- a/src/api/tags/ocpCloudTags.ts +++ b/src/api/tags/ocpCloudTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface OcpCloudTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/openshift/infrastructures/all/', }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/ocpTags.ts b/src/api/tags/ocpTags.ts index 2549a0d48..117f037c4 100644 --- a/src/api/tags/ocpTags.ts +++ b/src/api/tags/ocpTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface OcpTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/openshift/', }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/rhelTags.ts b/src/api/tags/rhelTags.ts index ed5f1abdf..f79caada3 100644 --- a/src/api/tags/rhelTags.ts +++ b/src/api/tags/rhelTags.ts @@ -3,13 +3,11 @@ import { axiosInstance } from 'api'; import type { Tag } from './tag'; import { TagType } from './tag'; -export interface RhelTag extends Tag {} - export const TagTypePaths: Partial> = { [TagType.tag]: 'tags/openshift/', // Todo: update to use ibm APIs are available }; export function runTag(tagType: TagType, query: string) { const path = TagTypePaths[tagType]; - return axiosInstance.get(`${path}?${query}`); + return axiosInstance.get(`${path}?${query}`); } diff --git a/src/api/tags/tag.ts b/src/api/tags/tag.ts index 5b6c4f979..376bf40af 100644 --- a/src/api/tags/tag.ts +++ b/src/api/tags/tag.ts @@ -18,14 +18,12 @@ export interface TagMeta extends PagedMetaData { }; } -export interface Tag extends PagedResponse {} +export type Tag = PagedResponse; -// eslint-disable-next-line no-shadow export const enum TagType { tag = 'tag', } -// eslint-disable-next-line no-shadow export const enum TagPathsType { aws = 'aws', awsOcp = 'aws_ocp', diff --git a/src/api/userAccess.ts b/src/api/userAccess.ts index 8410df19e..740bcdead 100644 --- a/src/api/userAccess.ts +++ b/src/api/userAccess.ts @@ -14,7 +14,6 @@ export interface UserAccess { data: UserAccessData[] | boolean; } -// eslint-disable-next-line no-shadow export const enum UserAccessType { all = 'all', aws = 'aws', diff --git a/src/components/drawers/commonDrawer/commonDrawer.tsx b/src/components/drawers/commonDrawer/commonDrawer.tsx index e3caea18b..229a4e2d7 100644 --- a/src/components/drawers/commonDrawer/commonDrawer.tsx +++ b/src/components/drawers/commonDrawer/commonDrawer.tsx @@ -37,7 +37,7 @@ class CommonDrawerBase extends React.Component { }; private handleExpand = () => { - this.drawerRef.current && (this.drawerRef.current as any).focus(); + (this.drawerRef?.current as any)?.focus(); }; public render() { diff --git a/src/components/drawers/exports/exportsContent.tsx b/src/components/drawers/exports/exportsContent.tsx index eca7f6d87..2e11afe16 100644 --- a/src/components/drawers/exports/exportsContent.tsx +++ b/src/components/drawers/exports/exportsContent.tsx @@ -31,7 +31,7 @@ interface ExportsContentStateProps { } interface ExportsContentDispatchProps { - // TBD... + fetchReport: typeof reportActions.fetchReport; } interface ExportsContentState { diff --git a/src/components/drawers/exports/exportsTable.tsx b/src/components/drawers/exports/exportsTable.tsx index 337cb0b16..9fa0c55f8 100644 --- a/src/components/drawers/exports/exportsTable.tsx +++ b/src/components/drawers/exports/exportsTable.tsx @@ -195,21 +195,21 @@ class ExportsTableBase extends React.Component )} > - {intl.formatMessage(messages.status, { value: status })} + {intl.formatMessage(messages.statusStates, { value: status })} ); break; case 'running': return ( ); case 'pending': default: return ( ); } diff --git a/src/components/featureToggle/featureToggle.tsx b/src/components/featureToggle/featureToggle.tsx index a180aec65..5f7dffc55 100644 --- a/src/components/featureToggle/featureToggle.tsx +++ b/src/components/featureToggle/featureToggle.tsx @@ -4,8 +4,8 @@ import { useLayoutEffect } from 'react'; import { useDispatch } from 'react-redux'; import { FeatureToggleActions } from 'store/featureToggle'; -// eslint-disable-next-line no-shadow export const enum FeatureToggle { + accountInfoEmptyState = 'cost-management.ui.account-info-empty-state', // https://issues.redhat.com/browse/COST-5335 awsEc2Instances = 'cost-management.ui.aws-ec2-instances', // https://issues.redhat.com/browse/COST-4855 debug = 'cost-management.ui.debug', exports = 'cost-management.ui.exports', // Async exports https://issues.redhat.com/browse/COST-2223 @@ -21,6 +21,10 @@ const useIsToggleEnabled = (toggle: FeatureToggle) => { return client.isEnabled(toggle); }; +export const useIsAccountInfoEmptyStateToggleEnabled = () => { + return useIsToggleEnabled(FeatureToggle.accountInfoEmptyState); +}; + export const useIsAwsEc2InstancesToggleEnabled = () => { return useIsToggleEnabled(FeatureToggle.awsEc2Instances); }; @@ -58,6 +62,7 @@ export const useFeatureToggle = () => { const dispatch = useDispatch(); const { auth } = useChrome(); + const isAccountInfoEmptyStateToggleEnabled = useIsAccountInfoEmptyStateToggleEnabled(); const isAwsEc2InstancesToggleEnabled = useIsAwsEc2InstancesToggleEnabled(); const isDebugToggleEnabled = useIsDebugToggleEnabled(); const isExportsToggleEnabled = useIsExportsToggleEnabled(); @@ -77,6 +82,7 @@ export const useFeatureToggle = () => { // Workaround for code that doesn't use hooks dispatch( FeatureToggleActions.setFeatureToggle({ + isAccountInfoEmptyStateToggleEnabled, isAwsEc2InstancesToggleEnabled, isDebugToggleEnabled, isExportsToggleEnabled, @@ -92,6 +98,7 @@ export const useFeatureToggle = () => { fetchUser(identity => console.log('User identity:', identity)); } }, [ + isAccountInfoEmptyStateToggleEnabled, isAwsEc2InstancesToggleEnabled, isDebugToggleEnabled, isExportsToggleEnabled, diff --git a/src/locales/messages.ts b/src/locales/messages.ts index eaf129ad5..a4b9001eb 100644 --- a/src/locales/messages.ts +++ b/src/locales/messages.ts @@ -1454,6 +1454,21 @@ export default defineMessages({ description: 'distribute costs', id: 'distributeCosts', }, + distributeCostsToProjects: { + defaultMessage: 'Distribute these costs to projects, based on the above description type', + description: 'Distribute these costs to projects, based on the above description type', + id: 'distributeCostsToProjects', + }, + distributeNetwork: { + defaultMessage: 'Network traffic', + description: 'Network traffic', + id: 'distributeNetwork', + }, + distributePlatform: { + defaultMessage: 'Platform overhead (OpenShift services)', + description: 'Platform overhead (OpenShift services)', + id: 'distributePlatform', + }, distributePlatformCosts: { defaultMessage: '{value, select, ' + @@ -1463,6 +1478,11 @@ export default defineMessages({ description: 'Distribute platform costs', id: 'distributePlatformCosts', }, + distributeStorage: { + defaultMessage: 'Storage', + description: 'Storage', + id: 'distributeStorage', + }, distributeUnallocatedCapacity: { defaultMessage: '{value, select, ' + @@ -1472,6 +1492,11 @@ export default defineMessages({ description: 'Distribute unallocated capacity', id: 'distributeUnallocatedCapacity', }, + distributeWorker: { + defaultMessage: 'Worker unallowcated (unused and non-reserved resources)', + description: 'Worker unallowcated (unused and non-reserved resources)', + id: 'distributeWorker', + }, distributionModelDesc: { defaultMessage: 'Choose how your raw costs are distributed at the project level.', description: 'Choose how your raw costs are distributed at the project level.', @@ -1491,11 +1516,6 @@ export default defineMessages({ description: 'Distribution type description', id: 'distributionTypeDesc', }, - doNotDistribute: { - defaultMessage: 'Do not distribute', - description: 'Do not distribute', - id: 'doNotDistribute', - }, docsAddOcpSources: { defaultMessage: 'https://docs.redhat.com/en/documentation/cost_management_service/1-latest/html/integrating_openshift_container_platform_data_into_cost_management', @@ -1749,6 +1769,7 @@ export default defineMessages({ 'product_service {{resolution, select, daily {{provider}_services_daily_{startDate}_{endDate}} monthly {{provider}_services_monthly_{startDate}_{endDate}} other {}}} ' + 'project {{resolution, select, daily {{provider}_projects_daily_{startDate}_{endDate}} monthly {{provider}_projects_monthly_{startDate}_{endDate}} other {}}} ' + 'region {{resolution, select, daily {{provider}_regions_daily_{startDate}_{endDate}} monthly {{provider}_regions_monthly_{startDate}_{endDate}} other {}}} ' + + 'resource_id {{resolution, select, daily {{provider}_resources_daily_{startDate}_{endDate}} monthly {{provider}_resources_monthly_{startDate}_{endDate}} other {}}} ' + 'resource_location {{resolution, select, daily {{provider}_regions_daily_{startDate}_{endDate}} monthly {{provider}_regions_monthly_{startDate}_{endDate}} other {}}} ' + 'service {{resolution, select, daily {{provider}_services_daily_{startDate}_{endDate}} monthly {{provider}_services_monthly_{startDate}_{endDate}} other {}}} ' + 'service_name {{resolution, select, daily {{provider}_services_daily_{startDate}_{endDate}} monthly {{provider}_services_monthly_{startDate}_{endDate}} other {}}} ' + @@ -2103,6 +2124,11 @@ export default defineMessages({ description: 'This page shows filtered results. To undo filters, clear filters on the previous page.', id: 'filteredByWarning', }, + finalization: { + defaultMessage: 'Finalization', + description: 'Finalization', + id: 'finalization', + }, forDate: { defaultMessage: '{value} for {dateRange}', description: '{value} for {Jan 1-31}', @@ -2348,11 +2374,21 @@ export default defineMessages({ description: 'Instances', id: 'instances', }, + integration: { + defaultMessage: 'Integration', + description: 'Integration', + id: 'integration', + }, lastProcessed: { defaultMessage: 'Last processed', description: 'Last processed', id: 'lastProcessed', }, + lastUpdated: { + defaultMessage: 'Last updated', + description: 'Last updated', + id: 'lastUpdated', + }, learnMore: { defaultMessage: 'Learn more', description: 'Learn more', @@ -2529,15 +2565,15 @@ export default defineMessages({ description: 'Name plural or singular', id: 'names', }, - network: { - defaultMessage: 'Network', - description: 'Network', - id: 'network', + networkUnattributedDistributed: { + defaultMessage: 'Network unattributed', + description: 'Network unattributed', + id: 'networkUnattributedDistributed', }, - networkDesc: { - defaultMessage: 'Distribute the cost of network traffic to projects based on distribution type.', - description: 'Distribute the cost of network traffic to projects based on distribution type.', - id: 'networkDesc', + networkUnattributedDistributedDesc: { + defaultMessage: 'Costs associated with ingress and egress network traffic for individual nodes.', + description: 'Costs associated with ingress and egress network traffic for individual nodes.', + id: 'networkUnattributedDistributedDesc', }, next: { defaultMessage: 'next', @@ -2555,8 +2591,7 @@ export default defineMessages({ id: 'noDataForDate', }, noDataStateDesc: { - defaultMessage: - 'We have detected an integration, but we are not done processing the incoming data. The time to process could take up to 24 hours. Try refreshing the page at a later time.', + defaultMessage: 'We have detected an integration, but we are not done processing the incoming data.', description: 'still processing request, 24 hour message', id: 'noDataStateDesc', }, @@ -2565,6 +2600,11 @@ export default defineMessages({ description: 'Refresh this page', id: 'noDataStateRefresh', }, + noDataStateRefreshDesc: { + defaultMessage: 'The time to process could take up to 24 hours. Try refreshing the page at a later time.', + description: 'still processing request, 24 hour message', + id: 'noDataStateRefreshDesc', + }, noDataStateTitle: { defaultMessage: 'Still processing the data', description: 'Still processing the data', @@ -2891,12 +2931,12 @@ export default defineMessages({ id: 'optimizations', }, overhead: { - defaultMessage: 'Overhead', - description: 'Overhead', + defaultMessage: 'Includes overhead', + description: 'Includes overhead', id: 'overhead', }, overheadDesc: { - defaultMessage: 'Includes distributed costs', + defaultMessage: 'Includes distributed costs {value}', description: 'Includes distributed costs', id: 'overheadDesc', }, @@ -3112,6 +3152,11 @@ export default defineMessages({ description: 'Rate must be a positive number', id: 'priceListPosNumberRate', }, + providerDetails: { + defaultMessage: 'Integrations details', + description: 'Integrations details', + id: 'providerDetails', + }, pvcTitle: { defaultMessage: 'Persistent Volume Claims', description: 'Persistent Volume Claims', @@ -3435,7 +3480,7 @@ export default defineMessages({ id: 'start', }, status: { - defaultMessage: '{value, select, ' + 'pending {Pending} ' + 'running {Running} ' + 'failed {Failed} ' + 'other {}}', + defaultMessage: 'Status', description: 'Status', id: 'status', }, @@ -3444,6 +3489,23 @@ export default defineMessages({ description: 'Status/Actions', id: 'statusActions', }, + statusMsg: { + defaultMessage: + '{value, select, ' + + 'complete {Complete} ' + + 'failed {Failed} ' + + 'in_progress {in-Progress} ' + + 'paused {Paused} ' + + 'pending {Pending} ' + + 'other {}}', + description: 'Status message', + id: 'statusMsg', + }, + statusStates: { + defaultMessage: '{value, select, ' + 'pending {Pending} ' + 'running {Running} ' + 'failed {Failed} ' + 'other {}}', + description: 'Status states', + id: 'statusStates', + }, storage: { defaultMessage: 'Storage', description: 'Storage', @@ -3454,10 +3516,17 @@ export default defineMessages({ description: 'StorageClass', id: 'storageClass', }, - storageDesc: { - defaultMessage: 'Distribute the cost of storage to projects based on distribution type.', - description: 'Distribute the cost of storage to projects based on distribution type.', - id: 'storageDesc', + storageUnattributedDistributed: { + defaultMessage: 'Storage unattributed', + description: 'Storage unattributed', + id: 'storageUnattributedDistributed', + }, + storageUnattributedDistributedDesc: { + defaultMessage: + 'A type of project that gets created when cost management is unable to correlate a portion of the cloud cost to an OpenShift namespace', + description: + 'A type of project that gets created when cost management is unable to correlate a portion of the cloud cost to an OpenShift namespace', + id: 'storageUnattributedDistributedDesc', }, suggestions: { defaultMessage: 'Suggestions', diff --git a/src/routes/components/charts/common/chartDatum.ts b/src/routes/components/charts/common/chartDatum.ts index d398c3b43..af5018232 100644 --- a/src/routes/components/charts/common/chartDatum.ts +++ b/src/routes/components/charts/common/chartDatum.ts @@ -23,7 +23,6 @@ export interface ChartDatum { } // The computed report cost or usage item -// eslint-disable-next-line no-shadow export const enum ComputedReportItemType { cost = 'cost', // cost.total.value infrastructure = 'infrastructure', // infrastructure.total.value @@ -32,20 +31,20 @@ export const enum ComputedReportItemType { } // The computed report value -// eslint-disable-next-line no-shadow export const enum ComputedReportItemValueType { distributed = 'distributed', // cost.distributed.value none = 'none', // A value type is not used in this scenario (e.g., usage.value) markup = 'markup', // infrastructure.markup.value + networkUnattributedDistributed = 'network_unattributed_distributed', // cost.network_unattributed_distributed.value platformDistributed = 'platform_distributed', // cost.platform_distributed.value raw = 'raw', // infrastructure.raw.value + storageUnattributedDistributed = 'storage_unattributed_distributed', // cost.storage_unattributed_distributed.value total = 'total', // // infrastructure.total.value usage = 'usage', // infrastructure.usage.value workerUnallocatedDistributed = 'worker_unallocated_distributed', // cost.worker_unallocated_distributed.value } // The datum type, which can be applied to daily or monthly data -// eslint-disable-next-line no-shadow export const enum DatumType { cumulative, rolling, diff --git a/src/routes/components/charts/common/chartDatumForecast.ts b/src/routes/components/charts/common/chartDatumForecast.ts index dc1a6c665..643b79a21 100644 --- a/src/routes/components/charts/common/chartDatumForecast.ts +++ b/src/routes/components/charts/common/chartDatumForecast.ts @@ -10,7 +10,6 @@ import type { ChartDatum } from './chartDatum'; import { DatumType, isFloat, isInt, padChartDatums } from './chartDatum'; // The computed forecast cost -// eslint-disable-next-line no-shadow export const enum ComputedForecastItemType { cost = 'cost', infrastructure = 'infrastructure', diff --git a/src/routes/components/costType/costType.tsx b/src/routes/components/costType/costType.tsx index f4dbae156..67d666945 100644 --- a/src/routes/components/costType/costType.tsx +++ b/src/routes/components/costType/costType.tsx @@ -34,7 +34,6 @@ interface CostTypeState { type CostTypeProps = CostTypeOwnProps & CostTypeDispatchProps & CostTypeStateProps & WrappedComponentProps; -// eslint-disable-next-line no-shadow export const enum CostTypes { amortized = 'calculated_amortized_cost', blended = 'blended_cost', diff --git a/src/routes/components/dataToolbar/dataToolbar.styles.ts b/src/routes/components/dataToolbar/dataToolbar.styles.ts index 695011321..054c1a36f 100644 --- a/src/routes/components/dataToolbar/dataToolbar.styles.ts +++ b/src/routes/components/dataToolbar/dataToolbar.styles.ts @@ -11,4 +11,7 @@ export const styles = { paddingBottom: global_spacer_md.value, paddingTop: global_spacer_md.value, }, + platformCosts: { + marginTop: '6px', + }, } as { [className: string]: React.CSSProperties }; diff --git a/src/routes/components/dataToolbar/dataToolbar.tsx b/src/routes/components/dataToolbar/dataToolbar.tsx index 0caa8ea9a..c1a1af26f 100644 --- a/src/routes/components/dataToolbar/dataToolbar.tsx +++ b/src/routes/components/dataToolbar/dataToolbar.tsx @@ -273,6 +273,9 @@ export class DataToolbarBase extends React.Component void; }) => { return ( - + { if (onBulkSelectClicked) { - checked ? onBulkSelectClicked('all') : onBulkSelectClicked('none'); + onBulkSelectClicked(checked ? 'all' : 'none'); } onBulkSelectToggle(false); }; @@ -101,6 +101,7 @@ export const getBulkSelect = ({ onOpenChange={isOpen => onBulkSelectToggle(isOpen)} onSelect={onBulkSelect} popperProps={{ + appendTo: () => document.body, // Page scroll workaround https://issues.redhat.com/browse/COST-5320 position: 'left', }} toggle={toggle} diff --git a/src/routes/components/dataToolbar/utils/category.tsx b/src/routes/components/dataToolbar/utils/category.tsx index 8142000d1..6838155d4 100644 --- a/src/routes/components/dataToolbar/utils/category.tsx +++ b/src/routes/components/dataToolbar/utils/category.tsx @@ -58,7 +58,7 @@ export const getCategoryInput = ({ return ( onCategoryInputSelect(value, categoryOption.key)} placeholder={intl.formatMessage(messages.filterByPlaceholder, { value: placeholderKey })} + resourceKey={categoryOption.resourceKey} resourcePathsType={resourcePathsType} resourceType={categoryOption.key as ResourceType} /> @@ -124,12 +125,12 @@ export const onCategoryInput = ({ key?: string; }) => { if (event && event.key && event.key !== 'Enter') { - return {}; + return {}; // For destructure } const val = cleanInput(categoryInput); if (val.trim() === '') { - return {}; + return {}; // For destructure } const isExcludes = currentExclude === ExcludeType.exclude; diff --git a/src/routes/components/dataToolbar/utils/common.ts b/src/routes/components/dataToolbar/utils/common.ts index 52b425667..b71d23a9c 100644 --- a/src/routes/components/dataToolbar/utils/common.ts +++ b/src/routes/components/dataToolbar/utils/common.ts @@ -13,6 +13,7 @@ export interface Filters { export interface ToolbarChipGroupExt extends ToolbarChipGroup { ariaLabelKey?: string; placeholderKey?: string; + resourceKey?: string; selectClassName?: string; // A selector from routes/components/dataToolbar/dataToolbar.scss selectOptions?: ToolbarChipGroup[]; } diff --git a/src/routes/components/dataToolbar/utils/exclude.tsx b/src/routes/components/dataToolbar/utils/exclude.tsx index 83bcac04f..98fcf1171 100644 --- a/src/routes/components/dataToolbar/utils/exclude.tsx +++ b/src/routes/components/dataToolbar/utils/exclude.tsx @@ -8,7 +8,6 @@ import { SelectWrapper } from 'routes/components/selectWrapper'; import type { Filters } from './common'; import { hasFilters } from './common'; -// eslint-disable-next-line no-shadow export const enum ExcludeType { exclude = 'exclude', include = 'include', diff --git a/src/routes/components/dataToolbar/utils/orgUntits.tsx b/src/routes/components/dataToolbar/utils/orgUntits.tsx index d9e3b9ed7..63e626f78 100644 --- a/src/routes/components/dataToolbar/utils/orgUntits.tsx +++ b/src/routes/components/dataToolbar/utils/orgUntits.tsx @@ -32,14 +32,14 @@ export const getOrgUnitSelect = ({ const selectOptions: SelectWrapperOption[] = getOrgUnitOptions(orgReport).map(option => ({ description: option.key, compareTo: item => - filters[orgUnitIdKey] ? (filters[orgUnitIdKey] as any).find(filter => filter.value === item.value) : false, + filters?.[orgUnitIdKey] ? (filters[orgUnitIdKey] as any).find(filter => filter.value === item.value) : false, toString: () => option.name, value: option.key, })); const chips = []; // Get selected items as PatternFly's ToolbarChip type const selections = []; // Select options and selections must be same type - if (filters[orgUnitIdKey] && Array.isArray(filters[orgUnitIdKey])) { + if (filters?.[orgUnitIdKey] && Array.isArray(filters[orgUnitIdKey])) { (filters[orgUnitIdKey] as any).map(filter => { const selection = selectOptions.find(option => option.value === filter.value); if (selection) { diff --git a/src/routes/components/dataToolbar/utils/tags.tsx b/src/routes/components/dataToolbar/utils/tags.tsx index bd152c672..e32a09fe5 100644 --- a/src/routes/components/dataToolbar/utils/tags.tsx +++ b/src/routes/components/dataToolbar/utils/tags.tsx @@ -137,7 +137,7 @@ export const getTagValueSelect = ({ return ( filter.value) : []} + selections={filters?.tag?.[tagKeyOption.key] ? filters.tag[tagKeyOption.key].map(filter => filter.value) : []} tagKey={currentTagKey} tagKeyValue={tagKeyValueInput} tagPathsType={tagPathsType} diff --git a/src/routes/components/export/exportModal.tsx b/src/routes/components/export/exportModal.tsx index 5194a1bba..3faa1c1ef 100644 --- a/src/routes/components/export/exportModal.tsx +++ b/src/routes/components/export/exportModal.tsx @@ -13,7 +13,7 @@ import { Radio, TextInput, } from '@patternfly/react-core'; -import type { ReportPathsType } from 'api/reports/report'; +import type { ReportPathsType, ReportType } from 'api/reports/report'; import type { AxiosError } from 'axios'; import { format } from 'date-fns'; import messages from 'locales/messages'; @@ -35,10 +35,12 @@ export interface ExportModalOwnProps { groupBy?: string; isAllItems?: boolean; isOpen: boolean; + isTimeScoped?: boolean; items?: ComputedReportItem[]; onClose(isOpen: boolean); reportPathsType: ReportPathsType; reportQueryString: string; + reportType: ReportType; resolution?: 'daily' | 'monthly'; // Default resolution showAggregateType?: boolean; // Monthly resolution filters are not valid with date range showFormatType?: boolean; // Format type; CVS / JSON @@ -144,9 +146,11 @@ export class ExportModalBase extends React.Component, - + ); }; -export default DataDetails; +export { ProviderDetailsModal }; diff --git a/src/routes/details/components/providerDetails/providerDetailsTable.tsx b/src/routes/details/components/providerDetails/providerDetailsTable.tsx new file mode 100644 index 000000000..8f44e93a1 --- /dev/null +++ b/src/routes/details/components/providerDetails/providerDetailsTable.tsx @@ -0,0 +1,73 @@ +import type { Providers, ProviderType } from 'api/providers'; +import messages from 'locales/messages'; +import React, { useEffect, useState } from 'react'; +import { useIntl } from 'react-intl'; +import { DataTable } from 'routes/components/dataTable'; +import { filterProviders } from 'routes/utils/providers'; + +import { OverallStatus } from './components/overallStatus'; +import { SourceLink } from './components/sourceLink'; +import { ProviderDetailsModal } from './providerDetailsModal'; + +interface ProviderDetailsTableOwnProps { + providers?: Providers; + providerType?: ProviderType; +} + +type ProviderDetailsTableProps = ProviderDetailsTableOwnProps; + +const ProviderDetailsTable: React.FC = ({ providers, providerType }) => { + const intl = useIntl(); + const [columns, setColumns] = useState([]); + const [rows, setRows] = useState([]); + + const initDatum = () => { + if (!providers) { + return; + } + + // Filter OCP providers to skip an extra API request + const filteredProviders = filterProviders(providers, providerType)?.data?.filter(data => data.status !== null); + + const newRows = []; + const newColumns = [ + { + name: intl.formatMessage(messages.integration), + }, + { + name: intl.formatMessage(messages.lastUpdated), + }, + { + name: intl.formatMessage(messages.status), + }, + { + name: '', + }, + ]; + + filteredProviders?.map(item => { + // const clusterId = item?.authentication?.credentials?.cluster_id; + + newRows.push({ + cells: [ + { value: }, + { value: }, + { value: }, + { value: }, + ], + item, + }); + }); + + setColumns(newColumns); + setRows(newRows); + }; + + useEffect(() => { + initDatum(); + }, [providers]); + + return ; +}; + +export { ProviderDetailsTable }; diff --git a/src/routes/details/ocpBreakdown/providerDetails/dataDetails/utils/format.ts b/src/routes/details/components/providerDetails/utils/format.ts similarity index 100% rename from src/routes/details/ocpBreakdown/providerDetails/dataDetails/utils/format.ts rename to src/routes/details/components/providerDetails/utils/format.ts diff --git a/src/routes/details/ocpBreakdown/providerDetails/dataDetails/utils/icon.tsx b/src/routes/details/components/providerDetails/utils/icon.tsx similarity index 100% rename from src/routes/details/ocpBreakdown/providerDetails/dataDetails/utils/icon.tsx rename to src/routes/details/components/providerDetails/utils/icon.tsx diff --git a/src/routes/details/ocpBreakdown/providerDetails/utils/normailize.ts b/src/routes/details/components/providerDetails/utils/normailize.ts similarity index 100% rename from src/routes/details/ocpBreakdown/providerDetails/utils/normailize.ts rename to src/routes/details/components/providerDetails/utils/normailize.ts diff --git a/src/routes/details/ocpBreakdown/providerDetails/dataDetails/utils/status.ts b/src/routes/details/components/providerDetails/utils/status.ts similarity index 88% rename from src/routes/details/ocpBreakdown/providerDetails/dataDetails/utils/status.ts rename to src/routes/details/components/providerDetails/utils/status.ts index a8133032e..7da4f4a90 100644 --- a/src/routes/details/ocpBreakdown/providerDetails/dataDetails/utils/status.ts +++ b/src/routes/details/components/providerDetails/utils/status.ts @@ -2,9 +2,8 @@ import type { Provider } from 'api/providers'; import { ProviderType } from 'api/providers'; import messages from 'locales/messages'; import type { MessageDescriptor } from 'react-intl'; -import { normalize } from 'routes/details/ocpBreakdown/providerDetails/utils/normailize'; +import { normalize } from 'routes/details/components/providerDetails/utils/normailize'; -// eslint-disable-next-line no-shadow export const enum StatusType { complete = 'complete', failed = 'failed', @@ -79,13 +78,21 @@ const getProviderStatusMsg = ( export const getProviderStatus = ( provider: Provider, isCloud = false -): { msg: MessageDescriptor; status: StatusType } => { +): { lastUpdated: string; msg: MessageDescriptor; status: StatusType } => { let status; let msg; if (!provider) { return status; } + const lastUpdated = + provider.status?.summary?.end || + provider.status?.summary?.start || + provider.status?.processing?.end || + provider.status?.processing?.start || + provider.status?.download?.end || + provider.status?.download?.start; + // Skip summaryState for cloud const downloadState = lookupKey(provider.status?.download?.state); const processingState = lookupKey(provider.status?.processing?.state); @@ -120,5 +127,5 @@ export const getProviderStatus = ( status = StatusType.complete; msg = messages.dataDetailsIntegrationAndFinalization; // only one final step } - return { msg, status }; + return { lastUpdated, msg, status }; }; diff --git a/src/routes/details/ocpBreakdown/providerDetails/dataDetails/utils/variant.ts b/src/routes/details/components/providerDetails/utils/variant.ts similarity index 100% rename from src/routes/details/ocpBreakdown/providerDetails/dataDetails/utils/variant.ts rename to src/routes/details/components/providerDetails/utils/variant.ts diff --git a/src/routes/details/gcpBreakdown/gcpBreakdown.tsx b/src/routes/details/gcpBreakdown/gcpBreakdown.tsx index 6255147d8..e64ffb9d3 100644 --- a/src/routes/details/gcpBreakdown/gcpBreakdown.tsx +++ b/src/routes/details/gcpBreakdown/gcpBreakdown.tsx @@ -87,9 +87,9 @@ const mapStateToProps = createMapStateToProps, currency, - defaultBreadcrumbPath: formatPath(routes.gcpDetails.path), description: queryFromRoute[breakdownDescKey], detailsURL, emptyStateTitle: intl.formatMessage(messages.gcpDetailsTitle), diff --git a/src/routes/details/gcpDetails/gcpDetails.tsx b/src/routes/details/gcpDetails/gcpDetails.tsx index e95056ac2..f10ff25b8 100644 --- a/src/routes/details/gcpDetails/gcpDetails.tsx +++ b/src/routes/details/gcpDetails/gcpDetails.tsx @@ -18,6 +18,7 @@ import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; import { NotAvailable } from 'routes/components/page/notAvailable'; +import { ProviderDetails } from 'routes/details/components/providerDetails'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedGcpReportItems'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; @@ -33,6 +34,7 @@ import { handleOnSort, } from 'routes/utils/queryNavigate'; import { createMapStateToProps, FetchStatus } 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'; @@ -48,6 +50,7 @@ import { styles } from './gcpDetails.styles'; interface GcpDetailsStateProps { currency?: string; + isAccountInfoEmptyStateToggleEnabled?: boolean; providers: Providers; providersError: AxiosError; providersFetchStatus: FetchStatus; @@ -165,6 +168,7 @@ class GcpDetails extends React.Component { onClose={this.handleOnExportModalClose} reportPathsType={reportPathsType} reportQueryString={reportQueryString} + reportType={reportType} /> ); }; @@ -319,8 +323,18 @@ class GcpDetails extends React.Component { }; public render() { - const { currency, intl, providers, providersFetchStatus, query, report, reportError, reportFetchStatus, router } = - this.props; + const { + currency, + intl, + isAccountInfoEmptyStateToggleEnabled, + providers, + providersFetchStatus, + query, + report, + reportError, + reportFetchStatus, + router, + } = this.props; const computedItems = this.getComputedItems(); const groupById = getIdKeyForGroupBy(query.group_by); @@ -340,9 +354,17 @@ class GcpDetails extends React.Component { return ; } if (!hasCurrentMonthData(providers)) { - return ; + return ( + : undefined + } + title={title} + /> + ); } } + return (
, currency, - defaultBreadcrumbPath: formatPath(routes.ibmDetails.path), description: queryFromRoute[breakdownDescKey], detailsURL, emptyStateTitle: intl.formatMessage(messages.ibmDetailsTitle), diff --git a/src/routes/details/ibmDetails/ibmDetails.tsx b/src/routes/details/ibmDetails/ibmDetails.tsx index 6fceaebe5..1af6f03db 100644 --- a/src/routes/details/ibmDetails/ibmDetails.tsx +++ b/src/routes/details/ibmDetails/ibmDetails.tsx @@ -18,6 +18,7 @@ import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; import { NotAvailable } from 'routes/components/page/notAvailable'; +import { ProviderDetails } from 'routes/details/components/providerDetails'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedIbmReportItems'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; @@ -34,6 +35,7 @@ import { handleOnSort, } from 'routes/utils/queryNavigate'; import { createMapStateToProps, FetchStatus } 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'; @@ -49,6 +51,7 @@ import { styles } from './ibmDetails.styles'; interface IbmDetailsStateProps { currency?: string; + isAccountInfoEmptyStateToggleEnabled?: boolean; providers: Providers; providersError: AxiosError; providersFetchStatus: FetchStatus; @@ -166,6 +169,7 @@ class IbmDetails extends React.Component { onClose={this.handleOnExportModalClose} reportPathsType={reportPathsType} reportQueryString={reportQueryString} + reportType={reportType} /> ); }; @@ -321,8 +325,18 @@ class IbmDetails extends React.Component { }; public render() { - const { currency, intl, providers, providersFetchStatus, query, report, reportError, reportFetchStatus, router } = - this.props; + const { + currency, + intl, + isAccountInfoEmptyStateToggleEnabled, + providers, + providersFetchStatus, + query, + report, + reportError, + reportFetchStatus, + router, + } = this.props; const computedItems = this.getComputedItems(); const groupById = getIdKeyForGroupBy(query.group_by); @@ -342,9 +356,17 @@ class IbmDetails extends React.Component { return ; } if (!hasCurrentMonthData(providers)) { - return ; + return ( + : undefined + } + title={title} + /> + ); } } + return (
( ); return { + breadcrumbPath: formatPath(routes.ociDetails.path), costOverviewComponent: , currency, - defaultBreadcrumbPath: formatPath(routes.ociDetails.path), description: queryFromRoute[breakdownDescKey], detailsURL, emptyStateTitle: intl.formatMessage(messages.ociDetailsTitle), diff --git a/src/routes/details/ociDetails/detailsToolbar.tsx b/src/routes/details/ociDetails/detailsToolbar.tsx index 2cf445056..5bcb25b60 100644 --- a/src/routes/details/ociDetails/detailsToolbar.tsx +++ b/src/routes/details/ociDetails/detailsToolbar.tsx @@ -2,7 +2,7 @@ import type { ToolbarChipGroup } from '@patternfly/react-core'; import type { OciQuery } from 'api/queries/ociQuery'; import { getQuery } from 'api/queries/ociQuery'; import { ResourcePathsType } from 'api/resources/resource'; -import type { OciTag } from 'api/tags/ociTags'; +import type { Tag } from 'api/tags/tag'; import { TagPathsType, TagType } from 'api/tags/tag'; import messages from 'locales/messages'; import React from 'react'; @@ -36,7 +36,7 @@ interface DetailsToolbarOwnProps { } interface DetailsToolbarStateProps { - tagReport?: OciTag; + tagReport?: Tag; tagReportFetchStatus?: FetchStatus; tagQueryString?: string; } diff --git a/src/routes/details/ociDetails/ociDetails.tsx b/src/routes/details/ociDetails/ociDetails.tsx index ed9abf9f4..3301980ab 100644 --- a/src/routes/details/ociDetails/ociDetails.tsx +++ b/src/routes/details/ociDetails/ociDetails.tsx @@ -18,6 +18,7 @@ import { Loading } from 'routes/components/page/loading'; import { NoData } from 'routes/components/page/noData'; import { NoProviders } from 'routes/components/page/noProviders'; import { NotAvailable } from 'routes/components/page/notAvailable'; +import { ProviderDetails } from 'routes/details/components/providerDetails'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedOciReportItems'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; @@ -33,6 +34,7 @@ import { handleOnSort, } from 'routes/utils/queryNavigate'; import { createMapStateToProps, FetchStatus } 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'; @@ -48,6 +50,7 @@ import { styles } from './ociDetails.styles'; interface OciDetailsStateProps { currency?: string; + isAccountInfoEmptyStateToggleEnabled?: boolean; providers: Providers; providersError: AxiosError; providersFetchStatus: FetchStatus; @@ -165,6 +168,7 @@ class OciDetails extends React.Component { onClose={this.handleOnExportModalClose} reportPathsType={reportPathsType} reportQueryString={reportQueryString} + reportType={reportType} /> ); }; @@ -323,6 +327,7 @@ class OciDetails extends React.Component { const { currency, intl, + isAccountInfoEmptyStateToggleEnabled, providers, providersFetchStatus, query, @@ -351,9 +356,17 @@ class OciDetails extends React.Component { return ; } if (!hasCurrentMonthData(providers)) { - return ; + return ( + : undefined + } + title={title} + /> + ); } } + return (
= ({ clusterId }: ClusterInfoProps) => { +const ClusterInfoModal: React.FC = ({ clusterId }: ClusterInfoModalProps) => { const intl = useIntl(); const [isOpen, setIsOpen] = useState(false); @@ -43,4 +43,4 @@ const ClusterInfo: React.FC = ({ clusterId }: ClusterInfoProps ); }; -export default ClusterInfo; +export { ClusterInfoModal }; diff --git a/src/routes/details/ocpBreakdown/providerDetails/clusterInfo/components/cloudIntegration.tsx b/src/routes/details/ocpBreakdown/clusterInfo/components/cloudIntegration.tsx similarity index 93% rename from src/routes/details/ocpBreakdown/providerDetails/clusterInfo/components/cloudIntegration.tsx rename to src/routes/details/ocpBreakdown/clusterInfo/components/cloudIntegration.tsx index 7a0a82db1..64d35cd2b 100644 --- a/src/routes/details/ocpBreakdown/providerDetails/clusterInfo/components/cloudIntegration.tsx +++ b/src/routes/details/ocpBreakdown/clusterInfo/components/cloudIntegration.tsx @@ -4,7 +4,7 @@ import messages from 'locales/messages'; import React from 'react'; import { useIntl } from 'react-intl'; import { routes } from 'routes'; -import { SourceLink } from 'routes/details/ocpBreakdown/providerDetails/components/sourceLink'; +import { SourceLink } from 'routes/details/components/providerDetails/components/sourceLink'; import { formatPath } from 'utils/paths'; import { styles } from '../clusterInfo.styles'; diff --git a/src/routes/details/ocpBreakdown/clusterInfo/index.ts b/src/routes/details/ocpBreakdown/clusterInfo/index.ts new file mode 100644 index 000000000..138a3c25f --- /dev/null +++ b/src/routes/details/ocpBreakdown/clusterInfo/index.ts @@ -0,0 +1 @@ +export { ClusterInfoModal } from './clusterInfoModal'; diff --git a/src/routes/details/ocpBreakdown/ocpBreakdown.tsx b/src/routes/details/ocpBreakdown/ocpBreakdown.tsx index e869e4cc1..cfe1c2a2e 100644 --- a/src/routes/details/ocpBreakdown/ocpBreakdown.tsx +++ b/src/routes/details/ocpBreakdown/ocpBreakdown.tsx @@ -12,8 +12,8 @@ import { connect } from 'react-redux'; import { routes } from 'routes'; import type { BreakdownStateProps } from 'routes/details/components/breakdown'; import { BreakdownBase } from 'routes/details/components/breakdown'; -import { ClusterInfo } from 'routes/details/ocpBreakdown/providerDetails/clusterInfo'; -import { DataDetails } from 'routes/details/ocpBreakdown/providerDetails/dataDetails'; +import { ProviderDetailsModal } from 'routes/details/components/providerDetails'; +import { ClusterInfoModal } from 'routes/details/ocpBreakdown/clusterInfo'; import { getGroupById, getGroupByValue } from 'routes/utils/groupBy'; import { filterProviders } from 'routes/utils/providers'; import { getQueryState } from 'routes/utils/queryState'; @@ -23,7 +23,7 @@ import { providersQuery, providersSelectors } from 'store/providers'; import { reportActions, reportSelectors } from 'store/reports'; import { uiActions } from 'store/ui'; import { formatPath } from 'utils/paths'; -import { breakdownDescKey, breakdownTitleKey, platformCategoryKey } from 'utils/props'; +import { breadcrumbLabelKey, breakdownDescKey, breakdownTitleKey, platformCategoryKey } from 'utils/props'; import type { RouterComponentProps } from 'utils/router'; import { withRouter } from 'utils/router'; import { getCostDistribution, getCurrency } from 'utils/sessionStorage'; @@ -94,11 +94,16 @@ const mapStateToProps = createMapStateToProps : undefined, - dataDetailsComponent: groupBy === 'cluster' ? : undefined, + breadcrumbLabel, + clusterInfoComponent: groupBy === 'cluster' ? : undefined, + dataDetailsComponent: + groupBy === 'cluster' ? ( + + ) : undefined, costDistribution, costOverviewComponent: ( ), currency, - defaultBreadcrumbPath: formatPath(routes.ocpDetails.path), description: queryFromRoute[breakdownDescKey], detailsURL, emptyStateTitle: intl.formatMessage(messages.ocpDetailsTitle), diff --git a/src/routes/details/ocpBreakdown/optimizations.tsx b/src/routes/details/ocpBreakdown/optimizations.tsx index a6e446545..05e8b903d 100644 --- a/src/routes/details/ocpBreakdown/optimizations.tsx +++ b/src/routes/details/ocpBreakdown/optimizations.tsx @@ -24,7 +24,8 @@ const Optimizations: React.FC = () => { const groupByValue = getGroupByValue(queryFromRoute); const otimizationsTab = location.search.indexOf('optimizationsTab') === -1 ? '&optimizationsTab=true' : ''; - const clusterFilter = queryState?.filter_by?.cluster ? queryState.filter_by.cluster : undefined; + const clusterFilter = queryState?.filter_by?.cluster; + const isOptimizationsPath = queryFromRoute?.optimizationsPath === 'true'; return ( = () => { cluster={clusterFilter} hideCluster={clusterFilter !== undefined} hideProject={groupBy === 'project'} + isOptimizationsPath={isOptimizationsPath} linkPath={formatPath(routes.optimizationsBreakdown.path)} linkState={{ ...(location.state && location.state), diff --git a/src/routes/details/ocpBreakdown/providerDetails/clusterInfo/index.ts b/src/routes/details/ocpBreakdown/providerDetails/clusterInfo/index.ts deleted file mode 100644 index 43774fc38..000000000 --- a/src/routes/details/ocpBreakdown/providerDetails/clusterInfo/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as ClusterInfo } from './clusterInfo'; diff --git a/src/routes/details/ocpBreakdown/providerDetails/components/sourceLink.styles.ts b/src/routes/details/ocpBreakdown/providerDetails/components/sourceLink.styles.ts deleted file mode 100644 index 81c67d5f0..000000000 --- a/src/routes/details/ocpBreakdown/providerDetails/components/sourceLink.styles.ts +++ /dev/null @@ -1,8 +0,0 @@ -import global_spacer_md from '@patternfly/react-tokens/dist/js/global_spacer_md'; -import type React from 'react'; - -export const styles = { - spacingRight: { - marginRight: global_spacer_md.value, - }, -} as { [className: string]: React.CSSProperties }; diff --git a/src/routes/details/ocpBreakdown/providerDetails/dataDetails/index.ts b/src/routes/details/ocpBreakdown/providerDetails/dataDetails/index.ts deleted file mode 100644 index 21ecfb844..000000000 --- a/src/routes/details/ocpBreakdown/providerDetails/dataDetails/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as DataDetails } from './dataDetails'; diff --git a/src/routes/details/ocpDetails/detailsHeader.tsx b/src/routes/details/ocpDetails/detailsHeader.tsx index 3478b26f1..c7180d8ea 100644 --- a/src/routes/details/ocpDetails/detailsHeader.tsx +++ b/src/routes/details/ocpDetails/detailsHeader.tsx @@ -46,7 +46,9 @@ interface DetailsHeaderStateProps { providersQueryString: string; } -interface DetailsHeaderState {} +interface DetailsHeaderState { + // TBD... +} type DetailsHeaderProps = DetailsHeaderOwnProps & DetailsHeaderStateProps & WrappedComponentProps; diff --git a/src/routes/details/ocpDetails/detailsTable.tsx b/src/routes/details/ocpDetails/detailsTable.tsx index 0399e5395..552dcb5e9 100644 --- a/src/routes/details/ocpDetails/detailsTable.tsx +++ b/src/routes/details/ocpDetails/detailsTable.tsx @@ -223,17 +223,16 @@ class DetailsTableBase extends React.Component 0) || - (item.cost.workerUnallocatedDistributed && item.cost.workerUnallocatedDistributed.value > 0)); + (item.cost?.networkUnattributedDistributed?.value > 0 || + item.cost?.platformDistributed?.value > 0 || + item.cost?.storageUnattributedDistributed?.value > 0 || + item.cost?.workerUnallocatedDistributed?.value > 0); const desc = item.id && item.id !== item.label ?
{item.id}
: null; - const isDisabled = - label === `${noPrefix}${groupBy}` || - label === `${noPrefix}${groupByTagKey}` || - isUnallocatedProject || - isUnattributedCosts; + const isDisabled = label === `${noPrefix}${groupBy}` || label === `${noPrefix}${groupByTagKey}`; + const isLinkDisabled = isDisabled || isUnallocatedProject || isUnattributedCosts; const actions = this.getActions(item, isDisabled); - const name = isDisabled ? ( + const name = isLinkDisabled ? ( (label as any) ) : ( ) : isOverheadCosts ? ( - + + {item.cost?.networkUnattributedDistributed?.value > 0 && ( +
  • {intl.formatMessage(messages.networkUnattributedDistributed)}
  • + )} + {item.cost?.platformDistributed?.value > 0 && ( +
  • {intl.formatMessage(messages.platformDistributed)}
  • + )} + {item.cost?.storageUnattributedDistributed?.value > 0 && ( +
  • {intl.formatMessage(messages.storageUnattributedDistributed)}
  • + )} + {item.cost?.workerUnallocated?.value > 0 && ( +
  • {intl.formatMessage(messages.workerUnallocated)}
  • + )} + + ), + })} + enableFlip + > diff --git a/src/routes/details/ocpDetails/detailsToolbar.tsx b/src/routes/details/ocpDetails/detailsToolbar.tsx index ad02ef293..383dae42b 100644 --- a/src/routes/details/ocpDetails/detailsToolbar.tsx +++ b/src/routes/details/ocpDetails/detailsToolbar.tsx @@ -2,7 +2,7 @@ import type { ToolbarChipGroup } from '@patternfly/react-core'; import type { OcpQuery } from 'api/queries/ocpQuery'; import { getQuery } from 'api/queries/ocpQuery'; import { ResourcePathsType } from 'api/resources/resource'; -import type { OcpTag } from 'api/tags/ocpTags'; +import type { Tag } from 'api/tags/tag'; import { TagPathsType, TagType } from 'api/tags/tag'; import messages from 'locales/messages'; import React from 'react'; @@ -37,7 +37,7 @@ interface DetailsToolbarOwnProps { } interface DetailsToolbarStateProps { - tagReport?: OcpTag; + tagReport?: Tag; tagReportFetchStatus?: FetchStatus; tagQueryString?: string; } @@ -93,7 +93,11 @@ export class DetailsToolbarBase extends React.Component { onClose={this.handleOnExportModalClose} reportPathsType={reportPathsType} reportQueryString={reportQueryString} + reportType={reportType} /> ); }; @@ -404,6 +407,7 @@ class OcpDetails extends React.Component { costDistribution, currency, intl, + isAccountInfoEmptyStateToggleEnabled, providers, providersFetchStatus, query, @@ -431,9 +435,17 @@ class OcpDetails extends React.Component { return ; } if (!hasCurrentMonthData(providers)) { - return ; + return ( + : undefined + } + title={title} + /> + ); } } + return (
    , currency, - defaultBreadcrumbPath: formatPath(routes.rhelDetails.path), description: queryFromRoute[breakdownDescKey], detailsURL, emptyStateTitle: intl.formatMessage(messages.rhelDetailsTitle), diff --git a/src/routes/details/rhelDetails/detailsToolbar.tsx b/src/routes/details/rhelDetails/detailsToolbar.tsx index f8fe83636..d85af1b33 100644 --- a/src/routes/details/rhelDetails/detailsToolbar.tsx +++ b/src/routes/details/rhelDetails/detailsToolbar.tsx @@ -2,7 +2,7 @@ import type { ToolbarChipGroup } from '@patternfly/react-core'; import type { OcpQuery } from 'api/queries/ocpQuery'; import { getQuery } from 'api/queries/ocpQuery'; import { ResourcePathsType } from 'api/resources/resource'; -import type { OcpTag } from 'api/tags/ocpTags'; +import type { Tag } from 'api/tags/tag'; import { TagPathsType, TagType } from 'api/tags/tag'; import messages from 'locales/messages'; import React from 'react'; @@ -36,7 +36,7 @@ interface DetailsToolbarOwnProps { } interface DetailsToolbarStateProps { - tagReport?: OcpTag; + tagReport?: Tag; tagReportFetchStatus?: FetchStatus; tagQueryString?: string; } diff --git a/src/routes/details/rhelDetails/rhelDetails.tsx b/src/routes/details/rhelDetails/rhelDetails.tsx index 163a6f07a..18e5c232f 100644 --- a/src/routes/details/rhelDetails/rhelDetails.tsx +++ b/src/routes/details/rhelDetails/rhelDetails.tsx @@ -21,6 +21,7 @@ import { NoProviders } from 'routes/components/page/noProviders'; import { NotAvailable } from 'routes/components/page/notAvailable'; import type { ColumnManagementModalOption } from 'routes/details/components/columnManagement'; import { ColumnManagementModal, initHiddenColumns } from 'routes/details/components/columnManagement'; +import { ProviderDetails } from 'routes/details/components/providerDetails'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedRhelReportItems'; @@ -36,6 +37,7 @@ import { handleOnSort, } from 'routes/utils/queryNavigate'; import { createMapStateToProps, FetchStatus } 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'; @@ -51,6 +53,7 @@ import { styles } from './rhelDetails.styles'; interface RhelDetailsStateProps { currency?: string; + isAccountInfoEmptyStateToggleEnabled?: boolean; providers: Providers; providersFetchStatus: FetchStatus; query: RhelQuery; @@ -208,6 +211,7 @@ class RhelDetails extends React.Component { onClose={this.handleOnExportModalClose} reportPathsType={reportPathsType} reportQueryString={reportQueryString} + reportType={reportType} /> ); }; @@ -377,8 +381,18 @@ class RhelDetails extends React.Component { }; public render() { - const { currency, intl, providers, providersFetchStatus, query, report, reportError, reportFetchStatus, router } = - this.props; + const { + currency, + intl, + isAccountInfoEmptyStateToggleEnabled, + providers, + providersFetchStatus, + query, + report, + reportError, + reportFetchStatus, + router, + } = this.props; const computedItems = this.getComputedItems(); const groupById = getIdKeyForGroupBy(query.group_by); @@ -398,9 +412,17 @@ class RhelDetails extends React.Component { return ; } if (!hasCurrentMonthData(providers)) { - return ; + return ( + : undefined + } + title={title} + /> + ); } } + return (
    { onClose={this.handleOnExportModalClose} reportPathsType={getReportPathsType(perspective)} reportQueryString={reportQueryString} + reportType={ReportType.cost} resolution="daily" showTimeScope={false} /> @@ -232,6 +234,7 @@ class Explorer extends React.Component { isCompact={!isBottom} isDisabled={isDisabled} itemCount={count} + menuAppendTo={document.body} // Page scroll workaround https://issues.redhat.com/browse/COST-5320 onPerPageSelect={(event, perPage) => handleOnPerPageSelect(query, router, perPage)} onSetPage={(event, pageNumber) => handleOnSetPage(query, router, report, pageNumber)} page={page} diff --git a/src/routes/explorer/explorerTable.tsx b/src/routes/explorer/explorerTable.tsx index ab08d63a5..daad735bf 100644 --- a/src/routes/explorer/explorerTable.tsx +++ b/src/routes/explorer/explorerTable.tsx @@ -233,6 +233,7 @@ class ExplorerTableBase extends React.Component{item.id}
    : null; } + if (!tooltipContent) { + tooltipContent = ( +
      + {item.cost?.networkUnattributedDistributed?.value > 0 && ( +
    • {intl.formatMessage(messages.networkUnattributedDistributed)}
    • + )} + {item.cost?.platformDistributed?.value > 0 && ( +
    • {intl.formatMessage(messages.platformDistributed)}
    • + )} + {item.cost?.storageUnattributedDistributed?.value > 0 && ( +
    • {intl.formatMessage(messages.storageUnattributedDistributed)}
    • + )} + {item.cost?.workerUnallocated?.value > 0 && ( +
    • {intl.formatMessage(messages.workerUnallocated)}
    • + )} +
    + ); + } if (item.id && !selectItem) { selectItem = item; } if ( showCostDistribution && item.classification !== classificationUnallocated && - (item?.cost?.platformDistributed?.value > 0 || item?.cost?.workerUnallocatedDistributed?.value > 0) + (item.cost?.networkUnattributedDistributed?.value > 0 || + item.cost?.platformDistributed?.value > 0 || + item.cost?.storageUnattributedDistributed?.value > 0 || + item.cost?.workerUnallocatedDistributed?.value > 0) ) { isOverheadCosts = true; showLabels = true; @@ -298,7 +320,12 @@ class ExplorerTableBase extends React.Component ) : isOverheadCosts ? ( - + diff --git a/src/routes/explorer/explorerUtils.ts b/src/routes/explorer/explorerUtils.ts index 44fa5c480..c9ef2aa1d 100644 --- a/src/routes/explorer/explorerUtils.ts +++ b/src/routes/explorer/explorerUtils.ts @@ -28,7 +28,6 @@ import { isRhelAvailable, } from 'utils/userAccess'; -// eslint-disable-next-line no-shadow export const enum PerspectiveType { aws = 'aws', awsOcp = 'aws_ocp', // Aws filtered by Ocp diff --git a/src/routes/optimizations/optimizationsBreakdown/optimizationsBreakdown.tsx b/src/routes/optimizations/optimizationsBreakdown/optimizationsBreakdown.tsx index 862f94742..63962ce2e 100644 --- a/src/routes/optimizations/optimizationsBreakdown/optimizationsBreakdown.tsx +++ b/src/routes/optimizations/optimizationsBreakdown/optimizationsBreakdown.tsx @@ -1,10 +1,5 @@ import AsyncComponent from '@redhat-cloud-services/frontend-components/AsyncComponent'; -import messages from 'locales/messages'; import React from 'react'; -import { useIntl } from 'react-intl'; -import { routes } from 'routes'; -import { useQueryFromRoute } from 'utils/hooks'; -import { formatPath } from 'utils/paths'; import { styles } from './optimizationsBreakdown.styles'; @@ -15,19 +10,9 @@ interface OptimizationsBreakdownOwnProps { type OptimizationsBreakdownProps = OptimizationsBreakdownOwnProps; const OptimizationsBreakdown: React.FC = () => { - const intl = useIntl(); - const queryFromRoute = useQueryFromRoute(); - return (
    - +
    ); }; diff --git a/src/routes/optimizations/optimizationsDetails/optimizationsDetails.tsx b/src/routes/optimizations/optimizationsDetails/optimizationsDetails.tsx index 1042343e0..d116c9259 100644 --- a/src/routes/optimizations/optimizationsDetails/optimizationsDetails.tsx +++ b/src/routes/optimizations/optimizationsDetails/optimizationsDetails.tsx @@ -30,6 +30,7 @@ const OptimizationsDetails: React.FC = () => { linkState={{ ...(location.state && location.state), }} + projectPath={formatPath(routes.ocpBreakdown.path)} />
    ); diff --git a/src/routes/overview/components/dashboardWidgetBase.tsx b/src/routes/overview/components/dashboardWidgetBase.tsx index 7224d61ee..a3f9197e4 100644 --- a/src/routes/overview/components/dashboardWidgetBase.tsx +++ b/src/routes/overview/components/dashboardWidgetBase.tsx @@ -37,7 +37,6 @@ import { formatPath } from 'utils/paths'; import { ChartComparison } from './chartComparison'; import { chartStyles, styles } from './dashboardWidget.styles'; -// eslint-disable-next-line no-shadow const enum Comparison { cumulative = 'cumulative', daily = 'daily', diff --git a/src/routes/overview/overview.tsx b/src/routes/overview/overview.tsx index 8202ce078..3e99e4e2f 100644 --- a/src/routes/overview/overview.tsx +++ b/src/routes/overview/overview.tsx @@ -78,7 +78,6 @@ import { import { OciDashboard } from './ociDashboard'; import { styles } from './overview.styles'; -// eslint-disable-next-line no-shadow const enum InfrastructurePerspective { aws = 'aws', awsOcp = 'aws_ocp', // Aws filtered by Ocp @@ -92,19 +91,16 @@ const enum InfrastructurePerspective { ocpCloud = 'ocp_cloud', // All filtered by Ocp } -// eslint-disable-next-line no-shadow const enum OcpPerspective { ocp = 'ocp', } -// eslint-disable-next-line no-shadow const enum OverviewTab { infrastructure = 'infrastructure', ocp = 'ocp', rhel = 'rhel', } -// eslint-disable-next-line no-shadow const enum RhelPerspective { rhel = 'rhel', } diff --git a/src/routes/settings/costModels/components/addPriceList.test.tsx b/src/routes/settings/costModels/components/addPriceList.test.tsx index 4363d9638..db51486e6 100644 --- a/src/routes/settings/costModels/components/addPriceList.test.tsx +++ b/src/routes/settings/costModels/components/addPriceList.test.tsx @@ -32,7 +32,7 @@ const metricsHash: any = { metric: 'memory_gb_request_per_hour', label_metric: 'Memory', label_measurement: 'Request', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', default_cost_type: 'Supplementary', }, Usage: { @@ -40,7 +40,7 @@ const metricsHash: any = { metric: 'memory_gb_usage_per_hour', label_metric: 'Memory', label_measurement: 'Usage', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', default_cost_type: 'Supplementary', }, }, @@ -78,7 +78,7 @@ function RenderFormDataUI({ cancel, submit }) { name: 'memory_gb_usage_per_hour', label_metric: 'Memory', label_measurement: 'Request', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', }, description: '', tag_rates: { diff --git a/src/routes/settings/costModels/components/rateTable.tsx b/src/routes/settings/costModels/components/rateTable.tsx index 5bbc3063f..38d4e6301 100644 --- a/src/routes/settings/costModels/components/rateTable.tsx +++ b/src/routes/settings/costModels/components/rateTable.tsx @@ -97,9 +97,7 @@ const RateTableBase: React.FC = ({ columnIndex, }); const setRowExpanded = rowIndex => { - expanded.includes(rowIndex) - ? setExpanded(expanded.filter(ex => ex !== rowIndex)) - : setExpanded(expanded.concat([rowIndex])); + setExpanded(expanded.includes(rowIndex) ? expanded.filter(ex => ex !== rowIndex) : expanded.concat([rowIndex])); }; const compoundExpandParams = rowIndex => ({ isExpanded: expanded.includes(rowIndex), diff --git a/src/routes/settings/costModels/costModel/updateDistributionDialog.tsx b/src/routes/settings/costModels/costModel/updateDistributionDialog.tsx index 505b0eb0e..8d9ff31b9 100644 --- a/src/routes/settings/costModels/costModel/updateDistributionDialog.tsx +++ b/src/routes/settings/costModels/costModel/updateDistributionDialog.tsx @@ -1,6 +1,7 @@ import { Alert, Button, + Checkbox, Form, FormGroup, Modal, @@ -73,24 +74,20 @@ class UpdateDistributionDialogBase extends React.Component< this.setState({ distribution: value }); }; - private handleDistributePlatformUnallocatedChange = event => { - const { value } = event.currentTarget; - this.setState({ distributePlatformUnallocated: value === 'true' }); + private handleDistributePlatformUnallocatedChange = (event, isChecked) => { + this.setState({ distributePlatformUnallocated: isChecked }); }; - private handleDistributeWorkerUnallocatedChange = event => { - const { value } = event.currentTarget; - this.setState({ distributeWorkerUnallocated: value === 'true' }); + private handleDistributeWorkerUnallocatedChange = (event, isChecked) => { + this.setState({ distributeWorkerUnallocated: isChecked }); }; - private handleDistributeNetworkChange = event => { - const { value } = event.currentTarget; - this.setState({ distributeNetwork: value === 'true' }); + private handleDistributeNetworkChange = (event, isChecked) => { + this.setState({ distributeNetwork: isChecked }); }; - private handleDistributeStorageChange = event => { - const { value } = event.currentTarget; - this.setState({ distributeStorage: value === 'true' }); + private handleDistributeStorageChange = (event, isChecked) => { + this.setState({ distributeStorage: isChecked }); }; public render() { @@ -184,140 +181,47 @@ class UpdateDistributionDialogBase extends React.Component< - {intl.formatMessage(messages.platform)} + {intl.formatMessage(messages.distributeCostsToProjects)} - - {intl.formatMessage(messages.platformDesc)} -
    - - + - - -
    -
    - - - {intl.formatMessage(messages.workerUnallocated)} - - - {intl.formatMessage(messages.workerUnallocatedDesc)} - - - -
    - - - + {isOcpCloudNetworkingToggleEnabled && ( + + )} + {isOcpProjectStorageToggleEnabled && ( + + )}
    - {isOcpCloudNetworkingToggleEnabled && ( - <> - - - {intl.formatMessage(messages.network)} - - - {intl.formatMessage(messages.networkDesc)} - - - -
    - - - - -
    -
    - - )} - {isOcpProjectStorageToggleEnabled && ( - <> - - - {intl.formatMessage(messages.storage)} - - - {intl.formatMessage(messages.storageDesc)} - - - -
    - - - - -
    -
    - - )} ); diff --git a/src/routes/settings/costModels/costModel/updateRateModel.test.tsx b/src/routes/settings/costModels/costModel/updateRateModel.test.tsx index 7c02b26f6..845509e79 100644 --- a/src/routes/settings/costModels/costModel/updateRateModel.test.tsx +++ b/src/routes/settings/costModels/costModel/updateRateModel.test.tsx @@ -188,7 +188,7 @@ const initial = { metric: 'memory_gb_usage_per_hour', label_metric: 'Memory', label_measurement: 'Usage', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', default_cost_type: 'Supplementary', }, { @@ -196,7 +196,7 @@ const initial = { metric: 'memory_gb_request_per_hour', label_metric: 'Memory', label_measurement: 'Request', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', default_cost_type: 'Supplementary', }, { diff --git a/src/routes/settings/costModels/costModelWizard/costModelWizard.tsx b/src/routes/settings/costModels/costModelWizard/costModelWizard.tsx index 258886e4a..b0aa5818b 100644 --- a/src/routes/settings/costModels/costModelWizard/costModelWizard.tsx +++ b/src/routes/settings/costModels/costModelWizard/costModelWizard.tsx @@ -453,21 +453,17 @@ class CostModelWizardBase extends React.Component { - const { value } = event.currentTarget; - this.setState({ distributeNetwork: value === 'true' }); + handleDistributeNetworkChange: (event, isChecked) => { + this.setState({ distributeNetwork: isChecked }); }, - handleDistributePlatformUnallocatedChange: event => { - const { value } = event.currentTarget; - this.setState({ distributePlatformUnallocated: value === 'true' }); + handleDistributePlatformUnallocatedChange: (event, isChecked) => { + this.setState({ distributePlatformUnallocated: isChecked }); }, - handleDistributeStorageChange: event => { - const { value } = event.currentTarget; - this.setState({ distributeStorage: value === 'true' }); + handleDistributeStorageChange: (event, isChecked) => { + this.setState({ distributeStorage: isChecked }); }, - handleDistributeWorkerUnallocatedChange: event => { - const { value } = event.currentTarget; - this.setState({ distributeWorkerUnallocated: value === 'true' }); + handleDistributeWorkerUnallocatedChange: (event, isChecked) => { + this.setState({ distributeWorkerUnallocated: isChecked }); }, handleMarkupDiscountChange: event => { const { value } = event.currentTarget; diff --git a/src/routes/settings/costModels/costModelWizard/distribution.tsx b/src/routes/settings/costModels/costModelWizard/distribution.tsx index 9ab9491e6..d99749ee1 100644 --- a/src/routes/settings/costModels/costModelWizard/distribution.tsx +++ b/src/routes/settings/costModels/costModelWizard/distribution.tsx @@ -1,4 +1,14 @@ -import { FormGroup, Radio, Stack, StackItem, Text, TextContent, Title, TitleSizes } from '@patternfly/react-core'; +import { + Checkbox, + FormGroup, + Radio, + Stack, + StackItem, + Text, + TextContent, + Title, + TitleSizes, +} from '@patternfly/react-core'; import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; @@ -60,7 +70,7 @@ class DistributionBase extends React.Component
    - + - {intl.formatMessage(messages.platform)} + {intl.formatMessage(messages.distributeCostsToProjects)} - - {intl.formatMessage(messages.platformDesc)} - - - + - - - - - - - {intl.formatMessage(messages.workerUnallocated)} - - - {intl.formatMessage(messages.workerUnallocatedDesc)} - - - -
    - - - + {isOcpCloudNetworkingToggleEnabled && ( + + )} + {isOcpProjectStorageToggleEnabled && ( + + )}
    - {isOcpCloudNetworkingToggleEnabled && ( - <> - - - {intl.formatMessage(messages.network)} - - - {intl.formatMessage(messages.networkDesc)} - - - -
    - - - - -
    -
    - - )} - {isOcpProjectStorageToggleEnabled && ( - <> - - - {intl.formatMessage(messages.storage)} - - - {intl.formatMessage(messages.storageDesc)} - - - -
    - - - - -
    -
    - - )} ); }} diff --git a/src/routes/settings/platformProjects/platformProjectsToolbar.tsx b/src/routes/settings/platformProjects/platformProjectsToolbar.tsx index a01d79606..fb7a421d0 100644 --- a/src/routes/settings/platformProjects/platformProjectsToolbar.tsx +++ b/src/routes/settings/platformProjects/platformProjectsToolbar.tsx @@ -11,7 +11,6 @@ import type { Filter } from 'routes/utils/filter'; import { styles } from './platformProjects.styles'; -// eslint-disable-next-line no-shadow export const enum GroupType { default = 'default', platform = 'Platform', diff --git a/src/routes/settings/settings.tsx b/src/routes/settings/settings.tsx index 6e1a270b2..18d9b3af9 100644 --- a/src/routes/settings/settings.tsx +++ b/src/routes/settings/settings.tsx @@ -28,7 +28,6 @@ import { hasCostModelAccess, hasSettingsAccess } from 'utils/userAccess'; import { CostCategory } from './costCategory'; import { styles } from './settings.styles'; -// eslint-disable-next-line no-shadow const enum SettingsTab { costModels = 'cost_models', calculations = 'calculations', @@ -213,7 +212,7 @@ const Settings: React.FC = () => {
    {getTabs(availableTabs)}
    )} -
    {getTabContent(availableTabs)}
    +
    {getTabContent(availableTabs)}
    .
    ); }; diff --git a/src/routes/settings/tagLabels/tagLabels.tsx b/src/routes/settings/tagLabels/tagLabels.tsx index b11c7e622..ccec295d9 100644 --- a/src/routes/settings/tagLabels/tagLabels.tsx +++ b/src/routes/settings/tagLabels/tagLabels.tsx @@ -7,7 +7,6 @@ import { styles } from './tagLabels.styles'; import TagMapping from './tagMapping/tagMapping'; import { Tags } from './tags'; -// eslint-disable-next-line no-shadow const enum TagLabelsItem { tagMapping = 'tagMapping', tags = 'tags', diff --git a/src/routes/utils/computedReport/getComputedReportItems.ts b/src/routes/utils/computedReport/getComputedReportItems.ts index 96a8b2244..6321ee83b 100644 --- a/src/routes/utils/computedReport/getComputedReportItems.ts +++ b/src/routes/utils/computedReport/getComputedReportItems.ts @@ -13,8 +13,10 @@ export interface ComputedReportValue { export interface ComputedReportItemValue { distributed?: ReportValue; markup?: ReportValue; + networkUnattributedDistributed?: ReportValue; platformDistributed?: ReportValue; raw?: ReportValue; + storageUnattributedDistributed?: ReportValue; total?: ReportValue; usage?: ReportValue; workerUnallocatedDistributed?: ReportValue; @@ -118,6 +120,19 @@ function getCostData(val, key, item?: any) { units: val[key].markup.units ? val[key].markup.units : defaultUnits, }, }), + ...(val[key] && + val[key].network_unattributed_distributed && { + networkUnattributedDistributed: { + value: + val[key].network_unattributed_distributed.value + + (item && item[key]?.network_unattributed_distributed + ? item[key].network_unattributed_distributed.value + : 0), + units: val[key].network_unattributed_distributed.units + ? val[key].network_unattributed_distributed.units + : defaultUnits, + }, + }), ...(val[key] && val[key].platform_distributed && { platformDistributed: { @@ -134,6 +149,19 @@ function getCostData(val, key, item?: any) { units: val[key].raw.units ? val[key].raw.units : defaultUnits, }, }), + ...(val[key] && + val[key].storage_unattributed_distributed && { + storageUnattributedDistributed: { + value: + val[key].storage_unattributed_distributed.value + + (item && item[key]?.storage_unattributed_distributed + ? item[key].storage_unattributed_distributed.value + : 0), + units: val[key].storage_unattributed_distributed.units + ? val[key].storage_unattributed_distributed.units + : defaultUnits, + }, + }), ...(val[key] && val[key].total && { total: { diff --git a/src/routes/utils/dateRange.ts b/src/routes/utils/dateRange.ts index 10cf0a8a3..85b59d694 100644 --- a/src/routes/utils/dateRange.ts +++ b/src/routes/utils/dateRange.ts @@ -9,7 +9,6 @@ import { } from 'utils/dates'; // The date range drop down has the options below (if today is Jan 18th…) -// eslint-disable-next-line no-shadow export const enum DateRangeType { currentMonthToDate = 'current_month_to_date', // Current month (Jan 1 - Jan 18) custom = 'custom', // Any date range within the last 90 days, but no more than 65 days total for best API performance diff --git a/src/routes/utils/filter.ts b/src/routes/utils/filter.ts index c732587d5..6c8953eab 100644 --- a/src/routes/utils/filter.ts +++ b/src/routes/utils/filter.ts @@ -7,7 +7,6 @@ export interface Filter { value?: string; } -// eslint-disable-next-line no-shadow enum QueryFilterType { filter = 'filter_by', exclude = 'exclude', @@ -16,9 +15,9 @@ enum QueryFilterType { export const addFilterToQuery = (query: Query, filter: Filter) => { return addQueryFilter( query, - filter.type, - filter.value, - filter.isExcludes ? QueryFilterType.exclude : QueryFilterType.filter + filter?.type, + filter?.value, + filter?.isExcludes ? QueryFilterType.exclude : QueryFilterType.filter ); }; diff --git a/src/routes/utils/groupBy.ts b/src/routes/utils/groupBy.ts index 85d7d5672..056286b23 100644 --- a/src/routes/utils/groupBy.ts +++ b/src/routes/utils/groupBy.ts @@ -55,6 +55,21 @@ export const getGroupByTagKey = (query: Query) => { return groupByTagKey; }; +export const getExcludeTagKey = (query: Query) => { + let excludeTagKey; + + if (query?.exclude) { + for (const groupBy of Object.keys(query.exclude)) { + const tagIndex = groupBy.indexOf(tagPrefix); + if (tagIndex !== -1) { + excludeTagKey = groupBy.substring(tagIndex + tagPrefix.length) as any; + break; + } + } + } + return excludeTagKey; +}; + export const getFilterByTagKey = (query: Query) => { let filterByTagKey; diff --git a/src/routes/utils/providers.ts b/src/routes/utils/providers.ts index 7d5821475..47ca655b7 100644 --- a/src/routes/utils/providers.ts +++ b/src/routes/utils/providers.ts @@ -1,7 +1,6 @@ import type { Providers } from 'api/providers'; import type { ProviderType } from 'api/providers'; -// eslint-disable-next-line no-shadow const enum DataType { currentMonthData = 'current_month_data', hasData = 'has_data', diff --git a/src/routes/utils/queryState.ts b/src/routes/utils/queryState.ts index 8f9feea74..ce566d681 100644 --- a/src/routes/utils/queryState.ts +++ b/src/routes/utils/queryState.ts @@ -2,11 +2,11 @@ import type * as H from 'history'; import { cloneDeep } from 'lodash'; export function clearQueryState(location: H.Location, key: string) { - if (location?.state && location.state[key]) { + if (location?.state?.[key]) { location.state[key] = undefined; } } export function getQueryState(location: H.Location, key: string) { - return location?.state && location.state[key] ? cloneDeep(location.state[key]) : undefined; + return location?.state?.[key] ? cloneDeep(location.state[key]) : undefined; } diff --git a/src/routes/utils/sort.ts b/src/routes/utils/sort.ts index d4256006d..2ac25b75f 100644 --- a/src/routes/utils/sort.ts +++ b/src/routes/utils/sort.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line no-shadow export const enum SortDirection { asc, desc, diff --git a/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewCommon.ts b/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewCommon.ts index dffb612cd..7957598f3 100644 --- a/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewCommon.ts +++ b/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewCommon.ts @@ -1,6 +1 @@ -import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; - export const awsCostOverviewStateKey = 'awsCostOverview'; - -// tslint:disable-next-line:no-empty-interface -export interface AwsCostOverviewWidget extends CostOverviewWidget {} diff --git a/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewReducer.ts b/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewReducer.ts index 4a5f55e30..626779079 100644 --- a/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewReducer.ts +++ b/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewReducer.ts @@ -1,8 +1,9 @@ -import type { AwsCostOverviewWidget } from './awsCostOverviewCommon'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; + import { accountSummaryWidget, costWidget, regionSummaryWidget, serviceSummaryWidget } from './awsCostOverviewWidgets'; export type AwsCostOverviewState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewWidgets.ts b/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewWidgets.ts index c9e3f87d0..43c80a89a 100644 --- a/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewWidgets.ts +++ b/src/store/breakdown/costOverview/awsCostOverview/awsCostOverviewWidgets.ts @@ -1,13 +1,12 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { CostOverviewWidgetType } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { tagPrefix } from 'utils/props'; -import type { AwsCostOverviewWidget } from './awsCostOverviewCommon'; - let currrentId = 0; const getId = () => currrentId++; -export const costWidget: AwsCostOverviewWidget = { +export const costWidget: CostOverviewWidget = { chartName: 'awsCostWidget', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -15,7 +14,7 @@ export const costWidget: AwsCostOverviewWidget = { type: CostOverviewWidgetType.cost, }; -export const accountSummaryWidget: AwsCostOverviewWidget = { +export const accountSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'account', @@ -26,7 +25,7 @@ export const accountSummaryWidget: AwsCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const regionSummaryWidget: AwsCostOverviewWidget = { +export const regionSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'region', @@ -37,7 +36,7 @@ export const regionSummaryWidget: AwsCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const serviceSummaryWidget: AwsCostOverviewWidget = { +export const serviceSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'service', diff --git a/src/store/breakdown/costOverview/awsCostOverview/index.ts b/src/store/breakdown/costOverview/awsCostOverview/index.ts index 1c44648e4..20ffabc1e 100644 --- a/src/store/breakdown/costOverview/awsCostOverview/index.ts +++ b/src/store/breakdown/costOverview/awsCostOverview/index.ts @@ -1,7 +1,5 @@ -import type { AwsCostOverviewWidget } from './awsCostOverviewCommon'; import { awsCostOverviewStateKey } from './awsCostOverviewCommon'; import { awsCostOverviewReducer } from './awsCostOverviewReducer'; import * as awsCostOverviewSelectors from './awsCostOverviewSelectors'; -export type { AwsCostOverviewWidget }; export { awsCostOverviewStateKey, awsCostOverviewReducer, awsCostOverviewSelectors }; diff --git a/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewCommon.ts b/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewCommon.ts index 9e52efa2c..a40b41d2f 100644 --- a/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewCommon.ts +++ b/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewCommon.ts @@ -1,6 +1 @@ -import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; - export const azureCostOverviewStateKey = 'azureCostOverview'; - -// tslint:disable-next-line:no-empty-interface -export interface AzureCostOverviewWidget extends CostOverviewWidget {} diff --git a/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewReducer.ts b/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewReducer.ts index ea6b62a01..0698911a1 100644 --- a/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewReducer.ts +++ b/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewReducer.ts @@ -1,4 +1,5 @@ -import type { AzureCostOverviewWidget } from './azureCostOverviewCommon'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; + import { accountSummaryWidget, costWidget, @@ -7,7 +8,7 @@ import { } from './azureCostOverviewWidgets'; export type AzureCostOverviewState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewWidgets.ts b/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewWidgets.ts index fa50b9fc2..452c5f4e0 100644 --- a/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewWidgets.ts +++ b/src/store/breakdown/costOverview/azureCostOverview/azureCostOverviewWidgets.ts @@ -1,12 +1,12 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; -import type { AzureCostOverviewWidget } from 'store/breakdown/costOverview/azureCostOverview'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { CostOverviewWidgetType } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { tagPrefix } from 'utils/props'; let currrentId = 0; const getId = () => currrentId++; -export const costWidget: AzureCostOverviewWidget = { +export const costWidget: CostOverviewWidget = { chartName: 'azureCostWidget', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -14,7 +14,7 @@ export const costWidget: AzureCostOverviewWidget = { type: CostOverviewWidgetType.cost, }; -export const accountSummaryWidget: AzureCostOverviewWidget = { +export const accountSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'subscription_guid', @@ -25,7 +25,7 @@ export const accountSummaryWidget: AzureCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const regionSummaryWidget: AzureCostOverviewWidget = { +export const regionSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'resource_location', @@ -36,7 +36,7 @@ export const regionSummaryWidget: AzureCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const serviceSummaryWidget: AzureCostOverviewWidget = { +export const serviceSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'service_name', diff --git a/src/store/breakdown/costOverview/azureCostOverview/index.ts b/src/store/breakdown/costOverview/azureCostOverview/index.ts index 392a50114..9764e909b 100644 --- a/src/store/breakdown/costOverview/azureCostOverview/index.ts +++ b/src/store/breakdown/costOverview/azureCostOverview/index.ts @@ -1,7 +1,5 @@ -import type { AzureCostOverviewWidget } from './azureCostOverviewCommon'; import { azureCostOverviewStateKey } from './azureCostOverviewCommon'; import { azureCostOverviewReducer } from './azureCostOverviewReducer'; import * as azureCostOverviewSelectors from './azureCostOverviewSelectors'; -export type { AzureCostOverviewWidget }; export { azureCostOverviewStateKey, azureCostOverviewReducer, azureCostOverviewSelectors }; diff --git a/src/store/breakdown/costOverview/common/costOverviewCommon.ts b/src/store/breakdown/costOverview/common/costOverviewCommon.ts index 8ba267603..44cdb69e1 100644 --- a/src/store/breakdown/costOverview/common/costOverviewCommon.ts +++ b/src/store/breakdown/costOverview/common/costOverviewCommon.ts @@ -1,6 +1,5 @@ import type { ReportPathsType, ReportType } from 'api/reports/report'; -// eslint-disable-next-line no-shadow export const enum CostOverviewWidgetType { cluster = 'cluster', // This type displays clusters associated with a project cost = 'cost', // This type displays a cost breakdown as a pie chart diff --git a/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewCommon.ts b/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewCommon.ts index b422d3552..281b6cf98 100644 --- a/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewCommon.ts +++ b/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewCommon.ts @@ -1,6 +1 @@ -import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; - export const gcpCostOverviewStateKey = 'gcpCostOverview'; - -// tslint:disable-next-line:no-empty-interface -export interface GcpCostOverviewWidget extends CostOverviewWidget {} diff --git a/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewReducer.ts b/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewReducer.ts index 1bcf4a726..b20df8e05 100644 --- a/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewReducer.ts +++ b/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewReducer.ts @@ -1,4 +1,5 @@ -import type { GcpCostOverviewWidget } from './gcpCostOverviewCommon'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; + import { accountSummaryWidget, costWidget, @@ -8,7 +9,7 @@ import { } from './gcpCostOverviewWidgets'; export type GcpCostOverviewState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewWidgets.ts b/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewWidgets.ts index 9ede7a1ab..a4d0375bc 100644 --- a/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewWidgets.ts +++ b/src/store/breakdown/costOverview/gcpCostOverview/gcpCostOverviewWidgets.ts @@ -1,20 +1,19 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { CostOverviewWidgetType } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { tagPrefix } from 'utils/props'; -import type { GcpCostOverviewWidget } from './gcpCostOverviewCommon'; - let currrentId = 0; const getId = () => currrentId++; -export const costWidget: GcpCostOverviewWidget = { +export const costWidget: CostOverviewWidget = { id: getId(), reportPathsType: ReportPathsType.ocp, reportType: ReportType.cost, type: CostOverviewWidgetType.cost, }; -export const accountSummaryWidget: GcpCostOverviewWidget = { +export const accountSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'account', @@ -25,7 +24,7 @@ export const accountSummaryWidget: GcpCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const projectSummaryWidget: GcpCostOverviewWidget = { +export const projectSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'gcp_project', @@ -36,7 +35,7 @@ export const projectSummaryWidget: GcpCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const regionSummaryWidget: GcpCostOverviewWidget = { +export const regionSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'region', @@ -47,7 +46,7 @@ export const regionSummaryWidget: GcpCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const serviceSummaryWidget: GcpCostOverviewWidget = { +export const serviceSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'service', diff --git a/src/store/breakdown/costOverview/gcpCostOverview/index.ts b/src/store/breakdown/costOverview/gcpCostOverview/index.ts index b7cdf4012..76b61e6aa 100644 --- a/src/store/breakdown/costOverview/gcpCostOverview/index.ts +++ b/src/store/breakdown/costOverview/gcpCostOverview/index.ts @@ -1,7 +1,5 @@ -import type { GcpCostOverviewWidget } from './gcpCostOverviewCommon'; import { gcpCostOverviewStateKey } from './gcpCostOverviewCommon'; import { gcpCostOverviewReducer } from './gcpCostOverviewReducer'; import * as gcpCostOverviewSelectors from './gcpCostOverviewSelectors'; -export type { GcpCostOverviewWidget }; export { gcpCostOverviewStateKey, gcpCostOverviewReducer, gcpCostOverviewSelectors }; diff --git a/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewCommon.ts b/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewCommon.ts index 3f32863c8..d98c688eb 100644 --- a/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewCommon.ts +++ b/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewCommon.ts @@ -1,6 +1 @@ -import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; - export const ibmCostOverviewStateKey = 'ibmCostOverview'; - -// tslint:disable-next-line:no-empty-interface -export interface IbmCostOverviewWidget extends CostOverviewWidget {} diff --git a/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewReducer.ts b/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewReducer.ts index bab17a859..d9717c8ff 100644 --- a/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewReducer.ts +++ b/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewReducer.ts @@ -1,4 +1,5 @@ -import type { IbmCostOverviewWidget } from './ibmCostOverviewCommon'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; + import { accountSummaryWidget, costWidget, @@ -8,7 +9,7 @@ import { } from './ibmCostOverviewWidgets'; export type IbmCostOverviewState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewWidgets.ts b/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewWidgets.ts index fb27a63d0..a166b60ac 100644 --- a/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewWidgets.ts +++ b/src/store/breakdown/costOverview/ibmCostOverview/ibmCostOverviewWidgets.ts @@ -1,13 +1,12 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { CostOverviewWidgetType } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { tagPrefix } from 'utils/props'; -import type { IbmCostOverviewWidget } from './ibmCostOverviewCommon'; - let currrentId = 0; const getId = () => currrentId++; -export const costWidget: IbmCostOverviewWidget = { +export const costWidget: CostOverviewWidget = { chartName: 'ibmCostWidget', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -15,7 +14,7 @@ export const costWidget: IbmCostOverviewWidget = { type: CostOverviewWidgetType.cost, }; -export const accountSummaryWidget: IbmCostOverviewWidget = { +export const accountSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'account', @@ -26,7 +25,7 @@ export const accountSummaryWidget: IbmCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const projectSummaryWidget: IbmCostOverviewWidget = { +export const projectSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'project', @@ -37,7 +36,7 @@ export const projectSummaryWidget: IbmCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const regionSummaryWidget: IbmCostOverviewWidget = { +export const regionSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'region', @@ -48,7 +47,7 @@ export const regionSummaryWidget: IbmCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const serviceSummaryWidget: IbmCostOverviewWidget = { +export const serviceSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'service', diff --git a/src/store/breakdown/costOverview/ibmCostOverview/index.ts b/src/store/breakdown/costOverview/ibmCostOverview/index.ts index a63a40975..5308134d4 100644 --- a/src/store/breakdown/costOverview/ibmCostOverview/index.ts +++ b/src/store/breakdown/costOverview/ibmCostOverview/index.ts @@ -1,7 +1,5 @@ -import type { IbmCostOverviewWidget } from './ibmCostOverviewCommon'; import { ibmCostOverviewStateKey } from './ibmCostOverviewCommon'; import { ibmCostOverviewReducer } from './ibmCostOverviewReducer'; import * as ibmCostOverviewSelectors from './ibmCostOverviewSelectors'; -export type { IbmCostOverviewWidget }; export { ibmCostOverviewStateKey, ibmCostOverviewReducer, ibmCostOverviewSelectors }; diff --git a/src/store/breakdown/costOverview/ociCostOverview/index.ts b/src/store/breakdown/costOverview/ociCostOverview/index.ts index bc0e9f55e..160cceb2d 100644 --- a/src/store/breakdown/costOverview/ociCostOverview/index.ts +++ b/src/store/breakdown/costOverview/ociCostOverview/index.ts @@ -1,7 +1,5 @@ -import type { OciCostOverviewWidget } from './ociCostOverviewCommon'; import { ociCostOverviewStateKey } from './ociCostOverviewCommon'; import { ociCostOverviewReducer } from './ociCostOverviewReducer'; import * as ociCostOverviewSelectors from './ociCostOverviewSelectors'; -export type { OciCostOverviewWidget }; export { ociCostOverviewStateKey, ociCostOverviewReducer, ociCostOverviewSelectors }; diff --git a/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewCommon.ts b/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewCommon.ts index 5c1df4078..424be4ed9 100644 --- a/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewCommon.ts +++ b/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewCommon.ts @@ -1,6 +1 @@ -import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; - export const ociCostOverviewStateKey = 'ociCostOverview'; - -// tslint:disable-next-line:no-empty-interface -export interface OciCostOverviewWidget extends CostOverviewWidget {} diff --git a/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewReducer.ts b/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewReducer.ts index 8542bae45..d1752f6c2 100644 --- a/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewReducer.ts +++ b/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewReducer.ts @@ -1,8 +1,9 @@ -import type { OciCostOverviewWidget } from './ociCostOverviewCommon'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; + import { accountSummaryWidget, costWidget, regionSummaryWidget, serviceSummaryWidget } from './ociCostOverviewWidgets'; export type OciCostOverviewState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewWidgets.ts b/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewWidgets.ts index e955c31e7..01843bfad 100644 --- a/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewWidgets.ts +++ b/src/store/breakdown/costOverview/ociCostOverview/ociCostOverviewWidgets.ts @@ -1,12 +1,12 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { CostOverviewWidgetType } from 'store/breakdown/costOverview/common/costOverviewCommon'; -import type { OciCostOverviewWidget } from 'store/breakdown/costOverview/ociCostOverview'; import { tagPrefix } from 'utils/props'; let currrentId = 0; const getId = () => currrentId++; -export const costWidget: OciCostOverviewWidget = { +export const costWidget: CostOverviewWidget = { chartName: 'ociCostWidget', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -14,7 +14,7 @@ export const costWidget: OciCostOverviewWidget = { type: CostOverviewWidgetType.cost, }; -export const accountSummaryWidget: OciCostOverviewWidget = { +export const accountSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'payer_tenant_id', @@ -25,7 +25,7 @@ export const accountSummaryWidget: OciCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const regionSummaryWidget: OciCostOverviewWidget = { +export const regionSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'region', @@ -36,7 +36,7 @@ export const regionSummaryWidget: OciCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const serviceSummaryWidget: OciCostOverviewWidget = { +export const serviceSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'product_service', diff --git a/src/store/breakdown/costOverview/ocpCostOverview/index.ts b/src/store/breakdown/costOverview/ocpCostOverview/index.ts index 74df646e8..77f3d8ac8 100644 --- a/src/store/breakdown/costOverview/ocpCostOverview/index.ts +++ b/src/store/breakdown/costOverview/ocpCostOverview/index.ts @@ -1,7 +1,5 @@ -import type { OcpCostOverviewWidget } from './ocpCostOverviewCommon'; import { ocpCostOverviewStateKey } from './ocpCostOverviewCommon'; import { ocpCostOverviewReducer } from './ocpCostOverviewReducer'; import * as ocpCostOverviewSelectors from './ocpCostOverviewSelectors'; -export type { OcpCostOverviewWidget }; export { ocpCostOverviewReducer, ocpCostOverviewStateKey, ocpCostOverviewSelectors }; diff --git a/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewCommon.ts b/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewCommon.ts index ef2977169..e9dc5babb 100644 --- a/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewCommon.ts +++ b/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewCommon.ts @@ -1,6 +1 @@ -import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; - export const ocpCostOverviewStateKey = 'ocpCostOverview'; - -// tslint:disable-next-line:no-empty-interface -export interface OcpCostOverviewWidget extends CostOverviewWidget {} diff --git a/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewReducer.ts b/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewReducer.ts index e10eeaf2c..a53681a44 100644 --- a/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewReducer.ts +++ b/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewReducer.ts @@ -1,4 +1,5 @@ -import type { OcpCostOverviewWidget } from './ocpCostOverviewCommon'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; + import { clusterWidget, costDistributionWidget, @@ -12,7 +13,7 @@ import { } from './ocpCostOverviewWidgets'; export type OcpCostOverviewState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewWidgets.ts b/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewWidgets.ts index 1cd6f0bb0..bfbfe13b4 100644 --- a/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewWidgets.ts +++ b/src/store/breakdown/costOverview/ocpCostOverview/ocpCostOverviewWidgets.ts @@ -1,13 +1,12 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { CostOverviewWidgetType } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { platformCategoryKey, tagPrefix } from 'utils/props'; -import type { OcpCostOverviewWidget } from './ocpCostOverviewCommon'; - let currrentId = 0; const getId = () => currrentId++; -export const clusterWidget: OcpCostOverviewWidget = { +export const clusterWidget: CostOverviewWidget = { id: getId(), cluster: { reportGroupBy: 'project', @@ -18,7 +17,7 @@ export const clusterWidget: OcpCostOverviewWidget = { type: CostOverviewWidgetType.cluster, }; -export const costWidget: OcpCostOverviewWidget = { +export const costWidget: CostOverviewWidget = { chartName: 'ocpCostWidget', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -26,7 +25,7 @@ export const costWidget: OcpCostOverviewWidget = { type: CostOverviewWidgetType.cost, }; -export const costDistributionWidget: OcpCostOverviewWidget = { +export const costDistributionWidget: CostOverviewWidget = { chartName: 'ocpCostDistributionWidget', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -34,7 +33,7 @@ export const costDistributionWidget: OcpCostOverviewWidget = { type: CostOverviewWidgetType.costDistribution, }; -export const cpuUsageWidget: OcpCostOverviewWidget = { +export const cpuUsageWidget: CostOverviewWidget = { chartName: 'ocpCpuWidget', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -42,7 +41,7 @@ export const cpuUsageWidget: OcpCostOverviewWidget = { type: CostOverviewWidgetType.cpuUsage, }; -export const memoryUsageWidget: OcpCostOverviewWidget = { +export const memoryUsageWidget: CostOverviewWidget = { chartName: 'ocpMemoryWidget', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -50,7 +49,7 @@ export const memoryUsageWidget: OcpCostOverviewWidget = { type: CostOverviewWidgetType.memoryUsage, }; -export const projectSummaryWidget: OcpCostOverviewWidget = { +export const projectSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'project', @@ -63,7 +62,7 @@ export const projectSummaryWidget: OcpCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const pvcWidget: OcpCostOverviewWidget = { +export const pvcWidget: CostOverviewWidget = { chartName: 'ocpPvcWidget', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -73,7 +72,7 @@ export const pvcWidget: OcpCostOverviewWidget = { }; // Storage summary -export const volumeSummaryWidget: OcpCostOverviewWidget = { +export const volumeSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'storageclass', @@ -85,7 +84,7 @@ export const volumeSummaryWidget: OcpCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const volumeUsageWidget: OcpCostOverviewWidget = { +export const volumeUsageWidget: CostOverviewWidget = { chartName: 'ocpVolumeWidget', id: getId(), reportPathsType: ReportPathsType.ocp, diff --git a/src/store/breakdown/costOverview/rhelCostOverview/index.ts b/src/store/breakdown/costOverview/rhelCostOverview/index.ts index bd5ba1fb0..ef769f520 100644 --- a/src/store/breakdown/costOverview/rhelCostOverview/index.ts +++ b/src/store/breakdown/costOverview/rhelCostOverview/index.ts @@ -1,7 +1,5 @@ -import type { RhelCostOverviewWidget } from './rhelCostOverviewCommon'; import { rhelCostOverviewStateKey } from './rhelCostOverviewCommon'; import { rhelCostOverviewReducer } from './rhelCostOverviewReducer'; import * as rhelCostOverviewSelectors from './rhelCostOverviewSelectors'; -export type { RhelCostOverviewWidget }; export { rhelCostOverviewReducer, rhelCostOverviewStateKey, rhelCostOverviewSelectors }; diff --git a/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewCommon.ts b/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewCommon.ts index 977beaa3b..7f42e1d47 100644 --- a/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewCommon.ts +++ b/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewCommon.ts @@ -1,6 +1 @@ -import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; - export const rhelCostOverviewStateKey = 'rhelCostOverview'; - -// tslint:disable-next-line:no-empty-interface -export interface RhelCostOverviewWidget extends CostOverviewWidget {} diff --git a/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewReducer.ts b/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewReducer.ts index 78fb7d16b..7241ff3cf 100644 --- a/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewReducer.ts +++ b/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewReducer.ts @@ -1,4 +1,5 @@ -import type { RhelCostOverviewWidget } from './rhelCostOverviewCommon'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; + import { clusterWidget, costWidget, @@ -9,7 +10,7 @@ import { } from './rhelCostOverviewWidgets'; export type RhelCostOverviewState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewWidgets.ts b/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewWidgets.ts index b41c8c2b0..47c788d1f 100644 --- a/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewWidgets.ts +++ b/src/store/breakdown/costOverview/rhelCostOverview/rhelCostOverviewWidgets.ts @@ -1,13 +1,12 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; +import type { CostOverviewWidget } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { CostOverviewWidgetType } from 'store/breakdown/costOverview/common/costOverviewCommon'; import { platformCategoryKey } from 'utils/props'; -import type { RhelCostOverviewWidget } from './rhelCostOverviewCommon'; - let currrentId = 0; const getId = () => currrentId++; -export const clusterWidget: RhelCostOverviewWidget = { +export const clusterWidget: CostOverviewWidget = { id: getId(), cluster: { reportGroupBy: 'project', @@ -18,7 +17,7 @@ export const clusterWidget: RhelCostOverviewWidget = { type: CostOverviewWidgetType.cluster, }; -export const costWidget: RhelCostOverviewWidget = { +export const costWidget: CostOverviewWidget = { chartName: 'rhelCostWidget', id: getId(), reportPathsType: ReportPathsType.rhel, @@ -26,7 +25,7 @@ export const costWidget: RhelCostOverviewWidget = { type: CostOverviewWidgetType.cost, }; -export const cpuUsageWidget: RhelCostOverviewWidget = { +export const cpuUsageWidget: CostOverviewWidget = { chartName: 'rhelCpuWidget', id: getId(), reportPathsType: ReportPathsType.rhel, @@ -34,7 +33,7 @@ export const cpuUsageWidget: RhelCostOverviewWidget = { type: CostOverviewWidgetType.cpuUsage, }; -export const memoryUsageWidget: RhelCostOverviewWidget = { +export const memoryUsageWidget: CostOverviewWidget = { chartName: 'rhelMemoryWidget', id: getId(), reportPathsType: ReportPathsType.rhel, @@ -42,7 +41,7 @@ export const memoryUsageWidget: RhelCostOverviewWidget = { type: CostOverviewWidgetType.memoryUsage, }; -export const projectSummaryWidget: RhelCostOverviewWidget = { +export const projectSummaryWidget: CostOverviewWidget = { id: getId(), reportSummary: { reportGroupBy: 'project', @@ -55,7 +54,7 @@ export const projectSummaryWidget: RhelCostOverviewWidget = { type: CostOverviewWidgetType.reportSummary, }; -export const volumeUsageWidget: RhelCostOverviewWidget = { +export const volumeUsageWidget: CostOverviewWidget = { chartName: 'rhelVolumeWidget', id: getId(), reportPathsType: ReportPathsType.rhel, diff --git a/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataCommon.ts b/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataCommon.ts index 3a8a93d7d..ac5e547f0 100644 --- a/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataCommon.ts +++ b/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataCommon.ts @@ -1,6 +1 @@ -import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; - export const awsHistoricalDataStateKey = 'awsHistoricalData'; - -// tslint:disable-next-line:no-empty-interface -export interface AwsHistoricalDataWidget extends HistoricalDataWidget {} diff --git a/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataReducer.ts b/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataReducer.ts index 3b8b0d4d3..3303a0cc2 100644 --- a/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataReducer.ts +++ b/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataReducer.ts @@ -1,8 +1,9 @@ -import type { AwsHistoricalDataWidget } from './awsHistoricalDataCommon'; +import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; + import { computeUsageWidget, costWidget, storageUsageWidget } from './awsHistoricalDataWidgets'; export type AwsHistoricalDataState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataWidgets.ts b/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataWidgets.ts index d83028dff..a489c6306 100644 --- a/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataWidgets.ts +++ b/src/store/breakdown/historicalData/awsHistoricalData/awsHistoricalDataWidgets.ts @@ -1,12 +1,13 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; -import { HistoricalDataWidgetType } from 'store/breakdown/historicalData/common/historicalDataCommon'; - -import type { AwsHistoricalDataWidget } from './awsHistoricalDataCommon'; +import { + type HistoricalDataWidget, + HistoricalDataWidgetType, +} from 'store/breakdown/historicalData/common/historicalDataCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costWidget: AwsHistoricalDataWidget = { +export const costWidget: HistoricalDataWidget = { chartName: 'awsCostChart', id: getId(), reportPathsType: ReportPathsType.aws, @@ -14,7 +15,7 @@ export const costWidget: AwsHistoricalDataWidget = { type: HistoricalDataWidgetType.trend, }; -export const computeUsageWidget: AwsHistoricalDataWidget = { +export const computeUsageWidget: HistoricalDataWidget = { chartName: 'awsComputeChart', id: getId(), reportPathsType: ReportPathsType.aws, @@ -22,7 +23,7 @@ export const computeUsageWidget: AwsHistoricalDataWidget = { type: HistoricalDataWidgetType.usage, }; -export const storageUsageWidget: AwsHistoricalDataWidget = { +export const storageUsageWidget: HistoricalDataWidget = { chartName: 'awsStorageChart', id: getId(), reportPathsType: ReportPathsType.aws, diff --git a/src/store/breakdown/historicalData/awsHistoricalData/index.ts b/src/store/breakdown/historicalData/awsHistoricalData/index.ts index da12b0b7b..ccadb7a4f 100644 --- a/src/store/breakdown/historicalData/awsHistoricalData/index.ts +++ b/src/store/breakdown/historicalData/awsHistoricalData/index.ts @@ -1,7 +1,5 @@ -import type { AwsHistoricalDataWidget } from './awsHistoricalDataCommon'; import { awsHistoricalDataStateKey } from './awsHistoricalDataCommon'; import { awsHistoricalDataReducer } from './awsHistoricalDataReducer'; import * as awsHistoricalDataSelectors from './awsHistoricalDataSelectors'; -export type { AwsHistoricalDataWidget }; export { awsHistoricalDataStateKey, awsHistoricalDataReducer, awsHistoricalDataSelectors }; diff --git a/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataCommon.ts b/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataCommon.ts index 90b3b13ea..bfd907bfe 100644 --- a/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataCommon.ts +++ b/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataCommon.ts @@ -1,6 +1 @@ -import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; - export const azureHistoricalDataStateKey = 'azureHistoricalData'; - -// tslint:disable-next-line:no-empty-interface -export interface AzureHistoricalDataWidget extends HistoricalDataWidget {} diff --git a/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataReducer.ts b/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataReducer.ts index 292e23ac8..646023512 100644 --- a/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataReducer.ts +++ b/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataReducer.ts @@ -1,8 +1,9 @@ -import type { AzureHistoricalDataWidget } from './azureHistoricalDataCommon'; +import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; + import { computeUsageWidget, costWidget, storageUsageWidget } from './azureHistoricalDataWidgets'; export type AzureHistoricalDataState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataWidgets.ts b/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataWidgets.ts index e504be7ac..3da16b8d8 100644 --- a/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataWidgets.ts +++ b/src/store/breakdown/historicalData/azureHistoricalData/azureHistoricalDataWidgets.ts @@ -1,12 +1,13 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; -import { HistoricalDataWidgetType } from 'store/breakdown/historicalData/common/historicalDataCommon'; - -import type { AzureHistoricalDataWidget } from './azureHistoricalDataCommon'; +import { + type HistoricalDataWidget, + HistoricalDataWidgetType, +} from 'store/breakdown/historicalData/common/historicalDataCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costWidget: AzureHistoricalDataWidget = { +export const costWidget: HistoricalDataWidget = { chartName: 'azureCostChart', id: getId(), reportPathsType: ReportPathsType.azure, @@ -14,7 +15,7 @@ export const costWidget: AzureHistoricalDataWidget = { type: HistoricalDataWidgetType.trend, }; -export const computeUsageWidget: AzureHistoricalDataWidget = { +export const computeUsageWidget: HistoricalDataWidget = { chartName: 'azureComputeChart', id: getId(), reportPathsType: ReportPathsType.azure, @@ -22,7 +23,7 @@ export const computeUsageWidget: AzureHistoricalDataWidget = { type: HistoricalDataWidgetType.usage, }; -export const storageUsageWidget: AzureHistoricalDataWidget = { +export const storageUsageWidget: HistoricalDataWidget = { chartName: 'azureStorageChart', id: getId(), reportPathsType: ReportPathsType.azure, diff --git a/src/store/breakdown/historicalData/azureHistoricalData/index.ts b/src/store/breakdown/historicalData/azureHistoricalData/index.ts index aa69ec44d..15f5c1f7c 100644 --- a/src/store/breakdown/historicalData/azureHistoricalData/index.ts +++ b/src/store/breakdown/historicalData/azureHistoricalData/index.ts @@ -1,7 +1,5 @@ -import type { AzureHistoricalDataWidget } from './azureHistoricalDataCommon'; import { azureHistoricalDataStateKey } from './azureHistoricalDataCommon'; import { azureHistoricalDataReducer } from './azureHistoricalDataReducer'; import * as azureHistoricalDataSelectors from './azureHistoricalDataSelectors'; -export type { AzureHistoricalDataWidget }; export { azureHistoricalDataStateKey, azureHistoricalDataReducer, azureHistoricalDataSelectors }; diff --git a/src/store/breakdown/historicalData/common/historicalDataCommon.ts b/src/store/breakdown/historicalData/common/historicalDataCommon.ts index 81976df17..cc5b51c4d 100644 --- a/src/store/breakdown/historicalData/common/historicalDataCommon.ts +++ b/src/store/breakdown/historicalData/common/historicalDataCommon.ts @@ -1,6 +1,5 @@ import type { ReportPathsType, ReportType } from 'api/reports/report'; -// eslint-disable-next-line no-shadow export const enum HistoricalDataWidgetType { cost = 'cost', // This type displays historical cost chart network = 'network', // This type displays historical network chart diff --git a/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataCommon.ts b/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataCommon.ts index 0d2784739..1f6459725 100644 --- a/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataCommon.ts +++ b/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataCommon.ts @@ -1,6 +1 @@ -import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; - export const gcpHistoricalDataStateKey = 'gcpHistoricalData'; - -// tslint:disable-next-line:no-empty-interface -export interface GcpHistoricalDataWidget extends HistoricalDataWidget {} diff --git a/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataReducer.ts b/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataReducer.ts index 254786d92..261ea4127 100644 --- a/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataReducer.ts +++ b/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataReducer.ts @@ -1,8 +1,9 @@ -import type { GcpHistoricalDataWidget } from './gcpHistoricalDataCommon'; +import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; + import { computeUsageWidget, costWidget, storageUsageWidget } from './gcpHistoricalDataWidgets'; export type GcpHistoricalDataState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataWidgets.ts b/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataWidgets.ts index 3acb5b8bb..97a68dc81 100644 --- a/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataWidgets.ts +++ b/src/store/breakdown/historicalData/gcpHistoricalData/gcpHistoricalDataWidgets.ts @@ -1,12 +1,13 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; -import { HistoricalDataWidgetType } from 'store/breakdown/historicalData/common/historicalDataCommon'; - -import type { GcpHistoricalDataWidget } from './gcpHistoricalDataCommon'; +import { + type HistoricalDataWidget, + HistoricalDataWidgetType, +} from 'store/breakdown/historicalData/common/historicalDataCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costWidget: GcpHistoricalDataWidget = { +export const costWidget: HistoricalDataWidget = { chartName: 'gcpCostChart', id: getId(), reportPathsType: ReportPathsType.gcp, @@ -14,7 +15,7 @@ export const costWidget: GcpHistoricalDataWidget = { type: HistoricalDataWidgetType.trend, }; -export const computeUsageWidget: GcpHistoricalDataWidget = { +export const computeUsageWidget: HistoricalDataWidget = { chartName: 'gcpComputeChart', id: getId(), reportPathsType: ReportPathsType.gcp, @@ -22,7 +23,7 @@ export const computeUsageWidget: GcpHistoricalDataWidget = { type: HistoricalDataWidgetType.trend, }; -export const storageUsageWidget: GcpHistoricalDataWidget = { +export const storageUsageWidget: HistoricalDataWidget = { chartName: 'gcpStorageChart', id: getId(), reportPathsType: ReportPathsType.gcp, diff --git a/src/store/breakdown/historicalData/gcpHistoricalData/index.ts b/src/store/breakdown/historicalData/gcpHistoricalData/index.ts index 8cea1aef7..329135d07 100644 --- a/src/store/breakdown/historicalData/gcpHistoricalData/index.ts +++ b/src/store/breakdown/historicalData/gcpHistoricalData/index.ts @@ -1,7 +1,5 @@ -import type { GcpHistoricalDataWidget } from './gcpHistoricalDataCommon'; import { gcpHistoricalDataStateKey } from './gcpHistoricalDataCommon'; import { gcpHistoricalDataReducer } from './gcpHistoricalDataReducer'; import * as gcpHistoricalDataSelectors from './gcpHistoricalDataSelectors'; -export type { GcpHistoricalDataWidget }; export { gcpHistoricalDataStateKey, gcpHistoricalDataReducer, gcpHistoricalDataSelectors }; diff --git a/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataCommon.ts b/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataCommon.ts index 183447855..e0dc2ac6e 100644 --- a/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataCommon.ts +++ b/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataCommon.ts @@ -1,6 +1 @@ -import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; - export const ibmHistoricalDataStateKey = 'ibmHistoricalData'; - -// tslint:disable-next-line:no-empty-interface -export interface IbmHistoricalDataWidget extends HistoricalDataWidget {} diff --git a/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataReducer.ts b/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataReducer.ts index e14c386cb..d7288d066 100644 --- a/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataReducer.ts +++ b/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataReducer.ts @@ -1,8 +1,9 @@ -import type { IbmHistoricalDataWidget } from './ibmHistoricalDataCommon'; +import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; + import { computeUsageWidget, costWidget, storageUsageWidget } from './ibmHistoricalDataWidgets'; export type IbmHistoricalDataState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataWidgets.ts b/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataWidgets.ts index 32c675315..5c7ec3fbe 100644 --- a/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataWidgets.ts +++ b/src/store/breakdown/historicalData/ibmHistoricalData/ibmHistoricalDataWidgets.ts @@ -1,12 +1,13 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; -import { HistoricalDataWidgetType } from 'store/breakdown/historicalData/common/historicalDataCommon'; - -import type { IbmHistoricalDataWidget } from './ibmHistoricalDataCommon'; +import { + type HistoricalDataWidget, + HistoricalDataWidgetType, +} from 'store/breakdown/historicalData/common/historicalDataCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costWidget: IbmHistoricalDataWidget = { +export const costWidget: HistoricalDataWidget = { chartName: 'ibmCostChart', id: getId(), reportPathsType: ReportPathsType.ibm, @@ -14,7 +15,7 @@ export const costWidget: IbmHistoricalDataWidget = { type: HistoricalDataWidgetType.trend, }; -export const computeUsageWidget: IbmHistoricalDataWidget = { +export const computeUsageWidget: HistoricalDataWidget = { chartName: 'ibmComputeChart', id: getId(), reportPathsType: ReportPathsType.ibm, @@ -22,7 +23,7 @@ export const computeUsageWidget: IbmHistoricalDataWidget = { type: HistoricalDataWidgetType.trend, }; -export const storageUsageWidget: IbmHistoricalDataWidget = { +export const storageUsageWidget: HistoricalDataWidget = { chartName: 'ibmStorageChart', id: getId(), reportPathsType: ReportPathsType.ibm, diff --git a/src/store/breakdown/historicalData/ibmHistoricalData/index.ts b/src/store/breakdown/historicalData/ibmHistoricalData/index.ts index a46f65a3e..ad862fcca 100644 --- a/src/store/breakdown/historicalData/ibmHistoricalData/index.ts +++ b/src/store/breakdown/historicalData/ibmHistoricalData/index.ts @@ -1,7 +1,5 @@ -import type { IbmHistoricalDataWidget } from './ibmHistoricalDataCommon'; import { ibmHistoricalDataStateKey } from './ibmHistoricalDataCommon'; import { ibmHistoricalDataReducer } from './ibmHistoricalDataReducer'; import * as ibmHistoricalDataSelectors from './ibmHistoricalDataSelectors'; -export type { IbmHistoricalDataWidget }; export { ibmHistoricalDataStateKey, ibmHistoricalDataReducer, ibmHistoricalDataSelectors }; diff --git a/src/store/breakdown/historicalData/ociHistoricalData/index.ts b/src/store/breakdown/historicalData/ociHistoricalData/index.ts index 308cb468d..5edb37e62 100644 --- a/src/store/breakdown/historicalData/ociHistoricalData/index.ts +++ b/src/store/breakdown/historicalData/ociHistoricalData/index.ts @@ -1,7 +1,5 @@ -import type { OciHistoricalDataWidget } from './ociHistoricalDataCommon'; import { ociHistoricalDataStateKey } from './ociHistoricalDataCommon'; import { ociHistoricalDataReducer } from './ociHistoricalDataReducer'; import * as ociHistoricalDataSelectors from './ociHistoricalDataSelectors'; -export type { OciHistoricalDataWidget }; export { ociHistoricalDataStateKey, ociHistoricalDataReducer, ociHistoricalDataSelectors }; diff --git a/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataCommon.ts b/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataCommon.ts index dc5d107ab..691d23ea5 100644 --- a/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataCommon.ts +++ b/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataCommon.ts @@ -1,6 +1 @@ -import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; - export const ociHistoricalDataStateKey = 'ociHistoricalData'; - -// tslint:disable-next-line:no-empty-interface -export interface OciHistoricalDataWidget extends HistoricalDataWidget {} diff --git a/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataReducer.ts b/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataReducer.ts index 334ba202b..30690f7ad 100644 --- a/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataReducer.ts +++ b/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataReducer.ts @@ -1,8 +1,9 @@ -import type { OciHistoricalDataWidget } from './ociHistoricalDataCommon'; +import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; + import { computeUsageWidget, costWidget, storageUsageWidget } from './ociHistoricalDataWidgets'; export type OciHistoricalDataState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataWidgets.ts b/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataWidgets.ts index 873fd7cad..30cbc837e 100644 --- a/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataWidgets.ts +++ b/src/store/breakdown/historicalData/ociHistoricalData/ociHistoricalDataWidgets.ts @@ -1,12 +1,13 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; -import { HistoricalDataWidgetType } from 'store/breakdown/historicalData/common/historicalDataCommon'; - -import type { OciHistoricalDataWidget } from './ociHistoricalDataCommon'; +import { + type HistoricalDataWidget, + HistoricalDataWidgetType, +} from 'store/breakdown/historicalData/common/historicalDataCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costWidget: OciHistoricalDataWidget = { +export const costWidget: HistoricalDataWidget = { chartName: 'ociCostChart', id: getId(), reportPathsType: ReportPathsType.oci, @@ -14,7 +15,7 @@ export const costWidget: OciHistoricalDataWidget = { type: HistoricalDataWidgetType.trend, }; -export const computeUsageWidget: OciHistoricalDataWidget = { +export const computeUsageWidget: HistoricalDataWidget = { chartName: 'ociComputeChart', id: getId(), reportPathsType: ReportPathsType.oci, @@ -22,7 +23,7 @@ export const computeUsageWidget: OciHistoricalDataWidget = { type: HistoricalDataWidgetType.usage, }; -export const storageUsageWidget: OciHistoricalDataWidget = { +export const storageUsageWidget: HistoricalDataWidget = { chartName: 'ociStorageChart', id: getId(), reportPathsType: ReportPathsType.oci, diff --git a/src/store/breakdown/historicalData/ocpHistoricalData/index.ts b/src/store/breakdown/historicalData/ocpHistoricalData/index.ts index 45e503c83..4849bc4b3 100644 --- a/src/store/breakdown/historicalData/ocpHistoricalData/index.ts +++ b/src/store/breakdown/historicalData/ocpHistoricalData/index.ts @@ -1,7 +1,5 @@ -import type { OcpHistoricalDataWidget } from './ocpHistoricalDataCommon'; import { ocpHistoricalDataStateKey } from './ocpHistoricalDataCommon'; import { ocpHistoricalDataReducer } from './ocpHistoricalDataReducer'; import * as ocpHistoricalDataSelectors from './ocpHistoricalDataSelectors'; -export type { OcpHistoricalDataWidget }; export { ocpHistoricalDataReducer, ocpHistoricalDataStateKey, ocpHistoricalDataSelectors }; diff --git a/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataCommon.ts b/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataCommon.ts index 64628d17a..cd5103fb6 100644 --- a/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataCommon.ts +++ b/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataCommon.ts @@ -1,6 +1 @@ -import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; - export const ocpHistoricalDataStateKey = 'ocpHistoricalData'; - -// tslint:disable-next-line:no-empty-interface -export interface OcpHistoricalDataWidget extends HistoricalDataWidget {} diff --git a/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataReducer.ts b/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataReducer.ts index a6e572cfa..67b76dc8e 100644 --- a/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataReducer.ts +++ b/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataReducer.ts @@ -1,4 +1,5 @@ -import type { OcpHistoricalDataWidget } from './ocpHistoricalDataCommon'; +import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; + import { costWidget, cpuUsageWidget, @@ -8,7 +9,7 @@ import { } from './ocpHistoricalDataWidgets'; export type OcpHistoricalDataState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataWidgets.ts b/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataWidgets.ts index 38c960c26..de9fb3b48 100644 --- a/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataWidgets.ts +++ b/src/store/breakdown/historicalData/ocpHistoricalData/ocpHistoricalDataWidgets.ts @@ -1,12 +1,13 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; -import { HistoricalDataWidgetType } from 'store/breakdown/historicalData/common/historicalDataCommon'; - -import type { OcpHistoricalDataWidget } from './ocpHistoricalDataCommon'; +import { + type HistoricalDataWidget, + HistoricalDataWidgetType, +} from 'store/breakdown/historicalData/common/historicalDataCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costWidget: OcpHistoricalDataWidget = { +export const costWidget: HistoricalDataWidget = { chartName: 'ocpCostChart', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -14,7 +15,7 @@ export const costWidget: OcpHistoricalDataWidget = { type: HistoricalDataWidgetType.cost, }; -export const cpuUsageWidget: OcpHistoricalDataWidget = { +export const cpuUsageWidget: HistoricalDataWidget = { chartName: 'ocpCpuChart', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -22,7 +23,7 @@ export const cpuUsageWidget: OcpHistoricalDataWidget = { type: HistoricalDataWidgetType.usage, }; -export const memoryUsageWidget: OcpHistoricalDataWidget = { +export const memoryUsageWidget: HistoricalDataWidget = { chartName: 'ocpMemoryChart', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -30,7 +31,7 @@ export const memoryUsageWidget: OcpHistoricalDataWidget = { type: HistoricalDataWidgetType.usage, }; -export const networkUsageWidget: OcpHistoricalDataWidget = { +export const networkUsageWidget: HistoricalDataWidget = { chartName: 'ocpNetworkChart', id: getId(), reportPathsType: ReportPathsType.ocp, @@ -39,7 +40,7 @@ export const networkUsageWidget: OcpHistoricalDataWidget = { type: HistoricalDataWidgetType.network, }; -export const volumeUsageWidget: OcpHistoricalDataWidget = { +export const volumeUsageWidget: HistoricalDataWidget = { chartName: 'ocpVolumeChart', id: getId(), reportPathsType: ReportPathsType.ocp, diff --git a/src/store/breakdown/historicalData/rhelHistoricalData/index.ts b/src/store/breakdown/historicalData/rhelHistoricalData/index.ts index 1561d13e0..b5b7d0a2e 100644 --- a/src/store/breakdown/historicalData/rhelHistoricalData/index.ts +++ b/src/store/breakdown/historicalData/rhelHistoricalData/index.ts @@ -1,7 +1,5 @@ -import type { RhelHistoricalDataWidget } from './rhelHistoricalDataCommon'; import { rhelHistoricalDataStateKey } from './rhelHistoricalDataCommon'; import { rhelHistoricalDataReducer } from './rhelHistoricalDataReducer'; import * as rhelHistoricalDataSelectors from './rhelHistoricalDataSelectors'; -export type { RhelHistoricalDataWidget }; export { rhelHistoricalDataReducer, rhelHistoricalDataStateKey, rhelHistoricalDataSelectors }; diff --git a/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataCommon.ts b/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataCommon.ts index 8b904ea31..40b26d007 100644 --- a/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataCommon.ts +++ b/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataCommon.ts @@ -1,6 +1 @@ -import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; - export const rhelHistoricalDataStateKey = 'rhelHistoricalData'; - -// tslint:disable-next-line:no-empty-interface -export interface RhelHistoricalDataWidget extends HistoricalDataWidget {} diff --git a/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataReducer.ts b/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataReducer.ts index e8b29e627..ee954d481 100644 --- a/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataReducer.ts +++ b/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataReducer.ts @@ -1,8 +1,9 @@ -import type { RhelHistoricalDataWidget } from './rhelHistoricalDataCommon'; +import type { HistoricalDataWidget } from 'store/breakdown/historicalData/common/historicalDataCommon'; + import { costWidget, cpuUsageWidget, memoryUsageWidget } from './rhelHistoricalDataWidgets'; export type RhelHistoricalDataState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataWidgets.ts b/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataWidgets.ts index 723096734..514734eb1 100644 --- a/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataWidgets.ts +++ b/src/store/breakdown/historicalData/rhelHistoricalData/rhelHistoricalDataWidgets.ts @@ -1,12 +1,13 @@ import { ReportPathsType, ReportType } from 'api/reports/report'; -import { HistoricalDataWidgetType } from 'store/breakdown/historicalData/common/historicalDataCommon'; - -import type { RhelHistoricalDataWidget } from './rhelHistoricalDataCommon'; +import { + type HistoricalDataWidget, + HistoricalDataWidgetType, +} from 'store/breakdown/historicalData/common/historicalDataCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costWidget: RhelHistoricalDataWidget = { +export const costWidget: HistoricalDataWidget = { chartName: 'rhelCostChart', id: getId(), reportPathsType: ReportPathsType.rhel, @@ -14,7 +15,7 @@ export const costWidget: RhelHistoricalDataWidget = { type: HistoricalDataWidgetType.cost, }; -export const cpuUsageWidget: RhelHistoricalDataWidget = { +export const cpuUsageWidget: HistoricalDataWidget = { chartName: 'rhelCpuChart', id: getId(), reportPathsType: ReportPathsType.rhel, @@ -22,7 +23,7 @@ export const cpuUsageWidget: RhelHistoricalDataWidget = { type: HistoricalDataWidgetType.usage, }; -export const memoryUsageWidget: RhelHistoricalDataWidget = { +export const memoryUsageWidget: HistoricalDataWidget = { chartName: 'rhelMemoryChart', id: getId(), reportPathsType: ReportPathsType.rhel, diff --git a/src/store/common.ts b/src/store/common.ts index 781c32a02..d85767173 100644 --- a/src/store/common.ts +++ b/src/store/common.ts @@ -6,7 +6,6 @@ import type { RootState } from './rootReducer'; export const expirationMS = 30 * 60 * 1000; // 30 minutes -// eslint-disable-next-line no-shadow export const enum FetchStatus { 'none', 'inProgress', diff --git a/src/store/dashboard/awsDashboard/awsDashboardCommon.ts b/src/store/dashboard/awsDashboard/awsDashboardCommon.ts index 5725983bc..ebfa26121 100644 --- a/src/store/dashboard/awsDashboard/awsDashboardCommon.ts +++ b/src/store/dashboard/awsDashboard/awsDashboardCommon.ts @@ -13,18 +13,13 @@ export const awsDashboardTabFilters: AwsFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum AwsDashboardTab { services = 'services', accounts = 'accounts', regions = 'regions', } -export interface AwsDashboardWidget extends DashboardWidget { - // TBD... -} - -export function getGroupByForTab(widget: AwsDashboardWidget): AwsQuery['group_by'] { +export function getGroupByForTab(widget: DashboardWidget): AwsQuery['group_by'] { switch (widget.currentTab) { case AwsDashboardTab.services: // Use group_by for service tab and filter for others -- https://github.com/project-koku/koku-ui/issues/846 @@ -40,7 +35,7 @@ export function getGroupByForTab(widget: AwsDashboardWidget): AwsQuery['group_by } } -export function getQueryForWidget(widget: AwsDashboardWidget, filter: AwsFilters = awsDashboardDefaultFilters, props?) { +export function getQueryForWidget(widget: DashboardWidget, filter: AwsFilters = awsDashboardDefaultFilters, props?) { const query: AwsQuery = { filter, ...(props ? props : {}), @@ -49,7 +44,7 @@ export function getQueryForWidget(widget: AwsDashboardWidget, filter: AwsFilters } export function getQueryForWidgetTabs( - widget: AwsDashboardWidget, + widget: DashboardWidget, filter: AwsFilters = awsDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/awsDashboard/awsDashboardReducer.ts b/src/store/dashboard/awsDashboard/awsDashboardReducer.ts index d7dfee195..42fcbbdc4 100644 --- a/src/store/dashboard/awsDashboard/awsDashboardReducer.ts +++ b/src/store/dashboard/awsDashboard/awsDashboardReducer.ts @@ -1,14 +1,14 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './awsDashboardActions'; -import type { AwsDashboardWidget } from './awsDashboardCommon'; import { computeWidget, costSummaryWidget, databaseWidget, networkWidget, storageWidget } from './awsDashboardWidgets'; export type AwsDashboardAction = ActionType; export type AwsDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/awsDashboard/awsDashboardWidgets.ts b/src/store/dashboard/awsDashboard/awsDashboardWidgets.ts index 76420900c..f98789b5b 100644 --- a/src/store/dashboard/awsDashboard/awsDashboardWidgets.ts +++ b/src/store/dashboard/awsDashboard/awsDashboardWidgets.ts @@ -8,17 +8,16 @@ import { DatumType, } from 'routes/components/charts/common/chartDatum'; import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; -import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; +import { DashboardChartType, type DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { formatCurrency, formatUnits } from 'utils/format'; import { formatPath } from 'utils/paths'; -import type { AwsDashboardWidget } from './awsDashboardCommon'; import { AwsDashboardTab } from './awsDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const computeWidget: AwsDashboardWidget = { +export const computeWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'awsComputeChart', chartType: DashboardChartType.trend, @@ -47,7 +46,7 @@ export const computeWidget: AwsDashboardWidget = { }, }; -export const costSummaryWidget: AwsDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [AwsDashboardTab.services, AwsDashboardTab.accounts, AwsDashboardTab.regions], chartFormatter: formatCurrency, chartName: 'awsCostChart', @@ -77,7 +76,7 @@ export const costSummaryWidget: AwsDashboardWidget = { }, }; -export const databaseWidget: AwsDashboardWidget = { +export const databaseWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'awsDatabaseChart', chartType: DashboardChartType.trend, @@ -103,7 +102,7 @@ export const databaseWidget: AwsDashboardWidget = { }, }; -export const networkWidget: AwsDashboardWidget = { +export const networkWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'awsNetworkChart', chartType: DashboardChartType.trend, @@ -129,7 +128,7 @@ export const networkWidget: AwsDashboardWidget = { }, }; -export const storageWidget: AwsDashboardWidget = { +export const storageWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'awsStorageChart', chartType: DashboardChartType.trend, diff --git a/src/store/dashboard/awsDashboard/index.ts b/src/store/dashboard/awsDashboard/index.ts index 29b40d734..b71beef17 100644 --- a/src/store/dashboard/awsDashboard/index.ts +++ b/src/store/dashboard/awsDashboard/index.ts @@ -1,11 +1,9 @@ import * as awsDashboardActions from './awsDashboardActions'; -import type { AwsDashboardWidget } from './awsDashboardCommon'; import { awsDashboardStateKey, AwsDashboardTab } from './awsDashboardCommon'; import { awsDashboardReducer } from './awsDashboardReducer'; import * as awsDashboardSelectors from './awsDashboardSelectors'; import * as awsDashboardWidgets from './awsDashboardWidgets'; -export type { AwsDashboardWidget }; export { awsDashboardStateKey, awsDashboardReducer, diff --git a/src/store/dashboard/awsOcpDashboard/awsOcpDashboardCommon.ts b/src/store/dashboard/awsOcpDashboard/awsOcpDashboardCommon.ts index 4ed6be90b..9940da165 100644 --- a/src/store/dashboard/awsOcpDashboard/awsOcpDashboardCommon.ts +++ b/src/store/dashboard/awsOcpDashboard/awsOcpDashboardCommon.ts @@ -13,18 +13,13 @@ export const awsOcpDashboardTabFilters: AwsFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum AwsOcpDashboardTab { services = 'services', accounts = 'accounts', regions = 'regions', } -export interface AwsOcpDashboardWidget extends DashboardWidget { - // TBD... -} - -export function getGroupByForTab(widget: AwsOcpDashboardWidget): AwsQuery['group_by'] { +export function getGroupByForTab(widget: DashboardWidget): AwsQuery['group_by'] { switch (widget.currentTab) { case AwsOcpDashboardTab.services: // Use group_by for service tab and filter for others -- https://github.com/project-koku/koku-ui/issues/846 @@ -40,11 +35,7 @@ export function getGroupByForTab(widget: AwsOcpDashboardWidget): AwsQuery['group } } -export function getQueryForWidget( - widget: AwsOcpDashboardWidget, - filter: AwsFilters = awsOcpDashboardDefaultFilters, - props? -) { +export function getQueryForWidget(widget: DashboardWidget, filter: AwsFilters = awsOcpDashboardDefaultFilters, props?) { const query: AwsQuery = { filter, ...(props ? props : {}), @@ -53,7 +44,7 @@ export function getQueryForWidget( } export function getQueryForWidgetTabs( - widget: AwsOcpDashboardWidget, + widget: DashboardWidget, filter: AwsFilters = awsOcpDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/awsOcpDashboard/awsOcpDashboardReducer.ts b/src/store/dashboard/awsOcpDashboard/awsOcpDashboardReducer.ts index 04f641028..39eeeb88c 100644 --- a/src/store/dashboard/awsOcpDashboard/awsOcpDashboardReducer.ts +++ b/src/store/dashboard/awsOcpDashboard/awsOcpDashboardReducer.ts @@ -1,8 +1,8 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './awsOcpDashboardActions'; -import type { AwsOcpDashboardWidget } from './awsOcpDashboardCommon'; import { computeWidget, costSummaryWidget, @@ -14,7 +14,7 @@ import { export type AwsOcpDashboardAction = ActionType; export type AwsOcpDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/awsOcpDashboard/awsOcpDashboardWidgets.ts b/src/store/dashboard/awsOcpDashboard/awsOcpDashboardWidgets.ts index cb1ed6ccc..2535e5352 100644 --- a/src/store/dashboard/awsOcpDashboard/awsOcpDashboardWidgets.ts +++ b/src/store/dashboard/awsOcpDashboard/awsOcpDashboardWidgets.ts @@ -8,16 +8,15 @@ import { } from 'routes/components/charts/common/chartDatum'; import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; import { awsDashboardWidgets } from 'store/dashboard/awsDashboard'; -import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; +import { DashboardChartType, type DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { formatCurrency, formatUnits } from 'utils/format'; -import type { AwsOcpDashboardWidget } from './awsOcpDashboardCommon'; import { AwsOcpDashboardTab } from './awsOcpDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const computeWidget: AwsOcpDashboardWidget = { +export const computeWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'awsOcpComputeChart', chartType: DashboardChartType.trend, @@ -46,7 +45,7 @@ export const computeWidget: AwsOcpDashboardWidget = { }, }; -export const costSummaryWidget: AwsOcpDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [AwsOcpDashboardTab.services, AwsOcpDashboardTab.accounts, AwsOcpDashboardTab.regions], chartFormatter: formatCurrency, chartName: 'awsOcpCostChart', @@ -75,7 +74,7 @@ export const costSummaryWidget: AwsOcpDashboardWidget = { }, }; -export const databaseWidget: AwsOcpDashboardWidget = { +export const databaseWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'awsOcpDatabaseChart', chartType: DashboardChartType.trend, @@ -101,7 +100,7 @@ export const databaseWidget: AwsOcpDashboardWidget = { }, }; -export const networkWidget: AwsOcpDashboardWidget = { +export const networkWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'awsOcpNetworkChart', chartType: DashboardChartType.trend, @@ -127,7 +126,7 @@ export const networkWidget: AwsOcpDashboardWidget = { }, }; -export const storageWidget: AwsOcpDashboardWidget = { +export const storageWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'awsOcpStorageChart', chartType: DashboardChartType.trend, diff --git a/src/store/dashboard/awsOcpDashboard/index.ts b/src/store/dashboard/awsOcpDashboard/index.ts index bdc6ec224..970771199 100644 --- a/src/store/dashboard/awsOcpDashboard/index.ts +++ b/src/store/dashboard/awsOcpDashboard/index.ts @@ -1,10 +1,8 @@ import * as awsOcpDashboardActions from './awsOcpDashboardActions'; -import type { AwsOcpDashboardWidget } from './awsOcpDashboardCommon'; import { awsOcpDashboardStateKey, AwsOcpDashboardTab } from './awsOcpDashboardCommon'; import { awsOcpDashboardReducer } from './awsOcpDashboardReducer'; import * as awsOcpDashboardSelectors from './awsOcpDashboardSelectors'; -export type { AwsOcpDashboardWidget }; export { awsOcpDashboardStateKey, awsOcpDashboardReducer, diff --git a/src/store/dashboard/azureDashboard/azureDashboardCommon.ts b/src/store/dashboard/azureDashboard/azureDashboardCommon.ts index 55cfa8897..d42568d1f 100644 --- a/src/store/dashboard/azureDashboard/azureDashboardCommon.ts +++ b/src/store/dashboard/azureDashboard/azureDashboardCommon.ts @@ -13,16 +13,13 @@ export const azureDashboardTabFilters: AzureFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum AzureDashboardTab { service_names = 'service_names', subscription_guids = 'subscription_guids', resource_locations = 'resource_locations', } -export interface AzureDashboardWidget extends DashboardWidget {} - -export function getGroupByForTab(widget: AzureDashboardWidget): AzureQuery['group_by'] { +export function getGroupByForTab(widget: DashboardWidget): AzureQuery['group_by'] { switch (widget.currentTab) { case AzureDashboardTab.service_names: // Use group_by for service tab and filter for others -- https://github.com/project-koku/koku-ui/issues/846 @@ -47,7 +44,7 @@ export function getQueryForWidget(filter: AzureFilters = azureDashboardDefaultFi } export function getQueryForWidgetTabs( - widget: AzureDashboardWidget, + widget: DashboardWidget, filter: AzureFilters = azureDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/azureDashboard/azureDashboardReducer.ts b/src/store/dashboard/azureDashboard/azureDashboardReducer.ts index e777922e5..50421f179 100644 --- a/src/store/dashboard/azureDashboard/azureDashboardReducer.ts +++ b/src/store/dashboard/azureDashboard/azureDashboardReducer.ts @@ -1,8 +1,8 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './azureDashboardActions'; -import type { AzureDashboardWidget } from './azureDashboardCommon'; import { costSummaryWidget, databaseWidget, @@ -14,7 +14,7 @@ import { export type AzureDashboardAction = ActionType; export type AzureDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/azureDashboard/azureDashboardWidgets.ts b/src/store/dashboard/azureDashboard/azureDashboardWidgets.ts index abde9958d..74ccc1cbd 100644 --- a/src/store/dashboard/azureDashboard/azureDashboardWidgets.ts +++ b/src/store/dashboard/azureDashboard/azureDashboardWidgets.ts @@ -8,17 +8,16 @@ import { DatumType, } from 'routes/components/charts/common/chartDatum'; import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; -import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; +import { DashboardChartType, type DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { formatUnits } from 'utils/format'; import { formatPath } from 'utils/paths'; -import type { AzureDashboardWidget } from './azureDashboardCommon'; import { AzureDashboardTab } from './azureDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costSummaryWidget: AzureDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [ AzureDashboardTab.service_names, AzureDashboardTab.subscription_guids, @@ -51,7 +50,7 @@ export const costSummaryWidget: AzureDashboardWidget = { }, }; -export const databaseWidget: AzureDashboardWidget = { +export const databaseWidget: DashboardWidget = { chartName: 'azureDatabaseChart', chartType: DashboardChartType.trend, id: getId(), @@ -76,7 +75,7 @@ export const databaseWidget: AzureDashboardWidget = { }, }; -export const networkWidget: AzureDashboardWidget = { +export const networkWidget: DashboardWidget = { chartName: 'azureNetworkChart', chartType: DashboardChartType.trend, id: getId(), @@ -101,7 +100,7 @@ export const networkWidget: AzureDashboardWidget = { }, }; -export const storageWidget: AzureDashboardWidget = { +export const storageWidget: DashboardWidget = { chartName: 'azureStorageChart', chartType: DashboardChartType.trend, id: getId(), @@ -123,7 +122,7 @@ export const storageWidget: AzureDashboardWidget = { }, }; -export const virtualMachineWidget: AzureDashboardWidget = { +export const virtualMachineWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'azureComputeChart', chartType: DashboardChartType.trend, diff --git a/src/store/dashboard/azureDashboard/index.ts b/src/store/dashboard/azureDashboard/index.ts index 4e7db14b7..2476780d5 100644 --- a/src/store/dashboard/azureDashboard/index.ts +++ b/src/store/dashboard/azureDashboard/index.ts @@ -1,11 +1,9 @@ import * as azureDashboardActions from './azureDashboardActions'; -import type { AzureDashboardWidget } from './azureDashboardCommon'; import { azureDashboardStateKey, AzureDashboardTab } from './azureDashboardCommon'; import { azureDashboardReducer } from './azureDashboardReducer'; import * as azureDashboardSelectors from './azureDashboardSelectors'; import * as azureDashboardWidgets from './azureDashboardWidgets'; -export type { AzureDashboardWidget }; export { azureDashboardStateKey, azureDashboardReducer, diff --git a/src/store/dashboard/azureOcpDashboard/azureOcpDashboardCommon.ts b/src/store/dashboard/azureOcpDashboard/azureOcpDashboardCommon.ts index 7827ee020..41b88a64f 100644 --- a/src/store/dashboard/azureOcpDashboard/azureOcpDashboardCommon.ts +++ b/src/store/dashboard/azureOcpDashboard/azureOcpDashboardCommon.ts @@ -13,16 +13,13 @@ export const azureOcpDashboardTabFilters: AzureFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum AzureOcpDashboardTab { service_names = 'service_names', subscription_guids = 'subscription_guids', resource_locations = 'resource_locations', } -export interface AzureOcpDashboardWidget extends DashboardWidget {} - -export function getGroupByForTab(widget: AzureOcpDashboardWidget): AzureQuery['group_by'] { +export function getGroupByForTab(widget: DashboardWidget): AzureQuery['group_by'] { switch (widget.currentTab) { case AzureOcpDashboardTab.service_names: // Use group_by for service tab and filter for others -- https://github.com/project-koku/koku-ui/issues/846 @@ -47,7 +44,7 @@ export function getQueryForWidget(filter: AzureFilters = azureOcpDashboardDefaul } export function getQueryForWidgetTabs( - widget: AzureOcpDashboardWidget, + widget: DashboardWidget, filter: AzureFilters = azureOcpDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/azureOcpDashboard/azureOcpDashboardReducer.ts b/src/store/dashboard/azureOcpDashboard/azureOcpDashboardReducer.ts index 9626ba6e9..3d500a160 100644 --- a/src/store/dashboard/azureOcpDashboard/azureOcpDashboardReducer.ts +++ b/src/store/dashboard/azureOcpDashboard/azureOcpDashboardReducer.ts @@ -1,8 +1,8 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './azureOcpDashboardActions'; -import type { AzureOcpDashboardWidget } from './azureOcpDashboardCommon'; import { costSummaryWidget, databaseWidget, @@ -14,7 +14,7 @@ import { export type AzureOcpDashboardAction = ActionType; export type AzureOcpDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/azureOcpDashboard/azureOcpDashboardWidgets.ts b/src/store/dashboard/azureOcpDashboard/azureOcpDashboardWidgets.ts index efec3e423..fc319a1d1 100644 --- a/src/store/dashboard/azureOcpDashboard/azureOcpDashboardWidgets.ts +++ b/src/store/dashboard/azureOcpDashboard/azureOcpDashboardWidgets.ts @@ -8,16 +8,15 @@ import { } from 'routes/components/charts/common/chartDatum'; import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; import { azureDashboardWidgets } from 'store/dashboard/azureDashboard'; -import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; +import { DashboardChartType, type DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { formatUnits } from 'utils/format'; -import type { AzureOcpDashboardWidget } from './azureOcpDashboardCommon'; import { AzureOcpDashboardTab } from './azureOcpDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costSummaryWidget: AzureOcpDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [ AzureOcpDashboardTab.service_names, AzureOcpDashboardTab.subscription_guids, @@ -49,7 +48,7 @@ export const costSummaryWidget: AzureOcpDashboardWidget = { }, }; -export const databaseWidget: AzureOcpDashboardWidget = { +export const databaseWidget: DashboardWidget = { chartName: 'azureOcpDatabaseChart', chartType: DashboardChartType.trend, id: getId(), @@ -74,7 +73,7 @@ export const databaseWidget: AzureOcpDashboardWidget = { }, }; -export const networkWidget: AzureOcpDashboardWidget = { +export const networkWidget: DashboardWidget = { chartName: 'azureOcpNetworkChart', chartType: DashboardChartType.trend, id: getId(), @@ -99,7 +98,7 @@ export const networkWidget: AzureOcpDashboardWidget = { }, }; -export const storageWidget: AzureOcpDashboardWidget = { +export const storageWidget: DashboardWidget = { chartName: 'azureOcpStorageChart', chartType: DashboardChartType.trend, id: getId(), @@ -127,7 +126,7 @@ export const storageWidget: AzureOcpDashboardWidget = { }, }; -export const virtualMachineWidget: AzureOcpDashboardWidget = { +export const virtualMachineWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'azureOcpComputeChart', chartType: DashboardChartType.trend, diff --git a/src/store/dashboard/azureOcpDashboard/index.ts b/src/store/dashboard/azureOcpDashboard/index.ts index f60457362..cb8cbb39c 100644 --- a/src/store/dashboard/azureOcpDashboard/index.ts +++ b/src/store/dashboard/azureOcpDashboard/index.ts @@ -1,10 +1,8 @@ import * as azureOcpDashboardActions from './azureOcpDashboardActions'; -import type { AzureOcpDashboardWidget } from './azureOcpDashboardCommon'; import { azureOcpDashboardStateKey, AzureOcpDashboardTab } from './azureOcpDashboardCommon'; import { azureOcpDashboardReducer } from './azureOcpDashboardReducer'; import * as azureOcpDashboardSelectors from './azureOcpDashboardSelectors'; -export type { AzureOcpDashboardWidget }; export { azureOcpDashboardStateKey, azureOcpDashboardReducer, diff --git a/src/store/dashboard/common/dashboardCommon.ts b/src/store/dashboard/common/dashboardCommon.ts index b923e9eeb..16429a167 100644 --- a/src/store/dashboard/common/dashboardCommon.ts +++ b/src/store/dashboard/common/dashboardCommon.ts @@ -3,7 +3,6 @@ import type { ForecastPathsType, ForecastType } from 'api/forecasts/forecast'; import type { ReportPathsType, ReportType } from 'api/reports/report'; import type { FormatOptions, Formatter } from 'utils/format'; -// eslint-disable-next-line no-shadow export const enum DashboardChartType { cost = 'cost', // // This displays cumulative cost compared to infrastructure cost dailyCost = 'dailyCost', // This displays cumulative and daily cost compared to infrastructure cost diff --git a/src/store/dashboard/gcpDashboard/gcpDashboardCommon.ts b/src/store/dashboard/gcpDashboard/gcpDashboardCommon.ts index 7c7bf71c6..58fb422c5 100644 --- a/src/store/dashboard/gcpDashboard/gcpDashboardCommon.ts +++ b/src/store/dashboard/gcpDashboard/gcpDashboardCommon.ts @@ -13,7 +13,6 @@ export const gcpDashboardTabFilters: GcpFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum GcpDashboardTab { accounts = 'accounts', gcpProjects = 'gcp_projects', @@ -21,9 +20,7 @@ export const enum GcpDashboardTab { services = 'services', } -export interface GcpDashboardWidget extends DashboardWidget {} - -export function getGroupByForTab(widget: GcpDashboardWidget): GcpQuery['group_by'] { +export function getGroupByForTab(widget: DashboardWidget): GcpQuery['group_by'] { switch (widget.currentTab) { case GcpDashboardTab.services: // Use group_by for service tab and filter for others -- https://github.com/project-koku/koku-ui/issues/846 @@ -50,7 +47,7 @@ export function getQueryForWidget(filter: GcpFilters = gcpDashboardDefaultFilter } export function getQueryForWidgetTabs( - widget: GcpDashboardWidget, + widget: DashboardWidget, filter: GcpFilters = gcpDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/gcpDashboard/gcpDashboardReducer.ts b/src/store/dashboard/gcpDashboard/gcpDashboardReducer.ts index 873d67aa9..18c59c63a 100644 --- a/src/store/dashboard/gcpDashboard/gcpDashboardReducer.ts +++ b/src/store/dashboard/gcpDashboard/gcpDashboardReducer.ts @@ -1,14 +1,14 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './gcpDashboardActions'; -import type { GcpDashboardWidget } from './gcpDashboardCommon'; import { computeWidget, costSummaryWidget, databaseWidget, networkWidget, storageWidget } from './gcpDashboardWidgets'; export type GcpDashboardAction = ActionType; export type GcpDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/gcpDashboard/gcpDashboardWidgets.ts b/src/store/dashboard/gcpDashboard/gcpDashboardWidgets.ts index 67ac4a96d..ff0a21e1c 100644 --- a/src/store/dashboard/gcpDashboard/gcpDashboardWidgets.ts +++ b/src/store/dashboard/gcpDashboard/gcpDashboardWidgets.ts @@ -8,17 +8,16 @@ import { DatumType, } from 'routes/components/charts/common/chartDatum'; import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; -import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; +import { DashboardChartType, type DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { formatCurrency, formatUnits } from 'utils/format'; import { formatPath } from 'utils/paths'; -import type { GcpDashboardWidget } from './gcpDashboardCommon'; import { GcpDashboardTab } from './gcpDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const computeWidget: GcpDashboardWidget = { +export const computeWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'gcpComputeChart', chartType: DashboardChartType.trend, @@ -48,7 +47,7 @@ export const computeWidget: GcpDashboardWidget = { }, }; -export const costSummaryWidget: GcpDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [GcpDashboardTab.services, GcpDashboardTab.gcpProjects, GcpDashboardTab.regions], chartFormatter: formatCurrency, chartType: DashboardChartType.dailyTrend, @@ -78,7 +77,7 @@ export const costSummaryWidget: GcpDashboardWidget = { }, }; -export const databaseWidget: GcpDashboardWidget = { +export const databaseWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'gcpDatabaseChart', chartType: DashboardChartType.trend, @@ -104,7 +103,7 @@ export const databaseWidget: GcpDashboardWidget = { }, }; -export const networkWidget: GcpDashboardWidget = { +export const networkWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'gcpNetworkChart', chartType: DashboardChartType.trend, @@ -132,7 +131,7 @@ export const networkWidget: GcpDashboardWidget = { }, }; -export const storageWidget: GcpDashboardWidget = { +export const storageWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'gcpUsageChart', chartType: DashboardChartType.trend, diff --git a/src/store/dashboard/gcpDashboard/index.ts b/src/store/dashboard/gcpDashboard/index.ts index bd7c863e0..60e96c5ec 100644 --- a/src/store/dashboard/gcpDashboard/index.ts +++ b/src/store/dashboard/gcpDashboard/index.ts @@ -1,11 +1,9 @@ import * as gcpDashboardActions from './gcpDashboardActions'; -import type { GcpDashboardWidget } from './gcpDashboardCommon'; import { gcpDashboardStateKey, GcpDashboardTab } from './gcpDashboardCommon'; import { gcpDashboardReducer } from './gcpDashboardReducer'; import * as gcpDashboardSelectors from './gcpDashboardSelectors'; import * as gcpDashboardWidgets from './gcpDashboardWidgets'; -export type { GcpDashboardWidget }; export { gcpDashboardStateKey, gcpDashboardReducer, diff --git a/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardCommon.ts b/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardCommon.ts index 946b4f569..2177e07b3 100644 --- a/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardCommon.ts +++ b/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardCommon.ts @@ -13,7 +13,6 @@ export const gcpOcpDashboardTabFilters: GcpFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum GcpOcpDashboardTab { accounts = 'accounts', gcpProjects = 'gcp_projects', @@ -21,9 +20,7 @@ export const enum GcpOcpDashboardTab { services = 'services', } -export interface GcpOcpDashboardWidget extends DashboardWidget {} - -export function getGroupByForTab(widget: GcpOcpDashboardWidget): GcpQuery['group_by'] { +export function getGroupByForTab(widget: DashboardWidget): GcpQuery['group_by'] { switch (widget.currentTab) { case GcpOcpDashboardTab.services: // Use group_by for service tab and filter for others -- https://github.com/project-koku/koku-ui/issues/846 @@ -50,7 +47,7 @@ export function getQueryForWidget(filter: GcpFilters = gcpOcpDashboardDefaultFil } export function getQueryForWidgetTabs( - widget: GcpOcpDashboardWidget, + widget: DashboardWidget, filter: GcpFilters = gcpOcpDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardReducer.ts b/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardReducer.ts index 0e95c1ef1..013f7fbd8 100644 --- a/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardReducer.ts +++ b/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardReducer.ts @@ -1,8 +1,8 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './gcpOcpDashboardActions'; -import type { GcpOcpDashboardWidget } from './gcpOcpDashboardCommon'; import { computeWidget, costSummaryWidget, @@ -14,7 +14,7 @@ import { export type GcpOcpDashboardAction = ActionType; export type GcpOcpDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardWidgets.ts b/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardWidgets.ts index 7bd6ec507..d6eeffb36 100644 --- a/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardWidgets.ts +++ b/src/store/dashboard/gcpOcpDashboard/gcpOcpDashboardWidgets.ts @@ -7,17 +7,16 @@ import { DatumType, } from 'routes/components/charts/common/chartDatum'; import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; -import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; +import { DashboardChartType, type DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { gcpDashboardWidgets } from 'store/dashboard/gcpDashboard'; import { formatCurrency, formatUnits } from 'utils/format'; -import type { GcpOcpDashboardWidget } from './gcpOcpDashboardCommon'; import { GcpOcpDashboardTab } from './gcpOcpDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const computeWidget: GcpOcpDashboardWidget = { +export const computeWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'gcpOcpComputeChart', chartType: DashboardChartType.trend, @@ -47,7 +46,7 @@ export const computeWidget: GcpOcpDashboardWidget = { }, }; -export const costSummaryWidget: GcpOcpDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [GcpOcpDashboardTab.services, GcpOcpDashboardTab.gcpProjects, GcpOcpDashboardTab.regions], chartFormatter: formatCurrency, chartName: 'gcpOcpCostChart', @@ -76,7 +75,7 @@ export const costSummaryWidget: GcpOcpDashboardWidget = { }, }; -export const databaseWidget: GcpOcpDashboardWidget = { +export const databaseWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'gcpOcpDatabaseChart', chartType: DashboardChartType.trend, @@ -102,7 +101,7 @@ export const databaseWidget: GcpOcpDashboardWidget = { }, }; -export const networkWidget: GcpOcpDashboardWidget = { +export const networkWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'gcpOcpNetworkChart', chartType: DashboardChartType.trend, @@ -128,7 +127,7 @@ export const networkWidget: GcpOcpDashboardWidget = { }, }; -export const storageWidget: GcpOcpDashboardWidget = { +export const storageWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'gcpOcpStorageChart', chartType: DashboardChartType.trend, diff --git a/src/store/dashboard/gcpOcpDashboard/index.ts b/src/store/dashboard/gcpOcpDashboard/index.ts index 65348096e..bd1d6e66d 100644 --- a/src/store/dashboard/gcpOcpDashboard/index.ts +++ b/src/store/dashboard/gcpOcpDashboard/index.ts @@ -1,10 +1,8 @@ import * as gcpOcpDashboardActions from './gcpOcpDashboardActions'; -import type { GcpOcpDashboardWidget } from './gcpOcpDashboardCommon'; import { gcpOcpDashboardStateKey, GcpOcpDashboardTab } from './gcpOcpDashboardCommon'; import { gcpOcpDashboardReducer } from './gcpOcpDashboardReducer'; import * as gcpOcpDashboardSelectors from './gcpOcpDashboardSelectors'; -export type { GcpOcpDashboardWidget }; export { gcpOcpDashboardStateKey, gcpOcpDashboardReducer, diff --git a/src/store/dashboard/ibmDashboard/ibmDashboardCommon.ts b/src/store/dashboard/ibmDashboard/ibmDashboardCommon.ts index f5f67cd7c..9296fc9f3 100644 --- a/src/store/dashboard/ibmDashboard/ibmDashboardCommon.ts +++ b/src/store/dashboard/ibmDashboard/ibmDashboardCommon.ts @@ -13,7 +13,6 @@ export const ibmDashboardTabFilters: IbmFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum IbmDashboardTab { services = 'services', accounts = 'accounts', @@ -21,9 +20,7 @@ export const enum IbmDashboardTab { regions = 'regions', } -export interface IbmDashboardWidget extends DashboardWidget {} - -export function getGroupByForTab(widget: IbmDashboardWidget): IbmQuery['group_by'] { +export function getGroupByForTab(widget: DashboardWidget): IbmQuery['group_by'] { switch (widget.currentTab) { case IbmDashboardTab.services: // Use group_by for service tab and filter for others -- https://github.com/project-koku/koku-ui/issues/846 @@ -50,7 +47,7 @@ export function getQueryForWidget(filter: IbmFilters = ibmDashboardDefaultFilter } export function getQueryForWidgetTabs( - widget: IbmDashboardWidget, + widget: DashboardWidget, filter: IbmFilters = ibmDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/ibmDashboard/ibmDashboardReducer.ts b/src/store/dashboard/ibmDashboard/ibmDashboardReducer.ts index b1ddf6953..451598286 100644 --- a/src/store/dashboard/ibmDashboard/ibmDashboardReducer.ts +++ b/src/store/dashboard/ibmDashboard/ibmDashboardReducer.ts @@ -1,14 +1,14 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './ibmDashboardActions'; -import type { IbmDashboardWidget } from './ibmDashboardCommon'; import { computeWidget, costSummaryWidget, databaseWidget, networkWidget, storageWidget } from './ibmDashboardWidgets'; export type IbmDashboardAction = ActionType; export type IbmDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/ibmDashboard/ibmDashboardWidgets.ts b/src/store/dashboard/ibmDashboard/ibmDashboardWidgets.ts index 0e9494177..95cd5af87 100644 --- a/src/store/dashboard/ibmDashboard/ibmDashboardWidgets.ts +++ b/src/store/dashboard/ibmDashboard/ibmDashboardWidgets.ts @@ -8,17 +8,16 @@ import { DatumType, } from 'routes/components/charts/common/chartDatum'; import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; -import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; +import { DashboardChartType, type DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { formatCurrency, formatUnits } from 'utils/format'; import { formatPath } from 'utils/paths'; -import type { IbmDashboardWidget } from './ibmDashboardCommon'; import { IbmDashboardTab } from './ibmDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const computeWidget: IbmDashboardWidget = { +export const computeWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'ibmComputeChart', chartType: DashboardChartType.trend, @@ -48,7 +47,7 @@ export const computeWidget: IbmDashboardWidget = { }, }; -export const costSummaryWidget: IbmDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [IbmDashboardTab.services, IbmDashboardTab.projects, IbmDashboardTab.regions], chartFormatter: formatCurrency, chartName: 'ibmCostChart', @@ -78,7 +77,7 @@ export const costSummaryWidget: IbmDashboardWidget = { }, }; -export const databaseWidget: IbmDashboardWidget = { +export const databaseWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'ibmDatabaseChart', chartType: DashboardChartType.trend, @@ -104,7 +103,7 @@ export const databaseWidget: IbmDashboardWidget = { }, }; -export const networkWidget: IbmDashboardWidget = { +export const networkWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'ibmNetworkChart', chartType: DashboardChartType.trend, @@ -132,7 +131,7 @@ export const networkWidget: IbmDashboardWidget = { }, }; -export const storageWidget: IbmDashboardWidget = { +export const storageWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'ibmStorageChart', chartType: DashboardChartType.trend, diff --git a/src/store/dashboard/ibmDashboard/index.ts b/src/store/dashboard/ibmDashboard/index.ts index 6f9d74770..a6f34f630 100644 --- a/src/store/dashboard/ibmDashboard/index.ts +++ b/src/store/dashboard/ibmDashboard/index.ts @@ -1,8 +1,6 @@ import * as ibmDashboardActions from './ibmDashboardActions'; -import type { IbmDashboardWidget } from './ibmDashboardCommon'; import { ibmDashboardStateKey, IbmDashboardTab } from './ibmDashboardCommon'; import { ibmDashboardReducer } from './ibmDashboardReducer'; import * as ibmDashboardSelectors from './ibmDashboardSelectors'; -export type { IbmDashboardWidget }; export { ibmDashboardStateKey, ibmDashboardReducer, ibmDashboardActions, ibmDashboardSelectors, IbmDashboardTab }; diff --git a/src/store/dashboard/ociDashboard/index.ts b/src/store/dashboard/ociDashboard/index.ts index c45db39a1..10382cd52 100644 --- a/src/store/dashboard/ociDashboard/index.ts +++ b/src/store/dashboard/ociDashboard/index.ts @@ -1,11 +1,9 @@ import * as ociDashboardActions from './ociDashboardActions'; -import type { OciDashboardWidget } from './ociDashboardCommon'; import { ociDashboardStateKey, OciDashboardTab } from './ociDashboardCommon'; import { ociDashboardReducer } from './ociDashboardReducer'; import * as ociDashboardSelectors from './ociDashboardSelectors'; import * as ociDashboardWidgets from './ociDashboardWidgets'; -export type { OciDashboardWidget }; export { ociDashboardStateKey, ociDashboardReducer, diff --git a/src/store/dashboard/ociDashboard/ociDashboardCommon.ts b/src/store/dashboard/ociDashboard/ociDashboardCommon.ts index a5d7a2d42..bc804cc42 100644 --- a/src/store/dashboard/ociDashboard/ociDashboardCommon.ts +++ b/src/store/dashboard/ociDashboard/ociDashboardCommon.ts @@ -13,16 +13,13 @@ export const ociDashboardTabFilters: OciFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum OciDashboardTab { product_services = 'product_services', payer_tenant_ids = 'payer_tenant_ids', regions = 'regions', } -export interface OciDashboardWidget extends DashboardWidget {} - -export function getGroupByForTab(widget: OciDashboardWidget): OciQuery['group_by'] { +export function getGroupByForTab(widget: DashboardWidget): OciQuery['group_by'] { switch (widget.currentTab) { case OciDashboardTab.product_services: return { @@ -47,7 +44,7 @@ export function getQueryForWidget(filter: OciFilters = ociDashboardDefaultFilter } export function getQueryForWidgetTabs( - widget: OciDashboardWidget, + widget: DashboardWidget, filter: OciFilters = ociDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/ociDashboard/ociDashboardReducer.ts b/src/store/dashboard/ociDashboard/ociDashboardReducer.ts index ea7db79fd..0c34e8c6d 100644 --- a/src/store/dashboard/ociDashboard/ociDashboardReducer.ts +++ b/src/store/dashboard/ociDashboard/ociDashboardReducer.ts @@ -1,8 +1,8 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './ociDashboardActions'; -import type { OciDashboardWidget } from './ociDashboardCommon'; import { costSummaryWidget, databaseWidget, @@ -14,7 +14,7 @@ import { export type OciDashboardAction = ActionType; export type OciDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/ociDashboard/ociDashboardWidgets.ts b/src/store/dashboard/ociDashboard/ociDashboardWidgets.ts index 99d187da2..87cabcbec 100644 --- a/src/store/dashboard/ociDashboard/ociDashboardWidgets.ts +++ b/src/store/dashboard/ociDashboard/ociDashboardWidgets.ts @@ -8,17 +8,16 @@ import { DatumType, } from 'routes/components/charts/common/chartDatum'; import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; -import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; +import { DashboardChartType, type DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { formatUnits } from 'utils/format'; import { formatPath } from 'utils/paths'; -import type { OciDashboardWidget } from './ociDashboardCommon'; import { OciDashboardTab } from './ociDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costSummaryWidget: OciDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [OciDashboardTab.product_services, OciDashboardTab.payer_tenant_ids, OciDashboardTab.regions], chartType: DashboardChartType.dailyTrend, chartName: 'ociCostChart', @@ -47,7 +46,7 @@ export const costSummaryWidget: OciDashboardWidget = { }, }; -export const databaseWidget: OciDashboardWidget = { +export const databaseWidget: DashboardWidget = { chartName: 'ociDatabaseChart', chartType: DashboardChartType.trend, id: getId(), @@ -74,7 +73,7 @@ export const databaseWidget: OciDashboardWidget = { }, }; -export const networkWidget: OciDashboardWidget = { +export const networkWidget: DashboardWidget = { chartName: 'ociNetworkChart', chartType: DashboardChartType.trend, id: getId(), @@ -101,7 +100,7 @@ export const networkWidget: OciDashboardWidget = { }, }; -export const storageWidget: OciDashboardWidget = { +export const storageWidget: DashboardWidget = { chartName: 'ociStorageChart', chartType: DashboardChartType.trend, id: getId(), @@ -123,7 +122,7 @@ export const storageWidget: OciDashboardWidget = { }, }; -export const virtualMachineWidget: OciDashboardWidget = { +export const virtualMachineWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'ociComputeChart', chartType: DashboardChartType.trend, diff --git a/src/store/dashboard/ocpCloudDashboard/index.ts b/src/store/dashboard/ocpCloudDashboard/index.ts index dc5baef50..47ca803cd 100644 --- a/src/store/dashboard/ocpCloudDashboard/index.ts +++ b/src/store/dashboard/ocpCloudDashboard/index.ts @@ -1,10 +1,8 @@ import * as ocpCloudDashboardActions from './ocpCloudDashboardActions'; -import type { OcpCloudDashboardWidget } from './ocpCloudDashboardCommon'; import { ocpCloudDashboardStateKey, OcpCloudDashboardTab } from './ocpCloudDashboardCommon'; import { ocpCloudDashboardReducer } from './ocpCloudDashboardReducer'; import * as ocpCloudDashboardSelectors from './ocpCloudDashboardSelectors'; -export type { OcpCloudDashboardWidget }; export { ocpCloudDashboardStateKey, ocpCloudDashboardReducer, diff --git a/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardCommon.ts b/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardCommon.ts index 26eadd2be..6f9135df1 100644 --- a/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardCommon.ts +++ b/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardCommon.ts @@ -13,17 +13,14 @@ export const ocpCloudDashboardTabFilters: OcpCloudFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum OcpCloudDashboardTab { accounts = 'accounts', regions = 'regions', services = 'services', } -export interface OcpCloudDashboardWidget extends DashboardWidget {} - // Todo: cluster, project, node -export function getGroupByForTab(widget: OcpCloudDashboardWidget): OcpCloudQuery['group_by'] { +export function getGroupByForTab(widget: DashboardWidget): OcpCloudQuery['group_by'] { switch (widget.currentTab) { case OcpCloudDashboardTab.accounts: return { account: '*' }; @@ -48,7 +45,7 @@ export function getQueryForWidget(filter: OcpCloudFilters = ocpCloudDashboardDef } export function getQueryForWidgetTabs( - widget: OcpCloudDashboardWidget, + widget: DashboardWidget, filter: OcpCloudFilters = ocpCloudDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardReducer.ts b/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardReducer.ts index 763507963..fe86b42a1 100644 --- a/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardReducer.ts +++ b/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardReducer.ts @@ -1,8 +1,8 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './ocpCloudDashboardActions'; -import type { OcpCloudDashboardWidget } from './ocpCloudDashboardCommon'; import { computeWidget, costSummaryWidget, @@ -14,7 +14,7 @@ import { export type OcpCloudDashboardAction = ActionType; export type OcpCloudDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardWidgets.ts b/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardWidgets.ts index b6545089c..81d971e10 100644 --- a/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardWidgets.ts +++ b/src/store/dashboard/ocpCloudDashboard/ocpCloudDashboardWidgets.ts @@ -9,17 +9,16 @@ import { import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; import { awsDashboardWidgets } from 'store/dashboard/awsDashboard'; import { azureDashboardWidgets } from 'store/dashboard/azureDashboard'; -import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; +import { DashboardChartType, type DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { gcpDashboardWidgets } from 'store/dashboard/gcpDashboard'; import { formatCurrency, formatUnits } from 'utils/format'; -import type { OcpCloudDashboardWidget } from './ocpCloudDashboardCommon'; import { OcpCloudDashboardTab } from './ocpCloudDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costSummaryWidget: OcpCloudDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [OcpCloudDashboardTab.services, OcpCloudDashboardTab.accounts, OcpCloudDashboardTab.regions], chartFormatter: formatCurrency, chartName: 'ocpCloudCostChart', @@ -50,7 +49,7 @@ export const costSummaryWidget: OcpCloudDashboardWidget = { // Cloud widgets -export const computeWidget: OcpCloudDashboardWidget = { +export const computeWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'ocpCloudComputeChart', chartType: DashboardChartType.trend, @@ -76,7 +75,7 @@ export const computeWidget: OcpCloudDashboardWidget = { }, }; -export const databaseWidget: OcpCloudDashboardWidget = { +export const databaseWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'ocpCloudDatabaseChart', chartType: DashboardChartType.trend, @@ -104,7 +103,7 @@ export const databaseWidget: OcpCloudDashboardWidget = { }, }; -export const networkWidget: OcpCloudDashboardWidget = { +export const networkWidget: DashboardWidget = { chartFormatter: formatCurrency, chartName: 'ocpCloudNetworkChart', chartType: DashboardChartType.trend, @@ -132,7 +131,7 @@ export const networkWidget: OcpCloudDashboardWidget = { }, }; -export const storageWidget: OcpCloudDashboardWidget = { +export const storageWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'ocpCloudStorageChart', chartType: DashboardChartType.trend, diff --git a/src/store/dashboard/ocpDashboard/index.ts b/src/store/dashboard/ocpDashboard/index.ts index d37dec2bc..b01ba8b7a 100644 --- a/src/store/dashboard/ocpDashboard/index.ts +++ b/src/store/dashboard/ocpDashboard/index.ts @@ -1,8 +1,6 @@ import * as ocpDashboardActions from './ocpDashboardActions'; -import type { OcpDashboardWidget } from './ocpDashboardCommon'; import { ocpDashboardStateKey, OcpDashboardTab } from './ocpDashboardCommon'; import { ocpDashboardReducer } from './ocpDashboardReducer'; import * as ocpDashboardSelectors from './ocpDashboardSelectors'; -export type { OcpDashboardWidget }; export { ocpDashboardStateKey, ocpDashboardReducer, ocpDashboardActions, ocpDashboardSelectors, OcpDashboardTab }; diff --git a/src/store/dashboard/ocpDashboard/ocpDashboardCommon.ts b/src/store/dashboard/ocpDashboard/ocpDashboardCommon.ts index b528423a4..a0974a034 100644 --- a/src/store/dashboard/ocpDashboard/ocpDashboardCommon.ts +++ b/src/store/dashboard/ocpDashboard/ocpDashboardCommon.ts @@ -13,15 +13,12 @@ export const ocpDashboardTabFilters: OcpFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum OcpDashboardTab { nodes = 'nodes', clusters = 'clusters', projects = 'projects', } -export interface OcpDashboardWidget extends DashboardWidget {} - // Todo: cluster, project, node export function getGroupByForTab(tab: OcpDashboardTab): OcpQuery['group_by'] { switch (tab) { @@ -45,7 +42,7 @@ export function getQueryForWidget(filter: any = ocpDashboardDefaultFilters, prop } export function getQueryForWidgetTabs( - widget: OcpDashboardWidget, + widget: DashboardWidget, filter: OcpFilters = ocpDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/ocpDashboard/ocpDashboardReducer.ts b/src/store/dashboard/ocpDashboard/ocpDashboardReducer.ts index 4bd328edb..f232b3aae 100644 --- a/src/store/dashboard/ocpDashboard/ocpDashboardReducer.ts +++ b/src/store/dashboard/ocpDashboard/ocpDashboardReducer.ts @@ -1,14 +1,14 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './ocpDashboardActions'; -import type { OcpDashboardWidget } from './ocpDashboardCommon'; import { costSummaryWidget, cpuWidget, memoryWidget, optimizationsWidget, volumeWidget } from './ocpDashboardWidgets'; export type OcpDashboardAction = ActionType; export type OcpDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/ocpDashboard/ocpDashboardWidgets.ts b/src/store/dashboard/ocpDashboard/ocpDashboardWidgets.ts index 31c73b23a..c9b16c781 100644 --- a/src/store/dashboard/ocpDashboard/ocpDashboardWidgets.ts +++ b/src/store/dashboard/ocpDashboard/ocpDashboardWidgets.ts @@ -8,17 +8,16 @@ import { DatumType, } from 'routes/components/charts/common/chartDatum'; import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; -import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; +import { DashboardChartType, type DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { formatCurrency, formatUnits } from 'utils/format'; import { formatPath } from 'utils/paths'; -import type { OcpDashboardWidget } from './ocpDashboardCommon'; import { OcpDashboardTab } from './ocpDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costSummaryWidget: OcpDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [OcpDashboardTab.projects, OcpDashboardTab.clusters], chartFormatter: formatCurrency, chartName: 'ocpCostChart', @@ -51,7 +50,7 @@ export const costSummaryWidget: OcpDashboardWidget = { }, }; -export const cpuWidget: OcpDashboardWidget = { +export const cpuWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'ocpCpuChart', chartType: DashboardChartType.usage, @@ -73,7 +72,7 @@ export const cpuWidget: OcpDashboardWidget = { }, }; -export const memoryWidget: OcpDashboardWidget = { +export const memoryWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'ocpMemoryChart', chartType: DashboardChartType.usage, @@ -95,7 +94,7 @@ export const memoryWidget: OcpDashboardWidget = { }, }; -export const optimizationsWidget: OcpDashboardWidget = { +export const optimizationsWidget: DashboardWidget = { id: getId(), titleKey: messages.optimizations, details: { @@ -103,7 +102,7 @@ export const optimizationsWidget: OcpDashboardWidget = { }, }; -export const volumeWidget: OcpDashboardWidget = { +export const volumeWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'ocpVolumeChart', chartType: DashboardChartType.usage, diff --git a/src/store/dashboard/rhelDashboard/index.ts b/src/store/dashboard/rhelDashboard/index.ts index fc251988e..831582a0f 100644 --- a/src/store/dashboard/rhelDashboard/index.ts +++ b/src/store/dashboard/rhelDashboard/index.ts @@ -1,8 +1,6 @@ import * as rhelDashboardActions from './rhelDashboardActions'; -import type { RhelDashboardWidget } from './rhelDashboardCommon'; import { rhelDashboardStateKey, RhelDashboardTab } from './rhelDashboardCommon'; import { rhelDashboardReducer } from './rhelDashboardReducer'; import * as rhelDashboardSelectors from './rhelDashboardSelectors'; -export type { RhelDashboardWidget }; export { rhelDashboardStateKey, rhelDashboardReducer, rhelDashboardActions, rhelDashboardSelectors, RhelDashboardTab }; diff --git a/src/store/dashboard/rhelDashboard/rhelDashboardCommon.ts b/src/store/dashboard/rhelDashboard/rhelDashboardCommon.ts index 452b3442e..04d020a64 100644 --- a/src/store/dashboard/rhelDashboard/rhelDashboardCommon.ts +++ b/src/store/dashboard/rhelDashboard/rhelDashboardCommon.ts @@ -13,15 +13,12 @@ export const rhelDashboardTabFilters: RhelFilters = { limit: 3, }; -// eslint-disable-next-line no-shadow export const enum RhelDashboardTab { nodes = 'nodes', clusters = 'clusters', projects = 'projects', } -export interface RhelDashboardWidget extends DashboardWidget {} - // Todo: cluster, project, node export function getGroupByForTab(tab: RhelDashboardTab): RhelQuery['group_by'] { switch (tab) { @@ -45,7 +42,7 @@ export function getQueryForWidget(filter: RhelFilters = rhelDashboardDefaultFilt } export function getQueryForWidgetTabs( - widget: RhelDashboardWidget, + widget: DashboardWidget, filter: RhelFilters = rhelDashboardDefaultFilters, props? ) { diff --git a/src/store/dashboard/rhelDashboard/rhelDashboardReducer.ts b/src/store/dashboard/rhelDashboard/rhelDashboardReducer.ts index 117e4777f..86e5d6345 100644 --- a/src/store/dashboard/rhelDashboard/rhelDashboardReducer.ts +++ b/src/store/dashboard/rhelDashboard/rhelDashboardReducer.ts @@ -1,14 +1,14 @@ +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import type { ActionType } from 'typesafe-actions'; import { getType } from 'typesafe-actions'; import { setWidgetTab } from './rhelDashboardActions'; -import type { RhelDashboardWidget } from './rhelDashboardCommon'; import { costSummaryWidget, cpuWidget, memoryWidget, volumeWidget } from './rhelDashboardWidgets'; export type RhelDashboardAction = ActionType; export type RhelDashboardState = Readonly<{ - widgets: Record; + widgets: Record; currentWidgets: number[]; }>; diff --git a/src/store/dashboard/rhelDashboard/rhelDashboardWidgets.ts b/src/store/dashboard/rhelDashboard/rhelDashboardWidgets.ts index 24857c253..164644d0b 100644 --- a/src/store/dashboard/rhelDashboard/rhelDashboardWidgets.ts +++ b/src/store/dashboard/rhelDashboard/rhelDashboardWidgets.ts @@ -8,17 +8,17 @@ import { DatumType, } from 'routes/components/charts/common/chartDatum'; import { ComputedForecastItemType } from 'routes/components/charts/common/chartDatumForecast'; +import type { DashboardWidget } from 'store/dashboard/common/dashboardCommon'; import { DashboardChartType } from 'store/dashboard/common/dashboardCommon'; import { formatCurrency, formatUnits } from 'utils/format'; import { formatPath } from 'utils/paths'; -import type { RhelDashboardWidget } from './rhelDashboardCommon'; import { RhelDashboardTab } from './rhelDashboardCommon'; let currrentId = 0; const getId = () => currrentId++; -export const costSummaryWidget: RhelDashboardWidget = { +export const costSummaryWidget: DashboardWidget = { availableTabs: [RhelDashboardTab.projects, RhelDashboardTab.clusters], chartFormatter: formatCurrency, chartName: 'rhelCostChart', @@ -50,7 +50,7 @@ export const costSummaryWidget: RhelDashboardWidget = { }, }; -export const cpuWidget: RhelDashboardWidget = { +export const cpuWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'rhelCpuChart', chartType: DashboardChartType.usage, @@ -72,7 +72,7 @@ export const cpuWidget: RhelDashboardWidget = { }, }; -export const memoryWidget: RhelDashboardWidget = { +export const memoryWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'rhelMemoryChart', chartType: DashboardChartType.usage, @@ -94,7 +94,7 @@ export const memoryWidget: RhelDashboardWidget = { }, }; -export const volumeWidget: RhelDashboardWidget = { +export const volumeWidget: DashboardWidget = { chartFormatter: formatUnits, chartName: 'rhelVolumeChart', chartType: DashboardChartType.usage, diff --git a/src/store/featureToggle/__snapshots__/featureToggle.test.ts.snap b/src/store/featureToggle/__snapshots__/featureToggle.test.ts.snap index ce0f17673..226af3c9a 100644 --- a/src/store/featureToggle/__snapshots__/featureToggle.test.ts.snap +++ b/src/store/featureToggle/__snapshots__/featureToggle.test.ts.snap @@ -3,6 +3,7 @@ exports[`default state 1`] = ` { "hasFeatureToggle": false, + "isAccountInfoEmptyStateToggleEnabled": false, "isAwsEc2InstancesToggleEnabled": false, "isDebugToggleEnabled": false, "isExportsToggleEnabled": false, diff --git a/src/store/featureToggle/featureToggleActions.ts b/src/store/featureToggle/featureToggleActions.ts index c5f487069..ba6ffc57b 100644 --- a/src/store/featureToggle/featureToggleActions.ts +++ b/src/store/featureToggle/featureToggleActions.ts @@ -1,6 +1,7 @@ import { createAction } from 'typesafe-actions'; export interface FeatureToggleActionMeta { + isAccountInfoEmptyStateToggleEnabled?: boolean; isAwsEc2InstancesToggleEnabled?: boolean; isDebugToggleEnabled?: boolean; isExportsToggleEnabled?: boolean; diff --git a/src/store/featureToggle/featureToggleReducer.ts b/src/store/featureToggle/featureToggleReducer.ts index 68222df27..c2208bd68 100644 --- a/src/store/featureToggle/featureToggleReducer.ts +++ b/src/store/featureToggle/featureToggleReducer.ts @@ -8,7 +8,8 @@ export type FeatureToggleAction = ActionType state[stateKey]; export const selectHasFeatureToggle = (state: RootState) => selectFeatureToggleState(state).hasFeatureToggle; +export const selectIsAccountInfoEmptyStateToggleEnabled = (state: RootState) => + selectFeatureToggleState(state).isAccountInfoEmptyStateToggleEnabled; export const selectIsAwsEc2InstancesToggleEnabled = (state: RootState) => selectFeatureToggleState(state).isAwsEc2InstancesToggleEnabled; export const selectIsDebugToggleEnabled = (state: RootState) => selectFeatureToggleState(state).isDebugToggleEnabled; diff --git a/src/store/metrics/store.test.ts b/src/store/metrics/store.test.ts index 571e2378f..c529e1e79 100644 --- a/src/store/metrics/store.test.ts +++ b/src/store/metrics/store.test.ts @@ -48,14 +48,14 @@ test('fetch metrics', async () => { metric: 'memory_gb_request_per_hour', label_metric: 'Memory', label_measurement: 'Request', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', }, { source_type: 'Openshift Container Platform', metric: 'memory_gb_usage_per_hour', label_metric: 'Memory', label_measurement: 'Usage', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', }, ], }, @@ -90,14 +90,14 @@ test('fetch metrics', async () => { metric: 'memory_gb_request_per_hour', label_metric: 'Memory', label_measurement: 'Request', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', }, Usage: { source_type: 'Openshift Container Platform', metric: 'memory_gb_usage_per_hour', label_metric: 'Memory', label_measurement: 'Usage', - label_measurement_unit: 'GB-hours', + label_measurement_unit: 'GiB-hours', }, }, });