From 5ee33d47ba9eec4477bc0963142bdd69cfb56f46 Mon Sep 17 00:00:00 2001 From: Jim Wright Date: Fri, 9 May 2025 09:33:09 -0700 Subject: [PATCH] [UI] VAULT-35614 review reporting phase 1 dashboard design changes (#30538) * Update reporting addon * Update usage page data mappings Remove display name mapping per design review * Update after feedback from design Copywrite headers * Remove the old name mapping test from the usage page * Update tooltips to have periods Update namespaces tooltip --- ui/app/components/usage/page.ts | 58 +++++++++----- .../integration/components/usage/page-test.js | 27 +++++++ .../components/usage/page/index-test.js | 77 ------------------- .../vault-reporting/base/title-row.d.ts | 3 +- .../vault-reporting/base/title-row.d.ts.map | 2 +- .../vault-reporting/cluster-replication.d.ts | 19 ++--- .../cluster-replication.d.ts.map | 2 +- .../components/vault-reporting/counter.d.ts | 3 +- .../vault-reporting/counter.d.ts.map | 2 +- .../vault-reporting/dashboard/export.d.ts.map | 2 +- .../vault-reporting/filter-bar.d.ts | 44 +++++++++++ .../vault-reporting/filter-bar.d.ts.map | 1 + .../vault-reporting/global-lease.d.ts | 10 ++- .../vault-reporting/global-lease.d.ts.map | 2 +- .../vault-reporting/horizontal-bar-chart.d.ts | 8 ++ .../horizontal-bar-chart.d.ts.map | 2 +- .../vault-reporting/views/dashboard.d.ts | 3 +- .../vault-reporting/views/dashboard.d.ts.map | 2 +- .../views/secret-inventory.d.ts | 28 +++++++ .../views/secret-inventory.d.ts.map | 1 + .../services/reporting-analytics.d.ts | 17 ++++ .../services/reporting-analytics.d.ts.map | 1 + .../declarations/types/index.d.ts | 33 ++++---- .../declarations/types/index.d.ts.map | 2 +- .../declarations/utils/cel.d.ts | 15 ++++ .../declarations/utils/cel.d.ts.map | 1 + .../vault-reporting/base/title-row.js.map | 2 +- .../vault-reporting/cluster-replication.js | 59 +++++++------- .../cluster-replication.js.map | 2 +- .../components/vault-reporting/counter.js | 10 +-- .../components/vault-reporting/counter.js.map | 2 +- .../vault-reporting/dashboard/export.js | 2 +- .../vault-reporting/dashboard/export.js.map | 2 +- .../vault-reporting/global-lease.js | 33 +++++--- .../vault-reporting/global-lease.js.map | 2 +- .../vault-reporting/horizontal-bar-chart.js | 2 +- .../horizontal-bar-chart.js.map | 2 +- .../vault-reporting/views/dashboard.js | 58 +++++++------- .../vault-reporting/views/dashboard.js.map | 2 +- .../dist/styles/vault-reporting.css | 2 +- ui/vault-reporting/dist/types/index.js.map | 2 +- 41 files changed, 328 insertions(+), 219 deletions(-) create mode 100644 ui/tests/integration/components/usage/page-test.js delete mode 100644 ui/tests/integration/components/usage/page/index-test.js create mode 100644 ui/vault-reporting/declarations/components/vault-reporting/filter-bar.d.ts create mode 100644 ui/vault-reporting/declarations/components/vault-reporting/filter-bar.d.ts.map create mode 100644 ui/vault-reporting/declarations/components/vault-reporting/views/secret-inventory.d.ts create mode 100644 ui/vault-reporting/declarations/components/vault-reporting/views/secret-inventory.d.ts.map create mode 100644 ui/vault-reporting/declarations/services/reporting-analytics.d.ts create mode 100644 ui/vault-reporting/declarations/services/reporting-analytics.d.ts.map create mode 100644 ui/vault-reporting/declarations/utils/cel.d.ts create mode 100644 ui/vault-reporting/declarations/utils/cel.d.ts.map diff --git a/ui/app/components/usage/page.ts b/ui/app/components/usage/page.ts index 8fb42bc1b2..ae5df5ab6a 100644 --- a/ui/app/components/usage/page.ts +++ b/ui/app/components/usage/page.ts @@ -5,8 +5,6 @@ import Component from '@ember/component'; import { service } from '@ember/service'; -import { allEngines } from 'vault/helpers/mountable-secret-engines'; -import { allMethods } from 'vault/helpers/mountable-auth-methods'; import type FlagsService from 'vault/services/flags'; import type ApiService from 'vault/services/api'; @@ -31,23 +29,47 @@ export default class UsagePage extends Component { @service declare readonly flags: FlagsService; handleFetchUsageData: getUsageDataFunction = async () => { - //TODO: Update client with typed response after the API is updated https://hashicorp.atlassian.net/browse/VAULT-35108 + /** + * We get a partially typed response from the API client, but only 1 level deep. + * Casting the nested types here and falling back to defaults in the mappings. + * We should get typescript errors if top level interfaces in the API client or + * the vault-reporting addon change. + */ const response = await this.api.sys.generateUtilizationReport(); - const data = response as UsageDashboardData; - // Replace engine names with display names if available - allEngines().forEach((engine) => { - if (engine.type in data.secret_engines) { - data.secret_engines[engine.displayName] = data.secret_engines[engine.type] || 0; - delete data.secret_engines[engine.type]; - } - }); - // Replace auth method names with display names if available - allMethods().forEach((method) => { - if (method.type in data.auth_methods) { - data.auth_methods[method.displayName] = data.auth_methods[method.type] || 0; - delete data.auth_methods[method.type]; - } - }); + const leaseCountQuotas = response.leaseCountQuotas as UsageDashboardData['leaseCountQuotas']; + const replicationStatus = response.replicationStatus as UsageDashboardData['replicationStatus']; + const pki = response.pki as UsageDashboardData['pki']; + const secretSync = response.secretSync as UsageDashboardData['secretSync']; + + const data: UsageDashboardData = { + authMethods: (response.authMethods as Record) || {}, + secretEngines: (response.secretEngines as Record) || {}, + leasesByAuthMethod: (response.leasesByAuthMethod as Record) || {}, + leaseCountQuotas: { + globalLeaseCountQuota: { + capacity: leaseCountQuotas?.globalLeaseCountQuota?.capacity || 0, + count: leaseCountQuotas?.globalLeaseCountQuota?.count || 0, + name: leaseCountQuotas?.globalLeaseCountQuota?.name || '', + }, + totalLeaseCountQuotas: leaseCountQuotas?.totalLeaseCountQuotas || 0, + }, + replicationStatus: { + drState: replicationStatus?.drState || 'disabled', + prState: replicationStatus?.prState || 'disabled', + drPrimary: replicationStatus?.drPrimary ?? false, + prPrimary: replicationStatus?.prPrimary ?? false, + }, + kvv1Secrets: response.kvv1Secrets || 0, + kvv2Secrets: response.kvv2Secrets || 0, + namespaces: response.namespaces || 0, + pki: { + totalIssuers: pki?.totalIssuers || 0, + totalRoles: pki?.totalRoles || 0, + }, + secretSync: { + totalDestinations: secretSync?.totalDestinations || 0, + }, + }; return data as UsageDashboardData; }; } diff --git a/ui/tests/integration/components/usage/page-test.js b/ui/tests/integration/components/usage/page-test.js new file mode 100644 index 0000000000..5a85e9b7a2 --- /dev/null +++ b/ui/tests/integration/components/usage/page-test.js @@ -0,0 +1,27 @@ +/** + * Copyright (c) HashiCorp, Inc. + */ + +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'vault/tests/helpers'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; +import sinon from 'sinon'; + +module('Integration | Component | usage | Page::Usage', function (hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(async function () { + this.api = this.owner.lookup('service:api'); + this.generateUtilizationReportStub = sinon.stub(this.api.sys, 'generateUtilizationReport').resolves({}); + }); + + hooks.afterEach(function () { + this.generateUtilizationReportStub.restore(); + }); + + test('it provides the correct fetch function to the dashboard component', async function (assert) { + await render(hbs``); + assert.true(this.generateUtilizationReportStub.calledOnce, 'fetch function is called on render'); + }); +}); diff --git a/ui/tests/integration/components/usage/page/index-test.js b/ui/tests/integration/components/usage/page/index-test.js deleted file mode 100644 index 4a7a412f8c..0000000000 --- a/ui/tests/integration/components/usage/page/index-test.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) HashiCorp, Inc. - */ - -import { module, test } from 'qunit'; -import { setupRenderingTest } from 'vault/tests/helpers'; -import { findAll, render } from '@ember/test-helpers'; -import { hbs } from 'ember-cli-htmlbars'; -import sinon from 'sinon'; - -module('Integration | Component | usage | Page::Usage', function (hooks) { - setupRenderingTest(hooks); - - hooks.beforeEach(async function () { - this.api = this.owner.lookup('service:api'); - this.generateUtilizationReportStub = sinon.stub(this.api.sys, 'generateUtilizationReport').resolves({}); - }); - - hooks.afterEach(function () { - this.generateUtilizationReportStub.restore(); - }); - - test('it provides the correct fetch function to the dashboard component', async function (assert) { - await render(hbs``); - assert.true(this.generateUtilizationReportStub.calledOnce, 'fetch function is called on render'); - }); - - test('it remaps data to friendly names if available', async function (assert) { - this.generateUtilizationReportStub.resolves({ - auth_methods: { alicloud: 2, cert: 2, userpass: 2, 'unknown-random-method': 1 }, - kvv1_secrets: 15, - kvv2_secrets: 146, - lease_count_quotas: { - global_lease_count_quota: { - capacity: 300000, - count: 244121, - name: 'default', - }, - total_lease_count_quotas: 2, - }, - namespaces: 10, - secrets_sync: 79, - pki: { total_issuers: 2, total_roles: 6 }, - replication_status: { - dr_primary: false, - dr_state: 'disabled', - pr_primary: false, - pr_state: 'enabled', - }, - secret_engines: { - keymgmt: 5, - gcpkms: 10, - pki: 11, - 'unknown-random-engine': 1, - }, - }); - await render(hbs``); - - const engineLabels = [...findAll('[data-test-dashboard-secret-engines] .axis g text')].map( - (label) => label.textContent - ); - const authMethodLabels = [...findAll('[data-test-dashboard-auth-methods] .axis g text')].map( - (label) => label.textContent - ); - assert.deepEqual( - engineLabels, - ['PKI Certificates', 'Google Cloud KMS', 'Key Management', 'unknown-random-engine'], - 'Engine labels are correct (sorted DESC)' - ); - - assert.deepEqual( - authMethodLabels, - ['AliCloud', 'TLS Certificates', 'Username & Password', 'unknown-random-method'], - 'Auth method labels are correct (sorted DESC)' - ); - }); -}); diff --git a/ui/vault-reporting/declarations/components/vault-reporting/base/title-row.d.ts b/ui/vault-reporting/declarations/components/vault-reporting/base/title-row.d.ts index 1462afd0bd..324f5af05d 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/base/title-row.d.ts +++ b/ui/vault-reporting/declarations/components/vault-reporting/base/title-row.d.ts @@ -5,6 +5,7 @@ import Component from '@glimmer/component'; import { HdsLinkStandalone } from '@hashicorp/design-system-components/components'; import './title-row.scss'; +import type { SafeString } from '@ember/template'; /** * TitleRow Component * @@ -16,7 +17,7 @@ export interface TitleRowSignature { /** The main title text to display */ title: string; /** Optional description text to display beneath the title */ - description?: string; + description?: string | SafeString; /** Custom text for the link (defaults to "View all") */ linkText?: string; /** Icon to display with the link (defaults to "arrow-right") */ diff --git a/ui/vault-reporting/declarations/components/vault-reporting/base/title-row.d.ts.map b/ui/vault-reporting/declarations/components/vault-reporting/base/title-row.d.ts.map index a663762886..39a06347d5 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/base/title-row.d.ts.map +++ b/ui/vault-reporting/declarations/components/vault-reporting/base/title-row.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"title-row.d.ts","sourceRoot":"","sources":["../../../../src/components/vault-reporting/base/title-row.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAGL,iBAAiB,EAClB,MAAM,gDAAgD,CAAC;AACxD,OAAO,kBAAkB,CAAC;AAE1B;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE;QACJ,qCAAqC;QACrC,KAAK,EAAE,MAAM,CAAC;QACd,6DAA6D;QAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,wDAAwD;QACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gEAAgE;QAChE,QAAQ,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrC,gEAAgE;QAChE,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gDAAgD;QAChD,UAAU,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;KACjC,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;KACb,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAChE,IAAI,OAAO,uBAEV;IAED,IAAI,QAAQ,WAEX;IAED,IAAI,OAAO,WAEV;IAED,IAAI,QAAQ,urTAEX;IAED,IAAI,UAAU,uBAEb;CAqDF"} \ No newline at end of file +{"version":3,"file":"title-row.d.ts","sourceRoot":"","sources":["../../../../src/components/vault-reporting/base/title-row.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAGL,iBAAiB,EAClB,MAAM,gDAAgD,CAAC;AACxD,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE;QACJ,qCAAqC;QACrC,KAAK,EAAE,MAAM,CAAC;QACd,6DAA6D;QAC7D,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;QAClC,wDAAwD;QACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gEAAgE;QAChE,QAAQ,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrC,gEAAgE;QAChE,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gDAAgD;QAChD,UAAU,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;KACjC,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;KACb,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAChE,IAAI,OAAO,uBAEV;IAED,IAAI,QAAQ,WAEX;IAED,IAAI,OAAO,WAEV;IAED,IAAI,QAAQ,urTAEX;IAED,IAAI,UAAU,uBAEb;CAqDF"} \ No newline at end of file diff --git a/ui/vault-reporting/declarations/components/vault-reporting/cluster-replication.d.ts b/ui/vault-reporting/declarations/components/vault-reporting/cluster-replication.d.ts index a5fe696a21..ae97bbea43 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/cluster-replication.d.ts +++ b/ui/vault-reporting/declarations/components/vault-reporting/cluster-replication.d.ts @@ -7,9 +7,7 @@ import { REPLICATION_ENABLED_STATE } from '../../types/index.ts'; import './cluster-replication.scss'; export interface ClusterReplicationSignature { Args: { - isDisasterRecoveryPrimary: boolean; disasterRecoveryState: REPLICATION_ENABLED_STATE | 'disabled'; - isPerformancePrimary: boolean; performanceState: REPLICATION_ENABLED_STATE | 'disabled'; }; Blocks: { @@ -18,17 +16,10 @@ export interface ClusterReplicationSignature { Element: HTMLElement; } export default class ClusterReplication extends Component { - get disasterRecoveryBadge(): { - icon: 'check' | 'x'; - text: string; - color: 'success' | 'neutral'; - }; - get performanceBadge(): { - icon: 'check' | 'x'; - text: string; - color: 'success' | 'neutral'; - }; - get disasterRecoveryRole(): "Primary" | "Secondary"; - get performanceRole(): "Primary" | "Secondary"; + getState: (state?: REPLICATION_ENABLED_STATE | "disabled") => "disabled" | REPLICATION_ENABLED_STATE; + get isEmpty(): boolean; + get description(): import("@ember/template").SafeString | "Status of disaster recovery and performance replication."; + getIcon: (state?: REPLICATION_ENABLED_STATE | "disabled") => "loading" | "loading-static" | "running" | "running-static" | "apple" | "apple-color" | "alibaba" | "alibaba-color" | "amazon-ecs" | "amazon-ecs-color" | "amazon-eks" | "amazon-eks-color" | "auth0" | "auth0-color" | "aws" | "aws-color" | "aws-cdk" | "aws-cdk-color" | "aws-cloudwatch" | "aws-cloudwatch-color" | "aws-ec2" | "aws-ec2-color" | "aws-lambda" | "aws-lambda-color" | "aws-s3" | "aws-s3-color" | "azure" | "azure-color" | "azure-aks" | "azure-aks-color" | "azure-blob-storage" | "azure-blob-storage-color" | "azure-devops" | "azure-devops-color" | "azure-vms" | "azure-vms-color" | "bitbucket" | "bitbucket-color" | "bridgecrew" | "bridgecrew-color" | "cisco" | "cisco-color" | "codepen" | "codepen-color" | "confluence" | "confluence-color" | "confluent" | "confluent-color" | "datadog" | "datadog-color" | "digital-ocean" | "digital-ocean-color" | "docker" | "docker-color" | "duo-color" | "duo" | "elastic-observability" | "elastic-observability-color" | "f5" | "f5-color" | "facebook" | "facebook-color" | "figma" | "figma-color" | "gcp" | "gcp-color" | "git" | "git-color" | "gitlab" | "gitlab-color" | "github" | "github-color" | "google" | "google-color" | "google-docs" | "google-docs-color" | "google-drive" | "google-drive-color" | "google-forms" | "google-forms-color" | "google-sheets" | "google-sheets-color" | "google-slides" | "google-slides-color" | "grafana" | "grafana-color" | "helm" | "helm-color" | "infracost" | "infracost-color" | "jfrog" | "jfrog-color" | "jira" | "jira-color" | "jwt" | "jwt-color" | "kubernetes" | "kubernetes-color" | "lightlytics" | "lightlytics-color" | "linkedin" | "linkedin-color" | "linode" | "linode-color" | "linux" | "linux-color" | "loom" | "loom-color" | "meetup" | "meetup-color" | "microsoft" | "microsoft-color" | "microsoft-teams" | "microsoft-teams-color" | "minio" | "minio-color" | "mongodb" | "mongodb-color" | "new-relic" | "new-relic-color" | "okta" | "okta-color" | "oracle" | "oracle-color" | "opa" | "opa-color" | "openid" | "openid-color" | "pack" | "pack-color" | "pager-duty" | "pager-duty-color" | "ping-identity " | "ping-identity-color" | "postgres" | "postgres-color" | "rabbitmq" | "rabbitmq-color" | "saml" | "saml-color" | "service-now" | "service-now-color" | "slack" | "slack-color" | "snyk" | "snyk-color" | "splunk" | "splunk-color" | "twilio" | "twilio-color" | "twitch" | "twitch-color" | "twitter" | "twitter-color" | "twitter-x" | "twitter-x-color" | "vantage" | "vantage-color" | "venafi" | "venafi-color" | "vercel" | "vercel-color" | "vmware" | "vmware-color" | "youtube" | "youtube-color" | "boundary" | "boundary-color" | "boundary-fill" | "boundary-fill-color" | "boundary-square" | "boundary-square-color" | "consul" | "consul-color" | "consul-fill" | "consul-fill-color" | "consul-square" | "consul-square-color" | "nomad" | "nomad-color" | "nomad-fill" | "nomad-fill-color" | "nomad-square" | "nomad-square-color" | "packer" | "packer-color" | "packer-fill" | "packer-fill-color" | "packer-square" | "packer-square-color" | "terraform" | "terraform-color" | "terraform-fill" | "terraform-fill-color" | "terraform-square" | "terraform-square-color" | "vagrant" | "vagrant-color" | "vagrant-fill" | "vagrant-fill-color" | "vagrant-square" | "vagrant-square-color" | "vault" | "vault-color" | "vault-fill" | "vault-fill-color" | "vault-square" | "vault-square-color" | "vault-radar" | "vault-radar-color" | "vault-radar-fill" | "vault-radar-fill-color" | "vault-radar-square" | "vault-radar-square-color" | "vault-secrets" | "vault-secrets-color" | "vault-secrets-fill" | "vault-secrets-fill-color" | "vault-secrets-square" | "vault-secrets-square-color" | "waypoint" | "waypoint-color" | "waypoint-fill" | "waypoint-fill-color" | "waypoint-square" | "waypoint-square-color" | "hashicorp" | "hashicorp-color" | "hashicorp-fill" | "hashicorp-fill-color" | "hashicorp-square" | "hashicorp-square-color" | "hcp" | "hcp-color" | "hcp-fill" | "hcp-fill-color" | "hcp-square" | "hcp-square-color" | "accessibility" | "folder-users" | "frown" | "identity-service" | "identity-user" | "meh" | "robot" | "smile" | "user" | "user-check" | "user-circle" | "user-circle-fill" | "user-minus" | "user-plus" | "user-x" | "users" | "ampersand" | "beaker" | "bucket" | "bulb" | "circle" | "circle-dot" | "circle-fill" | "circle-half" | "diamond" | "diamond-fill" | "disc" | "dot" | "dot-half" | "droplet" | "flag" | "gift" | "government" | "handshake" | "hash" | "hexagon" | "hexagon-fill" | "labyrinth" | "layers" | "moon" | "octagon" | "outline" | "random" | "rocket" | "sparkle" | "square" | "square-fill" | "sun" | "triangle" | "triangle-fill" | "truck" | "wand" | "zap" | "zap-off" | "docs" | "docs-download" | "docs-link" | "guide" | "guide-link" | "help" | "info" | "info-fill" | "learn" | "learn-link" | "support" | "alert-circle" | "alert-circle-fill" | "alert-diamond" | "alert-diamond-fill" | "alert-octagon" | "alert-octagon-fill" | "alert-triangle" | "alert-triangle-fill" | "check" | "check-circle" | "check-circle-fill" | "check-diamond" | "check-diamond-fill" | "check-hexagon" | "check-hexagon-fill" | "check-square" | "check-square-fill" | "skip" | "x" | "x-circle" | "x-circle-fill" | "x-diamond" | "x-diamond-fill" | "x-hexagon" | "x-hexagon-fill" | "x-square" | "x-square-fill" | "bug" | "certificate" | "eye" | "eye-off" | "fingerprint" | "key" | "keychain" | "lock" | "lock-fill" | "lock-off" | "shield" | "shield-alert" | "shield-check" | "shield-off" | "shield-x" | "token" | "unlock" | "verified" | "wall" | "minus" | "minus-circle" | "minus-circle-fill" | "minus-plus" | "minus-plus-circle" | "minus-plus-square" | "minus-square" | "minus-square-fill" | "plus" | "plus-circle" | "plus-circle-fill" | "plus-square" | "camera" | "camera-off" | "cast" | "closed-caption" | "fast-forward" | "film" | "headphones" | "image" | "music" | "pause" | "pause-circle" | "play" | "play-circle" | "radio" | "rewind" | "rss" | "skip-back" | "skip-forward" | "speaker" | "stop-circle" | "volume" | "volume-down" | "volume-2" | "volume-x" | "wifi" | "wifi-off" | "compass" | "crosshair" | "map" | "map-pin" | "navigation" | "navigation-alt" | "redirect" | "target" | "align-center" | "align-justify" | "align-left" | "align-right" | "battery" | "battery-charging" | "bookmark" | "bookmark-add" | "bookmark-add-fill" | "bookmark-fill" | "bookmark-remove" | "bookmark-remove-fill" | "bottom" | "command" | "crop" | "dashboard" | "delete" | "download" | "edit" | "entry-point" | "exit-point" | "external-link" | "filter" | "filter-circle" | "filter-fill" | "grid" | "grid-alt" | "home" | "jump-link" | "layout" | "link" | "list" | "maximize" | "maximize-alt" | "menu" | "minimize" | "minimize-alt" | "more-horizontal" | "more-vertical" | "mouse-pointer" | "paperclip" | "pen-tool" | "pencil-tool" | "pin" | "power" | "printer" | "reload" | "repeat" | "rotate-cw" | "rotate-ccw" | "search" | "share" | "sidebar" | "sidebar-hide" | "sidebar-show" | "sign-in" | "sign-out" | "slash" | "slash-square" | "sort-asc" | "sort-desc" | "switcher" | "sync" | "sync-alert" | "sync-reverse" | "tag" | "toggle-left" | "toggle-right" | "top" | "trash" | "type" | "unfold-close" | "unfold-open" | "upload" | "zoom-in" | "zoom-out" | "archive" | "clipboard" | "clipboard-checked" | "clipboard-copy" | "clipboard-x" | "file" | "file-change" | "file-check" | "file-diff" | "file-minus" | "file-plus" | "file-source" | "file-text" | "file-x" | "files" | "folder" | "folder-fill" | "folder-minus" | "folder-minus-fill" | "folder-plus" | "folder-plus-fill" | "folder-star" | "inbox" | "api" | "auto-apply" | "build" | "change" | "change-circle" | "change-square" | "channel" | "cloud" | "cloud-check" | "cloud-download" | "cloud-lightning" | "cloud-lock" | "cloud-off" | "cloud-upload" | "cloud-x" | "code" | "connection" | "connection-gateway" | "cpu" | "duplicate" | "gateway" | "git-branch" | "git-commit" | "git-merge" | "git-pull-request" | "git-repo" | "hammer" | "key-values" | "mainframe" | "mesh" | "module" | "monitor" | "network" | "network-alt" | "node" | "path" | "pipeline" | "plug" | "replication-direct" | "replication-perf" | "scissors" | "server" | "server-cluster" | "serverless" | "service" | "settings" | "sliders" | "smartphone" | "socket" | "step" | "tablet" | "terminal" | "terminal-screen" | "test" | "tools" | "transform-data" | "tv" | "webhook" | "wrench" | "calendar" | "clock" | "clock-filled" | "delay" | "event" | "history" | "hourglass" | "watch" | "bar-chart" | "bar-chart-alt" | "box" | "collections" | "database" | "hard-drive" | "line-chart" | "line-chart-up" | "logs" | "package" | "pie-chart" | "queue" | "save" | "trend-down" | "trend-up" | "activity" | "at-sign" | "award" | "bell" | "bell-active" | "bell-active-fill" | "bell-off" | "discussion-circle" | "discussion-square" | "heart" | "heart-fill" | "heart-off" | "mail" | "mail-open" | "message-circle" | "message-circle-fill" | "message-square" | "message-square-fill" | "mic" | "mic-off" | "newspaper" | "phone" | "phone-call" | "phone-off" | "send" | "star" | "star-circle" | "star-fill" | "star-off" | "thumbs-down" | "thumbs-up" | "video" | "video-off" | "bank-vault" | "briefcase" | "credit-card" | "dollar-sign" | "enterprise" | "globe" | "globe-private" | "org" | "provider" | "shopping-bag" | "shopping-cart" | "arrow-down" | "arrow-down-circle" | "arrow-down-left" | "arrow-down-right" | "arrow-left" | "arrow-left-circle" | "arrow-right" | "arrow-right-circle" | "arrow-up" | "arrow-up-circle" | "arrow-up-left" | "arrow-up-right" | "caret" | "chevron-down" | "chevron-left" | "chevron-right" | "chevron-up" | "chevrons-down" | "chevrons-left" | "chevrons-right" | "chevrons-up" | "corner-down-left" | "corner-down-right" | "corner-left-down" | "corner-left-up" | "corner-right-down" | "corner-right-up" | "corner-up-left" | "corner-up-right" | "load-balancer" | "migrate" | "move" | "shuffle" | "swap-horizontal" | "swap-vertical" | undefined; + getColor: (state?: REPLICATION_ENABLED_STATE | "disabled") => "neutral" | "neutral-dark-mode" | "highlight" | "success" | "warning" | "critical" | undefined; } //# sourceMappingURL=cluster-replication.d.ts.map \ No newline at end of file diff --git a/ui/vault-reporting/declarations/components/vault-reporting/cluster-replication.d.ts.map b/ui/vault-reporting/declarations/components/vault-reporting/cluster-replication.d.ts.map index 01f02cc756..020fe52598 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/cluster-replication.d.ts.map +++ b/ui/vault-reporting/declarations/components/vault-reporting/cluster-replication.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"cluster-replication.d.ts","sourceRoot":"","sources":["../../../src/components/vault-reporting/cluster-replication.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAO3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,4BAA4B,CAAC;AAEpC,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE;QACJ,yBAAyB,EAAE,OAAO,CAAC;QACnC,qBAAqB,EAAE,yBAAyB,GAAG,UAAU,CAAC;QAC9D,oBAAoB,EAAE,OAAO,CAAC;QAC9B,gBAAgB,EAAE,yBAAyB,GAAG,UAAU,CAAC;KAC1D,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;KACb,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,SAAS,CAAC,2BAA2B,CAAC;IACpF,IAAI,qBAAqB,IAAI;QAC3B,IAAI,EAAE,OAAO,GAAG,GAAG,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;KAC9B,CAMA;IAED,IAAI,gBAAgB,IAAI;QACtB,IAAI,EAAE,OAAO,GAAG,GAAG,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;KAC9B,CAMA;IAED,IAAI,oBAAoB,4BAEvB;IAED,IAAI,eAAe,4BAElB;CAyFF"} \ No newline at end of file +{"version":3,"file":"cluster-replication.d.ts","sourceRoot":"","sources":["../../../src/components/vault-reporting/cluster-replication.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAO3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAIjE,OAAO,4BAA4B,CAAC;AAEpC,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE;QACJ,qBAAqB,EAAE,yBAAyB,GAAG,UAAU,CAAC;QAC9D,gBAAgB,EAAE,yBAAyB,GAAG,UAAU,CAAC;KAC1D,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;KACb,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,SAAS,CAAC,2BAA2B,CAAC;IACpF,QAAQ,WAAW,yBAAyB,GAAG,UAAU,4CAEvD;IAEF,IAAI,OAAO,YAKV;IAED,IAAI,WAAW,sGAQd;IAED,OAAO,WAAW,yBAAyB,GAAG,UAAU,osTAQtD;IAEF,QAAQ,WAAW,yBAAyB,GAAG,UAAU,oGAQvD;CAuDH"} \ No newline at end of file diff --git a/ui/vault-reporting/declarations/components/vault-reporting/counter.d.ts b/ui/vault-reporting/declarations/components/vault-reporting/counter.d.ts index 2358061c78..8465f8137a 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/counter.d.ts +++ b/ui/vault-reporting/declarations/components/vault-reporting/counter.d.ts @@ -14,6 +14,7 @@ export interface SSUReportingCounterSignature { suffix?: string; link?: string; emptyText?: string; + emptyLink?: string; }; Blocks: { default: []; @@ -24,6 +25,6 @@ export default class SSUReportingCounter extends Component void; + appliedFilters: Filter[]; + filterFieldDefinitions: FilterFieldDefinition[]; + }; + Blocks: { + default: []; + }; + Element: HTMLElement; +} +export default class FilterBar extends Component { + updateFilters: (filters: Record) => void; + handleClearFilters: () => void; + handleDismissFilter: (key: string) => void; + handleMultiselectChange: (name: string, event: Event) => void; + handleTextInputChange: (name: string, event: Event) => void; + handleNumberChange: (event: Event) => void; + handleDateRangeChange: (name: string, event: Event) => void; + isEqual: (a: string, b: string) => boolean; + isChecked: (name: string, value: string) => boolean; + getValue: (name: string) => string; + getOperator: (name: string) => "" | ">=" | "<=" | ">" | "<" | "=" | "!=" | "IN" | "NOT IN"; + friendlyAppliedString: (appliedFilter: Filter) => string; + get appliedFilters(): Record; + get appliedFiltersCount(): number; + get hasAppliedFilters(): boolean; +} +//# sourceMappingURL=filter-bar.d.ts.map \ No newline at end of file diff --git a/ui/vault-reporting/declarations/components/vault-reporting/filter-bar.d.ts.map b/ui/vault-reporting/declarations/components/vault-reporting/filter-bar.d.ts.map new file mode 100644 index 0000000000..bf6ea4f058 --- /dev/null +++ b/ui/vault-reporting/declarations/components/vault-reporting/filter-bar.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"filter-bar.d.ts","sourceRoot":"","sources":["../../../src/components/vault-reporting/filter-bar.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAG3C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAC;IACtD,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE;QACJ,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;QAC9C,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,sBAAsB,EAAE,qBAAqB,EAAE,CAAC;KACjD,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;KACb,CAAC;IACF,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,SAAS,CAAC,kBAAkB,CAAC;IAClE,aAAa,YAAa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAE9C;IAEF,kBAAkB,aAEhB;IAEF,mBAAmB,QAAS,MAAM,UAIhC;IAEF,uBAAuB,SAAU,MAAM,SAAS,KAAK,UA8BnD;IAEF,qBAAqB,SAAU,MAAM,SAAS,KAAK,UAajD;IAEF,kBAAkB,UAAW,KAAK,UAiBhC;IAEF,qBAAqB,SAAU,MAAM,SAAS,KAAK,UAcjD;IAEF,OAAO,MAAO,MAAM,KAAK,MAAM,aAE7B;IAEF,SAAS,SAAU,MAAM,SAAS,MAAM,aAGtC;IAEF,QAAQ,SAAU,MAAM,YAEtB;IAEF,WAAW,SAAU,MAAM,iEAEzB;IAEF,qBAAqB,kBAAmB,MAAM,YAM5C;IAEF,IAAI,cAAc,2BAgBjB;IAED,IAAI,mBAAmB,WAEtB;IAED,IAAI,iBAAiB,YAEpB;CAoSF"} \ No newline at end of file diff --git a/ui/vault-reporting/declarations/components/vault-reporting/global-lease.d.ts b/ui/vault-reporting/declarations/components/vault-reporting/global-lease.d.ts index 06e4406c82..04bcab467e 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/global-lease.d.ts +++ b/ui/vault-reporting/declarations/components/vault-reporting/global-lease.d.ts @@ -26,11 +26,15 @@ export interface GlobalLeaseSignature { } export default class GlobalLease extends Component { get percentage(): number; - get progressFillClass(): "ssu-global-lease__progress-fill--low" | "ssu-global-lease__progress-fill--medium" | "ssu-global-lease__progress-fill--high"; + get progressFillClass(): "" | "ssu-global-lease__progress-fill--exceeded"; get formattedCount(): string; get percentageString(): string; get hasData(): boolean | 0 | undefined; - get description(): "Snapshot of global lease count quota consumption" | undefined; - get linkUrl(): "https://developer.hashicorp.com/vault/docs/enterprise/lease-count-quotas" | undefined; + get description(): import("@ember/template").SafeString | undefined; + get linkUrl(): "https://developer.hashicorp.com/vault/tutorials/operations/resource-quotas#global-default-lease-count-quota" | undefined; + get alert(): { + color: 'warning' | 'neutral'; + description: string; + } | undefined; } //# sourceMappingURL=global-lease.d.ts.map \ No newline at end of file diff --git a/ui/vault-reporting/declarations/components/vault-reporting/global-lease.d.ts.map b/ui/vault-reporting/declarations/components/vault-reporting/global-lease.d.ts.map index 66cf84d27e..2af4468d48 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/global-lease.d.ts.map +++ b/ui/vault-reporting/declarations/components/vault-reporting/global-lease.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"global-lease.d.ts","sourceRoot":"","sources":["../../../src/components/vault-reporting/global-lease.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAQ3C,OAAO,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,4EAA4E,CAAC;AAE/H,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;QACZ;;;;;;;aAOK;QACL,KAAK,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;KAC1D,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS,CAAC,oBAAoB,CAAC;IACtE,IAAI,UAAU,WAIb;IAED,IAAI,iBAAiB,iIAQpB;IAED,IAAI,cAAc,WAWjB;IAED,IAAI,gBAAgB,WAEnB;IAED,IAAI,OAAO,4BAEV;IAED,IAAI,WAAW,mEAId;IAED,IAAI,OAAO,2FAIV;CAgHF"} \ No newline at end of file +{"version":3,"file":"global-lease.d.ts","sourceRoot":"","sources":["../../../src/components/vault-reporting/global-lease.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAS3C,OAAO,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,4EAA4E,CAAC;AAG/H,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;QACZ;;;;;;;aAOK;QACL,KAAK,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;KAC1D,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS,CAAC,oBAAoB,CAAC;IACtE,IAAI,UAAU,WAIb;IAED,IAAI,iBAAiB,qDAKpB;IAED,IAAI,cAAc,WAWjB;IAED,IAAI,gBAAgB,WAEnB;IAED,IAAI,OAAO,4BAEV;IAED,IAAI,WAAW,qDAMd;IAED,IAAI,OAAO,8HAIV;IAED,IAAI,KAAK,IACL;QAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GACrD,SAAS,CAgBZ;CAgIF"} \ No newline at end of file diff --git a/ui/vault-reporting/declarations/components/vault-reporting/horizontal-bar-chart.d.ts b/ui/vault-reporting/declarations/components/vault-reporting/horizontal-bar-chart.d.ts index 6ee490fadd..81fdee6a66 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/horizontal-bar-chart.d.ts +++ b/ui/vault-reporting/declarations/components/vault-reporting/horizontal-bar-chart.d.ts @@ -4,6 +4,7 @@ */ import './horizontal-bar-chart.scss'; import Component from '@glimmer/component'; +import { HdsLinkStandalone } from '@hashicorp/design-system-components/components'; import type { SimpleDatum } from '../../types/index.ts'; import type { HdsApplicationStateSignature } from '@hashicorp/design-system-components/components/hds/application-state/index'; export interface SSUReportingHorizontalBarChartSignature { @@ -11,7 +12,14 @@ export interface SSUReportingHorizontalBarChartSignature { data: SimpleDatum[]; title: string; description?: string; + /** Custom text for the link (defaults to "View all") */ + linkText?: string; + /** Icon to display with the link (defaults to "arrow-right") */ + linkIcon?: HdsLinkStandalone['icon']; + /** URL for the link - if not provided, no link will be shown */ linkUrl?: string; + /** Target for the link - defaults to "_self" */ + linkTarget?: '_blank' | '_self'; }; Blocks: { default: []; diff --git a/ui/vault-reporting/declarations/components/vault-reporting/horizontal-bar-chart.d.ts.map b/ui/vault-reporting/declarations/components/vault-reporting/horizontal-bar-chart.d.ts.map index 776fcaa21a..6807988d0b 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/horizontal-bar-chart.d.ts.map +++ b/ui/vault-reporting/declarations/components/vault-reporting/horizontal-bar-chart.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"horizontal-bar-chart.d.ts","sourceRoot":"","sources":["../../../src/components/vault-reporting/horizontal-bar-chart.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,6BAA6B,CAAC;AACrC,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAkB3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,4EAA4E,CAAC;AAE/H,MAAM,WAAW,uCAAuC;IACtD,IAAI,EAAE;QACJ,IAAI,EAAE,WAAW,EAAE,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;QACZ;;;;;;;aAOK;QACL,KAAK,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;KAC1D,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AACD,MAAM,CAAC,OAAO,OAAO,8BAA+B,SAAQ,SAAS,CAAC,uCAAuC,CAAC;IACnG,iBAAiB,SAAK;IAE/B,IAAI,OAAO,YAMV;IAED,IAAI,IAAI,kBAUP;IAED,IAAI,KAAK,WAIR;IAED,IAAI,SAAS,WAUZ;IAED,IAAI,OAAO,aAEV;IAED,IAAI,OAAO,aAEV;IAED,IAAI,WAAW,WAEd;IAED,IAAI,MAAM,aAET;IAED,IAAI,eAAe,WAElB;IAED,IAAI,qBAAqB,WAGxB;IAED,IAAI,kBAAkB,WAGrB;IAED,IAAI,WAAW,uBAId;IAED,IAAI,OAAO,uBAIV;IAED,SAAS,UAAW,MAAM,cAExB;IAEF,gBAAgB,gBAAiB,MAAM,UAErC;CAmKH"} \ No newline at end of file +{"version":3,"file":"horizontal-bar-chart.d.ts","sourceRoot":"","sources":["../../../src/components/vault-reporting/horizontal-bar-chart.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,6BAA6B,CAAC;AACrC,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAKL,iBAAiB,EAClB,MAAM,gDAAgD,CAAC;AAWxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,4EAA4E,CAAC;AAE/H,MAAM,WAAW,uCAAuC;IACtD,IAAI,EAAE;QACJ,IAAI,EAAE,WAAW,EAAE,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,wDAAwD;QACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gEAAgE;QAChE,QAAQ,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrC,gEAAgE;QAChE,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gDAAgD;QAChD,UAAU,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;KACjC,CAAC;IACF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;QACZ;;;;;;;aAOK;QACL,KAAK,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;KAC1D,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AACD,MAAM,CAAC,OAAO,OAAO,8BAA+B,SAAQ,SAAS,CAAC,uCAAuC,CAAC;IACnG,iBAAiB,SAAK;IAE/B,IAAI,OAAO,YAMV;IAED,IAAI,IAAI,kBAUP;IAED,IAAI,KAAK,WAIR;IAED,IAAI,SAAS,WAUZ;IAED,IAAI,OAAO,aAEV;IAED,IAAI,OAAO,aAEV;IAED,IAAI,WAAW,WAEd;IAED,IAAI,MAAM,aAET;IAED,IAAI,eAAe,WAElB;IAED,IAAI,qBAAqB,WAGxB;IAED,IAAI,kBAAkB,WAGrB;IAED,IAAI,WAAW,uBAId;IAED,IAAI,OAAO,uBAIV;IAED,SAAS,UAAW,MAAM,cAExB;IAEF,gBAAgB,gBAAiB,MAAM,UAErC;CAoKH"} \ No newline at end of file diff --git a/ui/vault-reporting/declarations/components/vault-reporting/views/dashboard.d.ts b/ui/vault-reporting/declarations/components/vault-reporting/views/dashboard.d.ts index 3870469f8b..d151731436 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/views/dashboard.d.ts +++ b/ui/vault-reporting/declarations/components/vault-reporting/views/dashboard.d.ts @@ -14,6 +14,7 @@ interface CounterBlock { suffix?: string; link?: string; emptyText?: string; + emptyLink?: string; } export interface SSUViewDashboardSignature { Args: { @@ -31,7 +32,7 @@ export default class SSUViewDashboard extends Component void; - getBarChartData: (map: Record) => SimpleDatum[]; + getBarChartData: (map: Record, exclude?: string[]) => SimpleDatum[]; get isVaultDedicated(): boolean; get kvSecretsTooltipMessage(): string; get counters(): CounterBlock[]; diff --git a/ui/vault-reporting/declarations/components/vault-reporting/views/dashboard.d.ts.map b/ui/vault-reporting/declarations/components/vault-reporting/views/dashboard.d.ts.map index b70aa8b72d..b3c3579af7 100644 --- a/ui/vault-reporting/declarations/components/vault-reporting/views/dashboard.d.ts.map +++ b/ui/vault-reporting/declarations/components/vault-reporting/views/dashboard.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../../src/components/vault-reporting/views/dashboard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,kBAAkB,CAAC;AAO1B,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAa5D,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE;QACJ,gBAAgB,EAAE,oBAAoB,CAAC;QACvC,gBAAgB,EAAE,OAAO,CAAC;KAC3B,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;KACb,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AACD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS,CAAC,yBAAyB,CAAC;IAEhF,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAG1B,eAAe,EAAE,MAAM,CAAM;IAG7B,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEJ,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,CAAC,MAAM,CAAC;IAKnE,YAAY,EAAE,MAAM,IAAI,CAWtB;IAEF,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,WAAW,EAAE,CAS7D;IAEF,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,uBAAuB,IAAI,MAAM,CAgBpC;IAED,IAAI,QAAQ,IAAI,YAAY,EAAE,CAmC7B;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;CAqLF"} \ No newline at end of file +{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../../src/components/vault-reporting/views/dashboard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,kBAAkB,CAAC;AAO1B,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAU5D,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE;QACJ,gBAAgB,EAAE,oBAAoB,CAAC;QACvC,gBAAgB,EAAE,OAAO,CAAC;KAC3B,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;KACb,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AACD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS,CAAC,yBAAyB,CAAC;IAEhF,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAG1B,eAAe,EAAE,MAAM,CAAM;IAG7B,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEJ,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,CAAC,MAAM,CAAC;IAKnE,YAAY,EAAE,MAAM,IAAI,CAUtB;IAEF,eAAe,EAAE,CACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,KACf,WAAW,EAAE,CAWhB;IAEF,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,uBAAuB,IAAI,MAAM,CAepC;IAED,IAAI,QAAQ,IAAI,YAAY,EAAE,CAgC7B;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;CAkNF"} \ No newline at end of file diff --git a/ui/vault-reporting/declarations/components/vault-reporting/views/secret-inventory.d.ts b/ui/vault-reporting/declarations/components/vault-reporting/views/secret-inventory.d.ts new file mode 100644 index 0000000000..5324b3789c --- /dev/null +++ b/ui/vault-reporting/declarations/components/vault-reporting/views/secret-inventory.d.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: BUSL-1.1 + */ +import { type FilterFieldDefinition } from '../filter-bar'; +import './secret-inventory.scss'; +import Component from '@glimmer/component'; +import { type Filter } from '@hashicorp/vault-reporting/utils/cel'; +export interface SecretInventorySignature { + Args: { + onFilterApplied: (value: string) => void; + filterString: string; + }; + Blocks: { + default: []; + }; + Element: HTMLElement; +} +export default class SecretInventory extends Component { + quickFilters: { + label: string; + applyFilter: () => void; + }[]; + filterFieldDefinitions: FilterFieldDefinition[]; + handleApplyFilters: (filters: Filter[]) => void; + get appliedFilters(): Filter[]; +} +//# sourceMappingURL=secret-inventory.d.ts.map \ No newline at end of file diff --git a/ui/vault-reporting/declarations/components/vault-reporting/views/secret-inventory.d.ts.map b/ui/vault-reporting/declarations/components/vault-reporting/views/secret-inventory.d.ts.map new file mode 100644 index 0000000000..36fa29c04a --- /dev/null +++ b/ui/vault-reporting/declarations/components/vault-reporting/views/secret-inventory.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"secret-inventory.d.ts","sourceRoot":"","sources":["../../../../src/components/vault-reporting/views/secret-inventory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAkB,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,yBAAyB,CAAC;AACjC,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAEL,KAAK,MAAM,EAEZ,MAAM,sCAAsC,CAAC;AAE9C,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE;QACJ,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QACzC,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF,MAAM,EAAE;QACN,OAAO,EAAE,EAAE,CAAC;KACb,CAAC;IAEF,OAAO,EAAE,WAAW,CAAC;CACtB;AAQD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,SAAS,CAAC,wBAAwB,CAAC;IAC9E,YAAY;;;QAyEV;IACF,sBAAsB,EAAE,qBAAqB,EAAE,CAgD7C;IACF,kBAAkB,YAAa,MAAM,EAAE,UAErC;IAEF,IAAI,cAAc,aAKjB;CA2EF"} \ No newline at end of file diff --git a/ui/vault-reporting/declarations/services/reporting-analytics.d.ts b/ui/vault-reporting/declarations/services/reporting-analytics.d.ts new file mode 100644 index 0000000000..54ada3f42f --- /dev/null +++ b/ui/vault-reporting/declarations/services/reporting-analytics.d.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: BUSL-1.1 + */ +import Service from '@ember/service'; +export default class ReportingAnalytics extends Service { + get analytics(): { + trackEvent: (event: string, properties?: object, options?: object) => void; + } | undefined; + trackEvent(event: string, properties?: object, options?: object): void; +} +declare module '@ember/service' { + interface Registry { + reportingAnalytics: ReportingAnalytics; + } +} +//# sourceMappingURL=reporting-analytics.d.ts.map \ No newline at end of file diff --git a/ui/vault-reporting/declarations/services/reporting-analytics.d.ts.map b/ui/vault-reporting/declarations/services/reporting-analytics.d.ts.map new file mode 100644 index 0000000000..a1626386e4 --- /dev/null +++ b/ui/vault-reporting/declarations/services/reporting-analytics.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"reporting-analytics.d.ts","sourceRoot":"","sources":["../../src/services/reporting-analytics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,OAAO,MAAM,gBAAgB,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,OAAO;IAGrD,IAAI,SAAS,IAEP;QACE,UAAU,EAAE,CACV,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,KACb,IAAI,CAAC;KACX,GACD,SAAS,CACd;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAUhE;AAGD,OAAO,QAAQ,gBAAgB,CAAC;IAC9B,UAAU,QAAQ;QAChB,kBAAkB,EAAE,kBAAkB,CAAC;KACxC;CACF"} \ No newline at end of file diff --git a/ui/vault-reporting/declarations/types/index.d.ts b/ui/vault-reporting/declarations/types/index.d.ts index c4868ea62e..9cf7a27a49 100644 --- a/ui/vault-reporting/declarations/types/index.d.ts +++ b/ui/vault-reporting/declarations/types/index.d.ts @@ -20,30 +20,33 @@ export declare enum REPLICATION_ENABLED_STATE { } export declare const REPLICATION_DISABLED_STATE = "disabled"; export interface UsageDashboardData { - auth_methods: Record; - kvv1_secrets: number; - kvv2_secrets: number; - lease_count_quotas: { - global_lease_count_quota: { + authMethods: Record; + leasesByAuthMethod: Record; + kvv1Secrets: number; + kvv2Secrets: number; + leaseCountQuotas: { + globalLeaseCountQuota: { capacity: number; count: number; name: string; }; - total_lease_count_quotas: number; + totalLeaseCountQuotas: number; }; namespaces: number; - secrets_sync: number; + secretSync: { + totalDestinations: number; + }; pki: { - total_issuers: number; - total_roles: number; + totalIssuers: number; + totalRoles: number; }; - replication_status: { - dr_primary: boolean; - dr_state: REPLICATION_ENABLED_STATE | typeof REPLICATION_DISABLED_STATE; - pr_primary: boolean; - pr_state: REPLICATION_ENABLED_STATE | typeof REPLICATION_DISABLED_STATE; + replicationStatus: { + drPrimary: boolean; + drState: REPLICATION_ENABLED_STATE | typeof REPLICATION_DISABLED_STATE; + prPrimary: boolean; + prState: REPLICATION_ENABLED_STATE | typeof REPLICATION_DISABLED_STATE; }; - secret_engines: Record; + secretEngines: Record; } export type getUsageDataFunction = () => Promise; export {}; diff --git a/ui/vault-reporting/declarations/types/index.d.ts.map b/ui/vault-reporting/declarations/types/index.d.ts.map index b52361548f..67b195b948 100644 --- a/ui/vault-reporting/declarations/types/index.d.ts.map +++ b/ui/vault-reporting/declarations/types/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,KAAK,aAAa,GAAG,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;AAChF,KAAK,aAAa,GAAG,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;AAChF,KAAK,iBAAiB,GAAG,GAAG,aAAa,IAAI,aAAa,EAAE,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,oBAAY,yBAAyB;IACnC,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,aAAa,kBAAkB;CAChC;AACD,eAAO,MAAM,0BAA0B,aAAa,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE;QAClB,wBAAwB,EAAE;YACxB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;QACF,wBAAwB,EAAE,MAAM,CAAC;KAClC,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE;QACH,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,kBAAkB,EAAE;QAClB,UAAU,EAAE,OAAO,CAAC;QACpB,QAAQ,EAAE,yBAAyB,GAAG,OAAO,0BAA0B,CAAC;QACxE,UAAU,EAAE,OAAO,CAAC;QACpB,QAAQ,EAAE,yBAAyB,GAAG,OAAO,0BAA0B,CAAC;KACzE,CAAC;IACF,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,KAAK,aAAa,GAAG,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;AAChF,KAAK,aAAa,GAAG,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;AAChF,KAAK,iBAAiB,GAAG,GAAG,aAAa,IAAI,aAAa,EAAE,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,oBAAY,yBAAyB;IACnC,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,aAAa,kBAAkB;CAChC;AACD,eAAO,MAAM,0BAA0B,aAAa,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE;QAChB,qBAAqB,EAAE;YACrB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;QACF,qBAAqB,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,GAAG,EAAE;QACH,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,iBAAiB,EAAE;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,yBAAyB,GAAG,OAAO,0BAA0B,CAAC;QACvE,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,yBAAyB,GAAG,OAAO,0BAA0B,CAAC;KACxE,CAAC;IACF,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC"} \ No newline at end of file diff --git a/ui/vault-reporting/declarations/utils/cel.d.ts b/ui/vault-reporting/declarations/utils/cel.d.ts new file mode 100644 index 0000000000..452e609e1f --- /dev/null +++ b/ui/vault-reporting/declarations/utils/cel.d.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: BUSL-1.1 + */ +export interface Filter { + field: string; + operator: '>=' | '<=' | '>' | '<' | '=' | '!=' | 'IN' | 'NOT IN'; + value: { + type: 'timestamp' | 'list' | 'string' | 'number'; + value: unknown; + }; +} +export declare const expressionToFilters: (expression: string) => Filter[]; +export declare const filtersToExpression: (filters: Filter[]) => string; +//# sourceMappingURL=cel.d.ts.map \ No newline at end of file diff --git a/ui/vault-reporting/declarations/utils/cel.d.ts.map b/ui/vault-reporting/declarations/utils/cel.d.ts.map new file mode 100644 index 0000000000..41061b0bf1 --- /dev/null +++ b/ui/vault-reporting/declarations/utils/cel.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"cel.d.ts","sourceRoot":"","sources":["../../src/utils/cel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsCH,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC;IACjE,KAAK,EAAE;QACL,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACjD,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAiCD,eAAO,MAAM,mBAAmB,eAAgB,MAAM,aA4BrD,CAAC;AAEF,eAAO,MAAM,mBAAmB,YAAa,MAAM,EAAE,WAepD,CAAC"} \ No newline at end of file diff --git a/ui/vault-reporting/dist/components/vault-reporting/base/title-row.js.map b/ui/vault-reporting/dist/components/vault-reporting/base/title-row.js.map index a038304bc1..d17d55b8c5 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/base/title-row.js.map +++ b/ui/vault-reporting/dist/components/vault-reporting/base/title-row.js.map @@ -1 +1 @@ -{"version":3,"file":"title-row.js","sources":["../../../../src/components/vault-reporting/base/title-row.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport {\n HdsTextDisplay,\n HdsTextBody,\n HdsLinkStandalone,\n} from '@hashicorp/design-system-components/components';\nimport './title-row.scss';\n\n/**\n * TitleRow Component\n *\n * A reusable component that displays a title with an optional description and link.\n * Used in dashboard cards to create consistent header styling.\n */\nexport interface TitleRowSignature {\n Args: {\n /** The main title text to display */\n title: string;\n /** Optional description text to display beneath the title */\n description?: string;\n /** Custom text for the link (defaults to \"View all\") */\n linkText?: string;\n /** Icon to display with the link (defaults to \"arrow-right\") */\n linkIcon?: HdsLinkStandalone['icon'];\n /** URL for the link - if not provided, no link will be shown */\n linkUrl?: string;\n /** Target for the link - defaults to \"_self\" */\n linkTarget?: '_blank' | '_self';\n };\n\n Blocks: {\n default: [];\n };\n\n Element: HTMLElement;\n}\n\nexport default class TitleRow extends Component {\n get hasLink() {\n return this.args.linkUrl;\n }\n\n get linkText() {\n return this.args.linkText || 'View all';\n }\n\n get linkUrl() {\n return this.args.linkUrl || '#';\n }\n\n get linkIcon() {\n return this.args.linkIcon || 'arrow-right';\n }\n\n get linkTarget() {\n return this.args.linkTarget || '_self';\n }\n\n \n}\n"],"names":["TitleRow","Component","hasLink","args","linkUrl","linkText","linkIcon","linkTarget","setComponentTemplate","precompileTemplate","strictMode","scope","HdsTextDisplay","HdsLinkStandalone","HdsTextBody"],"mappings":";;;;;AAAA;;;AAGC;AAuCc,MAAMA,iBAAiBC,SAAU,CAAA;EAC9C,IAAIC,OAAUA,GAAA;AACZ,IAAA,OAAO,IAAI,CAACC,IAAI,CAACC,OAAO;AAC1B;EAEA,IAAIC,QAAWA,GAAA;AACb,IAAA,OAAO,IAAI,CAACF,IAAI,CAACE,QAAQ,IAAI,UAAA;AAC/B;EAEA,IAAID,OAAUA,GAAA;AACZ,IAAA,OAAO,IAAI,CAACD,IAAI,CAACC,OAAO,IAAI,GAAA;AAC9B;EAEA,IAAIE,QAAWA,GAAA;AACb,IAAA,OAAO,IAAI,CAACH,IAAI,CAACG,QAAQ,IAAI,aAAA;AAC/B;EAEA,IAAIC,UAAaA,GAAA;AACf,IAAA,OAAO,IAAI,CAACJ,IAAI,CAACI,UAAU,IAAI,OAAA;AACjC;AAEA,EAAA;IAAAC,oBAAA,CAAAC,kBAAA,CA6BA,4uBAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;QAAAC,cAAA;QAAAC,iBAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"} \ No newline at end of file +{"version":3,"file":"title-row.js","sources":["../../../../src/components/vault-reporting/base/title-row.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport {\n HdsTextDisplay,\n HdsTextBody,\n HdsLinkStandalone,\n} from '@hashicorp/design-system-components/components';\nimport './title-row.scss';\nimport type { SafeString } from '@ember/template';\n\n/**\n * TitleRow Component\n *\n * A reusable component that displays a title with an optional description and link.\n * Used in dashboard cards to create consistent header styling.\n */\nexport interface TitleRowSignature {\n Args: {\n /** The main title text to display */\n title: string;\n /** Optional description text to display beneath the title */\n description?: string | SafeString;\n /** Custom text for the link (defaults to \"View all\") */\n linkText?: string;\n /** Icon to display with the link (defaults to \"arrow-right\") */\n linkIcon?: HdsLinkStandalone['icon'];\n /** URL for the link - if not provided, no link will be shown */\n linkUrl?: string;\n /** Target for the link - defaults to \"_self\" */\n linkTarget?: '_blank' | '_self';\n };\n\n Blocks: {\n default: [];\n };\n\n Element: HTMLElement;\n}\n\nexport default class TitleRow extends Component {\n get hasLink() {\n return this.args.linkUrl;\n }\n\n get linkText() {\n return this.args.linkText || 'View all';\n }\n\n get linkUrl() {\n return this.args.linkUrl || '#';\n }\n\n get linkIcon() {\n return this.args.linkIcon || 'arrow-right';\n }\n\n get linkTarget() {\n return this.args.linkTarget || '_self';\n }\n\n \n}\n"],"names":["TitleRow","Component","hasLink","args","linkUrl","linkText","linkIcon","linkTarget","setComponentTemplate","precompileTemplate","strictMode","scope","HdsTextDisplay","HdsLinkStandalone","HdsTextBody"],"mappings":";;;;;AAAA;;;AAGC;AAwCc,MAAMA,iBAAiBC,SAAU,CAAA;EAC9C,IAAIC,OAAUA,GAAA;AACZ,IAAA,OAAO,IAAI,CAACC,IAAI,CAACC,OAAO;AAC1B;EAEA,IAAIC,QAAWA,GAAA;AACb,IAAA,OAAO,IAAI,CAACF,IAAI,CAACE,QAAQ,IAAI,UAAA;AAC/B;EAEA,IAAID,OAAUA,GAAA;AACZ,IAAA,OAAO,IAAI,CAACD,IAAI,CAACC,OAAO,IAAI,GAAA;AAC9B;EAEA,IAAIE,QAAWA,GAAA;AACb,IAAA,OAAO,IAAI,CAACH,IAAI,CAACG,QAAQ,IAAI,aAAA;AAC/B;EAEA,IAAIC,UAAaA,GAAA;AACf,IAAA,OAAO,IAAI,CAACJ,IAAI,CAACI,UAAU,IAAI,OAAA;AACjC;AAEA,EAAA;IAAAC,oBAAA,CAAAC,kBAAA,CA6BA,4uBAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;QAAAC,cAAA;QAAAC,iBAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"} \ No newline at end of file diff --git a/ui/vault-reporting/dist/components/vault-reporting/cluster-replication.js b/ui/vault-reporting/dist/components/vault-reporting/cluster-replication.js index 52365a61bc..6196e79769 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/cluster-replication.js +++ b/ui/vault-reporting/dist/components/vault-reporting/cluster-replication.js @@ -1,7 +1,7 @@ import Component from '@glimmer/component'; import { HdsBadge, HdsTextBody, HdsCardContainer } from '@hashicorp/design-system-components/components'; import TitleRow from './base/title-row.js'; -import { REPLICATION_ENABLED_STATE } from '../../types/index.js'; +import { htmlSafe } from '@ember/template'; import { precompileTemplate } from '@ember/template-compilation'; import { setComponentTemplate } from '@ember/component'; @@ -10,36 +10,39 @@ import { setComponentTemplate } from '@ember/component'; * SPDX-License-Identifier: BUSL-1.1 */ class ClusterReplication extends Component { - get disasterRecoveryBadge() { - return Object.values(REPLICATION_ENABLED_STATE).includes(this.args.disasterRecoveryState) ? { - icon: 'check', - text: 'Enabled', - color: 'success' - } : { - icon: 'x', - text: 'Not set up', - color: 'neutral' + getState = (state = 'disabled') => { + return state; + }; + get isEmpty() { + return this.getState(this.args.disasterRecoveryState) === 'disabled' && this.getState(this.args.performanceState) === 'disabled'; + } + get description() { + if (this.isEmpty) { + return htmlSafe('Enable replication to replicate data across clusters.'); + } else { + return 'Status of disaster recovery and performance replication.'; + } + } + getIcon = (state = 'disabled') => { + const iconMap = { + disabled: 'x', + primary: 'check', + secondary: 'check', + bootstrapping: 'loading' }; - } - get performanceBadge() { - return Object.values(REPLICATION_ENABLED_STATE).includes(this.args.performanceState) ? { - icon: 'check', - text: 'Enabled', - color: 'success' - } : { - icon: 'x', - text: 'Not set up', - color: 'neutral' + return iconMap[state] || iconMap['disabled']; + }; + getColor = (state = 'disabled') => { + const colorMap = { + disabled: 'neutral', + primary: 'success', + secondary: 'success', + bootstrapping: 'neutral' }; - } - get disasterRecoveryRole() { - return this.args.isDisasterRecoveryPrimary ? 'Primary' : 'Secondary'; - } - get performanceRole() { - return this.args.isPerformancePrimary ? 'Primary' : 'Secondary'; - } + return colorMap[state] || colorMap['disabled']; + }; static { - setComponentTemplate(precompileTemplate("\n \n \n\n
\n \n Disaster Recovery\n \n \n\n \n {{this.disasterRecoveryRole}}\n \n
\n\n
\n \n Performance\n \n \n\n \n {{this.performanceRole}}\n \n
\n\n
\n ", { + setComponentTemplate(precompileTemplate("\n \n \n\n \n Disaster Recovery\n \n \n\n \n Performance\n \n \n\n \n ", { strictMode: true, scope: () => ({ HdsCardContainer, diff --git a/ui/vault-reporting/dist/components/vault-reporting/cluster-replication.js.map b/ui/vault-reporting/dist/components/vault-reporting/cluster-replication.js.map index b2ce382182..8a5bbd688c 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/cluster-replication.js.map +++ b/ui/vault-reporting/dist/components/vault-reporting/cluster-replication.js.map @@ -1 +1 @@ -{"version":3,"file":"cluster-replication.js","sources":["../../../src/components/vault-reporting/cluster-replication.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport {\n HdsCardContainer,\n HdsTextBody,\n HdsBadge,\n} from '@hashicorp/design-system-components/components';\nimport TitleRow from './base/title-row.gts';\nimport { REPLICATION_ENABLED_STATE } from '../../types/index.ts';\n\nimport './cluster-replication.scss';\n\nexport interface ClusterReplicationSignature {\n Args: {\n isDisasterRecoveryPrimary: boolean;\n disasterRecoveryState: REPLICATION_ENABLED_STATE | 'disabled';\n isPerformancePrimary: boolean;\n performanceState: REPLICATION_ENABLED_STATE | 'disabled';\n };\n\n Blocks: {\n default: [];\n };\n\n Element: HTMLElement;\n}\n\nexport default class ClusterReplication extends Component {\n get disasterRecoveryBadge(): {\n icon: 'check' | 'x';\n text: string;\n color: 'success' | 'neutral';\n } {\n return Object.values(REPLICATION_ENABLED_STATE as object).includes(\n this.args.disasterRecoveryState,\n )\n ? { icon: 'check', text: 'Enabled', color: 'success' }\n : { icon: 'x', text: 'Not set up', color: 'neutral' };\n }\n\n get performanceBadge(): {\n icon: 'check' | 'x';\n text: string;\n color: 'success' | 'neutral';\n } {\n return Object.values(REPLICATION_ENABLED_STATE as object).includes(\n this.args.performanceState,\n )\n ? { icon: 'check', text: 'Enabled', color: 'success' }\n : { icon: 'x', text: 'Not set up', color: 'neutral' };\n }\n\n get disasterRecoveryRole() {\n return this.args.isDisasterRecoveryPrimary ? 'Primary' : 'Secondary';\n }\n\n get performanceRole() {\n return this.args.isPerformancePrimary ? 'Primary' : 'Secondary';\n }\n\n \n}\n"],"names":["ClusterReplication","Component","disasterRecoveryBadge","Object","values","REPLICATION_ENABLED_STATE","includes","args","disasterRecoveryState","icon","text","color","performanceBadge","performanceState","disasterRecoveryRole","isDisasterRecoveryPrimary","performanceRole","isPerformancePrimary","setComponentTemplate","precompileTemplate","strictMode","scope","HdsCardContainer","TitleRow","HdsTextBody","HdsBadge"],"mappings":";;;;;;;AAAA;;;AAGC;AA4Bc,MAAMA,2BAA2BC,SAAU,CAAA;EACxD,IAAIC,qBAAAA,GAIF;AACA,IAAA,OAAOC,MAAO,CAAAC,MAAM,CAACC,yBAAmC,CAAA,CAAEC,QAAQ,CAChE,IAAI,CAACC,IAAI,CAACC,qBAAqB,CAE7B,GAAA;AAAEC,MAAAA,IAAM,EAAA,OAAA;AAASC,MAAAA,IAAM,EAAA,SAAA;AAAWC,MAAAA,KAAO,EAAA;AAAU,KACnD,GAAA;AAAEF,MAAAA,IAAM,EAAA,GAAA;AAAKC,MAAAA,IAAM,EAAA,YAAA;AAAcC,MAAAA,KAAO,EAAA;KAAU;AACxD;EAEA,IAAIC,gBAAAA,GAIF;AACA,IAAA,OAAOT,MAAO,CAAAC,MAAM,CAACC,yBAAmC,CAAA,CAAEC,QAAQ,CAChE,IAAI,CAACC,IAAI,CAACM,gBAAgB,CAExB,GAAA;AAAEJ,MAAAA,IAAM,EAAA,OAAA;AAASC,MAAAA,IAAM,EAAA,SAAA;AAAWC,MAAAA,KAAO,EAAA;AAAU,KACnD,GAAA;AAAEF,MAAAA,IAAM,EAAA,GAAA;AAAKC,MAAAA,IAAM,EAAA,YAAA;AAAcC,MAAAA,KAAO,EAAA;KAAU;AACxD;EAEA,IAAIG,oBAAuBA,GAAA;IACzB,OAAO,IAAI,CAACP,IAAI,CAACQ,yBAAyB,GAAG,SAAY,GAAA,WAAA;AAC3D;EAEA,IAAIC,eAAkBA,GAAA;IACpB,OAAO,IAAI,CAACT,IAAI,CAACU,oBAAoB,GAAG,SAAY,GAAA,WAAA;AACtD;AAEA,EAAA;IAAAC,oBAAA,CAAAC,kBAAA,CAoEA,mrDAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;QAAAC,gBAAA;QAAAC,QAAA;QAAAC,WAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"} \ No newline at end of file +{"version":3,"file":"cluster-replication.js","sources":["../../../src/components/vault-reporting/cluster-replication.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport {\n HdsCardContainer,\n HdsTextBody,\n HdsBadge,\n} from '@hashicorp/design-system-components/components';\nimport TitleRow from './base/title-row.gts';\nimport { REPLICATION_ENABLED_STATE } from '../../types/index.ts';\nimport type { IconName } from '@hashicorp/flight-icons/svg';\nimport { htmlSafe } from '@ember/template';\n\nimport './cluster-replication.scss';\n\nexport interface ClusterReplicationSignature {\n Args: {\n disasterRecoveryState: REPLICATION_ENABLED_STATE | 'disabled';\n performanceState: REPLICATION_ENABLED_STATE | 'disabled';\n };\n\n Blocks: {\n default: [];\n };\n\n Element: HTMLElement;\n}\n\nexport default class ClusterReplication extends Component {\n getState = (state: REPLICATION_ENABLED_STATE | 'disabled' = 'disabled') => {\n return state;\n };\n\n get isEmpty() {\n return (\n this.getState(this.args.disasterRecoveryState) === 'disabled' &&\n this.getState(this.args.performanceState) === 'disabled'\n );\n }\n\n get description() {\n if (this.isEmpty) {\n return htmlSafe(\n 'Enable replication to replicate data across clusters.',\n );\n } else {\n return 'Status of disaster recovery and performance replication.';\n }\n }\n\n getIcon = (state: REPLICATION_ENABLED_STATE | 'disabled' = 'disabled') => {\n const iconMap: Record = {\n disabled: 'x',\n primary: 'check',\n secondary: 'check',\n bootstrapping: 'loading',\n };\n return iconMap[state] || iconMap['disabled'];\n };\n\n getColor = (state: REPLICATION_ENABLED_STATE | 'disabled' = 'disabled') => {\n const colorMap: Record = {\n disabled: 'neutral',\n primary: 'success',\n secondary: 'success',\n bootstrapping: 'neutral',\n };\n return colorMap[state] || colorMap['disabled'];\n };\n\n \n}\n"],"names":["ClusterReplication","Component","getState","state","isEmpty","args","disasterRecoveryState","performanceState","description","htmlSafe","getIcon","iconMap","disabled","primary","secondary","bootstrapping","getColor","colorMap","setComponentTemplate","precompileTemplate","strictMode","scope","HdsCardContainer","TitleRow","HdsTextBody","HdsBadge"],"mappings":";;;;;;;AAAA;;;AAGC;AA4Bc,MAAMA,2BAA2BC,SAAU,CAAA;AACxDC,EAAAA,QAAA,GAAWA,CAACC,KAAmC,GAAa,UAAU,KAAA;AACpE,IAAA,OAAOA,KAAA;GACP;EAEF,IAAIC,OAAUA,GAAA;IACZ,OACE,IAAI,CAACF,QAAQ,CAAC,IAAI,CAACG,IAAI,CAACC,qBAAqB,CAAA,KAAM,cACnD,IAAI,CAACJ,QAAQ,CAAC,IAAI,CAACG,IAAI,CAACE,gBAAgB,CAAA,KAAM,UAChD;AACF;EAEA,IAAIC,WAAcA,GAAA;IAChB,IAAI,IAAI,CAACJ,OAAO,EAAE;MAChB,OAAOK,QACL,CAAA,8OAAA,CAAA;AAEJ,KAAO,MAAA;AACL,MAAA,OAAO,0DAAA;AACT;AACF;AAEAC,EAAAA,OAAA,GAAUA,CAACP,KAAmC,GAAa,UAAU,KAAA;AACnE,IAAA,MAAMQ,OAAoC,GAAA;AACxCC,MAAAA,QAAU,EAAA,GAAA;AACVC,MAAAA,OAAS,EAAA,OAAA;AACTC,MAAAA,SAAW,EAAA,OAAA;AACXC,MAAAA,aAAe,EAAA;KACjB;IACA,OAAOJ,OAAO,CAACR,KAAA,CAAM,IAAIQ,OAAO,CAAC,UAAW,CAAA;GAC5C;AAEFK,EAAAA,QAAA,GAAWA,CAACb,KAAmC,GAAa,UAAU,KAAA;AACpE,IAAA,MAAMc,QAA8C,GAAA;AAClDL,MAAAA,QAAU,EAAA,SAAA;AACVC,MAAAA,OAAS,EAAA,SAAA;AACTC,MAAAA,SAAW,EAAA,SAAA;AACXC,MAAAA,aAAe,EAAA;KACjB;IACA,OAAOE,QAAQ,CAACd,KAAA,CAAM,IAAIc,QAAQ,CAAC,UAAW,CAAA;GAC9C;AAEF,EAAA;IAAAC,oBAAA,CAAAC,kBAAA,CAwCA,8iCAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;QAAAC,gBAAA;QAAAC,QAAA;QAAAC,WAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"} \ No newline at end of file diff --git a/ui/vault-reporting/dist/components/vault-reporting/counter.js b/ui/vault-reporting/dist/components/vault-reporting/counter.js index 254bc7002a..0dbcdc54e8 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/counter.js +++ b/ui/vault-reporting/dist/components/vault-reporting/counter.js @@ -23,14 +23,14 @@ class SSUReportingCounter extends Component { get icon() { return this.args.icon || 'info'; } - get linkColor() { - if (this.shouldShowEmptyState) { - return 'secondary'; + get link() { + if (this.shouldShowEmptyState && this.args.emptyLink) { + return this.args.emptyLink; } - return 'primary'; + return this.args.link; } static { - setComponentTemplate(precompileTemplate("\n
\n
\n {{@title}}\n {{#if @tooltipMessage}}\n \n \n \n {{/if}}\n \n
\n\n \n {{#if @link}}\n {{this.count}}\n \n {{else}}\n {{this.count}}\n {{/if}}\n \n
\n ", { + setComponentTemplate(precompileTemplate("\n
\n
\n {{@title}}\n {{#if @tooltipMessage}}\n \n \n \n {{/if}}\n \n
\n\n \n {{#if this.link}}\n {{this.count}}\n \n {{else}}\n {{this.count}}\n {{/if}}\n \n
\n ", { strictMode: true, scope: () => ({ HdsTextBody, diff --git a/ui/vault-reporting/dist/components/vault-reporting/counter.js.map b/ui/vault-reporting/dist/components/vault-reporting/counter.js.map index 06fc9eae96..9e04bf90c0 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/counter.js.map +++ b/ui/vault-reporting/dist/components/vault-reporting/counter.js.map @@ -1 +1 @@ -{"version":3,"file":"counter.js","sources":["../../../src/components/vault-reporting/counter.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport {\n HdsTextBody,\n HdsIcon,\n HdsTooltipButton,\n HdsLinkInline,\n} from '@hashicorp/design-system-components/components';\nimport type { IconName } from '@hashicorp/flight-icons/svg';\n\nimport './counter.scss';\n\nexport interface SSUReportingCounterSignature {\n Args: {\n count: number;\n title: string;\n tooltipMessage?: string;\n icon?: IconName;\n suffix?: string;\n link?: string;\n emptyText?: string;\n };\n\n Blocks: {\n default: [];\n };\n\n Element: HTMLElement;\n}\nexport default class SSUReportingCounter extends Component {\n get shouldShowEmptyState() {\n return this.args.count === 0 && this.args.emptyText;\n }\n get count() {\n if (this.shouldShowEmptyState) {\n return this.args.emptyText;\n }\n\n if (this.args.suffix) {\n return `${this.args.count} ${this.args.suffix}`;\n }\n\n return this.args.count;\n }\n\n get icon() {\n return this.args.icon || 'info';\n }\n\n get linkColor() {\n if (this.shouldShowEmptyState) {\n return 'secondary';\n }\n return 'primary';\n }\n\n \n}\n"],"names":["SSUReportingCounter","Component","shouldShowEmptyState","args","count","emptyText","suffix","icon","linkColor","setComponentTemplate","precompileTemplate","strictMode","scope","HdsTextBody","HdsTooltipButton","HdsIcon","HdsLinkInline"],"mappings":";;;;;AAAA;;;AAGC;AA8Bc,MAAMA,4BAA4BC,SAAU,CAAA;EACzD,IAAIC,oBAAuBA,GAAA;AACzB,IAAA,OAAO,IAAI,CAACC,IAAI,CAACC,KAAK,KAAK,CAAA,IAAK,IAAI,CAACD,IAAI,CAACE,SAAS;AACrD;EACA,IAAID,KAAQA,GAAA;IACV,IAAI,IAAI,CAACF,oBAAoB,EAAE;AAC7B,MAAA,OAAO,IAAI,CAACC,IAAI,CAACE,SAAS;AAC5B;AAEA,IAAA,IAAI,IAAI,CAACF,IAAI,CAACG,MAAM,EAAE;AACpB,MAAA,OAAO,CAAG,EAAA,IAAI,CAACH,IAAI,CAACC,KAAK,CAAI,CAAA,EAAA,IAAI,CAACD,IAAI,CAACG,MAAM,CAAE,CAAA;AACjD;AAEA,IAAA,OAAO,IAAI,CAACH,IAAI,CAACC,KAAK;AACxB;EAEA,IAAIG,IAAOA,GAAA;AACT,IAAA,OAAO,IAAI,CAACJ,IAAI,CAACI,IAAI,IAAI,MAAA;AAC3B;EAEA,IAAIC,SAAYA,GAAA;IACd,IAAI,IAAI,CAACN,oBAAoB,EAAE;AAC7B,MAAA,OAAO,WAAA;AACT;AACA,IAAA,OAAO,SAAA;AACT;AAEA,EAAA;IAAAO,oBAAA,CAAAC,kBAAA,CA+BA,uzBAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;QAAAC,WAAA;QAAAC,gBAAA;QAAAC,OAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"} \ No newline at end of file +{"version":3,"file":"counter.js","sources":["../../../src/components/vault-reporting/counter.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport {\n HdsTextBody,\n HdsIcon,\n HdsTooltipButton,\n HdsLinkInline,\n} from '@hashicorp/design-system-components/components';\nimport type { IconName } from '@hashicorp/flight-icons/svg';\n\nimport './counter.scss';\n\nexport interface SSUReportingCounterSignature {\n Args: {\n count: number;\n title: string;\n tooltipMessage?: string;\n icon?: IconName;\n suffix?: string;\n link?: string;\n emptyText?: string;\n emptyLink?: string;\n };\n\n Blocks: {\n default: [];\n };\n\n Element: HTMLElement;\n}\nexport default class SSUReportingCounter extends Component {\n get shouldShowEmptyState() {\n return this.args.count === 0 && this.args.emptyText;\n }\n\n get count() {\n if (this.shouldShowEmptyState) {\n return this.args.emptyText;\n }\n\n if (this.args.suffix) {\n return `${this.args.count} ${this.args.suffix}`;\n }\n\n return this.args.count;\n }\n\n get icon() {\n return this.args.icon || 'info';\n }\n\n get link() {\n if (this.shouldShowEmptyState && this.args.emptyLink) {\n return this.args.emptyLink;\n }\n return this.args.link;\n }\n\n \n}\n"],"names":["SSUReportingCounter","Component","shouldShowEmptyState","args","count","emptyText","suffix","icon","link","emptyLink","setComponentTemplate","precompileTemplate","strictMode","scope","HdsTextBody","HdsTooltipButton","HdsIcon","HdsLinkInline"],"mappings":";;;;;AAAA;;;AAGC;AA+Bc,MAAMA,4BAA4BC,SAAU,CAAA;EACzD,IAAIC,oBAAuBA,GAAA;AACzB,IAAA,OAAO,IAAI,CAACC,IAAI,CAACC,KAAK,KAAK,CAAA,IAAK,IAAI,CAACD,IAAI,CAACE,SAAS;AACrD;EAEA,IAAID,KAAQA,GAAA;IACV,IAAI,IAAI,CAACF,oBAAoB,EAAE;AAC7B,MAAA,OAAO,IAAI,CAACC,IAAI,CAACE,SAAS;AAC5B;AAEA,IAAA,IAAI,IAAI,CAACF,IAAI,CAACG,MAAM,EAAE;AACpB,MAAA,OAAO,CAAG,EAAA,IAAI,CAACH,IAAI,CAACC,KAAK,CAAI,CAAA,EAAA,IAAI,CAACD,IAAI,CAACG,MAAM,CAAE,CAAA;AACjD;AAEA,IAAA,OAAO,IAAI,CAACH,IAAI,CAACC,KAAK;AACxB;EAEA,IAAIG,IAAOA,GAAA;AACT,IAAA,OAAO,IAAI,CAACJ,IAAI,CAACI,IAAI,IAAI,MAAA;AAC3B;EAEA,IAAIC,IAAOA,GAAA;IACT,IAAI,IAAI,CAACN,oBAAoB,IAAI,IAAI,CAACC,IAAI,CAACM,SAAS,EAAE;AACpD,MAAA,OAAO,IAAI,CAACN,IAAI,CAACM,SAAS;AAC5B;AACA,IAAA,OAAO,IAAI,CAACN,IAAI,CAACK,IAAI;AACvB;AAEA,EAAA;IAAAE,oBAAA,CAAAC,kBAAA,CAqCA,o6BAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;QAAAC,WAAA;QAAAC,gBAAA;QAAAC,OAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"} \ No newline at end of file diff --git a/ui/vault-reporting/dist/components/vault-reporting/dashboard/export.js b/ui/vault-reporting/dist/components/vault-reporting/dashboard/export.js index 88c3bd2e8d..838618965f 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/dashboard/export.js +++ b/ui/vault-reporting/dist/components/vault-reporting/dashboard/export.js @@ -25,7 +25,7 @@ class DashboardExport extends Component { get dataAsDownloadableCSVString() { const headers = ['Metric', 'Count/Breakdown']; // Manually define rows as looping through the data does not leave the most legible structure - const rows = [headers, ['Child Namespaces', this.args?.data?.namespaces || 0], ['Total KV Secrets', (this.args.data?.kvv1_secrets || 0) + (this.args.data?.kvv2_secrets || 0)], ['KV V1 Secrets', this.args.data?.kvv1_secrets || 0], ['KV V2 Secrets', this.args.data?.kvv2_secrets || 0], ['Secret Syncs', this.args.data?.secrets_sync || 0], ['PKI Roles', this.args.data?.pki?.total_roles || 0], ...this.#getNestedRows(this.args.data?.secret_engines || {}, 'Secret Engine'), ...this.#getNestedRows(this.args.data?.auth_methods || {}, 'Auth Method'), ['Global Lease Count', this.args.data?.lease_count_quotas.global_lease_count_quota.count || 0], ['Global Lease Quota', this.args.data?.lease_count_quotas.global_lease_count_quota.capacity || 0], ['Cluster Disaster Recovery', this.args?.data?.replication_status.dr_state || '-'], ['Cluster Disaster Recovery Primary', this.args?.data?.replication_status.dr_primary ?? '-'], ['Cluster Performance', this.args?.data?.replication_status.pr_state || '-'], ['Cluster Performance Primary', this.args?.data?.replication_status.pr_primary ?? '-']]; + const rows = [headers, ['Child Namespaces', this.args?.data?.namespaces || 0], ['Total KV Secrets', (this.args.data?.kvv1Secrets || 0) + (this.args.data?.kvv2Secrets || 0)], ['KV V1 Secrets', this.args.data?.kvv1Secrets || 0], ['KV V2 Secrets', this.args.data?.kvv2Secrets || 0], ['Secret Syncs', this.args.data?.secretSync?.totalDestinations || 0], ['PKI Roles', this.args.data?.pki?.totalRoles || 0], ...this.#getNestedRows(this.args.data?.secretEngines || {}, 'Secret Engine'), ...this.#getNestedRows(this.args.data?.authMethods || {}, 'Auth Method'), ['Global Lease Count', this.args.data?.leaseCountQuotas.globalLeaseCountQuota.count || 0], ['Global Lease Quota', this.args.data?.leaseCountQuotas.globalLeaseCountQuota.capacity || 0], ['Cluster Disaster Recovery', this.args?.data?.replicationStatus.drState || '-'], ['Cluster Disaster Recovery Primary', this.args?.data?.replicationStatus.drPrimary ?? '-'], ['Cluster Performance', this.args?.data?.replicationStatus.prState || '-'], ['Cluster Performance Primary', this.args?.data?.replicationStatus.prPrimary ?? '-']]; // Escape double quotes, quote cell content and separate with comma const csvString = rows.map(row => row.map(cell => { const escaped = String(cell).replace(/"/g, '""'); diff --git a/ui/vault-reporting/dist/components/vault-reporting/dashboard/export.js.map b/ui/vault-reporting/dist/components/vault-reporting/dashboard/export.js.map index f3cd299fae..7e024f16a8 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/dashboard/export.js.map +++ b/ui/vault-reporting/dist/components/vault-reporting/dashboard/export.js.map @@ -1 +1 @@ -{"version":3,"file":"export.js","sources":["../../../../src/components/vault-reporting/dashboard/export.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport { HdsDropdown } from '@hashicorp/design-system-components/components';\n\nimport type { UsageDashboardData } from '../../../types';\n\nexport interface DashboardExportSignature {\n Args: {\n data?: UsageDashboardData;\n };\n\n Blocks: {\n default: [];\n };\n Element: HTMLElement;\n}\n\nexport default class DashboardExport extends Component {\n #getNestedRows(records: Record, prefix: string = '') {\n return Object.entries(records).map(([key, value]) => {\n return [`${prefix} ${key}`, value];\n });\n }\n\n get dataAsDownloadableJSONString() {\n const { data } = this.args;\n const file = new Blob([JSON.stringify(data, null, ' ')], {\n type: 'application/json',\n });\n return URL.createObjectURL(file);\n }\n\n get dataAsDownloadableCSVString() {\n const headers = ['Metric', 'Count/Breakdown'];\n // Manually define rows as looping through the data does not leave the most legible structure\n const rows = [\n headers,\n ['Child Namespaces', this.args?.data?.namespaces || 0],\n [\n 'Total KV Secrets',\n (this.args.data?.kvv1_secrets || 0) +\n (this.args.data?.kvv2_secrets || 0),\n ],\n ['KV V1 Secrets', this.args.data?.kvv1_secrets || 0],\n ['KV V2 Secrets', this.args.data?.kvv2_secrets || 0],\n ['Secret Syncs', this.args.data?.secrets_sync || 0],\n ['PKI Roles', this.args.data?.pki?.total_roles || 0],\n ...this.#getNestedRows(\n this.args.data?.secret_engines || {},\n 'Secret Engine',\n ),\n ...this.#getNestedRows(this.args.data?.auth_methods || {}, 'Auth Method'),\n [\n 'Global Lease Count',\n this.args.data?.lease_count_quotas.global_lease_count_quota.count || 0,\n ],\n [\n 'Global Lease Quota',\n this.args.data?.lease_count_quotas.global_lease_count_quota.capacity ||\n 0,\n ],\n [\n 'Cluster Disaster Recovery',\n this.args?.data?.replication_status.dr_state || '-',\n ],\n [\n 'Cluster Disaster Recovery Primary',\n this.args?.data?.replication_status.dr_primary ?? '-',\n ],\n [\n 'Cluster Performance',\n this.args?.data?.replication_status.pr_state || '-',\n ],\n [\n 'Cluster Performance Primary',\n this.args?.data?.replication_status.pr_primary ?? '-',\n ],\n ];\n // Escape double quotes, quote cell content and separate with comma\n const csvString = rows\n .map((row) =>\n row\n .map((cell) => {\n const escaped = String(cell).replace(/\"/g, '\"\"');\n return `\"${escaped}\"`;\n })\n .join(','),\n )\n .join('\\r\\n');\n\n const blob = new Blob([csvString], { type: 'text/csv' });\n\n return URL.createObjectURL(blob);\n }\n\n \n}\n"],"names":["DashboardExport","Component","#getNestedRows","records","prefix","Object","entries","map","key","value","dataAsDownloadableJSONString","data","args","file","Blob","JSON","stringify","type","URL","createObjectURL","dataAsDownloadableCSVString","headers","rows","namespaces","kvv1_secrets","kvv2_secrets","secrets_sync","pki","total_roles","secret_engines","auth_methods","lease_count_quotas","global_lease_count_quota","count","capacity","replication_status","dr_state","dr_primary","pr_state","pr_primary","csvString","row","cell","escaped","String","replace","join","blob","setComponentTemplate","precompileTemplate","strictMode","scope","HdsDropdown"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"export.js","sources":["../../../../src/components/vault-reporting/dashboard/export.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport { HdsDropdown } from '@hashicorp/design-system-components/components';\n\nimport type { UsageDashboardData } from '../../../types';\n\nexport interface DashboardExportSignature {\n Args: {\n data?: UsageDashboardData;\n };\n\n Blocks: {\n default: [];\n };\n Element: HTMLElement;\n}\n\nexport default class DashboardExport extends Component {\n #getNestedRows(records: Record, prefix: string = '') {\n return Object.entries(records).map(([key, value]) => {\n return [`${prefix} ${key}`, value];\n });\n }\n\n get dataAsDownloadableJSONString() {\n const { data } = this.args;\n const file = new Blob([JSON.stringify(data, null, ' ')], {\n type: 'application/json',\n });\n return URL.createObjectURL(file);\n }\n\n get dataAsDownloadableCSVString() {\n const headers = ['Metric', 'Count/Breakdown'];\n // Manually define rows as looping through the data does not leave the most legible structure\n const rows = [\n headers,\n ['Child Namespaces', this.args?.data?.namespaces || 0],\n [\n 'Total KV Secrets',\n (this.args.data?.kvv1Secrets || 0) + (this.args.data?.kvv2Secrets || 0),\n ],\n ['KV V1 Secrets', this.args.data?.kvv1Secrets || 0],\n ['KV V2 Secrets', this.args.data?.kvv2Secrets || 0],\n ['Secret Syncs', this.args.data?.secretSync?.totalDestinations || 0],\n ['PKI Roles', this.args.data?.pki?.totalRoles || 0],\n ...this.#getNestedRows(\n this.args.data?.secretEngines || {},\n 'Secret Engine',\n ),\n ...this.#getNestedRows(this.args.data?.authMethods || {}, 'Auth Method'),\n [\n 'Global Lease Count',\n this.args.data?.leaseCountQuotas.globalLeaseCountQuota.count || 0,\n ],\n [\n 'Global Lease Quota',\n this.args.data?.leaseCountQuotas.globalLeaseCountQuota.capacity || 0,\n ],\n [\n 'Cluster Disaster Recovery',\n this.args?.data?.replicationStatus.drState || '-',\n ],\n [\n 'Cluster Disaster Recovery Primary',\n this.args?.data?.replicationStatus.drPrimary ?? '-',\n ],\n [\n 'Cluster Performance',\n this.args?.data?.replicationStatus.prState || '-',\n ],\n [\n 'Cluster Performance Primary',\n this.args?.data?.replicationStatus.prPrimary ?? '-',\n ],\n ];\n // Escape double quotes, quote cell content and separate with comma\n const csvString = rows\n .map((row) =>\n row\n .map((cell) => {\n const escaped = String(cell).replace(/\"/g, '\"\"');\n return `\"${escaped}\"`;\n })\n .join(','),\n )\n .join('\\r\\n');\n\n const blob = new Blob([csvString], { type: 'text/csv' });\n\n return URL.createObjectURL(blob);\n }\n\n \n}\n"],"names":["DashboardExport","Component","#getNestedRows","records","prefix","Object","entries","map","key","value","dataAsDownloadableJSONString","data","args","file","Blob","JSON","stringify","type","URL","createObjectURL","dataAsDownloadableCSVString","headers","rows","namespaces","kvv1Secrets","kvv2Secrets","secretSync","totalDestinations","pki","totalRoles","secretEngines","authMethods","leaseCountQuotas","globalLeaseCountQuota","count","capacity","replicationStatus","drState","drPrimary","prState","prPrimary","csvString","row","cell","escaped","String","replace","join","blob","setComponentTemplate","precompileTemplate","strictMode","scope","HdsDropdown"],"mappings":"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"} \ No newline at end of file diff --git a/ui/vault-reporting/dist/components/vault-reporting/global-lease.js b/ui/vault-reporting/dist/components/vault-reporting/global-lease.js index 2dd3036240..c12fe0900d 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/global-lease.js +++ b/ui/vault-reporting/dist/components/vault-reporting/global-lease.js @@ -1,7 +1,8 @@ import Component from '@glimmer/component'; -import { HdsApplicationState, HdsTextDisplay, HdsCardContainer } from '@hashicorp/design-system-components/components'; +import { HdsApplicationState, HdsAlert, HdsTextDisplay, HdsCardContainer } from '@hashicorp/design-system-components/components'; import TitleRow from './base/title-row.js'; import cssCustomProperty from '../../modifiers/css-custom-property.js'; +import { htmlSafe } from '@ember/template'; import { precompileTemplate } from '@ember/template-compilation'; import { setComponentTemplate } from '@ember/component'; @@ -18,13 +19,10 @@ class GlobalLease extends Component { return Math.round(Math.min(count / quota * 100, 100)); } get progressFillClass() { - if (this.percentage < 50) { - return 'ssu-global-lease__progress-fill--low'; + if (this.percentage >= 100) { + return 'ssu-global-lease__progress-fill--exceeded'; } - if (this.percentage < 100) { - return 'ssu-global-lease__progress-fill--medium'; - } - return 'ssu-global-lease__progress-fill--high'; + return ''; } get formattedCount() { const formatter = new Intl.NumberFormat('en-US', { @@ -47,22 +45,37 @@ class GlobalLease extends Component { } get description() { if (this.hasData) { - return 'Snapshot of global lease count quota consumption'; + return htmlSafe('Total number of active leases for this quota.'); } } get linkUrl() { if (this.hasData) { - return 'https://developer.hashicorp.com/vault/docs/enterprise/lease-count-quotas'; + return 'https://developer.hashicorp.com/vault/tutorials/operations/resource-quotas#global-default-lease-count-quota'; + } + } + get alert() { + if (this.percentage >= 100) { + return { + color: 'warning', + description: 'Global lease quota limit reached. If lease creation is blocked, reduce usage or increase the limit.' + }; + } + if (this.percentage >= 95) { + return { + color: 'neutral', + description: 'Approaching quota limit. Reduce usage or increase the lease limit to avoid blocking new leases.' + }; } } static { - setComponentTemplate(precompileTemplate("\n \n \n {{#if this.hasData}}\n {{this.percentage}}%\n\n
\n
\n
\n
\n \n \n {{this.formattedCount}}\n \n \n
\n {{else}}\n\n \n {{#if (has-block \"empty\")}}\n {{yield A to=\"empty\"}}\n {{else}}\n \n \n\n \n \n \n {{/if}}\n \n {{/if}}\n\n
\n ", { + setComponentTemplate(precompileTemplate("\n \n \n {{#if this.hasData}}\n {{this.percentage}}%\n\n {{#if this.alert}}\n \n {{this.alert.description}}\n \n {{/if}}\n\n
\n
\n
\n
\n \n \n {{this.formattedCount}}\n \n \n
\n {{else}}\n\n \n {{#if (has-block \"empty\")}}\n {{yield A to=\"empty\"}}\n {{else}}\n \n\n \n \n \n {{/if}}\n \n {{/if}}\n\n
\n ", { strictMode: true, scope: () => ({ HdsCardContainer, cssCustomProperty, TitleRow, HdsTextDisplay, + HdsAlert, HdsApplicationState }) }), this); diff --git a/ui/vault-reporting/dist/components/vault-reporting/global-lease.js.map b/ui/vault-reporting/dist/components/vault-reporting/global-lease.js.map index 8bd1fb9f61..810a684f7b 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/global-lease.js.map +++ b/ui/vault-reporting/dist/components/vault-reporting/global-lease.js.map @@ -1 +1 @@ -{"version":3,"file":"global-lease.js","sources":["../../../src/components/vault-reporting/global-lease.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport {\n HdsCardContainer,\n HdsTextDisplay,\n HdsApplicationState,\n} from '@hashicorp/design-system-components/components';\nimport TitleRow from './base/title-row.gts';\n\nimport './global-lease.scss';\nimport cssCustomProperty from '../../modifiers/css-custom-property.ts';\nimport type { HdsApplicationStateSignature } from '@hashicorp/design-system-components/components/hds/application-state/index';\n\nexport interface GlobalLeaseSignature {\n Args: {\n count?: number;\n quota?: number;\n };\n\n Blocks: {\n default: [];\n /** We optionally yield application state to allow for overrides on empty state eg:\n * \n * <:empty as |A|>\n * \n * \n * \n * \n * */\n empty: HdsApplicationStateSignature['Blocks']['default'];\n };\n\n Element: HTMLElement;\n}\n\nexport default class GlobalLease extends Component {\n get percentage() {\n const { count = 0, quota = 0 } = this.args;\n\n return Math.round(Math.min((count / quota) * 100, 100));\n }\n\n get progressFillClass() {\n if (this.percentage < 50) {\n return 'ssu-global-lease__progress-fill--low';\n }\n if (this.percentage < 100) {\n return 'ssu-global-lease__progress-fill--medium';\n }\n return 'ssu-global-lease__progress-fill--high';\n }\n\n get formattedCount() {\n const formatter = new Intl.NumberFormat('en-US', {\n notation: 'compact',\n compactDisplay: 'short',\n });\n\n const { count = 0, quota = 0 } = this.args;\n const formattedCount = formatter.format(count);\n const formattedTotal = formatter.format(quota);\n\n return `${formattedCount} / ${formattedTotal}`;\n }\n\n get percentageString() {\n return `${this.percentage}%`;\n }\n\n get hasData() {\n return this.args.quota && typeof this.args.quota === 'number';\n }\n\n get description() {\n if (this.hasData) {\n return 'Snapshot of global lease count quota consumption';\n }\n }\n\n get linkUrl() {\n if (this.hasData) {\n return 'https://developer.hashicorp.com/vault/docs/enterprise/lease-count-quotas';\n }\n }\n\n \n}\n"],"names":["GlobalLease","Component","percentage","count","quota","args","Math","round","min","progressFillClass","formattedCount","formatter","Intl","NumberFormat","notation","compactDisplay","format","formattedTotal","percentageString","hasData","description","linkUrl","setComponentTemplate","precompileTemplate","strictMode","scope","HdsCardContainer","cssCustomProperty","TitleRow","HdsTextDisplay","HdsApplicationState"],"mappings":";;;;;;;AAAA;;;AAGC;AAoCc,MAAMA,oBAAoBC,SAAU,CAAA;EACjD,IAAIC,UAAaA,GAAA;IACf,MAAM;AAAEC,MAAAA,KAAQ,GAAA,CAAC;AAAEC,MAAAA,KAAA,GAAQ;KAAG,GAAG,IAAI,CAACC,IAAI;AAE1C,IAAA,OAAOC,IAAA,CAAKC,KAAK,CAACD,IAAK,CAAAE,GAAG,CAAEL,KAAA,GAAQC,KAAK,GAAI,GAAK,EAAA,GAAA,CAAA,CAAA;AACpD;EAEA,IAAIK,iBAAoBA,GAAA;AACtB,IAAA,IAAI,IAAI,CAACP,UAAU,GAAG,EAAI,EAAA;AACxB,MAAA,OAAO,sCAAA;AACT;AACA,IAAA,IAAI,IAAI,CAACA,UAAU,GAAG,GAAK,EAAA;AACzB,MAAA,OAAO,yCAAA;AACT;AACA,IAAA,OAAO,uCAAA;AACT;EAEA,IAAIQ,cAAiBA,GAAA;IACnB,MAAMC,SAAY,GAAA,IAAIC,IAAK,CAAAC,YAAY,CAAC,OAAS,EAAA;AAC/CC,MAAAA,QAAU,EAAA,SAAA;AACVC,MAAAA,cAAgB,EAAA;AAClB,KAAA,CAAA;IAEA,MAAM;AAAEZ,MAAAA,KAAQ,GAAA,CAAC;AAAEC,MAAAA,KAAA,GAAQ;KAAG,GAAG,IAAI,CAACC,IAAI;AAC1C,IAAA,MAAMK,cAAA,GAAiBC,SAAU,CAAAK,MAAM,CAACb,KAAA,CAAA;AACxC,IAAA,MAAMc,cAAA,GAAiBN,SAAU,CAAAK,MAAM,CAACZ,KAAA,CAAA;AAExC,IAAA,OAAO,CAAGM,EAAAA,cAAA,CAAoBO,GAAAA,EAAAA,eAAgB,CAAA;AAChD;EAEA,IAAIC,gBAAmBA,GAAA;AACrB,IAAA,OAAO,CAAG,EAAA,IAAI,CAAChB,UAAU,CAAG,CAAA,CAAA;AAC9B;EAEA,IAAIiB,OAAUA,GAAA;AACZ,IAAA,OAAO,IAAI,CAACd,IAAI,CAACD,KAAK,IAAI,OAAO,IAAI,CAACC,IAAI,CAACD,KAAK,KAAK,QAAA;AACvD;EAEA,IAAIgB,WAAcA,GAAA;IAChB,IAAI,IAAI,CAACD,OAAO,EAAE;AAChB,MAAA,OAAO,kDAAA;AACT;AACF;EAEA,IAAIE,OAAUA,GAAA;IACZ,IAAI,IAAI,CAACF,OAAO,EAAE;AAChB,MAAA,OAAO,0EAAA;AACT;AACF;AAEA,EAAA;IAAAG,oBAAA,CAAAC,kBAAA,CAuEA,g5DAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;QAAAC,gBAAA;QAAAC,iBAAA;QAAAC,QAAA;QAAAC,cAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"} \ No newline at end of file +{"version":3,"file":"global-lease.js","sources":["../../../src/components/vault-reporting/global-lease.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport {\n HdsCardContainer,\n HdsTextDisplay,\n HdsApplicationState,\n HdsAlert,\n} from '@hashicorp/design-system-components/components';\nimport TitleRow from './base/title-row.gts';\n\nimport './global-lease.scss';\nimport cssCustomProperty from '../../modifiers/css-custom-property.ts';\nimport type { HdsApplicationStateSignature } from '@hashicorp/design-system-components/components/hds/application-state/index';\nimport { htmlSafe } from '@ember/template';\n\nexport interface GlobalLeaseSignature {\n Args: {\n count?: number;\n quota?: number;\n };\n\n Blocks: {\n default: [];\n /** We optionally yield application state to allow for overrides on empty state eg:\n * \n * <:empty as |A|>\n * \n * \n * \n * \n * */\n empty: HdsApplicationStateSignature['Blocks']['default'];\n };\n\n Element: HTMLElement;\n}\n\nexport default class GlobalLease extends Component {\n get percentage() {\n const { count = 0, quota = 0 } = this.args;\n\n return Math.round(Math.min((count / quota) * 100, 100));\n }\n\n get progressFillClass() {\n if (this.percentage >= 100) {\n return 'ssu-global-lease__progress-fill--exceeded';\n }\n return '';\n }\n\n get formattedCount() {\n const formatter = new Intl.NumberFormat('en-US', {\n notation: 'compact',\n compactDisplay: 'short',\n });\n\n const { count = 0, quota = 0 } = this.args;\n const formattedCount = formatter.format(count);\n const formattedTotal = formatter.format(quota);\n\n return `${formattedCount} / ${formattedTotal}`;\n }\n\n get percentageString() {\n return `${this.percentage}%`;\n }\n\n get hasData() {\n return this.args.quota && typeof this.args.quota === 'number';\n }\n\n get description() {\n if (this.hasData) {\n return htmlSafe(\n 'Total number of active leases for this quota.',\n );\n }\n }\n\n get linkUrl() {\n if (this.hasData) {\n return 'https://developer.hashicorp.com/vault/tutorials/operations/resource-quotas#global-default-lease-count-quota';\n }\n }\n\n get alert():\n | { color: 'warning' | 'neutral'; description: string }\n | undefined {\n if (this.percentage >= 100) {\n return {\n color: 'warning',\n description:\n 'Global lease quota limit reached. If lease creation is blocked, reduce usage or increase the limit.',\n };\n }\n\n if (this.percentage >= 95) {\n return {\n color: 'neutral',\n description:\n 'Approaching quota limit. Reduce usage or increase the lease limit to avoid blocking new leases.',\n };\n }\n }\n\n \n}\n"],"names":["GlobalLease","Component","percentage","count","quota","args","Math","round","min","progressFillClass","formattedCount","formatter","Intl","NumberFormat","notation","compactDisplay","format","formattedTotal","percentageString","hasData","description","htmlSafe","linkUrl","alert","color","setComponentTemplate","precompileTemplate","strictMode","scope","HdsCardContainer","cssCustomProperty","TitleRow","HdsTextDisplay","HdsAlert","HdsApplicationState"],"mappings":";;;;;;;;AAAA;;;AAGC;AAsCc,MAAMA,oBAAoBC,SAAU,CAAA;EACjD,IAAIC,UAAaA,GAAA;IACf,MAAM;AAAEC,MAAAA,KAAQ,GAAA,CAAC;AAAEC,MAAAA,KAAA,GAAQ;KAAG,GAAG,IAAI,CAACC,IAAI;AAE1C,IAAA,OAAOC,IAAA,CAAKC,KAAK,CAACD,IAAK,CAAAE,GAAG,CAAEL,KAAA,GAAQC,KAAK,GAAI,GAAK,EAAA,GAAA,CAAA,CAAA;AACpD;EAEA,IAAIK,iBAAoBA,GAAA;AACtB,IAAA,IAAI,IAAI,CAACP,UAAU,IAAI,GAAK,EAAA;AAC1B,MAAA,OAAO,2CAAA;AACT;AACA,IAAA,OAAO,EAAA;AACT;EAEA,IAAIQ,cAAiBA,GAAA;IACnB,MAAMC,SAAY,GAAA,IAAIC,IAAK,CAAAC,YAAY,CAAC,OAAS,EAAA;AAC/CC,MAAAA,QAAU,EAAA,SAAA;AACVC,MAAAA,cAAgB,EAAA;AAClB,KAAA,CAAA;IAEA,MAAM;AAAEZ,MAAAA,KAAQ,GAAA,CAAC;AAAEC,MAAAA,KAAA,GAAQ;KAAG,GAAG,IAAI,CAACC,IAAI;AAC1C,IAAA,MAAMK,cAAA,GAAiBC,SAAU,CAAAK,MAAM,CAACb,KAAA,CAAA;AACxC,IAAA,MAAMc,cAAA,GAAiBN,SAAU,CAAAK,MAAM,CAACZ,KAAA,CAAA;AAExC,IAAA,OAAO,CAAGM,EAAAA,cAAA,CAAoBO,GAAAA,EAAAA,eAAgB,CAAA;AAChD;EAEA,IAAIC,gBAAmBA,GAAA;AACrB,IAAA,OAAO,CAAG,EAAA,IAAI,CAAChB,UAAU,CAAG,CAAA,CAAA;AAC9B;EAEA,IAAIiB,OAAUA,GAAA;AACZ,IAAA,OAAO,IAAI,CAACd,IAAI,CAACD,KAAK,IAAI,OAAO,IAAI,CAACC,IAAI,CAACD,KAAK,KAAK,QAAA;AACvD;EAEA,IAAIgB,WAAcA,GAAA;IAChB,IAAI,IAAI,CAACD,OAAO,EAAE;MAChB,OAAOE,QACL,CAAA,wNAAA,CAAA;AAEJ;AACF;EAEA,IAAIC,OAAUA,GAAA;IACZ,IAAI,IAAI,CAACH,OAAO,EAAE;AAChB,MAAA,OAAO,6GAAA;AACT;AACF;EAEA,IAAII,KAAAA,GAEU;AACZ,IAAA,IAAI,IAAI,CAACrB,UAAU,IAAI,GAAK,EAAA;MAC1B,OAAO;AACLsB,QAAAA,KAAO,EAAA,SAAA;AACPJ,QAAAA,WACE,EAAA;OACJ;AACF;AAEA,IAAA,IAAI,IAAI,CAAClB,UAAU,IAAI,EAAI,EAAA;MACzB,OAAO;AACLsB,QAAAA,KAAO,EAAA,SAAA;AACPJ,QAAAA,WACE,EAAA;OACJ;AACF;AACF;AAEA,EAAA;IAAAK,oBAAA,CAAAC,kBAAA,CAqFA,kqEAAA,EAAA;MAAAC,UAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EAAAA,OAAA;QAAAC,gBAAA;QAAAC,iBAAA;QAAAC,QAAA;QAAAC,cAAA;QAAAC,QAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"} \ No newline at end of file diff --git a/ui/vault-reporting/dist/components/vault-reporting/horizontal-bar-chart.js b/ui/vault-reporting/dist/components/vault-reporting/horizontal-bar-chart.js index 11c127a362..17eea34e15 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/horizontal-bar-chart.js +++ b/ui/vault-reporting/dist/components/vault-reporting/horizontal-bar-chart.js @@ -99,7 +99,7 @@ class SSUReportingHorizontalBarChart extends Component { this.xRangeOffsetWidth = offsetWidth; }; static { - setComponentTemplate(precompileTemplate("\n \n \n {{#if this.hasData}}\n {{!-- TODO: Figure out glint errors on lineal components --}}\n {{!-- @glint-expect-error --}}\n \n \n {{!-- We are using the stacked version of the HBars as there seems to be an issue in the non-stacked version for how the x position is calculated. --}}\n {{#let (scaleLinear range=(this.getXRange width) domain=this.xDomain) (scaleBand range=this.yRange domain=this.yDomain) (stackH data=this.data x=\"value\" y=\"label\" z=\"\") as |xScale yScale stacked|}}\n {{#if xScale.isValid}}\n \n {{!-- TODO: Extra wrapper exists only for test attribute, figure out a better way --}}\n \n \n \n \n {{!-- @glint-expect-error --}}\n {{#each stacked.data as |dataset|}}\n {{#each dataset as |datum|}}\n \n {{datum.x}}\n \n {{/each}}\n {{/each}}\n \n {{/if}}\n {{/let}}\n \n \n \n \n Total:\n {{this.total}}\n \n {{else}}\n\n \n {{#if (has-block \"empty\")}}\n {{yield A to=\"empty\"}}\n {{else}}\n \n \n {{#if @linkUrl}}\n \n \n \n {{/if}}\n {{/if}}\n \n {{/if}}\n \n ", { + setComponentTemplate(precompileTemplate("\n \n \n {{#if this.hasData}}\n {{!-- TODO: Figure out glint errors on lineal components --}}\n {{!-- @glint-expect-error --}}\n \n \n {{!-- We are using the stacked version of the HBars as there seems to be an issue in the non-stacked version for how the x position is calculated. --}}\n {{#let (scaleLinear range=(this.getXRange width) domain=this.xDomain) (scaleBand range=this.yRange domain=this.yDomain) (stackH data=this.data x=\"value\" y=\"label\" z=\"\") as |xScale yScale stacked|}}\n {{#if xScale.isValid}}\n \n {{!-- TODO: Extra wrapper exists only for test attribute, figure out a better way --}}\n \n \n \n \n {{!-- @glint-expect-error --}}\n {{#each stacked.data as |dataset|}}\n {{#each dataset as |datum|}}\n \n {{datum.x}}\n \n {{/each}}\n {{/each}}\n \n {{/if}}\n {{/let}}\n \n \n \n \n Total:\n {{this.total}}\n \n {{else}}\n\n \n {{#if (has-block \"empty\")}}\n {{yield A to=\"empty\"}}\n {{else}}\n \n \n {{#if @linkUrl}}\n \n \n \n {{/if}}\n {{/if}}\n \n {{/if}}\n \n ", { strictMode: true, scope: () => ({ HdsCardContainer, diff --git a/ui/vault-reporting/dist/components/vault-reporting/horizontal-bar-chart.js.map b/ui/vault-reporting/dist/components/vault-reporting/horizontal-bar-chart.js.map index 8e21d62b9c..37dba9ab59 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/horizontal-bar-chart.js.map +++ b/ui/vault-reporting/dist/components/vault-reporting/horizontal-bar-chart.js.map @@ -1 +1 @@ -{"version":3,"file":"horizontal-bar-chart.js","sources":["../../../src/components/vault-reporting/horizontal-bar-chart.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport './horizontal-bar-chart.scss';\nimport Component from '@glimmer/component';\n\nimport {\n HdsCardContainer,\n HdsSeparator,\n HdsTextBody,\n HdsApplicationState,\n} from '@hashicorp/design-system-components/components';\nimport TitleRow from './base/title-row.gts';\n\nimport LinealFluid from '@lineal-viz/lineal/components/lineal/fluid/index.js';\nimport LinealHBars from '@lineal-viz/lineal/components/lineal/h-bars/index.js';\nimport scaleLinear from '@lineal-viz/lineal/helpers/scale-linear.js';\nimport scaleBand from '@lineal-viz/lineal/helpers/scale-band.js';\nimport stackH from '@lineal-viz/lineal/helpers/stack-h.js';\nimport LinealAxis from '@lineal-viz/lineal/components/lineal/axis/index.js';\nimport axisOffset from '../../modifiers/axis-offset.ts';\nimport { tracked } from '@glimmer/tracking';\nimport type { SimpleDatum } from '../../types/index.ts';\nimport type { HdsApplicationStateSignature } from '@hashicorp/design-system-components/components/hds/application-state/index';\n\nexport interface SSUReportingHorizontalBarChartSignature {\n Args: {\n data: SimpleDatum[];\n title: string;\n description?: string;\n linkUrl?: string;\n };\n\n Blocks: {\n default: [];\n /** We optionally yield application state to allow for overrides on empty state eg:\n * \n * <:empty as |A|>\n * \n * \n * \n * \n * */\n empty: HdsApplicationStateSignature['Blocks']['default'];\n };\n\n Element: HTMLElement;\n}\nexport default class SSUReportingHorizontalBarChart extends Component {\n @tracked xRangeOffsetWidth = 0;\n\n get hasData() {\n return (\n this.args.data &&\n Array.isArray(this.args.data) &&\n this.args.data.length > 0\n );\n }\n\n get data() {\n if (!this.hasData) {\n return [];\n }\n // Filtering DESC for now per designs, could make configurable if needed\n return this.args.data\n .filter(({ value }) => value !== 0)\n .sort((a, b) => {\n return b.value - a.value;\n });\n }\n\n get total() {\n return this.data.reduce((runningTotal, { value }) => {\n return runningTotal + value;\n }, 0);\n }\n\n get a11yLabel() {\n const title = `Total of ${this.total} ${this.args.title}.`;\n\n const itemsDescription = this.data\n .map(({ value, label }) => {\n return `${value} ${label}`;\n })\n .join(', ');\n\n return `${title} Comprised of ${itemsDescription}.`;\n }\n\n get yDomain() {\n return this.data.map(({ label }) => label);\n }\n\n get xDomain() {\n return [0, Math.max(0, ...this.data.map(({ value }) => value))];\n }\n\n get rangeHeight() {\n return this.data.length * 26;\n }\n\n get yRange() {\n return [0, this.rangeHeight];\n }\n\n get emptyStateTitle() {\n return 'None enabled';\n }\n\n get emptyStateDescription() {\n const entitiesTitle = this.args.title;\n return `${entitiesTitle} in this namespace will appear here.`;\n }\n\n get emptyStateLinkText() {\n const entities = this.args.title.toLowerCase();\n return `Enable ${entities}`;\n }\n\n get description() {\n if (this.hasData) {\n return this.args.description;\n }\n }\n\n get linkUrl() {\n if (this.hasData) {\n return this.args.linkUrl;\n }\n }\n\n getXRange = (width: number) => {\n return [0, Math.max(0, width - this.xRangeOffsetWidth - 32)];\n };\n\n handleAxisOffset = (offsetWidth: number) => {\n this.xRangeOffsetWidth = offsetWidth;\n };\n\n \n}\n"],"names":["SSUReportingHorizontalBarChart","Component","g","prototype","tracked","i","void 0","hasData","args","data","Array","isArray","length","filter","value","sort","a","b","total","reduce","runningTotal","a11yLabel","title","itemsDescription","map","label","join","yDomain","xDomain","Math","max","rangeHeight","yRange","emptyStateTitle","emptyStateDescription","entitiesTitle","emptyStateLinkText","entities","toLowerCase","description","linkUrl","getXRange","width","xRangeOffsetWidth","handleAxisOffset","offsetWidth","setComponentTemplate","precompileTemplate","strictMode","scope","HdsCardContainer","TitleRow","LinealFluid","axisOffset","scaleLinear","scaleBand","stackH","LinealAxis","LinealHBars","HdsSeparator","HdsTextBody","HdsApplicationState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"horizontal-bar-chart.js","sources":["../../../src/components/vault-reporting/horizontal-bar-chart.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport './horizontal-bar-chart.scss';\nimport Component from '@glimmer/component';\n\nimport {\n HdsCardContainer,\n HdsSeparator,\n HdsTextBody,\n HdsApplicationState,\n HdsLinkStandalone,\n} from '@hashicorp/design-system-components/components';\nimport TitleRow from './base/title-row.gts';\n\nimport LinealFluid from '@lineal-viz/lineal/components/lineal/fluid/index.js';\nimport LinealHBars from '@lineal-viz/lineal/components/lineal/h-bars/index.js';\nimport scaleLinear from '@lineal-viz/lineal/helpers/scale-linear.js';\nimport scaleBand from '@lineal-viz/lineal/helpers/scale-band.js';\nimport stackH from '@lineal-viz/lineal/helpers/stack-h.js';\nimport LinealAxis from '@lineal-viz/lineal/components/lineal/axis/index.js';\nimport axisOffset from '../../modifiers/axis-offset.ts';\nimport { tracked } from '@glimmer/tracking';\nimport type { SimpleDatum } from '../../types/index.ts';\nimport type { HdsApplicationStateSignature } from '@hashicorp/design-system-components/components/hds/application-state/index';\n\nexport interface SSUReportingHorizontalBarChartSignature {\n Args: {\n data: SimpleDatum[];\n title: string;\n description?: string;\n /** Custom text for the link (defaults to \"View all\") */\n linkText?: string;\n /** Icon to display with the link (defaults to \"arrow-right\") */\n linkIcon?: HdsLinkStandalone['icon'];\n /** URL for the link - if not provided, no link will be shown */\n linkUrl?: string;\n /** Target for the link - defaults to \"_self\" */\n linkTarget?: '_blank' | '_self';\n };\n Blocks: {\n default: [];\n /** We optionally yield application state to allow for overrides on empty state eg:\n * \n * <:empty as |A|>\n * \n * \n * \n * \n * */\n empty: HdsApplicationStateSignature['Blocks']['default'];\n };\n\n Element: HTMLElement;\n}\nexport default class SSUReportingHorizontalBarChart extends Component {\n @tracked xRangeOffsetWidth = 0;\n\n get hasData() {\n return (\n this.args.data &&\n Array.isArray(this.args.data) &&\n this.args.data.length > 0\n );\n }\n\n get data() {\n if (!this.hasData) {\n return [];\n }\n // Filtering DESC for now per designs, could make configurable if needed\n return this.args.data\n .filter(({ value }) => value !== 0)\n .sort((a, b) => {\n return b.value - a.value;\n });\n }\n\n get total() {\n return this.data.reduce((runningTotal, { value }) => {\n return runningTotal + value;\n }, 0);\n }\n\n get a11yLabel() {\n const title = `Total of ${this.total} ${this.args.title}.`;\n\n const itemsDescription = this.data\n .map(({ value, label }) => {\n return `${value} ${label}`;\n })\n .join(', ');\n\n return `${title} Comprised of ${itemsDescription}.`;\n }\n\n get yDomain() {\n return this.data.map(({ label }) => label);\n }\n\n get xDomain() {\n return [0, Math.max(0, ...this.data.map(({ value }) => value))];\n }\n\n get rangeHeight() {\n return this.data.length * 26;\n }\n\n get yRange() {\n return [0, this.rangeHeight];\n }\n\n get emptyStateTitle() {\n return 'None enabled';\n }\n\n get emptyStateDescription() {\n const entitiesTitle = this.args.title;\n return `${entitiesTitle} in this namespace will appear here.`;\n }\n\n get emptyStateLinkText() {\n const entities = this.args.title.toLowerCase();\n return `Enable ${entities}`;\n }\n\n get description() {\n if (this.hasData) {\n return this.args.description;\n }\n }\n\n get linkUrl() {\n if (this.hasData) {\n return this.args.linkUrl;\n }\n }\n\n getXRange = (width: number) => {\n return [0, Math.max(0, width - this.xRangeOffsetWidth - 32)];\n };\n\n handleAxisOffset = (offsetWidth: number) => {\n this.xRangeOffsetWidth = offsetWidth;\n };\n\n \n}\n"],"names":["SSUReportingHorizontalBarChart","Component","g","prototype","tracked","i","void 0","hasData","args","data","Array","isArray","length","filter","value","sort","a","b","total","reduce","runningTotal","a11yLabel","title","itemsDescription","map","label","join","yDomain","xDomain","Math","max","rangeHeight","yRange","emptyStateTitle","emptyStateDescription","entitiesTitle","emptyStateLinkText","entities","toLowerCase","description","linkUrl","getXRange","width","xRangeOffsetWidth","handleAxisOffset","offsetWidth","setComponentTemplate","precompileTemplate","strictMode","scope","HdsCardContainer","TitleRow","LinealFluid","axisOffset","scaleLinear","scaleBand","stackH","LinealAxis","LinealHBars","HdsSeparator","HdsTextBody","HdsApplicationState"],"mappings":"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"} \ No newline at end of file diff --git a/ui/vault-reporting/dist/components/vault-reporting/views/dashboard.js b/ui/vault-reporting/dist/components/vault-reporting/views/dashboard.js index a163e1f3e0..bc28abe3b2 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/views/dashboard.js +++ b/ui/vault-reporting/dist/components/vault-reporting/views/dashboard.js @@ -1,13 +1,12 @@ import Component from '@glimmer/component'; -import { concat } from '@ember/helper'; +import { array } from '@ember/helper'; import SSUReportingCounter from '../counter.js'; import SSUReportingHorizontalBarChart from '../horizontal-bar-chart.js'; import GlobalLease from '../global-lease.js'; import ClusterReplication from '../cluster-replication.js'; import DashboardExport from '../dashboard/export.js'; import { tracked } from '@glimmer/tracking'; -import { on } from '@ember/modifier'; -import { HdsTextDisplay, HdsSeparator, HdsCardContainer, HdsAlert, HdsButton, HdsLinkInline, HdsBadge, HdsPageHeader } from '@hashicorp/design-system-components/components'; +import { HdsCardContainer, HdsAlert, HdsLinkInline, HdsTextBody, HdsBadge, HdsPageHeader } from '@hashicorp/design-system-components/components'; import { precompileTemplate } from '@ember/template-compilation'; import { setComponentTemplate } from '@ember/component'; import { g, i } from 'decorator-transforms/runtime'; @@ -40,87 +39,92 @@ class SSUViewDashboard extends Component { this.error = undefined; this.data = await this.args.onFetchUsageData(); this.lastUpdatedTime = new Intl.DateTimeFormat('en-US', { - dateStyle: 'medium', timeStyle: 'medium' }).format(new Date()); } catch (e) { this.error = e; } }; - getBarChartData = (map = {}) => { + getBarChartData = (map = {}, exclude = []) => { return Object.entries(map).map(([label, value]) => { return { label, value }; + }).filter(item => { + return !exclude?.includes(item.label); }); }; get isVaultDedicated() { return this.args.isVaultDedicated ?? true; } get kvSecretsTooltipMessage() { - const kvv1Secrets = this.data?.kvv1_secrets ?? 0; - const kvv2Secrets = this.data?.kvv2_secrets ?? 0; + const { + kvv1Secrets = 0, + kvv2Secrets = 0 + } = this.data ?? {}; const kvv1Formatted = Intl.NumberFormat().format(kvv1Secrets); const kvv2Formatted = Intl.NumberFormat().format(kvv2Secrets); if (kvv1Secrets && kvv2Secrets) { - return `Combined count of ${kvv1Formatted} KV v1 secrets and ${kvv2Formatted} KV v2 secrets in this namespace`; + return `Combined count of ${kvv1Formatted} KV version 1 secrets and ${kvv2Formatted} KV version 2 secrets.`; } if (kvv1Secrets) { - return `Total number of ${kvv1Formatted} KV v1 secrets in this namespace`; + return `Total number of ${kvv1Formatted} KV version 1 secrets.`; } if (kvv2Secrets) { - return `Total number of ${kvv2Formatted} KV v2 secrets in this namespace`; + return `Total number of ${kvv2Formatted} KV version 2 secrets.`; } return ''; } get counters() { + const { + kvv1Secrets = 0, + kvv2Secrets = 0 + } = this.data ?? {}; return [{ title: 'Child namespaces', - tooltipMessage: this.isVaultDedicated ? 'Total number of direct child namespaces under the root/ namespace' : 'Total number of direct child namespaces under the admin/ namespace', + tooltipMessage: 'Total number of namespaces for this cluster.', data: this.data?.namespaces ?? 0, link: 'access/namespaces' }, { title: 'KV secrets', tooltipMessage: this.kvSecretsTooltipMessage, - data: (this.data?.kvv1_secrets ?? 0) + (this.data?.kvv2_secrets ?? 0), - emptyText: 'No secrets stored' + data: kvv1Secrets + kvv2Secrets, + emptyText: 'No secrets stored', + emptyLink: 'secrets' }, { title: 'Secrets sync', - tooltipMessage: this.isVaultDedicated ? 'Total number of destinations (e.g. third-party integrations) synced with secrets from this namespace' : '', - data: this.data?.secrets_sync ?? 0, + tooltipMessage: 'Total number of destinations (e.g. third-party integrations) synced with secrets from this namespace.', + data: this.data?.secretSync?.totalDestinations ?? 0, link: 'sync/secrets/overview', - emptyText: 'Not configured', + emptyText: 'Not activated', suffix: 'destinations' }, { title: 'PKI roles', - tooltipMessage: this.isVaultDedicated ? 'Total number of PKI roles configured in this namespace' : '', - data: this.data?.pki?.total_roles ?? 0, + tooltipMessage: 'Total number of PKI roles configured.', + data: this.data?.pki?.totalRoles ?? 0, emptyText: 'No roles created' }]; } get namespace() { - return this.isVaultDedicated ? 'Admin' : 'Root'; + return this.isVaultDedicated ? 'admin' : 'root'; } static { - setComponentTemplate(precompileTemplate("\n
\n \n Vault Usage\n \n \n \n {{#if this.lastUpdatedTime}}\n Last updated\n {{this.lastUpdatedTime}}.\n {{/if}}\n Don't see what you're looking for?\n Share feedback.\n \n \n \n \n \n \n {{#if this.error}}\n \n Error\n An error\n occurred, please try again.\n \n {{/if}}\n {{#if this.data}}\n \n {{#each this.counters as |counter|}}\n \n {{/each}}\n \n \n Resource inventory\n
\n
\n \n \n
\n\n
\n \n\n \n
\n
\n {{/if}}\n
\n ", { + setComponentTemplate(precompileTemplate("\n
\n \n \n Vault Usage\n \n \n \n {{#if this.lastUpdatedTime}}\n \n Updated today at\n {{this.lastUpdatedTime}}.\n\n \n {{/if}}\n \n View and export your Vault usage. Don't see what you're looking for?\n Share feedback\n \n \n \n \n \n \n {{#if this.error}}\n \n Error\n An error\n occurred, please try again.\n \n {{/if}}\n {{#if this.data}}\n \n {{#each this.counters as |counter|}}\n \n {{/each}}\n \n
\n
\n \n\n \n\n \n
\n\n
\n \n <:empty as |A|>\n \n \n \n \n \n \n \n
\n\n
\n {{/if}}\n
\n ", { strictMode: true, scope: () => ({ HdsPageHeader, HdsBadge, - concat, + HdsTextBody, HdsLinkInline, - HdsButton, - on, DashboardExport, HdsAlert, HdsCardContainer, ReportingCounter: SSUReportingCounter, - HdsSeparator, - HdsTextDisplay, ReportingHorizontalBarChart: SSUReportingHorizontalBarChart, - GlobalLease, - ClusterReplication + array, + ClusterReplication, + GlobalLease }) }), this); } diff --git a/ui/vault-reporting/dist/components/vault-reporting/views/dashboard.js.map b/ui/vault-reporting/dist/components/vault-reporting/views/dashboard.js.map index 43460706cd..540a72b134 100644 --- a/ui/vault-reporting/dist/components/vault-reporting/views/dashboard.js.map +++ b/ui/vault-reporting/dist/components/vault-reporting/views/dashboard.js.map @@ -1 +1 @@ -{"version":3,"file":"dashboard.js","sources":["../../../../src/components/vault-reporting/views/dashboard.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport { concat } from '@ember/helper';\nimport './dashboard.scss';\nimport ReportingCounter from '../counter.gts';\nimport ReportingHorizontalBarChart from '../horizontal-bar-chart.gts';\nimport GlobalLease from '../global-lease.gts';\nimport ClusterReplication from '../cluster-replication.gts';\nimport DashboardExport from '../dashboard/export.gts';\n\nimport type {\n UsageDashboardData,\n SimpleDatum,\n getUsageDataFunction,\n} from '../../../types';\nimport { tracked } from '@glimmer/tracking';\nimport type { IconName } from '@hashicorp/flight-icons/svg';\nimport { on } from '@ember/modifier';\nimport {\n HdsSeparator,\n HdsTextDisplay,\n HdsPageHeader,\n HdsLinkInline,\n HdsButton,\n HdsCardContainer,\n HdsBadge,\n HdsAlert,\n} from '@hashicorp/design-system-components/components';\n\ninterface CounterBlock {\n title: string;\n tooltipMessage: string;\n data: number;\n icon?: IconName;\n suffix?: string;\n link?: string;\n emptyText?: string;\n}\n\nexport interface SSUViewDashboardSignature {\n Args: {\n onFetchUsageData: getUsageDataFunction;\n isVaultDedicated: boolean;\n };\n\n Blocks: {\n default: [];\n };\n\n Element: HTMLElement;\n}\nexport default class SSUViewDashboard extends Component {\n @tracked\n data?: UsageDashboardData;\n\n @tracked\n lastUpdatedTime: string = '';\n\n @tracked\n error?: unknown;\n\n constructor(owner: unknown, args: SSUViewDashboardSignature['Args']) {\n super(owner, args);\n this.fetchAllData();\n }\n\n fetchAllData: () => void = async () => {\n try {\n this.error = undefined;\n this.data = await this.args.onFetchUsageData();\n this.lastUpdatedTime = new Intl.DateTimeFormat('en-US', {\n dateStyle: 'medium',\n timeStyle: 'medium',\n }).format(new Date());\n } catch (e) {\n this.error = e;\n }\n };\n\n getBarChartData: (map: Record) => SimpleDatum[] = (\n map = {},\n ) => {\n return Object.entries(map).map(([label, value]) => {\n return {\n label,\n value,\n };\n });\n };\n\n get isVaultDedicated(): boolean {\n return this.args.isVaultDedicated ?? true;\n }\n\n get kvSecretsTooltipMessage(): string {\n const kvv1Secrets = this.data?.kvv1_secrets ?? 0;\n const kvv2Secrets = this.data?.kvv2_secrets ?? 0;\n const kvv1Formatted = Intl.NumberFormat().format(kvv1Secrets);\n const kvv2Formatted = Intl.NumberFormat().format(kvv2Secrets);\n\n if (kvv1Secrets && kvv2Secrets) {\n return `Combined count of ${kvv1Formatted} KV v1 secrets and ${kvv2Formatted} KV v2 secrets in this namespace`;\n }\n if (kvv1Secrets) {\n return `Total number of ${kvv1Formatted} KV v1 secrets in this namespace`;\n }\n if (kvv2Secrets) {\n return `Total number of ${kvv2Formatted} KV v2 secrets in this namespace`;\n }\n return '';\n }\n\n get counters(): CounterBlock[] {\n return [\n {\n title: 'Child namespaces',\n tooltipMessage: this.isVaultDedicated\n ? 'Total number of direct child namespaces under the root/ namespace'\n : 'Total number of direct child namespaces under the admin/ namespace',\n data: this.data?.namespaces ?? 0,\n link: 'access/namespaces',\n },\n {\n title: 'KV secrets',\n tooltipMessage: this.kvSecretsTooltipMessage,\n data: (this.data?.kvv1_secrets ?? 0) + (this.data?.kvv2_secrets ?? 0),\n emptyText: 'No secrets stored',\n },\n {\n title: 'Secrets sync',\n tooltipMessage: this.isVaultDedicated\n ? 'Total number of destinations (e.g. third-party integrations) synced with secrets from this namespace'\n : '',\n data: this.data?.secrets_sync ?? 0,\n link: 'sync/secrets/overview',\n emptyText: 'Not configured',\n suffix: 'destinations',\n },\n {\n title: 'PKI roles',\n tooltipMessage: this.isVaultDedicated\n ? 'Total number of PKI roles configured in this namespace'\n : '',\n data: this.data?.pki?.total_roles ?? 0,\n emptyText: 'No roles created',\n },\n ];\n }\n\n get namespace(): string {\n return this.isVaultDedicated ? 'Admin' : 'Root';\n }\n\n \n}\n"],"names":["SSUViewDashboard","Component","g","prototype","tracked","i","void 0","constructor","owner","args","fetchAllData","error","undefined","data","onFetchUsageData","lastUpdatedTime","Intl","DateTimeFormat","dateStyle","timeStyle","format","Date","e","getBarChartData","map","Object","entries","label","value","isVaultDedicated","kvSecretsTooltipMessage","kvv1Secrets","kvv1_secrets","kvv2Secrets","kvv2_secrets","kvv1Formatted","NumberFormat","kvv2Formatted","counters","title","tooltipMessage","namespaces","link","emptyText","secrets_sync","suffix","pki","total_roles","namespace","setComponentTemplate","precompileTemplate","strictMode","scope","HdsPageHeader","HdsBadge","concat","HdsLinkInline","HdsButton","on","DashboardExport","HdsAlert","HdsCardContainer","ReportingCounter","HdsSeparator","HdsTextDisplay","ReportingHorizontalBarChart","GlobalLease","ClusterReplication"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"dashboard.js","sources":["../../../../src/components/vault-reporting/views/dashboard.gts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\nimport Component from '@glimmer/component';\nimport { array } from '@ember/helper';\nimport './dashboard.scss';\nimport ReportingCounter from '../counter.gts';\nimport ReportingHorizontalBarChart from '../horizontal-bar-chart.gts';\nimport GlobalLease from '../global-lease.gts';\nimport ClusterReplication from '../cluster-replication.gts';\nimport DashboardExport from '../dashboard/export.gts';\n\nimport type {\n UsageDashboardData,\n SimpleDatum,\n getUsageDataFunction,\n} from '../../../types';\nimport { tracked } from '@glimmer/tracking';\nimport type { IconName } from '@hashicorp/flight-icons/svg';\nimport {\n HdsPageHeader,\n HdsLinkInline,\n HdsCardContainer,\n HdsBadge,\n HdsAlert,\n HdsTextBody,\n} from '@hashicorp/design-system-components/components';\n\ninterface CounterBlock {\n title: string;\n tooltipMessage: string;\n data: number;\n icon?: IconName;\n suffix?: string;\n link?: string;\n emptyText?: string;\n emptyLink?: string;\n}\n\nexport interface SSUViewDashboardSignature {\n Args: {\n onFetchUsageData: getUsageDataFunction;\n isVaultDedicated: boolean;\n };\n\n Blocks: {\n default: [];\n };\n\n Element: HTMLElement;\n}\nexport default class SSUViewDashboard extends Component {\n @tracked\n data?: UsageDashboardData;\n\n @tracked\n lastUpdatedTime: string = '';\n\n @tracked\n error?: unknown;\n\n constructor(owner: unknown, args: SSUViewDashboardSignature['Args']) {\n super(owner, args);\n this.fetchAllData();\n }\n\n fetchAllData: () => void = async () => {\n try {\n this.error = undefined;\n this.data = await this.args.onFetchUsageData();\n this.lastUpdatedTime = new Intl.DateTimeFormat('en-US', {\n timeStyle: 'medium',\n }).format(new Date());\n } catch (e) {\n this.error = e;\n }\n };\n\n getBarChartData: (\n map: Record,\n exclude?: string[],\n ) => SimpleDatum[] = (map = {}, exclude = []) => {\n return Object.entries(map)\n .map(([label, value]) => {\n return {\n label,\n value,\n };\n })\n .filter((item) => {\n return !exclude?.includes(item.label);\n });\n };\n\n get isVaultDedicated(): boolean {\n return this.args.isVaultDedicated ?? true;\n }\n\n get kvSecretsTooltipMessage(): string {\n const { kvv1Secrets = 0, kvv2Secrets = 0 } = this.data ?? {};\n const kvv1Formatted = Intl.NumberFormat().format(kvv1Secrets);\n const kvv2Formatted = Intl.NumberFormat().format(kvv2Secrets);\n\n if (kvv1Secrets && kvv2Secrets) {\n return `Combined count of ${kvv1Formatted} KV version 1 secrets and ${kvv2Formatted} KV version 2 secrets.`;\n }\n if (kvv1Secrets) {\n return `Total number of ${kvv1Formatted} KV version 1 secrets.`;\n }\n if (kvv2Secrets) {\n return `Total number of ${kvv2Formatted} KV version 2 secrets.`;\n }\n return '';\n }\n\n get counters(): CounterBlock[] {\n const { kvv1Secrets = 0, kvv2Secrets = 0 } = this.data ?? {};\n return [\n {\n title: 'Child namespaces',\n tooltipMessage: 'Total number of namespaces for this cluster.',\n data: this.data?.namespaces ?? 0,\n link: 'access/namespaces',\n },\n {\n title: 'KV secrets',\n tooltipMessage: this.kvSecretsTooltipMessage,\n data: kvv1Secrets + kvv2Secrets,\n emptyText: 'No secrets stored',\n emptyLink: 'secrets',\n },\n {\n title: 'Secrets sync',\n tooltipMessage:\n 'Total number of destinations (e.g. third-party integrations) synced with secrets from this namespace.',\n data: this.data?.secretSync?.totalDestinations ?? 0,\n link: 'sync/secrets/overview',\n emptyText: 'Not activated',\n suffix: 'destinations',\n },\n {\n title: 'PKI roles',\n tooltipMessage: 'Total number of PKI roles configured.',\n data: this.data?.pki?.totalRoles ?? 0,\n emptyText: 'No roles created',\n },\n ];\n }\n\n get namespace(): string {\n return this.isVaultDedicated ? 'admin' : 'root';\n }\n\n \n}\n"],"names":["SSUViewDashboard","Component","g","prototype","tracked","i","void 0","constructor","owner","args","fetchAllData","error","undefined","data","onFetchUsageData","lastUpdatedTime","Intl","DateTimeFormat","timeStyle","format","Date","e","getBarChartData","map","exclude","Object","entries","label","value","filter","item","includes","isVaultDedicated","kvSecretsTooltipMessage","kvv1Secrets","kvv2Secrets","kvv1Formatted","NumberFormat","kvv2Formatted","counters","title","tooltipMessage","namespaces","link","emptyText","emptyLink","secretSync","totalDestinations","suffix","pki","totalRoles","namespace","setComponentTemplate","precompileTemplate","strictMode","scope","HdsPageHeader","HdsBadge","HdsTextBody","HdsLinkInline","DashboardExport","HdsAlert","HdsCardContainer","ReportingCounter","ReportingHorizontalBarChart","array","ClusterReplication","GlobalLease"],"mappings":"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"} \ No newline at end of file diff --git a/ui/vault-reporting/dist/styles/vault-reporting.css b/ui/vault-reporting/dist/styles/vault-reporting.css index 6b38ba6296..685018f39d 100644 --- a/ui/vault-reporting/dist/styles/vault-reporting.css +++ b/ui/vault-reporting/dist/styles/vault-reporting.css @@ -2,4 +2,4 @@ * Copyright (c) HashiCorp, Inc. */ -.ssu-cluster-replication{padding:16px;display:flex;flex-direction:column;justify-content:center;gap:1rem}.ssu-cluster-replication__list-row{display:flex;justify-content:space-between;align-items:center}.ssu-cluster-replication__list-row__badge{margin:0 .25rem}.ssu-cluster-replication__list-row__role{color:var(--token-color-palette-green-400)}.ssu-title-row{margin-bottom:1rem}.ssu-title-row__description{display:block;margin-top:.25rem;color:var(--token-color-foreground-faint)}.ssu-title-row__container{display:flex;justify-content:space-between}.ssu-title-row__container__link{padding:0}.ssu-counter{padding:16px}.ssu-counter__title-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}.ssu-counter__title-row__tooltip{margin-left:3px;top:3px}.ssu-global-lease{padding:16px;display:flex;flex-direction:column;justify-content:center;gap:1rem}.ssu-global-lease__progress-wrapper{display:flex;align-items:center;gap:1rem;height:50px}.ssu-global-lease__progress-bar{flex:1;height:100%;background-color:var(--token-color-palette-neutral-300);overflow:hidden;font-size:40px;display:inline-block}@keyframes initialWidth{0%{transform:scaleX(0)}100%{transform:scaleX(1)}}.ssu-global-lease__progress-fill{height:100%;width:var(--vault-reporting-global-lease-percentage);animation:1s ease-out initialWidth;transform-origin:left;transition:width 1s ease-out,background-color 1s ease-out}.ssu-global-lease__progress-fill--initial{background-color:var(--token-color-palette-gray-100)}.ssu-global-lease__progress-fill--low{background-color:var(--token-color-palette-green-200)}.ssu-global-lease__progress-fill--medium{background-color:var(--token-color-vault-brand)}.ssu-global-lease__progress-fill--high{background-color:var(--token-color-palette-red-200)}.ssu-global-lease__percentage-text{font-weight:400;font-size:2.7rem;line-height:2.3rem}.ssu-global-lease__count-text{font-size:.875rem}.ssu-global-lease__empty-state{min-width:66%;margin:16px auto}.dashboard{padding:16px}.dashboard__error{margin-top:16px}.dashboard__counters{display:grid;grid-template-columns:repeat(4, minmax(0, 1fr));gap:16px;margin:32px 0}.dashboard__viz-blocks{display:grid;grid-template-columns:repeat(2, minmax(0, 1fr));gap:16px}.dashboard__viz-block{margin-bottom:16px}.dashboard__inventory-header{margin-bottom:16px}.dashboard__badge{margin-left:5px}.ssu-horizontal-bar-chart__container{padding:16px;display:flex;flex-direction:column;gap:16px;overflow:hidden}.ssu-horizontal-bar-chart__chart{box-sizing:border-box}.ssu-horizontal-bar-chart__chart svg{overflow:visible}.ssu-horizontal-bar-chart__chart rect{fill:var(--token-color-palette-blue-200);transform:translateY(7px);rx:5px;ry:5px}.ssu-horizontal-bar-chart__chart .axis line{display:none}.ssu-horizontal-bar-chart__separator{margin-top:auto}.ssu-horizontal-bar-chart__empty-state{min-width:66%;margin:16px auto} \ No newline at end of file +.ssu-cluster-replication{padding:16px;display:flex;flex-direction:column;justify-content:center;gap:1rem}.ssu-cluster-replication__list-row__badge{margin:0 .25rem;text-transform:capitalize}.ssu-horizontal-bar-chart__container{padding:16px;overflow:hidden;font-size:13px}.ssu-horizontal-bar-chart__chart{box-sizing:border-box;margin-top:15px;color:var(--token-color-foreground-primary);fill:var(--token-color-foreground-primary)}.ssu-horizontal-bar-chart__chart svg{overflow:visible}.ssu-horizontal-bar-chart__chart rect{fill:var(--token-color-palette-blue-200);transform:translateY(10.5px);rx:3px;ry:3px}.ssu-horizontal-bar-chart__chart .axis line{display:none}.ssu-horizontal-bar-chart__separator{margin-bottom:10px}.ssu-horizontal-bar-chart__empty-state{min-width:66%;margin:16px auto}.ssu-horizontal-bar-chart__total{color:var(--token-color-foreground-primary)}.ssu-title-row{margin-bottom:8px}.ssu-title-row__description{display:block;margin-top:.25rem;color:var(--token-color-foreground-faint)}.ssu-title-row__container{display:flex;justify-content:space-between}.ssu-title-row__container__link{padding:0}.ssu-global-lease{padding:16px}.ssu-global-lease__progress-wrapper{display:flex;align-items:center;gap:1rem;height:15px}.ssu-global-lease__progress-bar{flex:1;height:100%;background-color:var(--token-color-palette-neutral-100);border:1.5px solid var(--token-color-palette-neutral-200);border-radius:4px;overflow:hidden;font-size:40px;display:inline-block}@keyframes initialWidth{0%{transform:scaleX(0)}100%{transform:scaleX(1)}}.ssu-global-lease__progress-fill{height:100%;width:var(--vault-reporting-global-lease-percentage);animation:1s ease-out initialWidth;transform-origin:left;transition:width 1s ease-out,background-color 1s ease-out;background-color:var(--token-color-palette-neutral-300)}.ssu-global-lease__progress-fill--exceeded{background-color:var(--token-color-palette-red-100)}.ssu-global-lease__empty-state{min-width:66%;margin:16px auto;color:var(--token-color-foreground-faint)}.ssu-global-lease__alert{margin-bottom:8px}.dashboard{padding:16px}.dashboard__error{margin-top:16px}.dashboard__counters{display:grid;grid-template-columns:repeat(4, minmax(0, 1fr));gap:16px;margin:32px 0}.dashboard__viz-blocks{display:grid;grid-template-columns:repeat(2, minmax(0, 1fr));gap:16px}.dashboard__viz-block{margin-bottom:16px}.dashboard__badge{margin-left:5px}.dashboard__description p{margin-bottom:8px}.ssu-counter{padding:16px}.ssu-counter__title-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}.ssu-counter__title-row__tooltip{margin-left:3px;top:3px} \ No newline at end of file diff --git a/ui/vault-reporting/dist/types/index.js.map b/ui/vault-reporting/dist/types/index.js.map index 7fdf0c5ff8..d789eb8509 100644 --- a/ui/vault-reporting/dist/types/index.js.map +++ b/ui/vault-reporting/dist/types/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../../src/types/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\ntype ISODateString = `${number}${number}-${number}${number}-${number}${number}`;\ntype ISOTimeString = `${number}${number}:${number}${number}:${number}${number}`;\ntype ISODateTimeString = `${ISODateString}T${ISOTimeString}`;\n\nexport interface TimeSeriesDatum {\n date: ISODateTimeString;\n value: number;\n}\n\nexport interface SimpleDatum {\n value: number;\n label: string;\n}\n\n/*\n States for disaster recovery and performance\n (More states might be added once this is hooked up to the backend)\n*/\nexport enum REPLICATION_ENABLED_STATE {\n PRIMARY = 'primary',\n SECONDARY = 'secondary',\n BOOTSTRAPPING = 'bootstrapping',\n}\nexport const REPLICATION_DISABLED_STATE = 'disabled';\n\nexport interface UsageDashboardData {\n auth_methods: Record;\n kvv1_secrets: number;\n kvv2_secrets: number;\n lease_count_quotas: {\n global_lease_count_quota: {\n capacity: number;\n count: number;\n name: string;\n };\n total_lease_count_quotas: number;\n };\n namespaces: number;\n secrets_sync: number;\n pki: {\n total_issuers: number;\n total_roles: number;\n };\n replication_status: {\n dr_primary: boolean;\n dr_state: REPLICATION_ENABLED_STATE | typeof REPLICATION_DISABLED_STATE;\n pr_primary: boolean;\n pr_state: REPLICATION_ENABLED_STATE | typeof REPLICATION_DISABLED_STATE;\n };\n secret_engines: Record;\n}\n\nexport type getUsageDataFunction = () => Promise;\n"],"names":["REPLICATION_ENABLED_STATE","REPLICATION_DISABLED_STATE"],"mappings":"AAAA;AACA;AACA;AACA;;AAgBA;AACA;AACA;AACA;AACYA,IAAAA,yBAAyB,0BAAzBA,yBAAyB,EAAA;EAAzBA,yBAAyB,CAAA,SAAA,CAAA,GAAA,SAAA;EAAzBA,yBAAyB,CAAA,WAAA,CAAA,GAAA,WAAA;EAAzBA,yBAAyB,CAAA,eAAA,CAAA,GAAA,eAAA;AAAA,EAAA,OAAzBA,yBAAyB;AAAA,CAAA,CAAA,EAAA;AAK9B,MAAMC,0BAA0B,GAAG;;;;"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../../src/types/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: BUSL-1.1\n */\n\ntype ISODateString = `${number}${number}-${number}${number}-${number}${number}`;\ntype ISOTimeString = `${number}${number}:${number}${number}:${number}${number}`;\ntype ISODateTimeString = `${ISODateString}T${ISOTimeString}`;\n\nexport interface TimeSeriesDatum {\n date: ISODateTimeString;\n value: number;\n}\n\nexport interface SimpleDatum {\n value: number;\n label: string;\n}\n\n/*\n States for disaster recovery and performance\n (More states might be added once this is hooked up to the backend)\n*/\nexport enum REPLICATION_ENABLED_STATE {\n PRIMARY = 'primary',\n SECONDARY = 'secondary',\n BOOTSTRAPPING = 'bootstrapping',\n}\nexport const REPLICATION_DISABLED_STATE = 'disabled';\n\nexport interface UsageDashboardData {\n authMethods: Record;\n leasesByAuthMethod: Record;\n kvv1Secrets: number;\n kvv2Secrets: number;\n leaseCountQuotas: {\n globalLeaseCountQuota: {\n capacity: number;\n count: number;\n name: string;\n };\n totalLeaseCountQuotas: number;\n };\n namespaces: number;\n secretSync: { totalDestinations: number };\n pki: {\n totalIssuers: number;\n totalRoles: number;\n };\n replicationStatus: {\n drPrimary: boolean;\n drState: REPLICATION_ENABLED_STATE | typeof REPLICATION_DISABLED_STATE;\n prPrimary: boolean;\n prState: REPLICATION_ENABLED_STATE | typeof REPLICATION_DISABLED_STATE;\n };\n secretEngines: Record;\n}\n\nexport type getUsageDataFunction = () => Promise;\n"],"names":["REPLICATION_ENABLED_STATE","REPLICATION_DISABLED_STATE"],"mappings":"AAAA;AACA;AACA;AACA;;AAgBA;AACA;AACA;AACA;AACYA,IAAAA,yBAAyB,0BAAzBA,yBAAyB,EAAA;EAAzBA,yBAAyB,CAAA,SAAA,CAAA,GAAA,SAAA;EAAzBA,yBAAyB,CAAA,WAAA,CAAA,GAAA,WAAA;EAAzBA,yBAAyB,CAAA,eAAA,CAAA,GAAA,eAAA;AAAA,EAAA,OAAzBA,yBAAyB;AAAA,CAAA,CAAA,EAAA;AAK9B,MAAMC,0BAA0B,GAAG;;;;"} \ No newline at end of file