diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index 82767b69fd6..3f2b31d8027 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -143,6 +143,15 @@
"atRiskMembersDescription": {
"message": "These members are logging into Priority Access Intelligence with weak, exposed, or reused passwords."
},
+ "atRiskMembersDescriptionWithApp": {
+ "message": "These members are logging into $APPNAME$ with weak, exposed, or reused passwords.",
+ "placeholders": {
+ "appname": {
+ "content": "$1",
+ "example": "Salesforce"
+ }
+ }
+ },
"totalMembers": {
"message": "Total members"
},
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html b/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html
index ea1a4f9db31..8dcfafb77ae 100644
--- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html
+++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.html
@@ -82,7 +82,7 @@
(change)="onCheckboxChange(r.id, $event)"
/>
-
+ |
{{ r.applicationName }}
|
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.ts
index 119b2073061..dab0cded9c8 100644
--- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.ts
+++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/all-applications.component.ts
@@ -19,6 +19,7 @@ import { ConfigService } from "@bitwarden/common/platform/abstractions/config/co
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import {
+ DialogService,
Icons,
NoItemsModule,
SearchModule,
@@ -30,6 +31,7 @@ import { HeaderModule } from "@bitwarden/web-vault/app/layouts/header/header.mod
import { SharedModule } from "@bitwarden/web-vault/app/shared";
import { PipesModule } from "@bitwarden/web-vault/app/vault/individual-vault/pipes/pipes.module";
+import { openAppAtRiskMembersDialog } from "./app-at-risk-members-dialog.component";
import { ApplicationsLoadingComponent } from "./risk-insights-loading.component";
@Component({
@@ -100,6 +102,7 @@ export class AllApplicationsComponent implements OnInit, OnDestroy {
protected dataService: RiskInsightsDataService,
protected organizationService: OrganizationService,
protected reportService: RiskInsightsReportService,
+ protected dialogService: DialogService,
) {
this.searchControl.valueChanges
.pipe(debounceTime(200), takeUntilDestroyed())
@@ -136,6 +139,15 @@ export class AllApplicationsComponent implements OnInit, OnDestroy {
return item.applicationName;
}
+ showAppAtRiskMembers = async (applicationName: string) => {
+ openAppAtRiskMembersDialog(this.dialogService, {
+ members:
+ this.dataSource.data.find((app) => app.applicationName === applicationName)
+ ?.atRiskMemberDetails ?? [],
+ applicationName,
+ });
+ };
+
onCheckboxChange(id: number, event: Event) {
const isChecked = (event.target as HTMLInputElement).checked;
if (isChecked) {
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/app-at-risk-members-dialog.component.html b/bitwarden_license/bit-web/src/app/tools/access-intelligence/app-at-risk-members-dialog.component.html
new file mode 100644
index 00000000000..191f512b5d6
--- /dev/null
+++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/app-at-risk-members-dialog.component.html
@@ -0,0 +1,21 @@
+
+ {{ applicationName }}
+
+
+ {{ "atRiskMembersWithCount" | i18n: members.length }}
+ {{
+ "atRiskMembersDescriptionWithApp" | i18n: applicationName
+ }}
+
+
+ {{ member.email }}
+
+
+
+
+
+
+
+
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/app-at-risk-members-dialog.component.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/app-at-risk-members-dialog.component.ts
new file mode 100644
index 00000000000..d6a757fe897
--- /dev/null
+++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/app-at-risk-members-dialog.component.ts
@@ -0,0 +1,35 @@
+import { DIALOG_DATA } from "@angular/cdk/dialog";
+import { CommonModule } from "@angular/common";
+import { Component, Inject } from "@angular/core";
+
+import { JslibModule } from "@bitwarden/angular/jslib.module";
+import { MemberDetailsFlat } from "@bitwarden/bit-common/tools/reports/risk-insights/models/password-health";
+import { ButtonModule, DialogModule, DialogService } from "@bitwarden/components";
+
+type AppAtRiskMembersDialogParams = {
+ members: MemberDetailsFlat[];
+ applicationName: string;
+};
+
+export const openAppAtRiskMembersDialog = (
+ dialogService: DialogService,
+ dialogConfig: AppAtRiskMembersDialogParams,
+) =>
+ dialogService.open(AppAtRiskMembersDialogComponent, {
+ data: dialogConfig,
+ });
+
+@Component({
+ standalone: true,
+ templateUrl: "./app-at-risk-members-dialog.component.html",
+ imports: [ButtonModule, CommonModule, JslibModule, DialogModule],
+})
+export class AppAtRiskMembersDialogComponent {
+ protected members: MemberDetailsFlat[];
+ protected applicationName: string;
+
+ constructor(@Inject(DIALOG_DATA) private params: AppAtRiskMembersDialogParams) {
+ this.members = params.members;
+ this.applicationName = params.applicationName;
+ }
+}
|