mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 01:03:35 +00:00
@@ -12,7 +12,7 @@
|
||||
</div>
|
||||
|
||||
<div class="tw-items-baseline tw-gap-2">
|
||||
<span bitTypography="body2">{{ "onceYouReviewApps" | i18n }}</span>
|
||||
<span bitTypography="body2">{{ "onceYouReviewApplications" | i18n }}</span>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<dirt-activity-card
|
||||
[title]="'atRiskMembers' | i18n"
|
||||
[cardMetrics]="'membersAtRiskCount' | i18n: totalCriticalAppsAtRiskMemberCount"
|
||||
[metricDescription]="'membersWithAccessToAtRiskItemsForCriticalApps' | i18n"
|
||||
[metricDescription]="'membersWithAccessToAtRiskItemsForCriticalApplications' | i18n"
|
||||
actionText="{{ 'viewAtRiskMembers' | i18n }}"
|
||||
[showActionLink]="totalCriticalAppsAtRiskMemberCount > 0"
|
||||
(actionClick)="onViewAtRiskMembers()"
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
|
||||
<!-- Description Text -->
|
||||
<div bitTypography="helper" class="tw-text-muted">
|
||||
{{ "membersWillReceiveNotification" | i18n }}
|
||||
{{ "membersWillReceiveSecurityTask" | i18n }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
? hasNoCriticalApplications()
|
||||
? ("prioritizeCriticalApplications" | i18n)
|
||||
: ("reviewNewApplications" | i18n)
|
||||
: ("assignTasksToMembers" | i18n)
|
||||
: ("assignSecurityTasksToMembers" | i18n)
|
||||
}}
|
||||
</span>
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
<p bitTypography="body1" class="tw-mb-5">
|
||||
{{
|
||||
hasNoCriticalApplications()
|
||||
? ("selectCriticalApplicationsDescription" | i18n)
|
||||
: ("reviewNewApplicationsDescription" | i18n)
|
||||
? ("selectCriticalAppsDescription" | i18n)
|
||||
: ("reviewNewAppsDescription" | i18n)
|
||||
}}
|
||||
</p>
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
<!-- Show Empty state when there are no applications (no ciphers to make reports on) -->
|
||||
<empty-state-card
|
||||
[videoSrc]="emptyStateVideoSrc"
|
||||
[title]="this.i18nService.t('noApplicationsInOrgTitle', organizationName)"
|
||||
[description]="this.i18nService.t('noApplicationsInOrgDescription')"
|
||||
[title]="this.i18nService.t('noDataInOrgTitle')"
|
||||
[description]="this.i18nService.t('noDataInOrgDescription')"
|
||||
[benefits]="emptyStateBenefits"
|
||||
[buttonText]="this.i18nService.t('importData')"
|
||||
[buttonIcon]="IMPORT_ICON"
|
||||
@@ -27,8 +27,8 @@
|
||||
<!-- Show empty state for no reports run -->
|
||||
<empty-state-card
|
||||
[videoSrc]="emptyStateVideoSrc"
|
||||
[title]="this.i18nService.t('noReportRunTitle')"
|
||||
[description]="this.i18nService.t('noReportRunDescription')"
|
||||
[title]="this.i18nService.t('noReportsRunTitle')"
|
||||
[description]="this.i18nService.t('noReportsRunDescription')"
|
||||
[benefits]="emptyStateBenefits"
|
||||
[buttonText]="this.i18nService.t('riskInsightsRunReport')"
|
||||
[buttonIcon]=""
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
} from "@angular/core";
|
||||
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
|
||||
import { ActivatedRoute, Router } from "@angular/router";
|
||||
import { combineLatest, EMPTY, firstValueFrom } from "rxjs";
|
||||
import { EMPTY, firstValueFrom } from "rxjs";
|
||||
import { distinctUntilChanged, map, tap } from "rxjs/operators";
|
||||
|
||||
import { JslibModule } from "@bitwarden/angular/jslib.module";
|
||||
@@ -84,14 +84,11 @@ export class RiskInsightsComponent implements OnInit, OnDestroy {
|
||||
|
||||
dataLastUpdated: Date | null = null;
|
||||
|
||||
// Empty state properties
|
||||
protected organizationName = "";
|
||||
|
||||
// Empty state computed properties
|
||||
protected emptyStateBenefits: [string, string][] = [
|
||||
[this.i18nService.t("benefit1Title"), this.i18nService.t("benefit1Description")],
|
||||
[this.i18nService.t("benefit2Title"), this.i18nService.t("benefit2Description")],
|
||||
[this.i18nService.t("benefit3Title"), this.i18nService.t("benefit3Description")],
|
||||
[this.i18nService.t("feature1Title"), this.i18nService.t("feature1Description")],
|
||||
[this.i18nService.t("feature2Title"), this.i18nService.t("feature2Description")],
|
||||
[this.i18nService.t("feature3Title"), this.i18nService.t("feature3Description")],
|
||||
];
|
||||
protected emptyStateVideoSrc: string | null = "/videos/risk-insights-mark-as-critical.mp4";
|
||||
|
||||
@@ -140,17 +137,14 @@ export class RiskInsightsComponent implements OnInit, OnDestroy {
|
||||
)
|
||||
.subscribe();
|
||||
|
||||
// Combine report data, vault items check, organization details, and generation state
|
||||
// Subscribe to report data updates
|
||||
// This declarative pattern ensures proper cleanup and prevents memory leaks
|
||||
combineLatest([this.dataService.enrichedReportData$, this.dataService.organizationDetails$])
|
||||
this.dataService.enrichedReportData$
|
||||
.pipe(takeUntilDestroyed(this.destroyRef))
|
||||
.subscribe(([report, orgDetails]) => {
|
||||
.subscribe((report) => {
|
||||
// Update report state
|
||||
this.appsCount = report?.reportData.length ?? 0;
|
||||
this.dataLastUpdated = report?.creationDate ?? null;
|
||||
|
||||
// Update organization name
|
||||
this.organizationName = orgDetails?.organizationName ?? "";
|
||||
});
|
||||
|
||||
// Subscribe to drawer state changes
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<ng-container bitDialogContent>
|
||||
<span bitTypography="body1" class="tw-text-muted tw-text-sm">{{
|
||||
(drawerDetails.atRiskMemberDetails?.length > 0
|
||||
? "atRiskMembersDescription"
|
||||
? "atRiskMemberDescription"
|
||||
: "atRiskMembersDescriptionNone"
|
||||
) | i18n
|
||||
}}</span>
|
||||
|
||||
Reference in New Issue
Block a user