1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-23 11:43:46 +00:00

[PM-19322] Risk Insights Accessibility (#16221)

* pm-19322 / replace a tag with button

* pm-19324 / focusable dirt cards

* pm-19324 / focus for all apps dirt cards

* pm-19325 / items in table focusable

* wrap dirt cards in button

* wrap span in button

* safari fixes
This commit is contained in:
Alex
2025-09-22 10:16:15 -04:00
committed by GitHub
parent c3b2c1bfc9
commit 57734a7a5c
4 changed files with 74 additions and 49 deletions

View File

@@ -26,28 +26,42 @@
<div class="tw-mt-4 tw-flex tw-flex-col" *ngIf="!(isLoading$ | async) && dataSource.data.length"> <div class="tw-mt-4 tw-flex tw-flex-col" *ngIf="!(isLoading$ | async) && dataSource.data.length">
<h2 class="tw-mb-6" bitTypography="h2">{{ "allApplications" | i18n }}</h2> <h2 class="tw-mb-6" bitTypography="h2">{{ "allApplications" | i18n }}</h2>
<div class="tw-flex tw-gap-6"> <div class="tw-flex tw-gap-6">
<dirt-card <button
#allAppsOrgAtRiskMembers type="button"
class="tw-flex-1 tw-cursor-pointer" class="tw-flex-1"
[ngClass]="{ 'tw-bg-primary-100': dataService.drawerInvokerId === 'allAppsOrgAtRiskMembers' }" tabindex="0"
[title]="'atRiskMembers' | i18n"
[value]="applicationSummary.totalAtRiskMemberCount"
[maxValue]="applicationSummary.totalMemberCount"
(click)="showOrgAtRiskMembers('allAppsOrgAtRiskMembers')" (click)="showOrgAtRiskMembers('allAppsOrgAtRiskMembers')"
> >
</dirt-card> <dirt-card
<dirt-card #allAppsOrgAtRiskMembers
#allAppsOrgAtRiskApplications class="tw-w-full"
class="tw-flex-1 tw-cursor-pointer" [ngClass]="{
[ngClass]="{ 'tw-bg-primary-100': dataService.drawerInvokerId === 'allAppsOrgAtRiskMembers',
'tw-bg-primary-100': dataService.drawerInvokerId === 'allAppsOrgAtRiskApplications', }"
}" [title]="'atRiskMembers' | i18n"
[title]="'atRiskApplications' | i18n" [value]="applicationSummary.totalAtRiskMemberCount"
[value]="applicationSummary.totalAtRiskApplicationCount" [maxValue]="applicationSummary.totalMemberCount"
[maxValue]="applicationSummary.totalApplicationCount" >
</dirt-card>
</button>
<button
type="button"
class="tw-flex-1"
tabindex="0"
(click)="showOrgAtRiskApps('allAppsOrgAtRiskApplications')" (click)="showOrgAtRiskApps('allAppsOrgAtRiskApplications')"
> >
</dirt-card> <dirt-card
#allAppsOrgAtRiskApplications
class="tw-w-full"
[ngClass]="{
'tw-bg-primary-100': dataService.drawerInvokerId === 'allAppsOrgAtRiskApplications',
}"
[title]="'atRiskApplications' | i18n"
[value]="applicationSummary.totalAtRiskApplicationCount"
[maxValue]="applicationSummary.totalApplicationCount"
>
</dirt-card>
</button>
</div> </div>
<div class="tw-flex tw-mt-8 tw-mb-4 tw-gap-4"> <div class="tw-flex tw-mt-8 tw-mb-4 tw-gap-4">
<bit-search <bit-search

View File

@@ -48,17 +48,14 @@
<app-vault-icon *ngIf="row.ciphers.length > 0" [cipher]="row.ciphers[0]"></app-vault-icon> <app-vault-icon *ngIf="row.ciphers.length > 0" [cipher]="row.ciphers[0]"></app-vault-icon>
</td> </td>
<td <td
bitCell
class="tw-cursor-pointer" class="tw-cursor-pointer"
[ngClass]="{ 'tw-bg-primary-100': isDrawerIsOpenForThisRecord(row.applicationName) }"
(click)="showAppAtRiskMembers(row.applicationName)"
(keydown.enter)="showAppAtRiskMembers(row.applicationName)"
(keydown.space)="showAppAtRiskMembers(row.applicationName)"
role="button"
tabindex="0"
[attr.aria-label]="'viewItem' | i18n" [attr.aria-label]="'viewItem' | i18n"
[ngClass]="{ 'tw-bg-primary-100': isDrawerIsOpenForThisRecord(row.applicationName) }"
bitCell
> >
<span>{{ row.applicationName }}</span> <button type="button" tabindex="0" (click)="showAppAtRiskMembers(row.applicationName)">
<span>{{ row.applicationName }}</span>
</button>
</td> </td>
<td <td
bitCell bitCell

