diff --git a/apps/web/src/app/tools/access-intelligence/critical-applications.component.html b/apps/web/src/app/tools/access-intelligence/critical-applications.component.html index 1c503f3d786..6784695ee21 100644 --- a/apps/web/src/app/tools/access-intelligence/critical-applications.component.html +++ b/apps/web/src/app/tools/access-intelligence/critical-applications.component.html @@ -65,6 +65,7 @@ {{ "totalPasswords" | i18n }} {{ "atRiskMembers" | i18n }} {{ "totalMembers" | i18n }} + @@ -93,6 +94,21 @@ {{ r.totalMembers }} + + + + + + + diff --git a/apps/web/src/app/tools/access-intelligence/critical-applications.component.ts b/apps/web/src/app/tools/access-intelligence/critical-applications.component.ts index 0779b2977e5..55e38ad6f14 100644 --- a/apps/web/src/app/tools/access-intelligence/critical-applications.component.ts +++ b/apps/web/src/app/tools/access-intelligence/critical-applications.component.ts @@ -4,8 +4,16 @@ import { FormControl } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; import { debounceTime, map } from "rxjs"; +// eslint-disable-next-line no-restricted-imports +import { UnmarkCriticalApplicationApiService } from "@bitwarden/bit-common/tools/reports/risk-insights"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { SearchModule, TableDataSource, NoItemsModule, Icons } from "@bitwarden/components"; +import { + SearchModule, + TableDataSource, + NoItemsModule, + Icons, + ToastService, +} from "@bitwarden/components"; import { CardComponent } from "@bitwarden/tools-card"; import { HeaderModule } from "../../layouts/header/header.module"; @@ -20,6 +28,7 @@ import { RiskInsightsTabType } from "./risk-insights.component"; selector: "tools-critical-applications", templateUrl: "./critical-applications.component.html", imports: [CardComponent, HeaderModule, SearchModule, NoItemsModule, PipesModule, SharedModule], + providers: [UnmarkCriticalApplicationApiService], }) export class CriticalApplicationsComponent implements OnInit { protected dataSource = new TableDataSource(); @@ -55,12 +64,30 @@ export class CriticalApplicationsComponent implements OnInit { }); }; + unmarkAsCriticalApp = async (hostname: string) => { + await this.unmarkCriticalApplicationApiService.unmarkCriticalApplication( + this.organizationId, + hostname, + ); + this.toastService.showToast({ + // TODO uncomment when UnmarkCriticalApplicationApiService is properly implemented + // message: this.i18nService.t("criticalApplicationSuccessfullyUnmarked"), + // variant: "success", + // title: this.i18nService.t("Success"), + title: "API not yet implemented", + variant: "warning", + message: "API not yet implemented", + }); + }; + constructor( protected i18nService: I18nService, protected activatedRoute: ActivatedRoute, protected router: Router, + private unmarkCriticalApplicationApiService: UnmarkCriticalApplicationApiService, + protected toastService: ToastService, ) { - this.dataSource.data = []; //applicationTableMockData; + this.dataSource.data = applicationTableMockData; this.searchControl.valueChanges .pipe(debounceTime(200), takeUntilDestroyed()) .subscribe((v) => (this.dataSource.filter = v)); diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index a0b4793916d..8b9778675af 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -113,6 +113,12 @@ "totalApplications": { "message": "Total applications" }, + "unmarkAsCriticalApp": { + "message": "Unmark as critical app" + }, + "criticalApplicationSuccessfullyUnmarked": { + "message": "Critical application successfully unmarked" + }, "whatTypeOfItem": { "message": "What type of item is this?" }, diff --git a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/index.ts b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/index.ts index c7bace84e5b..9193a7d2e3f 100644 --- a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/index.ts +++ b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/index.ts @@ -1,2 +1,3 @@ export * from "./member-cipher-details-api.service"; export * from "./password-health.service"; +export * from "./unmark-critical-application-api.service"; diff --git a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/unmark-critical-application-api.service.ts b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/unmark-critical-application-api.service.ts new file mode 100644 index 00000000000..de04c7bd004 --- /dev/null +++ b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/unmark-critical-application-api.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from "@angular/core"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; + +@Injectable() +export class UnmarkCriticalApplicationApiService { + constructor(private apiService: ApiService) {} + + /** + * Unmark a critical application for organization + * @param orgId OrganizationId to get member cipher details for + * @returns void + */ + async unmarkCriticalApplication(orgId: string, hostname: string): Promise { + // TODO - Properly implement this method once the API is ready + // const response = await this.apiService.send( + // "GET", + // "/organizations/" + orgId + "/unmark-as-critical-application", + // null, + // true, + // true, + // ); + // return response; + } +}