diff --git a/changelog/22333.txt b/changelog/22333.txt new file mode 100644 index 0000000000..67debb7421 --- /dev/null +++ b/changelog/22333.txt @@ -0,0 +1,3 @@ +```release-note:improvement +ui: Implement Helios Design System copy button component making copy buttons accessible +``` \ No newline at end of file diff --git a/ui/app/components/hover-copy-button.js b/ui/app/components/hover-copy-button.js deleted file mode 100644 index 35fcaad07e..0000000000 --- a/ui/app/components/hover-copy-button.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) HashiCorp, Inc. - * SPDX-License-Identifier: BUSL-1.1 - */ - -import Component from '@glimmer/component'; -import { tracked } from '@glimmer/tracking'; - -/** - * @module HoverCopyButton - * The `HoverCopyButton` is used on dark backgrounds to show a copy button. - * - * @example ```js - * ``` - * - * @param {string} copyValue - The value to be copied. - * @param {boolean} [alwaysShow] - Boolean that affects the class. - */ - -export default class HoverCopyButton extends Component { - get alwaysShow() { - return this.args.alwaysShow || false; - } - get copyValue() { - return this.args.copyValue || false; - } - - @tracked tooltipText = 'Copy'; -} diff --git a/ui/app/components/keymgmt/key-edit.js b/ui/app/components/keymgmt/key-edit.js index c88f945778..3e271bbb47 100644 --- a/ui/app/components/keymgmt/key-edit.js +++ b/ui/app/components/keymgmt/key-edit.js @@ -47,11 +47,6 @@ export default class KeymgmtKeyEdit extends Component { return this.args.mode === 'create'; } - @action - toggleModal(bool) { - this.isDeleteModalOpen = bool; - } - @task @waitFor *saveKey(evt) { diff --git a/ui/app/components/sidebar/user-menu.hbs b/ui/app/components/sidebar/user-menu.hbs index e379c6ff52..4a4cb866e8 100644 --- a/ui/app/components/sidebar/user-menu.hbs +++ b/ui/app/components/sidebar/user-menu.hbs @@ -40,14 +40,13 @@ {{/if}}
  • - - Copy token - +
  • {{#if (is-before (now interval=1000) this.auth.tokenExpirationDate)}} {{#if this.auth.authData.renewable}} diff --git a/ui/app/components/transit-key-actions.js b/ui/app/components/transit-key-actions.js index bff73f8732..3d6f23ec4d 100644 --- a/ui/app/components/transit-key-actions.js +++ b/ui/app/components/transit-key-actions.js @@ -214,13 +214,6 @@ export default Component.extend(TRANSIT_PARAMS, { arr.forEach((param) => this.set(param, null)); }, - toggleModal(successMessage) { - if (!!successMessage && typeof successMessage === 'string') { - this.flashMessages.success(successMessage); - } - this.toggleProperty('isModalActive'); - }, - doSubmit(data, options = {}, maybeEvent) { const event = options.type === 'submit' ? options : maybeEvent; if (event) { diff --git a/ui/app/styles/components/console-ui-panel.scss b/ui/app/styles/components/console-ui-panel.scss index cd4b5e6241..4832a7c684 100644 --- a/ui/app/styles/components/console-ui-panel.scss +++ b/ui/app/styles/components/console-ui-panel.scss @@ -66,13 +66,6 @@ $console-close-height: 35px; } } -.console-ui-panel-content.hover-copy-button, -.console-ui-panel-content.hover-copy-button-static { - top: auto; - bottom: 0; - right: 0; -} - .console-ui-input { align-items: center; display: flex; diff --git a/ui/app/styles/components/control-group.scss b/ui/app/styles/components/control-group.scss index 90b0f5cea3..176591f7c0 100644 --- a/ui/app/styles/components/control-group.scss +++ b/ui/app/styles/components/control-group.scss @@ -34,20 +34,3 @@ .control-group .authorizations { margin-top: $size-9; } - -.control-group .hover-copy-button-static { - color: $orange; -} - -.control-group-token-text { - color: $grey; - position: relative; - padding: $size-8 0; - - .hover-copy-button-static { - position: relative; - top: auto; - left: auto; - display: inline-block; - } -} diff --git a/ui/app/styles/components/hover-copy-button.scss b/ui/app/styles/components/hover-copy-button.scss deleted file mode 100644 index ff6f585b44..0000000000 --- a/ui/app/styles/components/hover-copy-button.scss +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) HashiCorp, Inc. - * SPDX-License-Identifier: BUSL-1.1 - */ - -.has-copy-button { - position: relative; - color: $grey; -} -.hover-copy-button, -.hover-copy-button-static { - position: absolute; - top: 0.5rem; - right: 0.5rem; -} - -.hover-copy-button { - opacity: 0; - pointer-events: none; - transition: opacity $speed ease-in-out; - will-change: opacity; - z-index: 10; -} - -.has-copy-button:hover .hover-copy-button, -.has-copy-button:focus .hover-copy-button, -.hover-copy-button .copy-button:focus { - opacity: 1; - pointer-events: auto; -} diff --git a/ui/app/styles/components/masked-input.scss b/ui/app/styles/components/masked-input.scss index d3a4b3083e..ee908f6ecf 100644 --- a/ui/app/styles/components/masked-input.scss +++ b/ui/app/styles/components/masked-input.scss @@ -49,7 +49,6 @@ } .button.masked-input-toggle, -.button.copy-button, .button.download-button { min-width: $spacing-xl; border-left: 0; @@ -57,7 +56,6 @@ box-shadow: 0 3px 1px 0px rgba(10, 10, 10, 0.12); } -.button.copy-button, .button.download-button { border-radius: 0; } @@ -68,7 +66,6 @@ .display-only { .button.masked-input-toggle, - .button.copy-button, .button.download-button { background: transparent; height: auto; diff --git a/ui/app/styles/components/text-file.scss b/ui/app/styles/components/text-file.scss index c455ad83a1..3631e6e1ef 100644 --- a/ui/app/styles/components/text-file.scss +++ b/ui/app/styles/components/text-file.scss @@ -12,8 +12,7 @@ line-height: inherit; } } - .button.masked-input-toggle, - .button.copy-button { + .button.masked-input-toggle { display: flex; } } diff --git a/ui/app/styles/core.scss b/ui/app/styles/core.scss index f181434d58..19653c83dc 100644 --- a/ui/app/styles/core.scss +++ b/ui/app/styles/core.scss @@ -70,7 +70,6 @@ @import './components/features-selection'; @import './components/form-section'; @import './components/global-flash'; -@import './components/hover-copy-button'; @import './components/icon'; @import './components/init-illustration'; @import './components/info-table-row'; diff --git a/ui/app/styles/core/buttons.scss b/ui/app/styles/core/buttons.scss index 5efd76a4ad..8b87903143 100644 --- a/ui/app/styles/core/buttons.scss +++ b/ui/app/styles/core/buttons.scss @@ -14,10 +14,9 @@ display: inline-block; font-size: $size-8; font-weight: $font-weight-semibold; - height: 2.5rem; - line-height: 1.6; + min-height: 2.25rem; min-width: 6rem; - padding: $size-10 $size-8; + padding: 0.5625rem 0.9375rem; position: relative; text-align: center; text-decoration: none; @@ -332,3 +331,58 @@ a.button.disabled { cursor: not-allowed; } } + +// Existing class on component, modifying to match existing UI Structure buttons +.hds-copy-button { + font-weight: $font-weight-semibold; + box-shadow: $box-shadow-low; + border-radius: $radius; + + &.white-icon svg { + color: $white; + } + + &.icon-grey-300 svg { + color: $ui-gray-300; + } + + &.icon-grey-500 svg { + color: $ui-gray-500; + } + + &.icon-only { + margin-right: $spacing-xxs; + margin-left: $spacing-xxs; + } + + &.transparent { + background: none; + border: none; + box-shadow: none; + } + + &.primary { + background-color: $blue; + border-color: darken($blue, 2%); + color: $white; + font-weight: $font-weight-bold; + text-shadow: 0 1px 1px rgba($black, 0.25); + svg { + color: $white; + } + } + + &.secondary { + background-color: $grey-lightest; + border: 1px solid $grey-light; + } + + &.in-dropdown { + div { + font-size: $size-7; + } + svg { + color: transparent; + } + } +} diff --git a/ui/app/styles/helper-classes/layout.scss b/ui/app/styles/helper-classes/layout.scss index 58717acc41..a905ccee2c 100644 --- a/ui/app/styles/helper-classes/layout.scss +++ b/ui/app/styles/helper-classes/layout.scss @@ -23,6 +23,13 @@ } // position +.top-right-absolute { + position: absolute; + top: 0.5rem; + right: 0.5rem; + z-index: 10; +} + .is-in-bottom-right { position: absolute; bottom: 1rem; diff --git a/ui/app/styles/helper-classes/spacing.scss b/ui/app/styles/helper-classes/spacing.scss index f463ba8f5e..68aa21e5ca 100644 --- a/ui/app/styles/helper-classes/spacing.scss +++ b/ui/app/styles/helper-classes/spacing.scss @@ -107,10 +107,6 @@ margin-top: -$spacing-xxl; } -.has-top-margin-xxs { - margin: $spacing-xxs 0; -} - .has-right-margin-xxs { margin-right: $spacing-xxs; } @@ -147,6 +143,10 @@ margin-bottom: $spacing-xxl; } +.has-top-margin-xxs { + margin-top: $spacing-xxs; +} + .has-top-margin-s { margin-top: $spacing-s; } diff --git a/ui/app/templates/components/configure-ssh-secret.hbs b/ui/app/templates/components/configure-ssh-secret.hbs index a89a5502e2..0d01a52381 100644 --- a/ui/app/templates/components/configure-ssh-secret.hbs +++ b/ui/app/templates/components/configure-ssh-secret.hbs @@ -23,14 +23,7 @@
    - - Copy - +
    +
    - +
    \ No newline at end of file diff --git a/ui/app/templates/components/console/log-list.hbs b/ui/app/templates/components/console/log-list.hbs index 099fe876f1..cdccec776d 100644 --- a/ui/app/templates/components/console/log-list.hbs +++ b/ui/app/templates/components/console/log-list.hbs @@ -3,7 +3,7 @@ SPDX-License-Identifier: BUSL-1.1 ~}} -
    +
         Keys
         {{#each this.list as |item|}}
    @@ -11,5 +11,10 @@
     
         {{/each}}
       
    - +
    \ No newline at end of file diff --git a/ui/app/templates/components/console/log-object.hbs b/ui/app/templates/components/console/log-object.hbs index 93a1eaf547..866a4832a2 100644 --- a/ui/app/templates/components/console/log-object.hbs +++ b/ui/app/templates/components/console/log-object.hbs @@ -3,7 +3,12 @@ SPDX-License-Identifier: BUSL-1.1 ~}} -
    +
    {{this.columns}}
    - +
    \ No newline at end of file diff --git a/ui/app/templates/components/console/log-text.hbs b/ui/app/templates/components/console/log-text.hbs index d6fe35a9b2..00b4678db3 100644 --- a/ui/app/templates/components/console/log-text.hbs +++ b/ui/app/templates/components/console/log-text.hbs @@ -3,7 +3,12 @@ SPDX-License-Identifier: BUSL-1.1 ~}} -
    +
    {{@content}}
    - +
    \ No newline at end of file diff --git a/ui/app/templates/components/control-group-success.hbs b/ui/app/templates/components/control-group-success.hbs index 3755452b0d..ee98a1c769 100644 --- a/ui/app/templates/components/control-group-success.hbs +++ b/ui/app/templates/components/control-group-success.hbs @@ -16,8 +16,8 @@
    {{else}} {{#if this.unwrapData}} -
    -
    +
    +
    - +
    diff --git a/ui/app/templates/components/control-group.hbs b/ui/app/templates/components/control-group.hbs index 236e39d575..d9a9d5db16 100644 --- a/ui/app/templates/components/control-group.hbs +++ b/ui/app/templates/components/control-group.hbs @@ -48,8 +48,13 @@
    {{#if (or (not this.model.requestEntity) this.currentUserIsRequesting)}} -
    - +
    +

    Accessor @@ -85,11 +90,14 @@ {{/if}} {{#if this.controlGroupResponse.token}} -

    - We’ve saved your request token, but you may want to copy it just in case: - {{this.controlGroupResponse.token}} - -

    +
    +

    + We’ve saved your request token, but you may want to copy it just in case: +

    +
    + +
    +
    {{/if}} {{! template-lint-configure simple-unless "warn" }} {{#unless (and this.model.approved (or (not this.model.requestEntity) this.currentUserIsRequesting))}} diff --git a/ui/app/templates/components/generate-credentials.hbs b/ui/app/templates/components/generate-credentials.hbs index 427ba214e1..1e69c4b796 100644 --- a/ui/app/templates/components/generate-credentials.hbs +++ b/ui/app/templates/components/generate-credentials.hbs @@ -92,25 +92,11 @@

    - - Copy credentials - +
    {{#if this.model.leaseId}}
    - - Copy Lease ID - +
    {{/if}}
    diff --git a/ui/app/templates/components/hover-copy-button.hbs b/ui/app/templates/components/hover-copy-button.hbs deleted file mode 100644 index 1941179078..0000000000 --- a/ui/app/templates/components/hover-copy-button.hbs +++ /dev/null @@ -1,24 +0,0 @@ -{{! - Copyright (c) HashiCorp, Inc. - SPDX-License-Identifier: BUSL-1.1 -~}} - -
    - - - - - - - -
    - {{this.tooltipText}} -
    -
    -
    -
    \ No newline at end of file diff --git a/ui/app/templates/components/oidc/scope-form.hbs b/ui/app/templates/components/oidc/scope-form.hbs index 1f05e73ff6..51e7231919 100644 --- a/ui/app/templates/components/oidc/scope-form.hbs +++ b/ui/app/templates/components/oidc/scope-form.hbs @@ -86,17 +86,16 @@ >
    - - Copy - +
    - - Copy - +
    - - Copy - +
    - - Copy - +
    - - Copy - +
    {{#let (concat "vault write " this.model.backend "/encode/" this.cliCommand) as |copyEncodeCommand|}} - vault write {{this.model.backend}}/encode/{{this.cliCommand}} - - - + {{/let}}
    @@ -64,15 +56,7 @@
    {{#let (concat "vault write " this.model.backend "/decode/" this.cliCommand) as |copyDecodeCommand|}} - vault write {{this.model.backend}}/decode/{{this.cliCommand}} - - - + {{/let}}
    diff --git a/ui/app/templates/components/transit-form-show.hbs b/ui/app/templates/components/transit-form-show.hbs index 3440276955..cd26693482 100644 --- a/ui/app/templates/components/transit-form-show.hbs +++ b/ui/app/templates/components/transit-form-show.hbs @@ -155,14 +155,13 @@ diff --git a/ui/app/templates/components/transit-key-action/datakey.hbs b/ui/app/templates/components/transit-key-action/datakey.hbs index 52c430e87a..3ea93d06f4 100644 --- a/ui/app/templates/components/transit-key-action/datakey.hbs +++ b/ui/app/templates/components/transit-key-action/datakey.hbs @@ -78,76 +78,15 @@ +
    + +
    \ No newline at end of file diff --git a/ui/app/templates/components/transit-key-action/decrypt.hbs b/ui/app/templates/components/transit-key-action/decrypt.hbs index 0ec3a62340..411d9acbb7 100644 --- a/ui/app/templates/components/transit-key-action/decrypt.hbs +++ b/ui/app/templates/components/transit-key-action/decrypt.hbs @@ -59,32 +59,13 @@
    - - Copy & Close - +
    {{/if}} \ No newline at end of file diff --git a/ui/app/templates/components/transit-key-action/encrypt.hbs b/ui/app/templates/components/transit-key-action/encrypt.hbs index 0f7a9e8d81..3f95aeea2b 100644 --- a/ui/app/templates/components/transit-key-action/encrypt.hbs +++ b/ui/app/templates/components/transit-key-action/encrypt.hbs @@ -78,29 +78,10 @@
    - - Copy & Close - +
    \ No newline at end of file diff --git a/ui/app/templates/components/transit-key-action/export.hbs b/ui/app/templates/components/transit-key-action/export.hbs index 6843fd90fe..ae51b0ffe8 100644 --- a/ui/app/templates/components/transit-key-action/export.hbs +++ b/ui/app/templates/components/transit-key-action/export.hbs @@ -69,29 +69,29 @@
    - - Copy & Close - +
    \ No newline at end of file diff --git a/ui/app/templates/components/transit-key-action/hmac.hbs b/ui/app/templates/components/transit-key-action/hmac.hbs index c71f6a25d1..2e30c93376 100644 --- a/ui/app/templates/components/transit-key-action/hmac.hbs +++ b/ui/app/templates/components/transit-key-action/hmac.hbs @@ -55,29 +55,10 @@
    - - Copy & Close - +
    \ No newline at end of file diff --git a/ui/app/templates/components/transit-key-action/rewrap.hbs b/ui/app/templates/components/transit-key-action/rewrap.hbs index a3f84cb9bd..ac70546aba 100644 --- a/ui/app/templates/components/transit-key-action/rewrap.hbs +++ b/ui/app/templates/components/transit-key-action/rewrap.hbs @@ -67,29 +67,10 @@
    - - Copy & Close - +
    \ No newline at end of file diff --git a/ui/app/templates/components/transit-key-action/sign.hbs b/ui/app/templates/components/transit-key-action/sign.hbs index 55ca821c36..7bc00e5b4a 100644 --- a/ui/app/templates/components/transit-key-action/sign.hbs +++ b/ui/app/templates/components/transit-key-action/sign.hbs @@ -129,29 +129,10 @@
    - - Copy & Close - +
    \ No newline at end of file diff --git a/ui/app/templates/components/transit-key-actions.hbs b/ui/app/templates/components/transit-key-actions.hbs index 987924fbc5..b0f1d7e381 100644 --- a/ui/app/templates/components/transit-key-actions.hbs +++ b/ui/app/templates/components/transit-key-actions.hbs @@ -48,7 +48,6 @@ encodedBase64=this.encodedBase64 valid=this.valid doSubmit=(action "doSubmit") - toggleModal=(action "toggleModal") clearParams=(action "clearParams") }}
    diff --git a/ui/app/templates/vault/cluster/secrets/backend/sign.hbs b/ui/app/templates/vault/cluster/secrets/backend/sign.hbs index f094f8a8ee..1cac42a98e 100644 --- a/ui/app/templates/vault/cluster/secrets/backend/sign.hbs +++ b/ui/app/templates/vault/cluster/secrets/backend/sign.hbs @@ -37,7 +37,7 @@ {{#if this.model.signedKey}}
    - + Warning You will not be able to access this information later, so please copy the information below. @@ -59,25 +59,11 @@
    - - Copy key - +
    {{#if this.model.leaseId}}
    - - Copy lease ID - +
    {{/if}}
    diff --git a/ui/lib/core/addon/components/certificate-card.hbs b/ui/lib/core/addon/components/certificate-card.hbs index 8834e96b9b..a089650e8f 100644 --- a/ui/lib/core/addon/components/certificate-card.hbs +++ b/ui/lib/core/addon/components/certificate-card.hbs @@ -20,15 +20,13 @@ {{@data}}
    -
    - + - - + />
    \ No newline at end of file diff --git a/ui/lib/core/addon/components/choose-pgp-key-form.hbs b/ui/lib/core/addon/components/choose-pgp-key-form.hbs index 0d624f747a..b6683a2c8f 100644 --- a/ui/lib/core/addon/components/choose-pgp-key-form.hbs +++ b/ui/lib/core/addon/components/choose-pgp-key-form.hbs @@ -22,10 +22,12 @@

    {{concat "PGP Key " this.pgpKeyFile.filename}}

    -
    - - {{this.pgpKey}} -
    +
    diff --git a/ui/lib/core/addon/components/code-snippet.hbs b/ui/lib/core/addon/components/code-snippet.hbs index fd20c0cf1f..106f71ca4a 100644 --- a/ui/lib/core/addon/components/code-snippet.hbs +++ b/ui/lib/core/addon/components/code-snippet.hbs @@ -9,14 +9,10 @@ ...attributes > {{@codeBlock}} - {{! replace with Hds::Copy::Button }} - - Copy - - +
    \ No newline at end of file diff --git a/ui/lib/core/addon/components/copy-secret-dropdown.hbs b/ui/lib/core/addon/components/copy-secret-dropdown.hbs index 63142912b9..2873683f5b 100644 --- a/ui/lib/core/addon/components/copy-secret-dropdown.hbs +++ b/ui/lib/core/addon/components/copy-secret-dropdown.hbs @@ -8,14 +8,14 @@
    -
    +
    {{#if @addCopyButton}} -
    - - - -
    + {{/if}} {{#if (has-block)}} {{yield}} @@ -90,18 +87,18 @@ {{@value}} - -
    - {{@tooltipText}} -
    -
    +
    + {{@tooltipText}} + {{#if @isTooltipCopyable}} + + {{/if}} +
    {{else}} diff --git a/ui/lib/core/addon/components/json-editor.hbs b/ui/lib/core/addon/components/json-editor.hbs index c92b5dd3f2..329fb79038 100644 --- a/ui/lib/core/addon/components/json-editor.hbs +++ b/ui/lib/core/addon/components/json-editor.hbs @@ -28,14 +28,13 @@ {{/if}}
    - - - +
    diff --git a/ui/lib/core/addon/components/masked-input.hbs b/ui/lib/core/addon/components/masked-input.hbs index 4714723457..8c22a1bfc3 100644 --- a/ui/lib/core/addon/components/masked-input.hbs +++ b/ui/lib/core/addon/components/masked-input.hbs @@ -35,15 +35,13 @@ /> {{/if}} {{#if @allowCopy}} - - - + /> {{/if}} {{#if @allowDownload}} This is a one-time token that will be used to generate the operation token. Please save it.

    -
    - - {{this.encodedToken}} -
    +
    {{#if this.otp}}
    @@ -29,10 +26,7 @@

    This OTP will be used to decode the generated operation token. Please save it.

    -
    - - {{this.otp}} -
    +
    {{/if}}
    @@ -48,21 +42,18 @@ the operation token. {{/if}}

    -
    - {{! template-lint-disable quotes }} - {{#let - (if - this.otp - (concat 'vault operator generate-root -dr-token -otp="' this.otp '" -decode="' this.encodedToken '"') - (concat 'vault operator generate-root -dr-token -otp="" -decode="' this.encodedToken '"') - ) - as |cmd| - }} - - {{cmd}} - {{/let}} - {{! template-lint-enable quotes }} -
    + {{! template-lint-disable quotes }} + {{#let + (if + this.otp + (concat 'vault operator generate-root -dr-token -otp="' this.otp '" -decode="' this.encodedToken '"') + (concat 'vault operator generate-root -dr-token -otp="" -decode="' this.encodedToken '"') + ) + as |cmd| + }} + + {{/let}} + {{! template-lint-enable quotes }}
    diff --git a/ui/lib/core/addon/components/shamir/form.hbs b/ui/lib/core/addon/components/shamir/form.hbs index 4ba4992423..e79020da83 100644 --- a/ui/lib/core/addon/components/shamir/form.hbs +++ b/ui/lib/core/addon/components/shamir/form.hbs @@ -13,18 +13,17 @@ {{#if @otp}} Info - + Below is the generated OTP. This will be used to encode the generated Operation Token. Make sure to save this, as you will need it later to decode the Operation Token. + +

    + One Time Password (otp) +

    + +
    -
    - -

    - One Time Password (otp) -

    - {{@otp}} -
    {{/if}} {{#if (has-block)}} {{yield}} diff --git a/ui/lib/core/addon/templates/components/shamir-flow.hbs b/ui/lib/core/addon/templates/components/shamir-flow.hbs index d3fd9af2fc..98406b57c7 100644 --- a/ui/lib/core/addon/templates/components/shamir-flow.hbs +++ b/ui/lib/core/addon/templates/components/shamir-flow.hbs @@ -5,46 +5,37 @@ {{#if this.encoded_token}}
    -
    - -
    -

    - Encoded Operation Token -

    - {{this.encoded_token}} -
    +
    +

    + Encoded Operation Token +

    +
    + {{#if this.otp}} -
    - -
    -

    - One Time Password (otp) -

    - {{this.otp}} -
    +
    +

    + One Time Password (otp) +

    +
    {{/if}} -
    - {{! template-lint-disable quotes }} - {{#let - (if - this.otp - (concat 'vault operator generate-root -otp="' this.otp '" -decode="' this.encoded_token '"') - (concat 'vault operator generate-root -otp="" -decode="' this.encoded_token '"') - ) - as |cmd| - }} - -
    -

    - DR Operation Token Command -

    - {{cmd}} -
    - {{/let}} - {{! template-lint-enable quotes }} -
    + + {{! template-lint-disable quotes }} + {{#let + (if + this.otp + (concat 'vault operator generate-root -otp="' this.otp '" -decode="' this.encoded_token '"') + (concat 'vault operator generate-root -otp="" -decode="' this.encoded_token '"') + ) + as |cmd| + }} +

    + DR Operation Token Command +

    + + {{/let}} + {{! template-lint-enable quotes }}