View File

@@ -44,30 +44,42 @@
</button> </button>
</div> </div>
<div class="tw-flex tw-gap-6"> <div class="tw-flex tw-gap-6">
<dirt-card <button
#criticalAppsAtRiskMembers type="button"
class="tw-flex-1 tw-cursor-pointer" class="tw-flex-1"
[ngClass]="{ tabindex="0"
'tw-bg-primary-100': dataService.drawerInvokerId === 'criticalAppsAtRiskMembers',
}"
[title]="'atRiskMembers' | i18n"
[value]="applicationSummary.totalAtRiskMemberCount"
[maxValue]="applicationSummary.totalMemberCount"
(click)="showOrgAtRiskMembers('criticalAppsAtRiskMembers')" (click)="showOrgAtRiskMembers('criticalAppsAtRiskMembers')"
> >
</dirt-card> <dirt-card
<dirt-card #criticalAppsAtRiskMembers
#criticalAppsAtRiskApplications class="tw-w-full"
class="tw-flex-1 tw-cursor-pointer" [ngClass]="{
[ngClass]="{ 'tw-bg-primary-100': dataService.drawerInvokerId === 'criticalAppsAtRiskMembers',
'tw-bg-primary-100': dataService.drawerInvokerId === 'criticalAppsAtRiskApplications', }"
}" [title]="'atRiskMembers' | i18n"
[title]="'atRiskApplications' | i18n" [value]="applicationSummary.totalAtRiskMemberCount"
[value]="applicationSummary.totalAtRiskApplicationCount" [maxValue]="applicationSummary.totalMemberCount"
[maxValue]="applicationSummary.totalApplicationCount" >
</dirt-card>
</button>
<button
type="button"
class="tw-flex-1"
tabindex="0"
(click)="showOrgAtRiskApps('criticalAppsAtRiskApplications')" (click)="showOrgAtRiskApps('criticalAppsAtRiskApplications')"
> >
</dirt-card> <dirt-card
#criticalAppsAtRiskApplications
class="tw-w-full"
[ngClass]="{
'tw-bg-primary-100': dataService.drawerInvokerId === 'criticalAppsAtRiskApplications',
}"
[title]="'atRiskApplications' | i18n"
[value]="applicationSummary.totalAtRiskApplicationCount"
[maxValue]="applicationSummary.totalApplicationCount"
>
</dirt-card>
</button>
</div> </div>
<div class="tw-flex tw-mt-8 tw-mb-4 tw-gap-4"> <div class="tw-flex tw-mt-8 tw-mb-4 tw-gap-4">
<bit-search <bit-search

View File

@@ -15,15 +15,17 @@
"dataLastUpdated" | i18n: (dataLastUpdated$ | async | date: "MMMM d, y 'at' h:mm a") "dataLastUpdated" | i18n: (dataLastUpdated$ | async | date: "MMMM d, y 'at' h:mm a")
}}</span> }}</span>
<span class="tw-flex tw-justify-center tw-w-16"> <span class="tw-flex tw-justify-center tw-w-16">
<a <button
*ngIf="!(isRefreshing$ | async)" *ngIf="!(isRefreshing$ | async)"
type="button"
bitButton bitButton
buttonType="unstyled" buttonType="secondary"
class="tw-border-none !tw-font-normal tw-cursor-pointer !tw-py-0" class="tw-border-none !tw-font-normal tw-cursor-pointer !tw-py-0"
tabindex="0"
[bitAction]="refreshData.bind(this)" [bitAction]="refreshData.bind(this)"
> >
{{ "refresh" | i18n }} {{ "refresh" | i18n }}
</a> </button>
<span> <span>
<i <i
*ngIf="isRefreshing$ | async" *ngIf="isRefreshing$ | async"