mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-10-30 18:17:55 +00:00 
			
		
		
		
	UI: upgrade HDS to 4.12.0 (#28525)
				
					
				
			* update hds to latest version * yield dropdown Interactive text instead of use @text arg, results after running codemod * remaining dropdown changes * address sidebar nav IconButton deprecation, fix secret tests * revert * explicitly select popupmenu * more test changes * fix pki toggle button * remove tracked prop in oidc client controller * aaand more test updates * change to tilde * tilde yarn lock changes * small cleanup items
This commit is contained in:
		| @@ -18,9 +18,11 @@ | ||||
|             /> | ||||
|           </:logo> | ||||
|           <:actions> | ||||
|             <Hds::SideNav::Header::IconButton | ||||
|             <Hds::Button | ||||
|               @isIconOnly={{true}} | ||||
|               @size="large" | ||||
|               @icon="terminal-screen" | ||||
|               @ariaLabel="Console toggle" | ||||
|               @text="Console toggle" | ||||
|               data-test-console-toggle | ||||
|               {{on "click" (fn (mut this.console.isOpen) (not this.console.isOpen))}} | ||||
|             /> | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
|   as |Dropdown| | ||||
| > | ||||
|   <Dropdown.Trigger data-test-user-menu-trigger> | ||||
|     <Hds::SideNav::Header::IconButton @icon="user" @ariaLabel="User menu" /> | ||||
|     <Hds::Button @isIconOnly={{true}} @size="large" @icon="user" @text="User menu" /> | ||||
|   </Dropdown.Trigger> | ||||
|   <Dropdown.Content> | ||||
|     <div class="popup-menu-content" data-test-user-menu-content> | ||||
|   | ||||
| @@ -5,22 +5,7 @@ | ||||
|  | ||||
| import Controller from '@ember/controller'; | ||||
| import { service } from '@ember/service'; | ||||
| import { tracked } from '@glimmer/tracking'; | ||||
|  | ||||
| export default class OidcClientController extends Controller { | ||||
|   @service router; | ||||
|   @tracked isEditRoute; | ||||
|  | ||||
|   constructor() { | ||||
|     super(...arguments); | ||||
|     this.router.on( | ||||
|       'routeDidChange', | ||||
|       ({ targetName }) => (this.isEditRoute = targetName.includes('edit') ? true : false) | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   get showHeader() { | ||||
|     // hide header when rendering the edit form | ||||
|     return !this.isEditRoute; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -5,21 +5,7 @@ | ||||
|  | ||||
| import Controller from '@ember/controller'; | ||||
| import { service } from '@ember/service'; | ||||
| import { tracked } from '@glimmer/tracking'; | ||||
|  | ||||
| export default class OidcKeyController extends Controller { | ||||
|   @service router; | ||||
|   @tracked isEditRoute; | ||||
|  | ||||
|   constructor() { | ||||
|     super(...arguments); | ||||
|     this.router.on('routeDidChange', ({ targetName }) => { | ||||
|       return (this.isEditRoute = targetName.includes('edit') ? true : false); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   get showHeader() { | ||||
|     // hide header when rendering the edit form | ||||
|     return !this.isEditRoute; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -5,21 +5,7 @@ | ||||
|  | ||||
| import Controller from '@ember/controller'; | ||||
| import { service } from '@ember/service'; | ||||
| import { tracked } from '@glimmer/tracking'; | ||||
|  | ||||
| export default class OidcProviderController extends Controller { | ||||
|   @service router; | ||||
|   @tracked isEditRoute; | ||||
|  | ||||
|   constructor() { | ||||
|     super(...arguments); | ||||
|     this.router.on('routeDidChange', ({ targetName }) => { | ||||
|       return (this.isEditRoute = targetName.includes('edit') ? true : false); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   get showHeader() { | ||||
|     // hide header when rendering the edit form | ||||
|     return !this.isEditRoute; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -55,7 +55,8 @@ | ||||
|     &:hover { | ||||
|       background-color: $ui-gray-050; | ||||
|     } | ||||
|     div { | ||||
|     div, | ||||
|     span { | ||||
|       margin-left: -$spacing-4; | ||||
|       font-size: $size-7; | ||||
|       font-weight: $font-weight-semibold; | ||||
|   | ||||
| @@ -195,8 +195,3 @@ label { | ||||
|     cursor: not-allowed; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // TODO remove when HDS has released fix | ||||
| .hds-form-masked-input .hds-form-masked-input__toggle-button { | ||||
|   margin-right: $spacing-12; | ||||
| } | ||||
|   | ||||
| @@ -79,20 +79,17 @@ | ||||
|             data-test-popup-menu-trigger | ||||
|           /> | ||||
|           <dd.Interactive | ||||
|             @text="View {{singularize @itemType}}" | ||||
|             @route="vault.cluster.access.method.item.show" | ||||
|             @models={{array @methodModel.id @itemType list.item.id}} | ||||
|           /> | ||||
|           >View {{singularize @itemType}}</dd.Interactive> | ||||
|           <dd.Interactive | ||||
|             @text="Edit {{singularize @itemType}}" | ||||
|             @route="vault.cluster.access.method.item.edit" | ||||
|             @models={{array @methodModel.id @itemType list.item.id}} | ||||
|           /> | ||||
|           <dd.Interactive | ||||
|             @text="Delete {{singularize @itemType}}" | ||||
|             @color="critical" | ||||
|             {{on "click" (fn (mut this.itemToDelete) list.item)}} | ||||
|           /> | ||||
|           >Edit {{singularize @itemType}}</dd.Interactive> | ||||
|           <dd.Interactive @color="critical" {{on "click" (fn (mut this.itemToDelete) list.item)}}> | ||||
|             Delete | ||||
|             {{singularize @itemType}} | ||||
|           </dd.Interactive> | ||||
|         </Hds::Dropdown> | ||||
|       </Item.menu> | ||||
|       {{#if (eq list.item this.itemToDelete)}} | ||||
|   | ||||
| @@ -12,10 +12,9 @@ | ||||
|       data-test-popup-menu-trigger | ||||
|     /> | ||||
|     <dd.Interactive | ||||
|       @text="Details" | ||||
|       @route="vault.cluster.access.identity.aliases.show" | ||||
|       @models={{array (pluralize @item.parentType) @item.id "details"}} | ||||
|     /> | ||||
|     >Details</dd.Interactive> | ||||
|     {{#if @item.updatePath.isPending}} | ||||
|       <dd.Generic class="has-text-center"> | ||||
|         <LoadingDropdownOption /> | ||||
| @@ -23,18 +22,16 @@ | ||||
|     {{else}} | ||||
|       {{#if @item.canEdit}} | ||||
|         <dd.Interactive | ||||
|           @text="Edit" | ||||
|           @route="vault.cluster.access.identity.aliases.edit" | ||||
|           @models={{array (pluralize @item.parentType) @item.id}} | ||||
|         /> | ||||
|         >Edit</dd.Interactive> | ||||
|       {{/if}} | ||||
|       {{#if @item.canDelete}} | ||||
|         <dd.Interactive | ||||
|           @text="Remove" | ||||
|           @color="critical" | ||||
|           {{on "click" (fn (mut this.showConfirmModal) true)}} | ||||
|           data-test-popup-menu="delete" | ||||
|         /> | ||||
|         >Remove</dd.Interactive> | ||||
|       {{/if}} | ||||
|     {{/if}} | ||||
|   </Hds::Dropdown> | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|       @hasChevron={{false}} | ||||
|       data-test-popup-menu-trigger | ||||
|     /> | ||||
|     <dd.Interactive @text="Remove" @color="critical" {{on "click" (fn (mut this.showConfirmModal) true)}} /> | ||||
|     <dd.Interactive @color="critical" {{on "click" (fn (mut this.showConfirmModal) true)}}>Remove</dd.Interactive> | ||||
|   </Hds::Dropdown> | ||||
| </div> | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| <div class="has-text-right"> | ||||
|   <Hds::Dropdown @isInline={{true}} @listPosition="bottom-right" as |dd|> | ||||
|     <dd.ToggleIcon @icon="more-horizontal" @text="Metadata options" @hasChevron={{false}} data-test-popup-menu-trigger /> | ||||
|     <dd.Interactive @text="Remove" @color="critical" {{on "click" (fn (mut this.showConfirmModal) true)}} /> | ||||
|     <dd.Interactive @color="critical" {{on "click" (fn (mut this.showConfirmModal) true)}}>Remove</dd.Interactive> | ||||
|   </Hds::Dropdown> | ||||
| </div> | ||||
|  | ||||
|   | ||||
| @@ -11,13 +11,12 @@ | ||||
|       @hasChevron={{false}} | ||||
|       data-test-popup-menu-trigger | ||||
|     /> | ||||
|     <dd.Interactive @text="View policy" @route="vault.cluster.policy.show" @models={{array "acl" @policyName}} /> | ||||
|     <dd.Interactive @text="Edit policy" @route="vault.cluster.policy.edit" @models={{array "acl" @policyName}} /> | ||||
|     <dd.Interactive | ||||
|       @text="Remove from {{@model.identityType}}" | ||||
|       @color="critical" | ||||
|       {{on "click" (fn (mut this.showConfirmModal) true)}} | ||||
|     /> | ||||
|     <dd.Interactive @route="vault.cluster.policy.show" @models={{array "acl" @policyName}}>View policy</dd.Interactive> | ||||
|     <dd.Interactive @route="vault.cluster.policy.edit" @models={{array "acl" @policyName}}>Edit policy</dd.Interactive> | ||||
|     <dd.Interactive @color="critical" {{on "click" (fn (mut this.showConfirmModal) true)}}> | ||||
|       Remove from | ||||
|       {{@model.identityType}} | ||||
|     </dd.Interactive> | ||||
|   </Hds::Dropdown> | ||||
| </div> | ||||
|  | ||||
|   | ||||
| @@ -27,17 +27,15 @@ | ||||
|             data-test-popup-menu-trigger | ||||
|           /> | ||||
|           <dd.Interactive | ||||
|             @text="Details" | ||||
|             @route="vault.cluster.access.mfa.enforcements.enforcement" | ||||
|             @model={{@model.name}} | ||||
|             data-test-list-item-link="details" | ||||
|           /> | ||||
|           >Details</dd.Interactive> | ||||
|           <dd.Interactive | ||||
|             @text="Edit" | ||||
|             @route="vault.cluster.access.mfa.enforcements.enforcement.edit" | ||||
|             @model={{@model.name}} | ||||
|             data-test-list-item-link="edit" | ||||
|           /> | ||||
|           >Edit</dd.Interactive> | ||||
|         </Hds::Dropdown> | ||||
|       </div> | ||||
|     </div> | ||||
|   | ||||
| @@ -38,17 +38,15 @@ | ||||
|             data-test-popup-menu-trigger | ||||
|           /> | ||||
|           <dd.Interactive | ||||
|             @text="Details" | ||||
|             @route="vault.cluster.access.mfa.methods.method" | ||||
|             @model={{@model.id}} | ||||
|             data-test-mfa-method-menu-link="details" | ||||
|           /> | ||||
|           >Details</dd.Interactive> | ||||
|           <dd.Interactive | ||||
|             @text="Edit" | ||||
|             @route="vault.cluster.access.mfa.methods.method.edit" | ||||
|             @model={{@model.id}} | ||||
|             data-test-mfa-method-menu-link="edit" | ||||
|           /> | ||||
|           >Edit</dd.Interactive> | ||||
|         </Hds::Dropdown> | ||||
|       </div> | ||||
|     </div> | ||||
|   | ||||
| @@ -34,19 +34,17 @@ | ||||
|               /> | ||||
|               {{#if client.canRead}} | ||||
|                 <dd.Interactive | ||||
|                   @text="Details" | ||||
|                   @route="vault.cluster.access.oidc.clients.client.details" | ||||
|                   @model={{client.name}} | ||||
|                   data-test-oidc-client-menu-link="details" | ||||
|                 /> | ||||
|                 >Details</dd.Interactive> | ||||
|               {{/if}} | ||||
|               {{#if client.canEdit}} | ||||
|                 <dd.Interactive | ||||
|                   @text="Edit" | ||||
|                   @route="vault.cluster.access.oidc.clients.client.edit" | ||||
|                   @model={{client.name}} | ||||
|                   data-test-oidc-client-menu-link="edit" | ||||
|                 /> | ||||
|                 >Edit</dd.Interactive> | ||||
|               {{/if}} | ||||
|             </Hds::Dropdown> | ||||
|           {{/if}} | ||||
|   | ||||
| @@ -34,19 +34,17 @@ | ||||
|               /> | ||||
|               {{#if provider.canRead}} | ||||
|                 <dd.Interactive | ||||
|                   @text="Details" | ||||
|                   @route="vault.cluster.access.oidc.providers.provider.details" | ||||
|                   @model={{provider.name}} | ||||
|                   data-test-oidc-provider-menu-link="details" | ||||
|                 /> | ||||
|                 >Details</dd.Interactive> | ||||
|               {{/if}} | ||||
|               {{#if provider.canEdit}} | ||||
|                 <dd.Interactive | ||||
|                   @text="Edit" | ||||
|                   @route="vault.cluster.access.oidc.providers.provider.edit" | ||||
|                   @model={{provider.name}} | ||||
|                   data-test-oidc-provider-menu-link="edit" | ||||
|                 /> | ||||
|                 >Edit</dd.Interactive> | ||||
|               {{/if}} | ||||
|             </Hds::Dropdown> | ||||
|           {{/if}} | ||||
|   | ||||
| @@ -12,13 +12,12 @@ | ||||
|         <dd.Interactive | ||||
|           @href="/v1/sys/storage/raft/snapshot" | ||||
|           @isHrefExternal={{false}} | ||||
|           @text="Download" | ||||
|           {{on "click" (action "downloadViaServiceWorker")}} | ||||
|         /> | ||||
|         >Download</dd.Interactive> | ||||
|       {{else}} | ||||
|         <dd.Interactive @text="Download" {{on "click" (action "downloadSnapshot")}} /> | ||||
|         <dd.Interactive {{on "click" (action "downloadSnapshot")}}>Download</dd.Interactive> | ||||
|       {{/if}} | ||||
|       <dd.Interactive @text="Restore" @route="vault.cluster.storage-restore" /> | ||||
|       <dd.Interactive @route="vault.cluster.storage-restore">Restore</dd.Interactive> | ||||
|     </Hds::Dropdown> | ||||
|   </PH.Actions> | ||||
| </Hds::PageHeader> | ||||
|   | ||||
| @@ -36,11 +36,10 @@ | ||||
|           </dd.Generic> | ||||
|         {{else if @item.canGenerate}} | ||||
|           <dd.Interactive | ||||
|             @text="Generate credentials" | ||||
|             @route="vault.cluster.secrets.backend.credentials" | ||||
|             @model={{@item.id}} | ||||
|             data-test-role-aws-link="generate" | ||||
|           /> | ||||
|           >Generate credentials</dd.Interactive> | ||||
|         {{/if}} | ||||
|         {{#if @item.updatePath.isPending}} | ||||
|           <dd.Generic class="has-text-center"> | ||||
| @@ -49,27 +48,24 @@ | ||||
|         {{else}} | ||||
|           {{#if @item.canRead}} | ||||
|             <dd.Interactive | ||||
|               @text="Details" | ||||
|               @route="vault.cluster.secrets.backend.show" | ||||
|               @model={{@item.id}} | ||||
|               data-test-role-ssh-link="show" | ||||
|             /> | ||||
|             >Details</dd.Interactive> | ||||
|           {{/if}} | ||||
|           {{#if @item.canEdit}} | ||||
|             <dd.Interactive | ||||
|               @text="Edit" | ||||
|               @route="vault.cluster.secrets.backend.edit" | ||||
|               @model={{@item.id}} | ||||
|               data-test-role-ssh-link="edit" | ||||
|             /> | ||||
|             >Edit</dd.Interactive> | ||||
|           {{/if}} | ||||
|           {{#if @item.canDelete}} | ||||
|             <dd.Interactive | ||||
|               @text="Delete" | ||||
|               @color="critical" | ||||
|               {{on "click" (fn (mut this.showConfirmModal) true)}} | ||||
|               data-test-aws-role-delete={{@item.id}} | ||||
|             /> | ||||
|             >Delete</dd.Interactive> | ||||
|           {{/if}} | ||||
|         {{/if}} | ||||
|       </Hds::Dropdown> | ||||
|   | ||||
| @@ -34,46 +34,41 @@ | ||||
|           data-test-popup-menu-trigger | ||||
|         /> | ||||
|         {{#if @item.canEdit}} | ||||
|           <dd.Interactive @text="Edit connection" @route="vault.cluster.secrets.backend.edit" @model={{@item.id}} /> | ||||
|           <dd.Interactive @route="vault.cluster.secrets.backend.edit" @model={{@item.id}}>Edit connection</dd.Interactive> | ||||
|         {{/if}} | ||||
|         {{#if @item.canEditRole}} | ||||
|           <dd.Interactive @text="Edit Role" @route="vault.cluster.secrets.backend.edit" @model={{concat "role/" @item.id}} /> | ||||
|           <dd.Interactive @route="vault.cluster.secrets.backend.edit" @model={{concat "role/" @item.id}}>Edit Role</dd.Interactive> | ||||
|         {{/if}} | ||||
|         {{#if @item.canReset}} | ||||
|           <dd.Interactive | ||||
|             @text="Reset connection" | ||||
|             @icon={{if (eq this.actionRunning "reset") "loading"}} | ||||
|             {{on "click" (fn this.resetConnection @item.id)}} | ||||
|           /> | ||||
|           >Reset connection</dd.Interactive> | ||||
|         {{/if}} | ||||
|         {{#if (and (eq @item.type "dynamic") @item.canGenerateCredentials)}} | ||||
|           <dd.Interactive | ||||
|             @text="Generate credentials" | ||||
|             @route="vault.cluster.secrets.backend.credentials" | ||||
|             @model={{@item.id}} | ||||
|             @query={{hash roleType=this.keyTypeValue}} | ||||
|           /> | ||||
|           >Generate credentials</dd.Interactive> | ||||
|         {{else if (and (eq @item.type "static") @item.canGetCredentials)}} | ||||
|           <dd.Interactive | ||||
|             @text="Get credentials" | ||||
|             @route="vault.cluster.secrets.backend.credentials" | ||||
|             @model={{@item.id}} | ||||
|             @query={{hash roleType=this.keyTypeValue}} | ||||
|           /> | ||||
|           >Get credentials</dd.Interactive> | ||||
|         {{/if}} | ||||
|         {{#if (and @item.canRotateRoleCredentials (eq this.keyTypeValue "static"))}} | ||||
|           <dd.Interactive | ||||
|             @text="Rotate credentials" | ||||
|             @icon={{if (eq this.actionRunning "rotateRole") "loading"}} | ||||
|             {{on "click" (fn this.rotateRoleCred @item.id)}} | ||||
|           /> | ||||
|           >Rotate credentials</dd.Interactive> | ||||
|         {{/if}} | ||||
|         {{#if @item.canRotateRoot}} | ||||
|           <dd.Interactive | ||||
|             @text="Rotate root credentials" | ||||
|             @icon={{if (eq this.actionRunning "rotateRoot") "loading"}} | ||||
|             {{on "click" (fn this.rotateRootCred @item.id)}} | ||||
|           /> | ||||
|           >Rotate root credentials</dd.Interactive> | ||||
|         {{/if}} | ||||
|       </Hds::Dropdown> | ||||
|     </div> | ||||
|   | ||||
| @@ -21,6 +21,7 @@ | ||||
|         @backend={{@backendModel.id}} | ||||
|         @queryParams={{secret-query-params @backendModel.type @item.type asQueryParams=true}} | ||||
|         class="has-text-black has-text-weight-semibold" | ||||
|         data-test-secret-item-link={{@item.id}} | ||||
|       > | ||||
|         {{#if (eq @backendModel.type "transit")}} | ||||
|           <Icon @name="key" class="has-text-grey-light" /> | ||||
| @@ -39,7 +40,7 @@ | ||||
|           data-test-popup-menu-trigger | ||||
|         /> | ||||
|         {{#if @item.isFolder}} | ||||
|           <dd.Interactive @text="Contents" @route="vault.cluster.secrets.backend.list" @model={{@item.id}} /> | ||||
|           <dd.Interactive @route="vault.cluster.secrets.backend.list" @model={{@item.id}}>Contents</dd.Interactive> | ||||
|         {{else}} | ||||
|           {{#if (or @item.versionPath.isLoading @item.secretPath.isLoading)}} | ||||
|             <dd.Generic class="has-text-center"> | ||||
| @@ -48,27 +49,24 @@ | ||||
|           {{else}} | ||||
|             {{#if @item.canRead}} | ||||
|               <dd.Interactive | ||||
|                 @text="Details" | ||||
|                 @route="vault.cluster.secrets.backend.show" | ||||
|                 @model={{@item.id}} | ||||
|                 @query={{secret-query-params @backendModel.type @item.type asQueryParams=true}} | ||||
|               /> | ||||
|               >Details</dd.Interactive> | ||||
|             {{/if}} | ||||
|             {{#if @item.canEdit}} | ||||
|               <dd.Interactive | ||||
|                 @text="Edit" | ||||
|                 @route="vault.cluster.secrets.backend.edit" | ||||
|                 @model={{@item.id}} | ||||
|                 @query={{secret-query-params @backendModel.type @item.type asQueryParams=true}} | ||||
|               /> | ||||
|               >Edit</dd.Interactive> | ||||
|             {{/if}} | ||||
|             {{#if @item.canDelete}} | ||||
|               <dd.Interactive | ||||
|                 @text="Delete" | ||||
|                 @color="critical" | ||||
|                 data-test-confirm-action-trigger | ||||
|                 {{on "click" (fn (mut this.showConfirmModal) true)}} | ||||
|               /> | ||||
|               >Delete</dd.Interactive> | ||||
|             {{/if}} | ||||
|           {{/if}} | ||||
|         {{/if}} | ||||
|   | ||||
| @@ -50,11 +50,10 @@ | ||||
|               </dd.Generic> | ||||
|             {{else if @item.canGenerate}} | ||||
|               <dd.Interactive | ||||
|                 @text="Generate credentials" | ||||
|                 @route="vault.cluster.secrets.backend.credentials" | ||||
|                 @model={{@item.id}} | ||||
|                 data-test-role-ssh-link="generate" | ||||
|               /> | ||||
|               >Generate credentials</dd.Interactive> | ||||
|             {{/if}} | ||||
|           {{else if (eq @item.keyType "ca")}} | ||||
|             {{#if @item.signPath.isPending}} | ||||
| @@ -63,11 +62,10 @@ | ||||
|               </dd.Generic> | ||||
|             {{else if @item.canGenerate}} | ||||
|               <dd.Interactive | ||||
|                 @text="Sign Keys" | ||||
|                 @route="vault.cluster.secrets.backend.sign" | ||||
|                 @model={{@item.id}} | ||||
|                 data-test-role-ssh-link="generate" | ||||
|               /> | ||||
|               >Sign Keys</dd.Interactive> | ||||
|             {{/if}} | ||||
|           {{/if}} | ||||
|           {{#if @loadingToggleZeroAddress}} | ||||
| @@ -75,10 +73,9 @@ | ||||
|               <LoadingDropdownOption /> | ||||
|             </dd.Generic> | ||||
|           {{else if @item.canEditZeroAddress}} | ||||
|             <dd.Interactive | ||||
|               @text={{if @item.zeroAddress "Disable Zero Address" "Enable Zero Address"}} | ||||
|               {{on "click" @toggleZeroAddress}} | ||||
|             /> | ||||
|             <dd.Interactive {{on "click" @toggleZeroAddress}}> | ||||
|               {{if @item.zeroAddress "Disable Zero Address" "Enable Zero Address"}} | ||||
|             </dd.Interactive> | ||||
|           {{/if}} | ||||
|           {{#if @item.updatePath.isPending}} | ||||
|             <dd.Generic class="has-text-center"> | ||||
| @@ -87,27 +84,24 @@ | ||||
|           {{else}} | ||||
|             {{#if @item.canRead}} | ||||
|               <dd.Interactive | ||||
|                 @text="Details" | ||||
|                 @route="vault.cluster.secrets.backend.show" | ||||
|                 @model={{@item.id}} | ||||
|                 data-test-role-ssh-link="show" | ||||
|               /> | ||||
|               >Details</dd.Interactive> | ||||
|             {{/if}} | ||||
|             {{#if @item.canEdit}} | ||||
|               <dd.Interactive | ||||
|                 @text="Edit" | ||||
|                 @route="vault.cluster.secrets.backend.edit" | ||||
|                 @model={{@item.id}} | ||||
|                 data-test-role-ssh-link="edit" | ||||
|               /> | ||||
|               >Edit</dd.Interactive> | ||||
|             {{/if}} | ||||
|             {{#if @item.canDelete}} | ||||
|               <dd.Interactive | ||||
|                 @text="Delete" | ||||
|                 @color="critical" | ||||
|                 {{on "click" (fn (mut this.showConfirmModal) true)}} | ||||
|                 data-test-ssh-role-delete | ||||
|               /> | ||||
|               >Delete</dd.Interactive> | ||||
|             {{/if}} | ||||
|           {{/if}} | ||||
|         </Hds::Dropdown> | ||||
|   | ||||
| @@ -33,10 +33,10 @@ | ||||
|               data-test-popup-menu-trigger | ||||
|             /> | ||||
|             {{#if @item.updatePath.canRead}} | ||||
|               <dd.Interactive @text="Details" @route="vault.cluster.secrets.backend.show" @model={{@itemPath}} /> | ||||
|               <dd.Interactive @route="vault.cluster.secrets.backend.show" @model={{@itemPath}}>Details</dd.Interactive> | ||||
|             {{/if}} | ||||
|             {{#if @item.updatePath.canUpdate}} | ||||
|               <dd.Interactive @text="Edit" @route="vault.cluster.secrets.backend.edit" @model={{@itemPath}} /> | ||||
|               <dd.Interactive @route="vault.cluster.secrets.backend.edit" @model={{@itemPath}}>Edit</dd.Interactive> | ||||
|             {{/if}} | ||||
|           </Hds::Dropdown> | ||||
|         {{/if}} | ||||
|   | ||||
| @@ -33,10 +33,10 @@ | ||||
|             data-test-popup-menu-trigger | ||||
|           /> | ||||
|           {{#if @item.updatePath.canRead}} | ||||
|             <dd.Interactive @text="Details" @route="vault.cluster.secrets.backend.show" @model={{@item.id}} /> | ||||
|             <dd.Interactive @route="vault.cluster.secrets.backend.show" @model={{@item.id}}>Details</dd.Interactive> | ||||
|           {{/if}} | ||||
|           {{#if @item.updatePath.canUpdate}} | ||||
|             <dd.Interactive @text="Edit" @route="vault.cluster.secrets.backend.edit" @model={{@item.id}} /> | ||||
|             <dd.Interactive @route="vault.cluster.secrets.backend.edit" @model={{@item.id}}>Edit</dd.Interactive> | ||||
|           {{/if}} | ||||
|         </Hds::Dropdown> | ||||
|       {{/if}} | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
|                   <Hds::SideNav::Header::HomeLink @icon="vault" @route="vault" @ariaLabel="Vault dashboard" /> | ||||
|                 </:logo> | ||||
|                 <:actions> | ||||
|                   <Hds::SideNav::Header::IconButton @icon="home" @ariaLabel="Docs index" @route="docs" /> | ||||
|                   <Hds::Button @isIconOnly={{true}} @icon="home" @text="Docs index" @route="docs" /> | ||||
|                 </:actions> | ||||
|               </Hds::SideNav::Header> | ||||
|             </:header> | ||||
|   | ||||
| @@ -41,10 +41,9 @@ | ||||
|               data-test-popup-menu-trigger | ||||
|             /> | ||||
|             <dd.Interactive | ||||
|               @text="Details" | ||||
|               @route="vault.cluster.access.identity.show" | ||||
|               @models={{array item.id "details"}} | ||||
|             /> | ||||
|             >Details</dd.Interactive> | ||||
|             {{#if (or item.isReloading item.updatePath.isPending item.aliasPath.isPending)}} | ||||
|               <dd.Generic class="has-text-center"> | ||||
|                 <LoadingDropdownOption /> | ||||
| @@ -55,27 +54,28 @@ | ||||
|                 {{#if (or (eq this.identityType "entity") (and (eq item.type "external") (not item.alias)))}} | ||||
|                   <dd.Interactive | ||||
|                     data-test-popup-menu="create alias" | ||||
|                     @text="Create alias" | ||||
|                     @route="vault.cluster.access.identity.aliases.add" | ||||
|                     @models={{array (pluralize this.identityType) item.id}} | ||||
|                   /> | ||||
|                   >Create alias</dd.Interactive> | ||||
|                 {{/if}} | ||||
|               {{/if}} | ||||
|               {{#if item.canEdit}} | ||||
|                 <dd.Interactive @text="Edit" @route="vault.cluster.access.identity.edit" @model={{item.id}} /> | ||||
|                 <dd.Interactive @route="vault.cluster.access.identity.edit" @model={{item.id}}>Edit</dd.Interactive> | ||||
|                 {{#if item.disabled}} | ||||
|                   <dd.Interactive @text="Enable" {{on "click" (action "toggleDisabled" item)}} /> | ||||
|                   <dd.Interactive {{on "click" (action "toggleDisabled" item)}}>Enable</dd.Interactive> | ||||
|                 {{else if (eq this.identityType "entity")}} | ||||
|                   <dd.Interactive @text="Disable" @color="critical" {{on "click" (fn (mut this.entityToDisable) item)}} /> | ||||
|                   <dd.Interactive | ||||
|                     @color="critical" | ||||
|                     {{on "click" (fn (mut this.entityToDisable) item)}} | ||||
|                   >Disable</dd.Interactive> | ||||
|                 {{/if}} | ||||
|               {{/if}} | ||||
|               {{#if item.canDelete}} | ||||
|                 <dd.Interactive | ||||
|                   @text="Delete" | ||||
|                   @color="critical" | ||||
|                   {{on "click" (fn (mut this.itemToDelete) item)}} | ||||
|                   data-test-popup-menu="delete" | ||||
|                 /> | ||||
|                 >Delete</dd.Interactive> | ||||
|               {{/if}} | ||||
|             {{/if}} | ||||
|           </Hds::Dropdown> | ||||
|   | ||||
| @@ -76,20 +76,19 @@ | ||||
|               @hasChevron={{false}} | ||||
|               data-test-popup-menu-trigger | ||||
|             /> | ||||
|             <dd.Interactive | ||||
|               @text="View configuration" | ||||
|               @route="vault.cluster.access.method.section" | ||||
|               @models={{array method.id "configuration"}} | ||||
|             /> | ||||
|             <dd.Interactive @route="vault.cluster.access.method.section" @models={{array method.id "configuration"}}> | ||||
|               View configuration | ||||
|             </dd.Interactive> | ||||
|             {{#if (or method.canEdit (and (eq method.methodType "aws") method.canEditAws))}} | ||||
|               <dd.Interactive | ||||
|                 @text="Edit configuration" | ||||
|                 @route="vault.cluster.settings.auth.configure" | ||||
|                 @model={{method.id}} | ||||
|               /> | ||||
|               <dd.Interactive @route="vault.cluster.settings.auth.configure" @model={{method.id}}> | ||||
|                 Edit configuration | ||||
|               </dd.Interactive> | ||||
|             {{/if}} | ||||
|             {{#if (and (not-eq method.methodType "token") method.canDisable)}} | ||||
|               <dd.Interactive @text="Disable" @color="critical" {{on "click" (fn (mut this.methodToDisable) method)}} /> | ||||
|               <dd.Interactive | ||||
|                 @color="critical" | ||||
|                 {{on "click" (fn (mut this.methodToDisable) method)}} | ||||
|               >Disable</dd.Interactive> | ||||
|             {{/if}} | ||||
|           </Hds::Dropdown> | ||||
|         </div> | ||||
|   | ||||
| @@ -93,11 +93,10 @@ | ||||
|                     data-test-popup-menu-trigger | ||||
|                   /> | ||||
|                   <dd.Interactive | ||||
|                     @text="Details" | ||||
|                     @route={{target.link}} | ||||
|                     @models={{target.linkModels}} | ||||
|                     data-test-target-link={{target.title}} | ||||
|                   /> | ||||
|                   >Details</dd.Interactive> | ||||
|                 </Hds::Dropdown> | ||||
|               </div> | ||||
|             </div> | ||||
|   | ||||
| @@ -46,7 +46,7 @@ | ||||
|                 </dd.Generic> | ||||
|               {{/if}} | ||||
|             {{/let}} | ||||
|             <dd.Interactive @text="Delete" @color="critical" {{on "click" (fn (mut this.nsToDelete) list.item)}} /> | ||||
|             <dd.Interactive @color="critical" {{on "click" (fn (mut this.nsToDelete) list.item)}}>Delete</dd.Interactive> | ||||
|           </Hds::Dropdown> | ||||
|           {{#if (eq this.nsToDelete list.item)}} | ||||
|             <ConfirmModal | ||||
|   | ||||
| @@ -46,19 +46,17 @@ | ||||
|                 data-test-popup-menu-trigger | ||||
|               /> | ||||
|               <dd.Interactive | ||||
|                 @text="Details" | ||||
|                 @route="vault.cluster.access.oidc.assignments.assignment.details" | ||||
|                 @model={{model.name}} | ||||
|                 @disabled={{eq model.canRead false}} | ||||
|                 data-test-oidc-assignment-menu-link="details" | ||||
|               /> | ||||
|               >Details</dd.Interactive> | ||||
|               <dd.Interactive | ||||
|                 @text="Edit" | ||||
|                 @route="vault.cluster.access.oidc.assignments.assignment.edit" | ||||
|                 @model={{model.name}} | ||||
|                 @disabled={{eq model.canEdit false}} | ||||
|                 data-test-oidc-assignment-menu-link="edit" | ||||
|               /> | ||||
|               >Edit</dd.Interactive> | ||||
|             </Hds::Dropdown> | ||||
|           </div> | ||||
|         </div> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   SPDX-License-Identifier: BUSL-1.1 | ||||
| ~}} | ||||
|  | ||||
| {{#if this.showHeader}} | ||||
| {{#if (not-eq this.router.currentRoute.localName "edit")}} | ||||
|   <PageHeader as |p|> | ||||
|     <p.top> | ||||
|       <Hds::Breadcrumb> | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|       <div class="level-left"> | ||||
|         <div> | ||||
|           <Icon @name="key" class="has-text-grey-light" /> | ||||
|           <span class="has-text-weight-semibold is-underline"> | ||||
|           <span class="has-text-weight-semibold is-underline" data-test-item> | ||||
|             {{model.name}} | ||||
|           </span> | ||||
|         </div> | ||||
| @@ -36,19 +36,17 @@ | ||||
|               data-test-popup-menu-trigger | ||||
|             /> | ||||
|             <dd.Interactive | ||||
|               @text="Details" | ||||
|               @route="vault.cluster.access.oidc.keys.key.details" | ||||
|               @model={{model.name}} | ||||
|               @disabled={{eq model.canRead false}} | ||||
|               data-test-oidc-key-menu-link="details" | ||||
|             /> | ||||
|             >Details</dd.Interactive> | ||||
|             <dd.Interactive | ||||
|               @text="Edit" | ||||
|               @route="vault.cluster.access.oidc.keys.key.edit" | ||||
|               @model={{model.name}} | ||||
|               @disabled={{eq model.canEdit false}} | ||||
|               data-test-oidc-key-menu-link="edit" | ||||
|             /> | ||||
|             >Edit</dd.Interactive> | ||||
|           </Hds::Dropdown> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   SPDX-License-Identifier: BUSL-1.1 | ||||
| ~}} | ||||
|  | ||||
| {{#if this.showHeader}} | ||||
| {{#if (not-eq this.router.currentRoute.localName "edit")}} | ||||
|   <PageHeader as |p|> | ||||
|     <p.top> | ||||
|       <Hds::Breadcrumb> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|   SPDX-License-Identifier: BUSL-1.1 | ||||
| ~}} | ||||
|  | ||||
| {{#if this.showHeader}} | ||||
| {{#if (not-eq this.router.currentRoute.localName "edit")}} | ||||
|   <PageHeader as |p|> | ||||
|     <p.top> | ||||
|       <Hds::Breadcrumb> | ||||
|   | ||||
| @@ -37,19 +37,17 @@ | ||||
|                 data-test-popup-menu-trigger | ||||
|               /> | ||||
|               <dd.Interactive | ||||
|                 @text="Details" | ||||
|                 @route="vault.cluster.access.oidc.scopes.scope.details" | ||||
|                 @model={{model.name}} | ||||
|                 @disabled={{eq model.canRead false}} | ||||
|                 data-test-oidc-scope-menu-link="details" | ||||
|               /> | ||||
|               >Details</dd.Interactive> | ||||
|               <dd.Interactive | ||||
|                 @text="Edit" | ||||
|                 @route="vault.cluster.access.oidc.scopes.scope.edit" | ||||
|                 @model={{model.name}} | ||||
|                 @disabled={{eq model.canEdit false}} | ||||
|                 data-test-oidc-scope-menu-link="edit" | ||||
|               /> | ||||
|               >Edit</dd.Interactive> | ||||
|             </Hds::Dropdown> | ||||
|           </div> | ||||
|         </div> | ||||
|   | ||||
| @@ -105,27 +105,24 @@ | ||||
|                 {{else}} | ||||
|                   {{#if item.canRead}} | ||||
|                     <dd.Interactive | ||||
|                       @text="Details" | ||||
|                       @route="vault.cluster.policy.show" | ||||
|                       @models={{array this.policyType item.id}} | ||||
|                       data-test-policy-link="show" | ||||
|                     /> | ||||
|                     >Details</dd.Interactive> | ||||
|                   {{/if}} | ||||
|                   {{#if item.canEdit}} | ||||
|                     <dd.Interactive | ||||
|                       @text="Edit" | ||||
|                       @route="vault.cluster.policy.edit" | ||||
|                       @models={{array this.policyType item.id}} | ||||
|                       data-test-policy-link="edit" | ||||
|                     /> | ||||
|                     >Edit</dd.Interactive> | ||||
|                   {{/if}} | ||||
|                   {{#if (and item.canDelete (not-eq item.name "default"))}} | ||||
|                     <dd.Interactive | ||||
|                       @text="Delete" | ||||
|                       @color="critical" | ||||
|                       data-test-confirm-action-trigger | ||||
|                       {{on "click" (fn (mut this.policyToDelete) item)}} | ||||
|                     /> | ||||
|                     >Delete</dd.Interactive> | ||||
|                   {{/if}} | ||||
|                 {{/if}} | ||||
|               </Hds::Dropdown> | ||||
|   | ||||
| @@ -94,19 +94,15 @@ | ||||
|           @hasChevron={{false}} | ||||
|           data-test-popup-menu-trigger | ||||
|         /> | ||||
|         <dd.Interactive | ||||
|           @text="View configuration" | ||||
|           @route={{backend.backendConfigurationLink}} | ||||
|           @model={{backend.id}} | ||||
|           data-test-engine-config | ||||
|         /> | ||||
|         <dd.Interactive @route={{backend.backendConfigurationLink}} @model={{backend.id}} data-test-engine-config> | ||||
|           View configuration | ||||
|         </dd.Interactive> | ||||
|         {{#if (not-eq backend.type "cubbyhole")}} | ||||
|           <dd.Interactive | ||||
|             @text="Disable" | ||||
|             @color="critical" | ||||
|             {{on "click" (fn (mut this.engineToDisable) backend)}} | ||||
|             data-test-confirm-action-trigger | ||||
|           /> | ||||
|           >Disable</dd.Interactive> | ||||
|         {{/if}} | ||||
|       </Hds::Dropdown> | ||||
|     </div> | ||||
|   | ||||
| @@ -113,10 +113,13 @@ | ||||
|                   data-test-popup-menu-trigger | ||||
|                 /> | ||||
|                 {{#if message.canEditCustomMessages}} | ||||
|                   <dd.Interactive @text="Edit" @route="messages.message.edit" @model={{message.id}} /> | ||||
|                   <dd.Interactive @route="messages.message.edit" @model={{message.id}}>Edit</dd.Interactive> | ||||
|                 {{/if}} | ||||
|                 {{#if message.canDeleteCustomMessages}} | ||||
|                   <dd.Interactive @text="Delete" @color="critical" {{on "click" (fn (mut this.messageToDelete) message)}} /> | ||||
|                   <dd.Interactive | ||||
|                     @color="critical" | ||||
|                     {{on "click" (fn (mut this.messageToDelete) message)}} | ||||
|                   >Delete</dd.Interactive> | ||||
|                 {{/if}} | ||||
|               </Hds::Dropdown> | ||||
|             {{/if}} | ||||
|   | ||||
| @@ -7,13 +7,14 @@ | ||||
|   {{! Hds component renders <li> and <button> elements }} | ||||
|   <Hds::Dropdown::ListItem::Interactive | ||||
|     data-test-confirm-action-trigger | ||||
|     @text={{@buttonText}} | ||||
|     @color="critical" | ||||
|     {{on "click" (fn (mut this.showConfirmModal) true)}} | ||||
|     ...attributes | ||||
|     {{! remove class when dropdown/popup menus are replaced with Hds::Dropdown }} | ||||
|     class="hds-confirm-action-critical" | ||||
|   /> | ||||
|   > | ||||
|     {{@buttonText}} | ||||
|   </Hds::Dropdown::ListItem::Interactive> | ||||
| {{else}} | ||||
|   <Hds::Button | ||||
|     data-test-confirm-action-trigger | ||||
|   | ||||
| @@ -71,22 +71,17 @@ | ||||
|       <Item.menu> | ||||
|         <Hds::Dropdown @isInline={{true}} @listPosition="bottom-right" as |dd|> | ||||
|           <dd.ToggleIcon @icon="more-horizontal" @text="More options" @hasChevron={{false}} data-test-popup-menu-trigger /> | ||||
|           <dd.Interactive | ||||
|             @text="View credentials" | ||||
|             @route="credentials.show" | ||||
|             @models={{array this.scope this.role list.item.id}} | ||||
|           /> | ||||
|           <dd.Interactive @route="credentials.show" @models={{array this.scope this.role list.item.id}}>View credentials</dd.Interactive> | ||||
|           {{#if list.item.deletePath.isPending}} | ||||
|             <dd.Generic> | ||||
|               <LoadingDropdownOption /> | ||||
|             </dd.Generic> | ||||
|           {{else if list.item.deletePath.canDelete}} | ||||
|             <dd.Interactive | ||||
|               @text="Revoke credentials" | ||||
|               @color="critical" | ||||
|               {{on "click" (fn (mut this.credToRevoke) list.item)}} | ||||
|               data-test-confirm-action-trigger | ||||
|             /> | ||||
|             >Revoke credentials</dd.Interactive> | ||||
|           {{/if}} | ||||
|         </Hds::Dropdown> | ||||
|         {{#if (eq this.credToRevoke list.item)}} | ||||
|   | ||||
| @@ -71,23 +71,22 @@ | ||||
|       <Item.menu> | ||||
|         <Hds::Dropdown @isInline={{true}} @listPosition="bottom-right" as |dd|> | ||||
|           <dd.ToggleIcon @icon="more-horizontal" @text="More options" @hasChevron={{false}} data-test-popup-menu-trigger /> | ||||
|           <dd.Interactive @text="View credentials" @route="credentials" @models={{array this.scope list.item.id}} /> | ||||
|           <dd.Interactive @text="View role" @route="role" @models={{array this.scope list.item.id}} /> | ||||
|           <dd.Interactive @route="credentials" @models={{array this.scope list.item.id}}>View credentials</dd.Interactive> | ||||
|           <dd.Interactive @route="role" @models={{array this.scope list.item.id}}>View role</dd.Interactive> | ||||
|           {{#if list.item.updatePath.isPending}} | ||||
|             <dd.Generic> | ||||
|               <LoadingDropdownOption /> | ||||
|             </dd.Generic> | ||||
|           {{else}} | ||||
|             {{#if list.item.updatePath.canUpdate}} | ||||
|               <dd.Interactive @text="Edit role" @route="role.edit" @models={{array this.scope list.item.id}} /> | ||||
|               <dd.Interactive @route="role.edit" @models={{array this.scope list.item.id}}>Edit role</dd.Interactive> | ||||
|             {{/if}} | ||||
|             {{#if list.item.updatePath.canDelete}} | ||||
|               <dd.Interactive | ||||
|                 @text="Delete role" | ||||
|                 @color="critical" | ||||
|                 {{on "click" (fn (mut this.roleToDelete) list.item)}} | ||||
|                 data-test-confirm-action-trigger | ||||
|               /> | ||||
|               >Delete role</dd.Interactive> | ||||
|             {{/if}} | ||||
|           {{/if}} | ||||
|         </Hds::Dropdown> | ||||
|   | ||||
| @@ -60,18 +60,17 @@ | ||||
|       <Item.menu> | ||||
|         <Hds::Dropdown @isInline={{true}} @listPosition="bottom-right" as |dd|> | ||||
|           <dd.ToggleIcon @icon="more-horizontal" @text="More options" @hasChevron={{false}} data-test-popup-menu-trigger /> | ||||
|           <dd.Interactive @text="View scope" @route="scope" @model={{list.item.id}} /> | ||||
|           <dd.Interactive @route="scope" @model={{list.item.id}}>View scope</dd.Interactive> | ||||
|           {{#if list.item.updatePath.isPending}} | ||||
|             <dd.Generic> | ||||
|               <LoadingDropdownOption /> | ||||
|             </dd.Generic> | ||||
|           {{else if list.item.updatePath.canDelete}} | ||||
|             <dd.Interactive | ||||
|               @text="Delete scope" | ||||
|               @color="critical" | ||||
|               {{on "click" (fn (mut this.scopeToDelete) list.item)}} | ||||
|               data-test-confirm-action-trigger | ||||
|             /> | ||||
|             >Delete scope</dd.Interactive> | ||||
|           {{/if}} | ||||
|         </Hds::Dropdown> | ||||
|         {{#if (eq this.scopeToDelete list.item)}} | ||||
|   | ||||
| @@ -49,18 +49,17 @@ | ||||
|                 data-test-popup-menu-trigger | ||||
|               /> | ||||
|               {{#if role.canRead}} | ||||
|                 <dd.Interactive @text="Details" @route="roles.role.details" @model={{role}} data-test-details /> | ||||
|                 <dd.Interactive @route="roles.role.details" @model={{role}} data-test-details>Details</dd.Interactive> | ||||
|               {{/if}} | ||||
|               {{#if role.canEdit}} | ||||
|                 <dd.Interactive @text="Edit" data-test-edit @route="roles.role.edit" @model={{role}} /> | ||||
|                 <dd.Interactive data-test-edit @route="roles.role.edit" @model={{role}}>Edit</dd.Interactive> | ||||
|               {{/if}} | ||||
|               {{#if role.canDelete}} | ||||
|                 <dd.Interactive | ||||
|                   @text="Delete" | ||||
|                   data-test-delete | ||||
|                   @color="critical" | ||||
|                   {{on "click" (fn (mut this.roleToDelete) role)}} | ||||
|                 /> | ||||
|                 >Delete</dd.Interactive> | ||||
|               {{/if}} | ||||
|             </Hds::Dropdown> | ||||
|           {{/if}} | ||||
|   | ||||
| @@ -84,7 +84,7 @@ | ||||
|           <div class="level-left"> | ||||
|             <div> | ||||
|               <Icon @name={{if metadata.pathIsDirectory "folder" "file"}} class="has-text-grey-light" /> | ||||
|               <span class="has-text-weight-semibold is-underline"> | ||||
|               <span class="has-text-weight-semibold is-underline" data-test-path> | ||||
|                 {{metadata.path}} | ||||
|               </span> | ||||
|             </div> | ||||
| @@ -100,35 +100,25 @@ | ||||
|                 /> | ||||
|                 {{#if metadata.pathIsDirectory}} | ||||
|                   <dd.Interactive | ||||
|                     @text="Content" | ||||
|                     @route="list-directory" | ||||
|                     @models={{array @backend metadata.fullSecretPath}} | ||||
|                   /> | ||||
|                   >Content</dd.Interactive> | ||||
|                 {{else}} | ||||
|                   <dd.Interactive | ||||
|                     @text="Overview" | ||||
|                     @route="secret.index" | ||||
|                     @models={{array @backend metadata.fullSecretPath}} | ||||
|                   /> | ||||
|                   <dd.Interactive | ||||
|                     @text="Secret data" | ||||
|                     @route="secret.details" | ||||
|                     @models={{array @backend metadata.fullSecretPath}} | ||||
|                   /> | ||||
|                   >Overview</dd.Interactive> | ||||
|                   <dd.Interactive @route="secret.details" @models={{array @backend metadata.fullSecretPath}}>Secret data</dd.Interactive> | ||||
|                   {{#if metadata.canReadMetadata}} | ||||
|                     <dd.Interactive | ||||
|                       @text="View version history" | ||||
|                       @route="secret.metadata.versions" | ||||
|                       @models={{array @backend metadata.fullSecretPath}} | ||||
|                     /> | ||||
|                     <dd.Interactive @route="secret.metadata.versions" @models={{array @backend metadata.fullSecretPath}}> | ||||
|                       View version history</dd.Interactive> | ||||
|                   {{/if}} | ||||
|                   {{#if metadata.canDeleteMetadata}} | ||||
|                     <dd.Interactive | ||||
|                       @text="Permanently delete" | ||||
|                       @color="critical" | ||||
|                       {{on "click" (fn (mut this.metadataToDelete) metadata)}} | ||||
|                       data-test-popup-metadata-delete | ||||
|                     /> | ||||
|                     >Permanently delete</dd.Interactive> | ||||
|                   {{/if}} | ||||
|                 {{/if}} | ||||
|               </Hds::Dropdown> | ||||
|   | ||||
| @@ -98,19 +98,17 @@ | ||||
|                 data-test-popup-menu-trigger | ||||
|               /> | ||||
|               <dd.Interactive | ||||
|                 @text="View version {{versionData.version}}" | ||||
|                 @route="secret.details" | ||||
|                 @models={{array @backend @path}} | ||||
|                 @query={{hash version=versionData.version}} | ||||
|               /> | ||||
|               >View version {{versionData.version}}</dd.Interactive> | ||||
|               {{#if (and @metadata.canCreateVersionData (not versionData.destroyed) (not versionData.isSecretDeleted))}} | ||||
|                 <dd.Interactive | ||||
|                   @text="Create new version from {{versionData.version}}" | ||||
|                   @route="secret.details.edit" | ||||
|                   @models={{array @backend @path}} | ||||
|                   @query={{hash version=versionData.version}} | ||||
|                   data-test-create-new-version-from={{versionData.version}} | ||||
|                 /> | ||||
|                 >Create new version from {{versionData.version}}</dd.Interactive> | ||||
|               {{/if}} | ||||
|             </Hds::Dropdown> | ||||
|           </div> | ||||
|   | ||||
| @@ -58,18 +58,21 @@ | ||||
|                 data-test-popup-menu-trigger | ||||
|               /> | ||||
|               {{#if library.canEdit}} | ||||
|                 <dd.Interactive @text="Edit" data-test-edit @route="libraries.library.edit" @model={{library}} /> | ||||
|                 <dd.Interactive data-test-edit @route="libraries.library.edit" @model={{library}}>Edit</dd.Interactive> | ||||
|               {{/if}} | ||||
|               {{#if library.canRead}} | ||||
|                 <dd.Interactive @text="Details" data-test-details @route="libraries.library.details" @model={{library}} /> | ||||
|                 <dd.Interactive | ||||
|                   data-test-details | ||||
|                   @route="libraries.library.details" | ||||
|                   @model={{library}} | ||||
|                 >Details</dd.Interactive> | ||||
|               {{/if}} | ||||
|               {{#if library.canDelete}} | ||||
|                 <dd.Interactive | ||||
|                   @text="Delete" | ||||
|                   data-test-delete | ||||
|                   @color="critical" | ||||
|                   {{on "click" (fn (mut this.libraryToDelete) library)}} | ||||
|                 /> | ||||
|                 >Delete</dd.Interactive> | ||||
|               {{/if}} | ||||
|             </Hds::Dropdown> | ||||
|           {{/if}} | ||||
|   | ||||
| @@ -53,38 +53,36 @@ | ||||
|           <Hds::Dropdown @isInline={{true}} @listPosition="bottom-right" as |dd|> | ||||
|             <dd.ToggleIcon @icon="more-horizontal" @text="More options" @hasChevron={{false}} data-test-popup-menu-trigger /> | ||||
|             {{#if role.canEdit}} | ||||
|               <dd.Interactive @text="Edit" data-test-edit @route="roles.role.edit" @models={{array role.type role.name}} /> | ||||
|               <dd.Interactive | ||||
|                 data-test-edit | ||||
|                 @route="roles.role.edit" | ||||
|                 @models={{array role.type role.name}} | ||||
|               >Edit</dd.Interactive> | ||||
|             {{/if}} | ||||
|             {{#if role.canReadCreds}} | ||||
|               <dd.Interactive | ||||
|                 @text="Get credentials" | ||||
|                 data-test-get-creds | ||||
|                 @route="roles.role.credentials" | ||||
|                 @models={{array role.type role.name}} | ||||
|               /> | ||||
|               <dd.Interactive data-test-get-creds @route="roles.role.credentials" @models={{array role.type role.name}}> | ||||
|                 Get credentials | ||||
|               </dd.Interactive> | ||||
|             {{/if}} | ||||
|             {{#if role.canRotateStaticCreds}} | ||||
|               <dd.Interactive | ||||
|                 @text="Rotate credentials" | ||||
|                 data-test-rotate-creds | ||||
|                 @color="critical" | ||||
|                 {{on "click" (fn (mut this.credsToRotate) role)}} | ||||
|               /> | ||||
|               >Rotate credentials</dd.Interactive> | ||||
|             {{/if}} | ||||
|             <dd.Interactive | ||||
|               @text="Details" | ||||
|               data-test-details | ||||
|               @route="roles.role.details" | ||||
|               {{! this will force the roles.role model hook to fire since we may only have a partial model loaded in the list view }} | ||||
|               @models={{array role.type role.name}} | ||||
|             /> | ||||
|             >Details</dd.Interactive> | ||||
|             {{#if role.canDelete}} | ||||
|               <dd.Interactive | ||||
|                 @text="Delete" | ||||
|                 data-test-delete | ||||
|                 @color="critical" | ||||
|                 {{on "click" (fn (mut this.roleToDelete) role)}} | ||||
|               /> | ||||
|               >Delete</dd.Interactive> | ||||
|             {{/if}} | ||||
|           </Hds::Dropdown> | ||||
|         </Item.menu> | ||||
|   | ||||
| @@ -108,12 +108,11 @@ | ||||
|                   data-test-popup-menu-trigger | ||||
|                 /> | ||||
|                 <dd.Interactive | ||||
|                   @text="Details" | ||||
|                   @route="issuers.issuer.details" | ||||
|                   @models={{array @backend pkiIssuer.id}} | ||||
|                   data-test-pki-issuer-details | ||||
|                 /> | ||||
|                 <dd.Interactive @text="Edit" @route="issuers.issuer.edit" @models={{array @backend pkiIssuer.id}} /> | ||||
|                 >Details</dd.Interactive> | ||||
|                 <dd.Interactive @route="issuers.issuer.edit" @models={{array @backend pkiIssuer.id}}>Edit</dd.Interactive> | ||||
|               </Hds::Dropdown> | ||||
|             </div> | ||||
|           </div> | ||||
|   | ||||
| @@ -54,19 +54,17 @@ | ||||
|                   /> | ||||
|                   {{#if @canRead}} | ||||
|                     <dd.Interactive | ||||
|                       @text="Details" | ||||
|                       @route="keys.key.details" | ||||
|                       @models={{array @backend pkiKey.keyId}} | ||||
|                       data-test-key-menu-link="details" | ||||
|                     /> | ||||
|                     >Details</dd.Interactive> | ||||
|                   {{/if}} | ||||
|                   {{#if @canEdit}} | ||||
|                     <dd.Interactive | ||||
|                       @text="Edit" | ||||
|                       @route="keys.key.edit" | ||||
|                       @models={{array @backend pkiKey.keyId}} | ||||
|                       data-test-key-menu-link="edit" | ||||
|                     /> | ||||
|                     >Edit</dd.Interactive> | ||||
|                   {{/if}} | ||||
|                 </Hds::Dropdown> | ||||
|               {{/if}} | ||||
|   | ||||
| @@ -38,7 +38,10 @@ | ||||
|                   @hasChevron={{false}} | ||||
|                   data-test-popup-menu-trigger | ||||
|                 /> | ||||
|                 <dd.Interactive @text="Details" @route="certificates.certificate.details" @model={{pkiCertificate.id}} /> | ||||
|                 <dd.Interactive | ||||
|                   @route="certificates.certificate.details" | ||||
|                   @model={{pkiCertificate.id}} | ||||
|                 >Details</dd.Interactive> | ||||
|               </Hds::Dropdown> | ||||
|             </div> | ||||
|           </div> | ||||
|   | ||||
| @@ -44,15 +44,13 @@ | ||||
|                   data-test-popup-menu-trigger | ||||
|                 /> | ||||
|                 <dd.Interactive | ||||
|                   @text="Details" | ||||
|                   @route="roles.role.details" | ||||
|                   @models={{array this.model.parentModel.id pkiRole.id}} | ||||
|                 /> | ||||
|                 >Details</dd.Interactive> | ||||
|                 <dd.Interactive | ||||
|                   @text="Edit" | ||||
|                   @route="roles.role.edit" | ||||
|                   @models={{array this.model.parentModel.id pkiRole.id}} | ||||
|                 /> | ||||
|                 >Edit</dd.Interactive> | ||||
|               </Hds::Dropdown> | ||||
|             </div> | ||||
|           </div> | ||||
|   | ||||
| @@ -38,18 +38,16 @@ | ||||
|                 /> | ||||
|                 {{#if (eq this.replicationMode "performance")}} | ||||
|                   <dd.Interactive | ||||
|                     @text="Path filter config" | ||||
|                     @route="mode.secondaries.config-show" | ||||
|                     @models={{array this.replicationMode secondary}} | ||||
|                     data-test-replication-path-filter-link={{true}} | ||||
|                   /> | ||||
|                   >Path filter config</dd.Interactive> | ||||
|                 {{/if}} | ||||
|                 {{#if this.model.canRevokeSecondary}} | ||||
|                   <dd.Interactive | ||||
|                     @text="Revoke" | ||||
|                     @color="critical" | ||||
|                     {{on "click" (fn (mut this.secondaryToRevoke) secondary)}} | ||||
|                   /> | ||||
|                   >Revoke</dd.Interactive> | ||||
|                 {{/if}} | ||||
|               </Hds::Dropdown> | ||||
|             {{/if}} | ||||
|   | ||||
| @@ -83,27 +83,24 @@ | ||||
|               </dd.Generic> | ||||
|             {{else}} | ||||
|               <dd.Interactive | ||||
|                 @text="Details" | ||||
|                 data-test-details | ||||
|                 @route="secrets.destinations.destination.details" | ||||
|                 @models={{array destination.type destination.name}} | ||||
|                 @disabled={{not destination.canRead}} | ||||
|               /> | ||||
|               >Details</dd.Interactive> | ||||
|               {{#if destination.canEdit}} | ||||
|                 <dd.Interactive | ||||
|                   @text="Edit" | ||||
|                   data-test-edit | ||||
|                   @route="secrets.destinations.destination.edit" | ||||
|                   @models={{array destination.type destination.name}} | ||||
|                 /> | ||||
|                 >Edit</dd.Interactive> | ||||
|               {{/if}} | ||||
|               {{#if destination.canDelete}} | ||||
|                 <dd.Interactive | ||||
|                   data-test-delete | ||||
|                   @text="Delete" | ||||
|                   @color="critical" | ||||
|                   {{on "click" (fn (mut this.destinationToDelete) destination)}} | ||||
|                 /> | ||||
|                 >Delete</dd.Interactive> | ||||
|               {{/if}} | ||||
|             {{/if}} | ||||
|           </Hds::Dropdown> | ||||
|   | ||||
| @@ -53,26 +53,21 @@ | ||||
|                 <dd.Separator /> | ||||
|               {{/if}} | ||||
|               {{#if association.canSync}} | ||||
|                 <dd.Interactive | ||||
|                   @text="Sync now" | ||||
|                   data-test-association-action="sync" | ||||
|                   {{on "click" (fn this.update association "set")}} | ||||
|                 /> | ||||
|                 <dd.Interactive data-test-association-action="sync" {{on "click" (fn this.update association "set")}}> | ||||
|                   Sync now</dd.Interactive> | ||||
|               {{/if}} | ||||
|               <dd.Interactive | ||||
|                 @text="View secret" | ||||
|                 data-test-association-action="view" | ||||
|                 @route="kvSecretOverview" | ||||
|                 @isRouteExternal={{true}} | ||||
|                 @models={{array association.mount association.secretName}} | ||||
|               /> | ||||
|               >View secret</dd.Interactive> | ||||
|               {{#if association.canUnsync}} | ||||
|                 <dd.Interactive | ||||
|                   data-test-association-action="unsync" | ||||
|                   @color="critical" | ||||
|                   @text="Unsync" | ||||
|                   {{on "click" (fn (mut this.secretToUnsync) association)}} | ||||
|                 /> | ||||
|                 >Unsync</dd.Interactive> | ||||
|               {{/if}} | ||||
|             {{/if}} | ||||
|           </Hds::Dropdown> | ||||
|   | ||||
| @@ -142,15 +142,13 @@ | ||||
|                     <dd.Interactive | ||||
|                       @route="secrets.destinations.destination.sync" | ||||
|                       @models={{array data.type data.name}} | ||||
|                       @text="Sync secrets" | ||||
|                       data-test-overview-table-action="sync" | ||||
|                     /> | ||||
|                     >Sync secrets</dd.Interactive> | ||||
|                     <dd.Interactive | ||||
|                       @route="secrets.destinations.destination.secrets" | ||||
|                       @models={{array data.type data.name}} | ||||
|                       @text="View synced secrets" | ||||
|                       data-test-overview-table-action="details" | ||||
|                     /> | ||||
|                     >View synced secrets</dd.Interactive> | ||||
|                   </Hds::Dropdown> | ||||
|                 </B.Td> | ||||
|               </B.Tr> | ||||
|   | ||||
| @@ -234,7 +234,7 @@ | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@babel/core": "^7.24.0", | ||||
|     "@hashicorp/design-system-components": "~4.7.0", | ||||
|     "@hashicorp/design-system-components": "~4.12.0", | ||||
|     "@hashicorp/ember-flight-icons": "^5.1.3", | ||||
|     "ember-auto-import": "^2.7.2", | ||||
|     "handlebars": "4.7.7", | ||||
|   | ||||
| @@ -13,7 +13,7 @@ import { GENERAL } from 'vault/tests/helpers/general-selectors'; | ||||
| const SELECTORS = { | ||||
|   identityRow: (name) => `[data-test-identity-row="${name}"]`, | ||||
|   popupMenu: '[data-test-popup-menu-trigger]', | ||||
|   menuDelete: '[data-test-popup-menu="delete"]', | ||||
|   menuDelete: (name) => `[data-test-identity-row="${name}"] [data-test-popup-menu="delete"]`, | ||||
| }; | ||||
| export const testCRUD = async (name, itemType, assert) => { | ||||
|   await page.visit({ item_type: itemType }); | ||||
| @@ -36,8 +36,8 @@ export const testCRUD = async (name, itemType, assert) => { | ||||
|   ); | ||||
|  | ||||
|   await click(`${SELECTORS.identityRow(name)} ${SELECTORS.popupMenu}`); | ||||
|   await waitUntil(() => find(SELECTORS.menuDelete)); | ||||
|   await click(SELECTORS.menuDelete); | ||||
|   await waitUntil(() => find(SELECTORS.menuDelete(name))); | ||||
|   await click(SELECTORS.menuDelete(name)); | ||||
|   await indexPage.confirmDelete(); | ||||
|   await settled(); | ||||
|   assert.dom(GENERAL.latestFlashContent).includesText('Successfully deleted'); | ||||
| @@ -57,7 +57,7 @@ export const testDeleteFromForm = async (name, itemType, assert) => { | ||||
|   await click('[data-test-tab-subnav="policies"]'); | ||||
|   assert.dom('.list-item-row').exists({ count: 1 }, 'One item is under policies'); | ||||
|   await click('[data-test-tab-subnav="metadata"]'); | ||||
|   assert.dom('.info-table-row').hasText('hello goodbye', 'Metadata shows on tab'); | ||||
|   assert.dom('.info-table-row').hasTextContaining('hello goodbye', 'Metadata shows on tab'); | ||||
|   await showPage.edit(); | ||||
|   assert.strictEqual( | ||||
|     currentRouteName(), | ||||
|   | ||||
| @@ -95,7 +95,7 @@ module('Acceptance | auth backend list', function (hooks) { | ||||
|           const itemCount = type === 'token' ? 2 : 3; | ||||
|           await click(`[data-test-auth-backend-link="${path}"] [data-test-popup-menu-trigger]`); | ||||
|           assert | ||||
|             .dom('.hds-dropdown-list-item') | ||||
|             .dom(`[data-test-auth-backend-link="${path}"] .hds-dropdown-list-item`) | ||||
|             .exists({ count: itemCount }, `shows ${itemCount} dropdown items for ${type}`); | ||||
|  | ||||
|           // all auth methods should be linkable | ||||
|   | ||||
| @@ -214,10 +214,12 @@ module('Acceptance | mfa-method', function (hooks) { | ||||
|       'Route transitions to method on save' | ||||
|     ); | ||||
|     await click('[data-test-tab="enforcements"]'); | ||||
|     assert.dom('[data-test-list-item]').hasText('bar', 'Enforcement is listed in method view'); | ||||
|     assert.dom('[data-test-list-item]').hasTextContaining('bar', 'Enforcement is listed in method view'); | ||||
|     await click('[data-test-sidebar-nav-link="Multi-Factor Authentication"]'); | ||||
|     await click('[data-test-tab="enforcements"]'); | ||||
|     assert.dom('[data-test-list-item="bar"]').hasText('bar', 'Enforcement is listed in enforcements view'); | ||||
|     assert | ||||
|       .dom('[data-test-list-item="bar"]') | ||||
|       .hasTextContaining('bar', 'Enforcement is listed in enforcements view'); | ||||
|     await click('[data-test-list-item="bar"]'); | ||||
|     await click('[data-test-tab="methods"]'); | ||||
|     assert | ||||
| @@ -242,7 +244,7 @@ module('Acceptance | mfa-method', function (hooks) { | ||||
|       'Route transitions to method on save' | ||||
|     ); | ||||
|     await click('[data-test-tab="enforcements"]'); | ||||
|     assert.dom('[data-test-list-item]').hasText(name, 'Enforcement is listed in method view'); | ||||
|     assert.dom('[data-test-list-item]').hasTextContaining(name, 'Enforcement is listed in method view'); | ||||
|   }); | ||||
|  | ||||
|   test('it should edit methods', async function (assert) { | ||||
|   | ||||
| @@ -72,7 +72,7 @@ module('Acceptance | oidc-config clients', function (hooks) { | ||||
|       assert.dom('[data-test-tab="keys"]').hasClass('active', 'keys tab is active'); | ||||
|       assert.strictEqual(currentRouteName(), 'vault.cluster.access.oidc.keys.index'); | ||||
|       assert | ||||
|         .dom('[data-test-oidc-key-linked-block="default"]') | ||||
|         .dom('[data-test-oidc-key-linked-block="default"] [data-test-item]') | ||||
|         .hasText('default', 'index page lists default key'); | ||||
|  | ||||
|       // navigate to default key details from pop-up menu | ||||
| @@ -132,7 +132,7 @@ module('Acceptance | oidc-config clients', function (hooks) { | ||||
|       // edit key and limit applications | ||||
|       await visit(OIDC_BASE_URL + '/keys'); | ||||
|       await click('[data-test-oidc-key-linked-block="test-key"] [data-test-popup-menu-trigger]'); | ||||
|       await click('[data-test-oidc-key-menu-link="edit"]'); | ||||
|       await click('[data-test-oidc-key-linked-block="test-key"] [data-test-oidc-key-menu-link="edit"]'); | ||||
|       assert.strictEqual( | ||||
|         currentRouteName(), | ||||
|         'vault.cluster.access.oidc.keys.key.edit', | ||||
|   | ||||
| @@ -64,10 +64,11 @@ module('Acceptance | raft storage', function (hooks) { | ||||
|       return {}; | ||||
|     }); | ||||
|  | ||||
|     const row = '[data-raft-row]:nth-child(2) [data-test-raft-actions]'; | ||||
|     await visit('/vault/storage/raft'); | ||||
|     assert.dom('[data-raft-row]').exists({ count: 2 }, '2 raft peers render in table'); | ||||
|     await click('[data-raft-row]:nth-child(2) [data-test-raft-actions] button'); | ||||
|     await click('[data-test-confirm-action-trigger]'); | ||||
|     await click(`${row} button`); | ||||
|     await click(`${row} [data-test-confirm-action-trigger]`); | ||||
|     await click('[data-test-confirm-button]'); | ||||
|     assert.dom('[data-raft-row]').exists({ count: 1 }, 'Raft peer successfully removed'); | ||||
|   }); | ||||
|   | ||||
| @@ -3,69 +3,55 @@ | ||||
|  * SPDX-License-Identifier: BUSL-1.1 | ||||
|  */ | ||||
|  | ||||
| import { currentRouteName, settled } from '@ember/test-helpers'; | ||||
| import { click, find, findAll, currentRouteName, visit } from '@ember/test-helpers'; | ||||
| import { clickTrigger } from 'ember-power-select/test-support/helpers'; | ||||
| import { create } from 'ember-cli-page-object'; | ||||
| import { module, test } from 'qunit'; | ||||
| import consoleClass from 'vault/tests/pages/components/console/ui-panel'; | ||||
| import { setupApplicationTest } from 'ember-qunit'; | ||||
| import { v4 as uuidv4 } from 'uuid'; | ||||
|  | ||||
| import mountSecrets from 'vault/tests/pages/settings/mount-secret-backend'; | ||||
| import backendsPage from 'vault/tests/pages/secrets/backends'; | ||||
| import authPage from 'vault/tests/pages/auth'; | ||||
| import ss from 'vault/tests/pages/components/search-select'; | ||||
| import { GENERAL } from 'vault/tests/helpers/general-selectors'; | ||||
| import { deleteEngineCmd, mountEngineCmd, runCmd } from 'vault/tests/helpers/commands'; | ||||
| import { login } from 'vault/tests/helpers/auth/auth-helpers'; | ||||
|  | ||||
| const consoleComponent = create(consoleClass); | ||||
| const searchSelect = create(ss); | ||||
| const SELECTORS = { | ||||
|   backendLink: (path) => | ||||
|     path ? `[data-test-secrets-backend-link="${path}"]` : '[data-test-secrets-backend-link]', | ||||
| }; | ||||
|  | ||||
| module('Acceptance | secret-engine list view', function (hooks) { | ||||
|   setupApplicationTest(hooks); | ||||
|  | ||||
|   hooks.beforeEach(function () { | ||||
|     this.uid = uuidv4(); | ||||
|     return authPage.login(); | ||||
|     return login(); | ||||
|   }); | ||||
|  | ||||
|   test('it allows you to disable an engine', async function (assert) { | ||||
|     // first mount an engine so we can disable it. | ||||
|     const enginePath = `alicloud-disable-${this.uid}`; | ||||
|     await mountSecrets.enable('alicloud', enginePath); | ||||
|     await settled(); | ||||
|     assert.ok(backendsPage.rows.filterBy('path', `${enginePath}/`)[0], 'shows the mounted engine'); | ||||
|  | ||||
|     await backendsPage.visit(); | ||||
|     await settled(); | ||||
|     const row = backendsPage.rows.filterBy('path', `${enginePath}/`)[0]; | ||||
|     await row.menu(); | ||||
|     await settled(); | ||||
|     await backendsPage.disableButton(); | ||||
|     await settled(); | ||||
|     await backendsPage.confirmDisable(); | ||||
|     await settled(); | ||||
|     await runCmd(mountEngineCmd('alicloud', enginePath)); | ||||
|     await visit('/vault/secrets'); | ||||
|     assert.dom(SELECTORS.backendLink(enginePath)).exists(); | ||||
|     const row = SELECTORS.backendLink(enginePath); | ||||
|     await click(`${row} ${GENERAL.menuTrigger}`); | ||||
|     await click(`${row} ${GENERAL.confirmTrigger}`); | ||||
|     await click(GENERAL.confirmButton); | ||||
|     assert.strictEqual( | ||||
|       currentRouteName(), | ||||
|       'vault.cluster.secrets.backends', | ||||
|       'redirects to the backends page' | ||||
|     ); | ||||
|     assert.strictEqual( | ||||
|       backendsPage.rows.filterBy('path', `${enginePath}/`).length, | ||||
|       0, | ||||
|       'does not show the disabled engine' | ||||
|     ); | ||||
|     assert.dom(SELECTORS.backendLink(enginePath)).doesNotExist('does not show the disabled engine'); | ||||
|   }); | ||||
|  | ||||
|   test('it adds disabled css styling to unsupported secret engines', async function (assert) { | ||||
|     assert.expect(2); | ||||
|     // first mount engine that is not supported | ||||
|     const enginePath = `nomad-${this.uid}`; | ||||
|     await runCmd(mountEngineCmd('nomad', enginePath)); | ||||
|     await visit('/vault/secrets'); | ||||
|  | ||||
|     await mountSecrets.enable('nomad', enginePath); | ||||
|     await settled(); | ||||
|     await backendsPage.visit(); | ||||
|     await settled(); | ||||
|  | ||||
|     const rows = document.querySelectorAll('[data-test-secrets-backend-link]'); | ||||
|     const rows = findAll(SELECTORS.backendLink()); | ||||
|     const rowUnsupported = Array.from(rows).filter((row) => row.innerText.includes('nomad')); | ||||
|     const rowSupported = Array.from(rows).filter((row) => row.innerText.includes('cubbyhole')); | ||||
|     assert | ||||
| @@ -77,7 +63,7 @@ module('Acceptance | secret-engine list view', function (hooks) { | ||||
|     assert.dom(rowSupported[0]).hasClass('linked-block', `linked-block class is added to supported engines.`); | ||||
|  | ||||
|     // cleanup | ||||
|     await consoleComponent.runCommands([`delete sys/mounts/${enginePath}`]); | ||||
|     await runCmd(deleteEngineCmd(enginePath)); | ||||
|   }); | ||||
|  | ||||
|   test('it filters by name and engine type', async function (assert) { | ||||
| @@ -85,32 +71,31 @@ module('Acceptance | secret-engine list view', function (hooks) { | ||||
|     const enginePath1 = `aws-1-${this.uid}`; | ||||
|     const enginePath2 = `aws-2-${this.uid}`; | ||||
|  | ||||
|     await mountSecrets.enable('aws', enginePath1); | ||||
|     await mountSecrets.enable('aws', enginePath2); | ||||
|     await backendsPage.visit(); | ||||
|     await settled(); | ||||
|     await await runCmd(mountEngineCmd('aws', enginePath1)); | ||||
|     await await runCmd(mountEngineCmd('aws', enginePath2)); | ||||
|     await visit('/vault/secrets'); | ||||
|     // filter by type | ||||
|     await clickTrigger('#filter-by-engine-type'); | ||||
|     await searchSelect.options.objectAt(0).click(); | ||||
|     await click(GENERAL.searchSelect.option()); | ||||
|  | ||||
|     const rows = document.querySelectorAll('[data-test-secrets-backend-link]'); | ||||
|     const rows = findAll(SELECTORS.backendLink()); | ||||
|     const rowsAws = Array.from(rows).filter((row) => row.innerText.includes('aws')); | ||||
|  | ||||
|     assert.strictEqual(rows.length, rowsAws.length, 'all rows returned are aws'); | ||||
|     // filter by name | ||||
|     await clickTrigger('#filter-by-engine-name'); | ||||
|     const firstItemToSelect = searchSelect.options.objectAt(0).text; | ||||
|     await searchSelect.options.objectAt(0).click(); | ||||
|     const firstItemToSelect = find(GENERAL.searchSelect.option()).innerText; | ||||
|     await click(GENERAL.searchSelect.option()); | ||||
|     const singleRow = document.querySelectorAll('[data-test-secrets-backend-link]'); | ||||
|     assert.strictEqual(singleRow.length, 1, 'returns only one row'); | ||||
|     assert.dom(singleRow[0]).includesText(firstItemToSelect, 'shows the filtered by name engine'); | ||||
|     // clear filter by engine name | ||||
|     await searchSelect.deleteButtons.objectAt(1).click(); | ||||
|     await click(`#filter-by-engine-name ${GENERAL.searchSelect.removeSelected}`); | ||||
|     const rowsAgain = document.querySelectorAll('[data-test-secrets-backend-link]'); | ||||
|     assert.ok(rowsAgain.length > 1, 'filter has been removed'); | ||||
|  | ||||
|     // cleanup | ||||
|     await consoleComponent.runCommands([`delete sys/mounts/${enginePath1}`]); | ||||
|     await consoleComponent.runCommands([`delete sys/mounts/${enginePath2}`]); | ||||
|     await runCmd(deleteEngineCmd(enginePath1)); | ||||
|     await runCmd(deleteEngineCmd(enginePath2)); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -48,17 +48,17 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook | ||||
|       const backend = this.backend; | ||||
|       await visit(`/vault/secrets/${backend}/kv/list`); | ||||
|       assert.dom(PAGE.list.item()).exists({ count: 1 }, 'single secret exists on list'); | ||||
|       assert.dom(PAGE.list.item('app/')).hasText('app/', 'expected list item'); | ||||
|       assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item'); | ||||
|       await click(PAGE.list.createSecret); | ||||
|       await fillIn(FORM.inputByAttr('path'), 'jk'); | ||||
|       await click(FORM.cancelBtn); | ||||
|       assert.dom(PAGE.list.item()).exists({ count: 1 }, 'same amount of secrets'); | ||||
|       assert.dom(PAGE.list.item('app/')).hasText('app/', 'expected list item'); | ||||
|       assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item'); | ||||
|       await click(PAGE.list.createSecret); | ||||
|       await fillIn(FORM.inputByAttr('path'), 'psych'); | ||||
|       await click(PAGE.breadcrumbAtIdx(1)); | ||||
|       assert.dom(PAGE.list.item()).exists({ count: 1 }, 'same amount of secrets'); | ||||
|       assert.dom(PAGE.list.item('app/')).hasText('app/', 'expected list item'); | ||||
|       assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item'); | ||||
|     }); | ||||
|     test('cancel on new version rolls back model (a)', async function (assert) { | ||||
|       const backend = this.backend; | ||||
| @@ -500,17 +500,17 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook | ||||
|       const backend = this.backend; | ||||
|       await visit(`/vault/secrets/${backend}/kv/list`); | ||||
|       assert.dom(PAGE.list.item()).exists({ count: 1 }, 'single secret exists on list'); | ||||
|       assert.dom(PAGE.list.item('app/')).hasText('app/', 'expected list item'); | ||||
|       assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item'); | ||||
|       await click(PAGE.list.createSecret); | ||||
|       await fillIn(FORM.inputByAttr('path'), 'jk'); | ||||
|       await click(FORM.cancelBtn); | ||||
|       assert.dom(PAGE.list.item()).exists({ count: 1 }, 'same amount of secrets'); | ||||
|       assert.dom(PAGE.list.item('app/')).hasText('app/', 'expected list item'); | ||||
|       assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item'); | ||||
|       await click(PAGE.list.createSecret); | ||||
|       await fillIn(FORM.inputByAttr('path'), 'psych'); | ||||
|       await click(PAGE.breadcrumbAtIdx(1)); | ||||
|       assert.dom(PAGE.list.item()).exists({ count: 1 }, 'same amount of secrets'); | ||||
|       assert.dom(PAGE.list.item('app/')).hasText('app/', 'expected list item'); | ||||
|       assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item'); | ||||
|     }); | ||||
|     test('cancel on new version rolls back model (dlr)', async function (assert) { | ||||
|       const backend = this.backend; | ||||
| @@ -649,17 +649,17 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook | ||||
|       const backend = this.backend; | ||||
|       await visit(`/vault/secrets/${backend}/kv/list`); | ||||
|       assert.dom(PAGE.list.item()).exists({ count: 1 }, 'single secret exists on list'); | ||||
|       assert.dom(PAGE.list.item('app/')).hasText('app/', 'expected list item'); | ||||
|       assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item'); | ||||
|       await click(PAGE.list.createSecret); | ||||
|       await fillIn(FORM.inputByAttr('path'), 'jk'); | ||||
|       await click(FORM.cancelBtn); | ||||
|       assert.dom(PAGE.list.item()).exists({ count: 1 }, 'same amount of secrets'); | ||||
|       assert.dom(PAGE.list.item('app/')).hasText('app/', 'expected list item'); | ||||
|       assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item'); | ||||
|       await click(PAGE.list.createSecret); | ||||
|       await fillIn(FORM.inputByAttr('path'), 'psych'); | ||||
|       await click(PAGE.breadcrumbAtIdx(1)); | ||||
|       assert.dom(PAGE.list.item()).exists({ count: 1 }, 'same amount of secrets'); | ||||
|       assert.dom(PAGE.list.item('app/')).hasText('app/', 'expected list item'); | ||||
|       assert.dom(`${PAGE.list.item('app/')} [data-test-path]`).hasText('app/', 'expected list item'); | ||||
|     }); | ||||
|     test('cancel on new version rolls back model (mm)', async function (assert) { | ||||
|       const backend = this.backend; | ||||
|   | ||||
| @@ -20,6 +20,7 @@ import { runCmd } from 'vault/tests/helpers/commands'; | ||||
| import { PAGE } from 'vault/tests/helpers/kv/kv-selectors'; | ||||
| import codemirror from 'vault/tests/helpers/codemirror'; | ||||
| import { GENERAL } from 'vault/tests/helpers/general-selectors'; | ||||
| import { SECRET_ENGINE_SELECTORS as SS } from 'vault/tests/helpers/secret-engine/secret-engine-selectors'; | ||||
|  | ||||
| const deleteEngine = async function (enginePath, assert) { | ||||
|   await logout.visit(); | ||||
| @@ -180,9 +181,8 @@ module('Acceptance | secrets/secret/create, read, delete', function (hooks) { | ||||
|       assert.dom('[data-test-secret-link]').exists({ count: 2 }); | ||||
|  | ||||
|       // delete the items | ||||
|       await listPage.secrets.objectAt(0).menuToggle(); | ||||
|       await settled(); | ||||
|       await listPage.delete(); | ||||
|       await click(SS.secretLinkMenu('1/2/3/4')); | ||||
|       await click(SS.secretLinkMenuDelete('1/2/3/4')); | ||||
|       await listPage.confirmDelete(); | ||||
|       await settled(); | ||||
|       assert.strictEqual(currentRouteName(), 'vault.cluster.secrets.backend.list'); | ||||
| @@ -219,7 +219,7 @@ module('Acceptance | secrets/secret/create, read, delete', function (hooks) { | ||||
|         '(', | ||||
|         ')', | ||||
|         '"', | ||||
|         //"'", | ||||
|         // "'", | ||||
|         '!', | ||||
|         '#', | ||||
|         '$', | ||||
| @@ -243,8 +243,8 @@ module('Acceptance | secrets/secret/create, read, delete', function (hooks) { | ||||
|       await runCmd([...commands, 'refresh']); | ||||
|       for (const path of paths) { | ||||
|         await listPage.visit({ backend, id: path }); | ||||
|         assert.ok(listPage.secrets.filterBy('text', '2')[0], `${path}: secret is displayed properly`); | ||||
|         await listPage.secrets.filterBy('text', '2')[0].click(); | ||||
|         assert.dom(SS.secretLinkATag()).hasText('2', `${path}: secret is displayed properly`); | ||||
|         await click(SS.secretLink()); | ||||
|         assert.strictEqual( | ||||
|           currentRouteName(), | ||||
|           'vault.cluster.secrets.backend.show', | ||||
| @@ -301,8 +301,8 @@ module('Acceptance | secrets/secret/create, read, delete', function (hooks) { | ||||
|         await listPage.create(); | ||||
|         await editPage.createSecret(`${path}/2`, 'foo', 'bar'); | ||||
|         await listPage.visit({ backend, id: path }); | ||||
|         assert.ok(listPage.secrets.filterBy('text', '2')[0], `${path}: secret is displayed properly`); | ||||
|         await listPage.secrets.filterBy('text', '2')[0].click(); | ||||
|         assert.dom(SS.secretLinkATag()).hasText('2', `${path}: secret is displayed properly`); | ||||
|         await click(SS.secretLink()); | ||||
|         assert.strictEqual( | ||||
|           currentRouteName(), | ||||
|           'vault.cluster.secrets.backend.show', | ||||
|   | ||||
| @@ -19,6 +19,11 @@ export const SECRET_ENGINE_SELECTORS = { | ||||
|   mountSubmit: '[data-test-mount-submit]', | ||||
|   secretHeader: '[data-test-secret-header]', | ||||
|   secretLink: (name: string) => (name ? `[data-test-secret-link="${name}"]` : '[data-test-secret-link]'), | ||||
|   secretLinkMenu: (name: string) => `[data-test-secret-link="${name}"] [data-test-popup-menu-trigger]`, | ||||
|   secretLinkMenuDelete: (name: string) => | ||||
|     `[data-test-secret-link="${name}"] [data-test-confirm-action-trigger]`, | ||||
|   secretLinkATag: (name: string) => | ||||
|     name ? `[data-test-secret-item-link="${name}"]` : '[data-test-secret-item-link]', | ||||
|   viewBackend: '[data-test-backend-view-link]', | ||||
|   warning: '[data-test-warning]', | ||||
|   aws: { | ||||
|   | ||||
| @@ -70,6 +70,7 @@ module('Integration | Component | kv | Page::List', function (hooks) { | ||||
|       @failedDirectoryQuery={{this.failedDirectoryQuery}} | ||||
|       @breadcrumbs={{this.breadcrumbs}} | ||||
|       @meta={{this.model.meta}} | ||||
|       @currentRouteParams={{array this.backend}} | ||||
|     />`, | ||||
|       { | ||||
|         owner: this.engine, | ||||
|   | ||||
| @@ -110,7 +110,9 @@ module('Integration | Component | ldap | Page::Roles', function (hooks) { | ||||
|     assert.dom('[data-test-delete]').hasText('Delete', 'Details link renders in menu'); | ||||
|  | ||||
|     await click('[data-test-popup-menu-trigger]:last-of-type'); | ||||
|     assert.dom('[data-test-rotate-creds]').doesNotExist('Rotate credentials link is hidden for dynamic type'); | ||||
|     assert | ||||
|       .dom('[data-test-popup-menu-trigger]:last-of-type [data-test-rotate-creds]') | ||||
|       .doesNotExist('Rotate credentials link is hidden for dynamic type'); | ||||
|   }); | ||||
|  | ||||
|   test('it should filter roles', async function (assert) { | ||||
|   | ||||
							
								
								
									
										91
									
								
								ui/yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								ui/yarn.lock
									
									
									
									
									
								
							| @@ -2029,7 +2029,7 @@ __metadata: | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "@embroider/addon-shim@npm:^1.0.0, @embroider/addon-shim@npm:^1.2.0, @embroider/addon-shim@npm:^1.6.0, @embroider/addon-shim@npm:^1.8.0, @embroider/addon-shim@npm:^1.8.3, @embroider/addon-shim@npm:^1.8.4, @embroider/addon-shim@npm:^1.8.6, @embroider/addon-shim@npm:^1.8.7, @embroider/addon-shim@npm:^1.8.9": | ||||
| "@embroider/addon-shim@npm:^1.0.0, @embroider/addon-shim@npm:^1.2.0, @embroider/addon-shim@npm:^1.6.0, @embroider/addon-shim@npm:^1.8.0, @embroider/addon-shim@npm:^1.8.3, @embroider/addon-shim@npm:^1.8.6, @embroider/addon-shim@npm:^1.8.7, @embroider/addon-shim@npm:^1.8.9": | ||||
|   version: 1.8.9 | ||||
|   resolution: "@embroider/addon-shim@npm:1.8.9" | ||||
|   dependencies: | ||||
| @@ -2458,25 +2458,24 @@ __metadata: | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "@hashicorp/design-system-components@npm:~4.7.0": | ||||
|   version: 4.7.0 | ||||
|   resolution: "@hashicorp/design-system-components@npm:4.7.0" | ||||
| "@hashicorp/design-system-components@npm:~4.12.0": | ||||
|   version: 4.12.0 | ||||
|   resolution: "@hashicorp/design-system-components@npm:4.12.0" | ||||
|   dependencies: | ||||
|     "@ember/render-modifiers": ^2.0.5 | ||||
|     "@ember/string": ^3.1.1 | ||||
|     "@ember/test-waiters": ^3.1.0 | ||||
|     "@embroider/addon-shim": ^1.8.7 | ||||
|     "@floating-ui/dom": ^1.6.3 | ||||
|     "@hashicorp/design-system-tokens": ^2.1.0 | ||||
|     "@hashicorp/ember-flight-icons": ^5.1.3 | ||||
|     "@hashicorp/flight-icons": ^3.5.0 | ||||
|     "@hashicorp/design-system-tokens": ^2.2.1 | ||||
|     "@hashicorp/flight-icons": ^3.6.0 | ||||
|     decorator-transforms: ^1.1.0 | ||||
|     ember-a11y-refocus: ^4.1.0 | ||||
|     ember-a11y-refocus: ^4.1.3 | ||||
|     ember-cli-sass: ^11.0.1 | ||||
|     ember-composable-helpers: ^5.0.0 | ||||
|     ember-element-helper: ^0.8.5 | ||||
|     ember-focus-trap: ^1.1.0 | ||||
|     ember-keyboard: ^8.2.1 | ||||
|     ember-get-config: ^2.1.1 | ||||
|     ember-modifier: ^4.1.0 | ||||
|     ember-power-select: ^8.2.0 | ||||
|     ember-stargate: ^0.4.3 | ||||
| @@ -2487,14 +2486,14 @@ __metadata: | ||||
|     tippy.js: ^6.3.7 | ||||
|   peerDependencies: | ||||
|     ember-source: ^3.28.0 || ^4.0.0 || ^5.3.0 | ||||
|   checksum: 88cafa21f11d761a226d9b065af715d632b1ea38699aac8294d035a7f7ab5518263c894813d0d4dc23f11dea440aaf6e58408531c7bbb3d9b2455a9dc9a9ba5c | ||||
|   checksum: ed7c79a43e3b286b5a4d543064dc566159909bee7052700eebe160a93f99b64dfc41291cd4d81c5dd558b415fc9033bc8937b0d751b191283ce404c407d1388b | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "@hashicorp/design-system-tokens@npm:^2.1.0": | ||||
|   version: 2.2.0 | ||||
|   resolution: "@hashicorp/design-system-tokens@npm:2.2.0" | ||||
|   checksum: 654978be98a94c1f478e472793b9c1b62762bb30f9e0a097c2e1effd4fb2b4619eeef347e39599aea4dd63c451e0f41e698d887827ca2496de83a9e1e1dd8525 | ||||
| "@hashicorp/design-system-tokens@npm:^2.2.1": | ||||
|   version: 2.2.1 | ||||
|   resolution: "@hashicorp/design-system-tokens@npm:2.2.1" | ||||
|   checksum: 0e4348ab27b2da4725068b5dab83474ad496895d2b422708b2c08cfc39289830f3756a1b352aff6e6095f64e3476ac227034ab02c7d2e0cc49d13a81ef69f6f3 | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| @@ -2517,6 +2516,13 @@ __metadata: | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "@hashicorp/flight-icons@npm:^3.6.0": | ||||
|   version: 3.6.0 | ||||
|   resolution: "@hashicorp/flight-icons@npm:3.6.0" | ||||
|   checksum: 5c09574c3e44b5662665271f4aaec8e9d50d0eecb858ba5e9d4d669baf0d98d0e875ce440d84ea7911bf81ff35a01440f79dd27cb78af706ca85341101d61073 | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "@humanwhocodes/config-array@npm:^0.11.14": | ||||
|   version: 0.11.14 | ||||
|   resolution: "@humanwhocodes/config-array@npm:0.11.14" | ||||
| @@ -7445,13 +7451,13 @@ __metadata: | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "ember-a11y-refocus@npm:^4.1.0": | ||||
|   version: 4.1.1 | ||||
|   resolution: "ember-a11y-refocus@npm:4.1.1" | ||||
| "ember-a11y-refocus@npm:^4.1.3": | ||||
|   version: 4.1.4 | ||||
|   resolution: "ember-a11y-refocus@npm:4.1.4" | ||||
|   dependencies: | ||||
|     ember-cli-babel: ^7.26.11 | ||||
|     ember-cli-htmlbars: ^6.0.1 | ||||
|   checksum: b9f861f1359e8c720bf844161da3eecbe2218149739211961d216b6fcaec5e78dfd51debe5ec2707ae0d31fdbbd9cf692349e3f0f5b47d1f12bd963c021494ac | ||||
|   checksum: c1a79f9b7792f3bac674e010b231561da4ca5fc2f3f6a9a6e2263908a6c781546e1baccdb84838f367ac9104e2c76b7f688a57f06f0bd6c194a6f1a71910e422 | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| @@ -8283,7 +8289,7 @@ __metadata: | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "ember-destroyable-polyfill@npm:^2.0.1, ember-destroyable-polyfill@npm:^2.0.3": | ||||
| "ember-destroyable-polyfill@npm:^2.0.1": | ||||
|   version: 2.0.3 | ||||
|   resolution: "ember-destroyable-polyfill@npm:2.0.3" | ||||
|   dependencies: | ||||
| @@ -8425,23 +8431,6 @@ __metadata: | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "ember-keyboard@npm:^8.2.1": | ||||
|   version: 8.2.1 | ||||
|   resolution: "ember-keyboard@npm:8.2.1" | ||||
|   dependencies: | ||||
|     "@embroider/addon-shim": ^1.8.4 | ||||
|     ember-destroyable-polyfill: ^2.0.3 | ||||
|     ember-modifier: ^2.1.2 || ^3.1.0 || ^4.0.0 | ||||
|     ember-modifier-manager-polyfill: ^1.2.0 | ||||
|   peerDependencies: | ||||
|     "@ember/test-helpers": ^2.6.0 || ^3.0.0 | ||||
|   peerDependenciesMeta: | ||||
|     "@ember/test-helpers": | ||||
|       optional: true | ||||
|   checksum: cfb4120aaf3b1ff3aba8ba1619b0597c6738abde31d1e0719d8bbf69512fb9967fc76bc85557351ec42856bb9b6c47354634f22f0accab0e15743d9f0e3f2be4 | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "ember-lifeline@npm:^7.0.0": | ||||
|   version: 7.0.0 | ||||
|   resolution: "ember-lifeline@npm:7.0.0" | ||||
| @@ -8497,7 +8486,20 @@ __metadata: | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "ember-modifier@npm:^2.1.2 || ^3.1.0 || ^4.0.0, ember-modifier@npm:^3.2.7 || ^4.0.0, ember-modifier@npm:^4.1.0": | ||||
| "ember-modifier@npm:^3.2.0, ember-modifier@npm:^3.2.7": | ||||
|   version: 3.2.7 | ||||
|   resolution: "ember-modifier@npm:3.2.7" | ||||
|   dependencies: | ||||
|     ember-cli-babel: ^7.26.6 | ||||
|     ember-cli-normalize-entity-name: ^1.0.0 | ||||
|     ember-cli-string-utils: ^1.1.0 | ||||
|     ember-cli-typescript: ^5.0.0 | ||||
|     ember-compatibility-helpers: ^1.2.5 | ||||
|   checksum: 2e96d9ec3939de178a9ce704d5a9360fd73f0276ffa4a9cce9f100a4087fdc8fae4a8b28bf1be22b05a4d1c61e1bb1ab93ca60576810c6556bc4d9323864c66a | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "ember-modifier@npm:^3.2.7 || ^4.0.0, ember-modifier@npm:^4.1.0": | ||||
|   version: 4.2.0 | ||||
|   resolution: "ember-modifier@npm:4.2.0" | ||||
|   dependencies: | ||||
| @@ -8514,19 +8516,6 @@ __metadata: | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "ember-modifier@npm:^3.2.0, ember-modifier@npm:^3.2.7": | ||||
|   version: 3.2.7 | ||||
|   resolution: "ember-modifier@npm:3.2.7" | ||||
|   dependencies: | ||||
|     ember-cli-babel: ^7.26.6 | ||||
|     ember-cli-normalize-entity-name: ^1.0.0 | ||||
|     ember-cli-string-utils: ^1.1.0 | ||||
|     ember-cli-typescript: ^5.0.0 | ||||
|     ember-compatibility-helpers: ^1.2.5 | ||||
|   checksum: 2e96d9ec3939de178a9ce704d5a9360fd73f0276ffa4a9cce9f100a4087fdc8fae4a8b28bf1be22b05a4d1c61e1bb1ab93ca60576810c6556bc4d9323864c66a | ||||
|   languageName: node | ||||
|   linkType: hard | ||||
|  | ||||
| "ember-page-title@npm:^8.0.0": | ||||
|   version: 8.2.3 | ||||
|   resolution: "ember-page-title@npm:8.2.3" | ||||
| @@ -18776,7 +18765,7 @@ __metadata: | ||||
|     "@ember/test-waiters": ^3.1.0 | ||||
|     "@glimmer/component": ^1.1.2 | ||||
|     "@glimmer/tracking": ^1.1.2 | ||||
|     "@hashicorp/design-system-components": ~4.7.0 | ||||
|     "@hashicorp/design-system-components": ~4.12.0 | ||||
|     "@hashicorp/ember-flight-icons": ^5.1.3 | ||||
|     "@icholy/duration": ^5.1.0 | ||||
|     "@lineal-viz/lineal": ^0.5.1 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 claire bontempo
					claire bontempo