From cb63eb8eeae4eee04e3f96318afa09be39d30463 Mon Sep 17 00:00:00 2001 From: voommen-livefront Date: Thu, 24 Jul 2025 09:00:35 -0500 Subject: [PATCH] PM-23826 Implement a dialog to accept connection params --- .../integration-card.component.html | 2 +- .../integration-card.component.ts | 23 +++++-- .../connect-dialog.component.html | 34 +++++++++ .../connect-dialog.component.ts | 69 +++++++++++++++++++ .../integrations/integration-dialog/index.ts | 1 + .../integration-grid.component.html | 1 + apps/web/src/locales/en/messages.json | 9 +++ 7 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/connect-dialog/connect-dialog.component.html create mode 100644 apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/connect-dialog/connect-dialog.component.ts create mode 100644 apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/index.ts diff --git a/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-card/integration-card.component.html b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-card/integration-card.component.html index 2c0db1cf933..e5687c71ed9 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-card/integration-card.component.html +++ b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-card/integration-card.component.html @@ -33,7 +33,7 @@

{{ description }}

@if (canSetupConnection) { - } diff --git a/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-card/integration-card.component.ts b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-card/integration-card.component.ts index 4188579bef9..aa4497db1a2 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-card/integration-card.component.ts +++ b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-card/integration-card.component.ts @@ -9,13 +9,16 @@ import { OnDestroy, ViewChild, } from "@angular/core"; -import { Observable, Subject, combineLatest, takeUntil } from "rxjs"; +import { Observable, Subject, combineLatest, lastValueFrom, takeUntil } from "rxjs"; import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-tokens"; import { ThemeType } from "@bitwarden/common/platform/enums"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; +import { DialogService } from "@bitwarden/components"; import { SharedModule } from "../../../../../../shared/shared.module"; +import { openCrowdstrikeConnectDialog } from "../integration-dialog/index"; +import { Integration } from "../models"; @Component({ selector: "app-integration-card", @@ -30,6 +33,7 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy { @Input() image: string; @Input() imageDarkMode?: string; @Input() linkURL: string; + @Input() integrationSettings: Integration; /** Adds relevant `rel` attribute to external links */ @Input() externalURL?: boolean; @@ -49,6 +53,7 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy { private themeStateService: ThemeStateService, @Inject(SYSTEM_THEME_OBSERVABLE) private systemTheme$: Observable, + private dialogService: DialogService, ) {} ngAfterViewInit() { @@ -101,9 +106,17 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy { return this.isConnected !== undefined; } - setupConnection(app: string) { - // This method can be used to handle the connection logic for the integration - // For example, it could open a modal or redirect to a setup page - this.isConnected = !this.isConnected; // Toggle connection state for demonstration + async setupConnection() { + // invoke the dialog to connect the integration + const dialog = openCrowdstrikeConnectDialog(this.dialogService, { + data: { + settings: this.integrationSettings, + }, + }); + + const result = await lastValueFrom(dialog.closed); + + // eslint-disable-next-line no-console + console.log(`Dialog closed with result: ${JSON.stringify(result)}`); } } diff --git a/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/connect-dialog/connect-dialog.component.html b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/connect-dialog/connect-dialog.component.html new file mode 100644 index 00000000000..4e220a2cc03 --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/connect-dialog/connect-dialog.component.html @@ -0,0 +1,34 @@ +
+ + + {{ "connectIntegrationButtonDesc" | i18n: connectInfo.settings.name }} + +
+ + + + + + {{ "url" | i18n }} + + + + {{ "bearerToken" | i18n }} + + + + {{ "index" | i18n }} + + + +
+ + + + +
+
diff --git a/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/connect-dialog/connect-dialog.component.ts b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/connect-dialog/connect-dialog.component.ts new file mode 100644 index 00000000000..edd00f02998 --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/connect-dialog/connect-dialog.component.ts @@ -0,0 +1,69 @@ +import { Component, Inject } from "@angular/core"; +import { FormBuilder, Validators } from "@angular/forms"; + +import { DIALOG_DATA, DialogConfig, DialogRef, DialogService } from "@bitwarden/components"; +import { SharedModule } from "@bitwarden/web-vault/app/shared"; + +import { Integration } from "../../models"; + +export type ConnectDialogParams = { + settings: Integration; +}; + +export interface ConnectDialogResult { + integrationSettings: Integration; + url: string; + bearerToken: string; + index: string; + success: boolean; + error: string | null; +} + +@Component({ + templateUrl: "./connect-dialog.component.html", + imports: [SharedModule], +}) +export class ConnectDialogComponent { + loading = false; + protected formGroup = this.formBuilder.group({ + url: ["", [Validators.required, Validators.pattern("https?://.+")]], + bearerToken: ["", Validators.required], + index: ["", Validators.required], + }); + + constructor( + @Inject(DIALOG_DATA) protected connectInfo: ConnectDialogParams, + protected formBuilder: FormBuilder, + private dialogRef: DialogRef, + ) {} + + protected submit = async (): Promise => { + const formJson = this.formGroup.getRawValue(); + + // eslint-disable-next-line no-console + console.log(`Form submitted with values: ${JSON.stringify(formJson)}`); + + const result: ConnectDialogResult = { + integrationSettings: this.connectInfo.settings, + url: this.formGroup.value.url, + bearerToken: this.formGroup.value.bearerToken, + index: this.formGroup.value.index, + success: true, + error: null, + }; + + // eslint-disable-next-line no-console + console.log(`Dialog closed with result: ${JSON.stringify(result)}`); + + this.dialogRef.close(result); + + return; + }; +} + +export function openCrowdstrikeConnectDialog( + dialogService: DialogService, + config: DialogConfig>, +) { + return dialogService.open(ConnectDialogComponent, config); +} diff --git a/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/index.ts b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/index.ts new file mode 100644 index 00000000000..8503d00b8c7 --- /dev/null +++ b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-dialog/index.ts @@ -0,0 +1 @@ +export * from "../integration-dialog/connect-dialog/connect-dialog.component"; diff --git a/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-grid/integration-grid.component.html b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-grid/integration-grid.component.html index b4eaff993f0..661c57b47fc 100644 --- a/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-grid/integration-grid.component.html +++ b/apps/web/src/app/admin-console/organizations/shared/components/integrations/integration-grid/integration-grid.component.html @@ -16,6 +16,7 @@ [description]="integration.description | i18n" [isConnected]="integration.isConnected" [canSetupConnection]="integration.canSetupConnection" + [integrationSettings]="integration" > diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index f34d6e41b37..1dfe415c33a 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -9562,6 +9562,15 @@ "createNewClientToManageAsProvider": { "message": "Create a new client organization to manage as a Provider. Additional seats will be reflected in the next billing cycle." }, + "url": { + "message": "URL" + }, + "bearerToken": { + "message": "Bearer Token" + }, + "index": { + "message": "Index" + }, "selectAPlan": { "message": "Select a plan" },