diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index 761cc2941d4..49e29f00748 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -373,6 +373,21 @@
"noNewApplicationsToReviewAtThisTime": {
"message": "No new applications to review at this time"
},
+ "organizationHasItemsSavedForApplications": {
+ "message": "Your organization has items saved for $COUNT$ applications",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "310"
+ }
+ }
+ },
+ "reviewApplicationsToSecureItems": {
+ "message": "Review applications to secure the items most critical to your organization's security"
+ },
+ "reviewApplications": {
+ "message": "Review applications"
+ },
"prioritizeCriticalApplications": {
"message": "Prioritize critical applications"
},
diff --git a/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/all-activity.component.html b/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/all-activity.component.html
index d8ad785ff14..43cf936e1a1 100644
--- a/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/all-activity.component.html
+++ b/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/all-activity.component.html
@@ -44,26 +44,53 @@
-
-
-
-
+
+ @if (isAllCaughtUp) {
+
+
+
+
+ }
+
+ @else if (showNeedsReviewState) {
+
+
+
+
+ }
+
+ @else {
+
+
+
+
+ }
}
diff --git a/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/all-activity.component.ts b/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/all-activity.component.ts
index 06073d93c85..907e8883a43 100644
--- a/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/all-activity.component.ts
+++ b/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/all-activity.component.ts
@@ -39,12 +39,14 @@ export class AllActivityComponent implements OnInit {
totalCriticalAppsAtRiskMemberCount = 0;
totalCriticalAppsCount = 0;
totalCriticalAppsAtRiskCount = 0;
+ totalApplicationCount = 0;
newApplicationsCount = 0;
newApplications: ApplicationHealthReportDetail[] = [];
extendPasswordChangeWidget = false;
allAppsHaveReviewDate = false;
isAllCaughtUp = false;
hasLoadedApplicationData = false;
+ showNeedsReviewState = false;
destroyRef = inject(DestroyRef);
@@ -65,6 +67,12 @@ export class AllActivityComponent implements OnInit {
this.totalCriticalAppsAtRiskMemberCount = summary.totalCriticalAtRiskMemberCount;
this.totalCriticalAppsCount = summary.totalCriticalApplicationCount;
this.totalCriticalAppsAtRiskCount = summary.totalCriticalAtRiskApplicationCount;
+ this.totalApplicationCount = summary.totalApplicationCount;
+ // If we have application data, mark as loaded
+ if (summary.totalApplicationCount > 0) {
+ this.hasLoadedApplicationData = true;
+ }
+ this.updateShowNeedsReviewState();
});
this.dataService.newApplications$
@@ -73,6 +81,7 @@ export class AllActivityComponent implements OnInit {
this.newApplications = newApps;
this.newApplicationsCount = newApps.length;
this.updateIsAllCaughtUp();
+ this.updateShowNeedsReviewState();
});
this.allActivitiesService.extendPasswordChangeWidget$
@@ -112,6 +121,20 @@ export class AllActivityComponent implements OnInit {
this.allAppsHaveReviewDate;
}
+ /**
+ * Updates the showNeedsReviewState flag based on current state.
+ * This state is shown when:
+ * - Data has been loaded
+ * - There are applications (totalApplicationCount > 0)
+ * - ALL apps do NOT have a review date (newApplicationsCount === totalApplicationCount)
+ */
+ private updateShowNeedsReviewState(): void {
+ this.showNeedsReviewState =
+ this.hasLoadedApplicationData &&
+ this.totalApplicationCount > 0 &&
+ this.newApplicationsCount === this.totalApplicationCount;
+ }
+
/**
* Handles the review new applications button click.
* Opens a dialog showing the list of new applications that can be marked as critical.