();
- protected taxInformation: TaxInformation;
-
constructor(
@Inject(DIALOG_DATA) private dialogParams: ChangePlanDialogParams,
private dialogRef: DialogRef,
@@ -193,7 +189,6 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
private organizationApiService: OrganizationApiServiceAbstraction,
private configService: ConfigService,
private billingApiService: BillingApiServiceAbstraction,
- private taxService: TaxServiceAbstraction,
) {}
async ngOnInit(): Promise {
@@ -272,11 +267,6 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
this.setInitialPlanSelection();
this.loading = false;
-
- const taxInfo = await this.organizationApiService.getTaxInfo(this.organizationId);
- this.taxInformation = TaxInformation.from(taxInfo);
-
- this.refreshSalesTax();
}
setInitialPlanSelection() {
@@ -360,7 +350,6 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
switch (cardState) {
case PlanCardState.Selected: {
return [
- "tw-group",
"tw-cursor-pointer",
"tw-block",
"tw-rounded",
@@ -413,12 +402,6 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
}
this.selectedPlan = plan;
this.formGroup.patchValue({ productTier: plan.productTier });
-
- try {
- this.refreshSalesTax();
- } catch {
- this.estimatedTax = 0;
- }
}
ngOnDestroy() {
@@ -584,6 +567,12 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
);
}
+ get taxCharges() {
+ return this.taxComponent != null && this.taxComponent.taxRate != null
+ ? (this.taxComponent.taxRate / 100) * this.passwordManagerSubtotal
+ : 0;
+ }
+
get passwordManagerSeats() {
if (this.selectedPlan.productTier === ProductTierType.Families) {
return this.selectedPlan.PasswordManager.baseSeats;
@@ -595,15 +584,15 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
if (this.organization.useSecretsManager) {
return (
this.passwordManagerSubtotal +
- this.additionalStorageTotal(this.selectedPlan) +
- this.secretsManagerSubtotal +
- this.estimatedTax
+ this.additionalStorageTotal(this.selectedPlan) +
+ this.secretsManagerSubtotal +
+ this.taxCharges || 0
);
}
return (
this.passwordManagerSubtotal +
- this.additionalStorageTotal(this.selectedPlan) +
- this.estimatedTax
+ this.additionalStorageTotal(this.selectedPlan) +
+ this.taxCharges || 0
);
}
@@ -656,8 +645,8 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
}
changedCountry() {
- if (this.deprecateStripeSourcesAPI && this.paymentV2Component) {
- this.paymentV2Component.showBankAccount = this.taxInformation.country === "US";
+ if (this.deprecateStripeSourcesAPI && this.paymentV2Component && this.taxComponent) {
+ this.paymentV2Component.showBankAccount = this.taxComponent.country === "US";
if (
!this.paymentV2Component.showBankAccount &&
@@ -665,8 +654,8 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
) {
this.paymentV2Component.select(PaymentMethodType.Card);
}
- } else if (this.paymentComponent && this.taxInformation) {
- this.paymentComponent!.hideBank = this.taxInformation.country !== "US";
+ } else if (this.paymentComponent && this.taxComponent) {
+ this.paymentComponent!.hideBank = this.taxComponent?.taxFormGroup?.value.country !== "US";
// Bank Account payments are only available for US customers
if (
this.paymentComponent.hideBank &&
@@ -678,14 +667,9 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
}
}
- protected taxInformationChanged(event: TaxInformation): void {
- this.taxInformation = event;
- this.changedCountry();
- this.refreshSalesTax();
- }
-
submit = async () => {
- if (!this.taxComponent?.validate()) {
+ if (!this.taxComponent?.taxFormGroup.valid && this.taxComponent?.taxFormGroup.touched) {
+ this.taxComponent?.taxFormGroup.markAllAsTouched();
return;
}
@@ -739,8 +723,8 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
this.formGroup.controls.premiumAccessAddon.value;
request.planType = this.selectedPlan.type;
if (this.showPayment) {
- request.billingAddressCountry = this.taxInformation.country;
- request.billingAddressPostalCode = this.taxInformation.postalCode;
+ request.billingAddressCountry = this.taxComponent.taxFormGroup?.value.country;
+ request.billingAddressPostalCode = this.taxComponent.taxFormGroup?.value.postalCode;
}
// Secrets Manager
@@ -751,9 +735,15 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
const tokenizedPaymentSource = await this.paymentV2Component.tokenize();
const updatePaymentMethodRequest = new UpdatePaymentMethodRequest();
updatePaymentMethodRequest.paymentSource = tokenizedPaymentSource;
- updatePaymentMethodRequest.taxInformation = ExpandedTaxInfoUpdateRequest.From(
- this.taxInformation,
- );
+ updatePaymentMethodRequest.taxInformation = {
+ country: this.taxComponent.country,
+ postalCode: this.taxComponent.postalCode,
+ taxId: this.taxComponent.taxId,
+ line1: this.taxComponent.line1,
+ line2: this.taxComponent.line2,
+ city: this.taxComponent.city,
+ state: this.taxComponent.state,
+ };
await this.billingApiService.updateOrganizationPaymentMethod(
this.organizationId,
@@ -764,8 +754,8 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
const paymentRequest = new PaymentRequest();
paymentRequest.paymentToken = tokenResult[0];
paymentRequest.paymentMethodType = tokenResult[1];
- paymentRequest.country = this.taxInformation.country;
- paymentRequest.postalCode = this.taxInformation.postalCode;
+ paymentRequest.country = this.taxComponent.taxFormGroup?.value.country;
+ paymentRequest.postalCode = this.taxComponent.taxFormGroup?.value.postalCode;
await this.organizationApiService.updatePayment(this.organizationId, paymentRequest);
}
}
@@ -954,48 +944,4 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
manageSelectableProduct(index: number) {
return index;
}
-
- private refreshSalesTax(): void {
- if (!this.taxInformation.country || !this.taxInformation.postalCode) {
- return;
- }
-
- const request: PreviewOrganizationInvoiceRequest = {
- organizationId: this.organizationId,
- passwordManager: {
- additionalStorage: 0,
- plan: this.selectedPlan?.type,
- seats: this.sub.seats,
- },
- taxInformation: {
- postalCode: this.taxInformation.postalCode,
- country: this.taxInformation.country,
- taxId: this.taxInformation.taxId,
- },
- };
-
- if (this.organization.useSecretsManager) {
- request.secretsManager = {
- seats: this.sub.smSeats,
- additionalMachineAccounts: this.sub.smServiceAccounts,
- };
- }
-
- this.taxService
- .previewOrganizationInvoice(request)
- .then((invoice) => {
- this.estimatedTax = invoice.taxAmount;
- })
- .catch((error) => {
- this.toastService.showToast({
- title: "",
- variant: "error",
- message: this.i18nService.t(error.message),
- });
- });
- }
-
- protected canUpdatePaymentInformation(): boolean {
- return this.upgradeRequiresPaymentMethod || this.showPayment || this.isPaymentSourceEmpty();
- }
}
diff --git a/apps/web/src/app/billing/organizations/change-plan.component.ts b/apps/web/src/app/billing/organizations/change-plan.component.ts
index 51cdbba557e..7c25413079a 100644
--- a/apps/web/src/app/billing/organizations/change-plan.component.ts
+++ b/apps/web/src/app/billing/organizations/change-plan.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { ProductTierType } from "@bitwarden/common/billing/enums";
diff --git a/apps/web/src/app/billing/organizations/download-license.component.ts b/apps/web/src/app/billing/organizations/download-license.component.ts
index 6b3a93548b4..02733322807 100644
--- a/apps/web/src/app/billing/organizations/download-license.component.ts
+++ b/apps/web/src/app/billing/organizations/download-license.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogConfig, DIALOG_DATA, DialogRef } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
diff --git a/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts b/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts
index 30ae39d481a..d533badabf8 100644
--- a/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts
+++ b/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { concatMap, Subject, takeUntil } from "rxjs";
diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.html b/apps/web/src/app/billing/organizations/organization-plans.component.html
index 3bb25cf1524..e1b74abea71 100644
--- a/apps/web/src/app/billing/organizations/organization-plans.component.html
+++ b/apps/web/src/app/billing/organizations/organization-plans.component.html
@@ -335,7 +335,7 @@
>{{ "additionalUsers" | i18n }}:
{{ "users" | i18n }}:
- {{ formGroup.controls.additionalSeats.value || 0 }} ×
+ {{ formGroup.controls["additionalSeats"].value || 0 }} ×
{{
(selectablePlan.isAnnual
? selectablePlan.PasswordManager.seatPrice / 12
@@ -355,7 +355,7 @@
*ngIf="selectablePlan.PasswordManager.hasAdditionalStorageOption"
>
{{ "additionalStorageGb" | i18n }}:
- {{ formGroup.controls.additionalStorage.value || 0 }} ×
+ {{ formGroup.controls["additionalStorage"].value || 0 }} ×
{{
(selectablePlan.isAnnual
? selectablePlan.PasswordManager.additionalStoragePricePerGb / 12
@@ -388,7 +388,7 @@
>{{ "additionalUsers" | i18n }}:
{{ "users" | i18n }}:
- {{ formGroup.controls.additionalSeats.value || 0 }} ×
+ {{ formGroup.controls["additionalSeats"].value || 0 }} ×
{{ selectablePlan.PasswordManager.seatPrice | currency: "$" }}
{{ "monthAbbr" | i18n }} =
{{
@@ -403,7 +403,7 @@
*ngIf="selectablePlan.PasswordManager.hasAdditionalStorageOption"
>
{{ "additionalStorageGb" | i18n }}:
- {{ formGroup.controls.additionalStorage.value || 0 }} ×
+ {{ formGroup.controls["additionalStorage"].value || 0 }} ×
{{ selectablePlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }}
{{ "monthAbbr" | i18n }} =
{{ additionalStorageTotal(selectablePlan) | currency: "$" }} /{{ "month" | i18n }}
@@ -440,11 +440,7 @@
-
+
{{ "passwordManagerPlanPrice" | i18n }}: {{ passwordManagerSubtotal | currency: "USD $" }}
@@ -454,7 +450,7 @@
- {{ "estimatedTax" | i18n }}: {{ estimatedTax | currency: "USD $" }}
+ {{ "estimatedTax" | i18n }}: {{ taxCharges | currency: "USD $" }}
diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.ts b/apps/web/src/app/billing/organizations/organization-plans.component.ts
index c8290f774da..e7a011792ae 100644
--- a/apps/web/src/app/billing/organizations/organization-plans.component.ts
+++ b/apps/web/src/app/billing/organizations/organization-plans.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import {
Component,
EventEmitter,
@@ -10,9 +12,7 @@ import {
import { FormBuilder, Validators } from "@angular/forms";
import { Router } from "@angular/router";
import { Subject, takeUntil } from "rxjs";
-import { debounceTime } from "rxjs/operators";
-import { ManageTaxInformationComponent } from "@bitwarden/angular/billing/components";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
@@ -26,12 +26,9 @@ import { OrganizationUpgradeRequest } from "@bitwarden/common/admin-console/mode
import { ProviderOrganizationCreateRequest } from "@bitwarden/common/admin-console/models/request/provider/provider-organization-create.request";
import { ProviderResponse } from "@bitwarden/common/admin-console/models/response/provider/provider.response";
import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions";
-import { TaxServiceAbstraction } from "@bitwarden/common/billing/abstractions/tax.service.abstraction";
import { PaymentMethodType, PlanType, ProductTierType } from "@bitwarden/common/billing/enums";
-import { TaxInformation } from "@bitwarden/common/billing/models/domain";
import { ExpandedTaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/expanded-tax-info-update.request";
import { PaymentRequest } from "@bitwarden/common/billing/models/request/payment.request";
-import { PreviewOrganizationInvoiceRequest } from "@bitwarden/common/billing/models/request/preview-organization-invoice.request";
import { UpdatePaymentMethodRequest } from "@bitwarden/common/billing/models/request/update-payment-method.request";
import { BillingResponse } from "@bitwarden/common/billing/models/response/billing.response";
import { OrganizationSubscriptionResponse } from "@bitwarden/common/billing/models/response/organization-subscription.response";
@@ -53,6 +50,7 @@ import { OrganizationCreateModule } from "../../admin-console/organizations/crea
import { BillingSharedModule, secretsManagerSubscribeFormFactory } from "../shared";
import { PaymentV2Component } from "../shared/payment/payment-v2.component";
import { PaymentComponent } from "../shared/payment/payment.component";
+import { TaxInfoComponent } from "../shared/tax-info.component";
interface OnSuccessArgs {
organizationId: string;
@@ -74,14 +72,13 @@ const Allowed2020PlansForLegacyProviders = [
export class OrganizationPlansComponent implements OnInit, OnDestroy {
@ViewChild(PaymentComponent) paymentComponent: PaymentComponent;
@ViewChild(PaymentV2Component) paymentV2Component: PaymentV2Component;
- @ViewChild(ManageTaxInformationComponent) taxComponent: ManageTaxInformationComponent;
+ @ViewChild(TaxInfoComponent) taxComponent: TaxInfoComponent;
- @Input() organizationId?: string;
+ @Input() organizationId: string;
@Input() showFree = true;
@Input() showCancel = false;
@Input() acceptingSponsorship = false;
@Input() currentPlan: PlanResponse;
-
selectedFile: File;
@Input()
@@ -96,8 +93,6 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
private _productTier = ProductTierType.Free;
- protected taxInformation: TaxInformation;
-
@Input()
get plan(): PlanType {
return this._plan;
@@ -154,10 +149,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
billing: BillingResponse;
provider: ProviderResponse;
- protected estimatedTax: number = 0;
- protected total: number = 0;
-
- private destroy$: Subject
= new Subject();
+ private destroy$ = new Subject();
constructor(
private apiService: ApiService,
@@ -176,7 +168,6 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
private toastService: ToastService,
private configService: ConfigService,
private billingApiService: BillingApiServiceAbstraction,
- private taxService: TaxServiceAbstraction,
) {
this.selfHosted = this.platformUtilsService.isSelfHost();
}
@@ -190,9 +181,6 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.organization = await this.organizationService.get(this.organizationId);
this.billing = await this.organizationApiService.getBilling(this.organizationId);
this.sub = await this.organizationApiService.getSubscription(this.organizationId);
- this.taxInformation = await this.organizationApiService.getTaxInfo(this.organizationId);
- } else {
- this.taxInformation = await this.apiService.getTaxInfo();
}
if (!this.selfHosted) {
@@ -253,16 +241,6 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
this.loading = false;
-
- this.formGroup.valueChanges.pipe(debounceTime(1000), takeUntil(this.destroy$)).subscribe(() => {
- this.refreshSalesTax();
- });
-
- this.secretsManagerForm.valueChanges
- .pipe(debounceTime(1000), takeUntil(this.destroy$))
- .subscribe(() => {
- this.refreshSalesTax();
- });
}
ngOnDestroy() {
@@ -460,6 +438,17 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
return this.selectedPlan.trialPeriodDays != null;
}
+ get taxCharges() {
+ return this.taxComponent != null && this.taxComponent.taxRate != null
+ ? (this.taxComponent.taxRate / 100) *
+ (this.passwordManagerSubtotal + this.secretsManagerSubtotal)
+ : 0;
+ }
+
+ get total() {
+ return this.passwordManagerSubtotal + this.secretsManagerSubtotal + this.taxCharges || 0;
+ }
+
get paymentDesc() {
if (this.acceptingSponsorship) {
return this.i18nService.t("paymentSponsored");
@@ -565,9 +554,9 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.changedProduct();
}
- protected changedCountry(): void {
+ changedCountry() {
if (this.deprecateStripeSourcesAPI) {
- this.paymentV2Component.showBankAccount = this.taxInformation?.country === "US";
+ this.paymentV2Component.showBankAccount = this.taxComponent.country === "US";
if (
!this.paymentV2Component.showBankAccount &&
this.paymentV2Component.selected === PaymentMethodType.BankAccount
@@ -575,7 +564,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.paymentV2Component.select(PaymentMethodType.Card);
}
} else {
- this.paymentComponent.hideBank = this.taxInformation?.country !== "US";
+ this.paymentComponent.hideBank = this.taxComponent.taxFormGroup?.value.country !== "US";
if (
this.paymentComponent.hideBank &&
this.paymentComponent.method === PaymentMethodType.BankAccount
@@ -586,31 +575,28 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
}
- protected onTaxInformationChanged(event: TaxInformation): void {
- this.taxInformation = event;
- this.changedCountry();
- this.refreshSalesTax();
- }
-
- protected cancel(): void {
+ cancel() {
this.onCanceled.emit();
}
- protected setSelectedFile(event: Event): void {
+ setSelectedFile(event: Event) {
const fileInputEl = event.target;
this.selectedFile = fileInputEl.files.length > 0 ? fileInputEl.files[0] : null;
}
submit = async () => {
- if (this.taxComponent && !this.taxComponent.validate()) {
- return;
+ if (this.taxComponent) {
+ if (!this.taxComponent?.taxFormGroup.valid) {
+ this.taxComponent?.taxFormGroup.markAllAsTouched();
+ return;
+ }
}
if (this.singleOrgPolicyBlock) {
return;
}
const doSubmit = async (): Promise => {
- let orgId: string;
+ let orgId: string = null;
if (this.createOrganization) {
const orgKey = await this.keyService.makeOrgKey();
const key = orgKey[0].encryptedString;
@@ -621,9 +607,11 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
const collectionCt = collection.encryptedString;
const orgKeys = await this.keyService.makeKeyPair(orgKey[1]);
- orgId = this.selfHosted
- ? await this.createSelfHosted(key, collectionCt, orgKeys)
- : await this.createCloudHosted(key, collectionCt, orgKeys, orgKey[1]);
+ if (this.selfHosted) {
+ orgId = await this.createSelfHosted(key, collectionCt, orgKeys);
+ } else {
+ orgId = await this.createCloudHosted(key, collectionCt, orgKeys, orgKey[1]);
+ }
this.toastService.showToast({
variant: "success",
@@ -631,7 +619,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
message: this.i18nService.t("organizationReadyToGo"),
});
} else {
- orgId = await this.updateOrganization();
+ orgId = await this.updateOrganization(orgId);
this.toastService.showToast({
variant: "success",
title: null,
@@ -665,53 +653,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.messagingService.send("organizationCreated", { organizationId });
};
- private refreshSalesTax(): void {
- if (this.formGroup.controls.plan.value == PlanType.Free) {
- this.estimatedTax = 0;
- return;
- }
-
- if (!this.taxComponent.validate()) {
- return;
- }
-
- const request: PreviewOrganizationInvoiceRequest = {
- organizationId: this.organizationId,
- passwordManager: {
- additionalStorage: this.formGroup.controls.additionalStorage.value,
- plan: this.formGroup.controls.plan.value,
- seats: this.formGroup.controls.additionalSeats.value,
- },
- taxInformation: {
- postalCode: this.taxInformation.postalCode,
- country: this.taxInformation.country,
- taxId: this.taxInformation.taxId,
- },
- };
-
- if (this.secretsManagerForm.controls.enabled.value === true) {
- request.secretsManager = {
- seats: this.secretsManagerForm.controls.userSeats.value,
- additionalMachineAccounts: this.secretsManagerForm.controls.additionalServiceAccounts.value,
- };
- }
-
- this.taxService
- .previewOrganizationInvoice(request)
- .then((invoice) => {
- this.estimatedTax = invoice.taxAmount;
- this.total = invoice.totalAmount;
- })
- .catch((error) => {
- this.toastService.showToast({
- title: "",
- variant: "error",
- message: this.i18nService.t(error.message),
- });
- });
- }
-
- private async updateOrganization() {
+ private async updateOrganization(orgId: string) {
const request = new OrganizationUpgradeRequest();
request.additionalSeats = this.formGroup.controls.additionalSeats.value;
request.additionalStorageGb = this.formGroup.controls.additionalStorage.value;
@@ -719,8 +661,8 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.selectedPlan.PasswordManager.hasPremiumAccessOption &&
this.formGroup.controls.premiumAccessAddon.value;
request.planType = this.selectedPlan.type;
- request.billingAddressCountry = this.taxInformation?.country;
- request.billingAddressPostalCode = this.taxInformation?.postalCode;
+ request.billingAddressCountry = this.taxComponent.taxFormGroup?.value.country;
+ request.billingAddressPostalCode = this.taxComponent.taxFormGroup?.value.postalCode;
// Secrets Manager
this.buildSecretsManagerRequest(request);
@@ -729,9 +671,10 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
if (this.deprecateStripeSourcesAPI) {
const updatePaymentMethodRequest = new UpdatePaymentMethodRequest();
updatePaymentMethodRequest.paymentSource = await this.paymentV2Component.tokenize();
- updatePaymentMethodRequest.taxInformation = ExpandedTaxInfoUpdateRequest.From(
- this.taxInformation,
- );
+ const expandedTaxInfoUpdateRequest = new ExpandedTaxInfoUpdateRequest();
+ expandedTaxInfoUpdateRequest.country = this.taxComponent.country;
+ expandedTaxInfoUpdateRequest.postalCode = this.taxComponent.postalCode;
+ updatePaymentMethodRequest.taxInformation = expandedTaxInfoUpdateRequest;
await this.billingApiService.updateOrganizationPaymentMethod(
this.organizationId,
updatePaymentMethodRequest,
@@ -741,8 +684,8 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
const paymentRequest = new PaymentRequest();
paymentRequest.paymentToken = paymentToken;
paymentRequest.paymentMethodType = paymentMethodType;
- paymentRequest.country = this.taxInformation?.country;
- paymentRequest.postalCode = this.taxInformation?.postalCode;
+ paymentRequest.country = this.taxComponent.taxFormGroup?.value.country;
+ paymentRequest.postalCode = this.taxComponent.taxFormGroup?.value.postalCode;
await this.organizationApiService.updatePayment(this.organizationId, paymentRequest);
}
}
@@ -766,7 +709,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
collectionCt: string,
orgKeys: [string, EncString],
orgKey: SymmetricCryptoKey,
- ): Promise {
+ ) {
const request = new OrganizationCreateRequest();
request.key = key;
request.collectionName = collectionCt;
@@ -795,13 +738,15 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.selectedPlan.PasswordManager.hasPremiumAccessOption &&
this.formGroup.controls.premiumAccessAddon.value;
request.planType = this.selectedPlan.type;
- request.billingAddressPostalCode = this.taxInformation?.postalCode;
- request.billingAddressCountry = this.taxInformation?.country;
- request.taxIdNumber = this.taxInformation?.taxId;
- request.billingAddressLine1 = this.taxInformation?.line1;
- request.billingAddressLine2 = this.taxInformation?.line2;
- request.billingAddressCity = this.taxInformation?.city;
- request.billingAddressState = this.taxInformation?.state;
+ request.billingAddressPostalCode = this.taxComponent.taxFormGroup?.value.postalCode;
+ request.billingAddressCountry = this.taxComponent.taxFormGroup?.value.country;
+ if (this.taxComponent.taxFormGroup?.value.includeTaxId) {
+ request.taxIdNumber = this.taxComponent.taxFormGroup?.value.taxId;
+ request.billingAddressLine1 = this.taxComponent.taxFormGroup?.value.line1;
+ request.billingAddressLine2 = this.taxComponent.taxFormGroup?.value.line2;
+ request.billingAddressCity = this.taxComponent.taxFormGroup?.value.city;
+ request.billingAddressState = this.taxComponent.taxFormGroup?.value.state;
+ }
}
// Secrets Manager
diff --git a/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts b/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts
index 61c13a26e0e..09a4890549b 100644
--- a/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts
+++ b/apps/web/src/app/billing/organizations/organization-subscription-cloud.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { concatMap, firstValueFrom, lastValueFrom, Observable, Subject, takeUntil } from "rxjs";
diff --git a/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.ts b/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.ts
index 3d2aef68755..ef68de39526 100644
--- a/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.ts
+++ b/apps/web/src/app/billing/organizations/organization-subscription-selfhost.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { FormControl, FormGroup } from "@angular/forms";
import { ActivatedRoute } from "@angular/router";
diff --git a/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.html b/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.html
index 57844805f55..78f9955d31a 100644
--- a/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.html
+++ b/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.html
@@ -9,12 +9,12 @@
{{ freeTrialData.message }}
- {{ "routeToPaymentMethodTrigger" | i18n }}
+ {{ "clickHereToAddPaymentMethod" | i18n }}
@@ -63,5 +63,20 @@
{{ "paymentChargedWithUnpaidSubscription" | i18n }}
+
+
+ {{ "taxInformation" | i18n }}
+ {{ "taxInformationDesc" | i18n }}
+
+
+
diff --git a/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.ts b/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.ts
index a6f04ea6862..4ed35461c72 100644
--- a/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.ts
+++ b/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Location } from "@angular/common";
import { Component, OnDestroy, ViewChild } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
@@ -9,6 +11,7 @@ import { OrganizationService } from "@bitwarden/common/admin-console/abstraction
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions";
import { PaymentMethodType } from "@bitwarden/common/billing/enums";
+import { ExpandedTaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/expanded-tax-info-update.request";
import { VerifyBankAccountRequest } from "@bitwarden/common/billing/models/request/verify-bank-account.request";
import { OrganizationSubscriptionResponse } from "@bitwarden/common/billing/models/response/organization-subscription.response";
import { PaymentSourceResponse } from "@bitwarden/common/billing/models/response/payment-source.response";
@@ -180,6 +183,32 @@ export class OrganizationPaymentMethodComponent implements OnDestroy {
}
};
+ protected updateTaxInformation = async (): Promise => {
+ this.taxInfoComponent.taxFormGroup.updateValueAndValidity();
+ this.taxInfoComponent.taxFormGroup.markAllAsTouched();
+
+ if (this.taxInfoComponent.taxFormGroup.invalid) {
+ return;
+ }
+
+ const request = new ExpandedTaxInfoUpdateRequest();
+ request.country = this.taxInfoComponent.country;
+ request.postalCode = this.taxInfoComponent.postalCode;
+ request.taxId = this.taxInfoComponent.taxId;
+ request.line1 = this.taxInfoComponent.line1;
+ request.line2 = this.taxInfoComponent.line2;
+ request.city = this.taxInfoComponent.city;
+ request.state = this.taxInfoComponent.state;
+
+ await this.billingApiService.updateOrganizationTaxInformation(this.organizationId, request);
+
+ this.toastService.showToast({
+ variant: "success",
+ title: null,
+ message: this.i18nService.t("taxInfoUpdated"),
+ });
+ };
+
protected verifyBankAccount = async (request: VerifyBankAccountRequest): Promise => {
await this.billingApiService.verifyOrganizationBankAccount(this.organizationId, request);
this.toastService.showToast({
diff --git a/apps/web/src/app/billing/organizations/sm-adjust-subscription.component.ts b/apps/web/src/app/billing/organizations/sm-adjust-subscription.component.ts
index bc8694a5058..4a4f309c68b 100644
--- a/apps/web/src/app/billing/organizations/sm-adjust-subscription.component.ts
+++ b/apps/web/src/app/billing/organizations/sm-adjust-subscription.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
import { Subject, takeUntil } from "rxjs";
diff --git a/apps/web/src/app/billing/organizations/sm-subscribe-standalone.component.ts b/apps/web/src/app/billing/organizations/sm-subscribe-standalone.component.ts
index aae799d8089..7ad0895809c 100644
--- a/apps/web/src/app/billing/organizations/sm-subscribe-standalone.component.ts
+++ b/apps/web/src/app/billing/organizations/sm-subscribe-standalone.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { FormBuilder } from "@angular/forms";
diff --git a/apps/web/src/app/billing/organizations/subscription-hidden.component.ts b/apps/web/src/app/billing/organizations/subscription-hidden.component.ts
index a603fff7804..894db727b01 100644
--- a/apps/web/src/app/billing/organizations/subscription-hidden.component.ts
+++ b/apps/web/src/app/billing/organizations/subscription-hidden.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input } from "@angular/core";
import { svgIcon } from "@bitwarden/components";
diff --git a/apps/web/src/app/billing/organizations/subscription-status.component.ts b/apps/web/src/app/billing/organizations/subscription-status.component.ts
index 9a0b634edcc..a097bf674e2 100644
--- a/apps/web/src/app/billing/organizations/subscription-status.component.ts
+++ b/apps/web/src/app/billing/organizations/subscription-status.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DatePipe } from "@angular/common";
import { Component, EventEmitter, Input, Output } from "@angular/core";
diff --git a/apps/web/src/app/billing/services/braintree.service.ts b/apps/web/src/app/billing/services/braintree.service.ts
index 04b2b7dd442..77617b5868b 100644
--- a/apps/web/src/app/billing/services/braintree.service.ts
+++ b/apps/web/src/app/billing/services/braintree.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
diff --git a/apps/web/src/app/billing/services/stripe.service.ts b/apps/web/src/app/billing/services/stripe.service.ts
index 4c0cdea8a14..61bc0b6cdd2 100644
--- a/apps/web/src/app/billing/services/stripe.service.ts
+++ b/apps/web/src/app/billing/services/stripe.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { BankAccount } from "@bitwarden/common/billing/models/domain";
diff --git a/apps/web/src/app/billing/services/trial-flow.service.ts b/apps/web/src/app/billing/services/trial-flow.service.ts
index 3135a811665..558851ad64c 100644
--- a/apps/web/src/app/billing/services/trial-flow.service.ts
+++ b/apps/web/src/app/billing/services/trial-flow.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Router } from "@angular/router";
@@ -52,11 +54,11 @@ export class TrialFlowService {
getFreeTrialMessage(trialRemainingDays: number): string {
if (trialRemainingDays >= 2) {
- return this.i18nService.t("freeTrialEndPrompt", trialRemainingDays);
+ return this.i18nService.t("freeTrialEndPromptCount", trialRemainingDays);
} else if (trialRemainingDays === 1) {
- return this.i18nService.t("freeTrialEndPromptForOneDayNoOrgName");
+ return this.i18nService.t("freeTrialEndPromptTomorrowNoOrgName");
} else {
- return this.i18nService.t("freeTrialEndingSoonWithoutOrgName");
+ return this.i18nService.t("freeTrialEndingTodayWithoutOrgName");
}
}
diff --git a/apps/web/src/app/billing/settings/sponsored-families.component.ts b/apps/web/src/app/billing/settings/sponsored-families.component.ts
index f49e7acce29..5e26e80a30a 100644
--- a/apps/web/src/app/billing/settings/sponsored-families.component.ts
+++ b/apps/web/src/app/billing/settings/sponsored-families.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import {
FormBuilder,
@@ -8,6 +10,7 @@ import {
AsyncValidatorFn,
ValidationErrors,
} from "@angular/forms";
+import { Router } from "@angular/router";
import { combineLatest, firstValueFrom, map, Observable, Subject, takeUntil } from "rxjs";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
@@ -24,6 +27,8 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl
import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction";
import { ToastService } from "@bitwarden/components";
+import { FreeFamiliesPolicyService } from "../services/free-families-policy.service";
+
interface RequestSponsorshipForm {
selectedSponsorshipOrgId: FormControl;
sponsorshipEmail: FormControl;
@@ -60,6 +65,8 @@ export class SponsoredFamiliesComponent implements OnInit, OnDestroy {
private toastService: ToastService,
private configService: ConfigService,
private policyService: PolicyService,
+ private freeFamiliesPolicyService: FreeFamiliesPolicyService,
+ private router: Router,
) {
this.sponsorshipForm = this.formBuilder.group({
selectedSponsorshipOrgId: new FormControl("", {
@@ -84,6 +91,8 @@ export class SponsoredFamiliesComponent implements OnInit, OnDestroy {
);
if (this.isFreeFamilyFlagEnabled) {
+ await this.preventAccessToFreeFamiliesPage();
+
this.availableSponsorshipOrgs$ = combineLatest([
this.organizationService.organizations$,
this.policyService.getAll$(PolicyType.FreeFamiliesSponsorshipPolicy),
@@ -140,6 +149,17 @@ export class SponsoredFamiliesComponent implements OnInit, OnDestroy {
this._destroy.complete();
}
+ private async preventAccessToFreeFamiliesPage() {
+ const showFreeFamiliesPage = await firstValueFrom(
+ this.freeFamiliesPolicyService.showFreeFamilies$,
+ );
+
+ if (!showFreeFamiliesPage) {
+ await this.router.navigate(["/"]);
+ return;
+ }
+ }
+
submit = async () => {
this.formPromise = this.apiService.postCreateSponsorship(
this.sponsorshipForm.value.selectedSponsorshipOrgId,
diff --git a/apps/web/src/app/billing/settings/sponsoring-org-row.component.ts b/apps/web/src/app/billing/settings/sponsoring-org-row.component.ts
index 77fed7b216c..59b68ceef83 100644
--- a/apps/web/src/app/billing/settings/sponsoring-org-row.component.ts
+++ b/apps/web/src/app/billing/settings/sponsoring-org-row.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { formatDate } from "@angular/common";
import { Component, EventEmitter, Input, Output, OnInit } from "@angular/core";
import { firstValueFrom, map, Observable } from "rxjs";
diff --git a/apps/web/src/app/billing/shared/add-credit-dialog.component.ts b/apps/web/src/app/billing/shared/add-credit-dialog.component.ts
index 68f074076d7..71afde81ee3 100644
--- a/apps/web/src/app/billing/shared/add-credit-dialog.component.ts
+++ b/apps/web/src/app/billing/shared/add-credit-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { Component, ElementRef, Inject, OnInit, ViewChild } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
diff --git a/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html b/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html
index 1767fb485d0..e41d3d961cd 100644
--- a/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html
+++ b/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html
@@ -5,11 +5,7 @@
[showBankAccount]="!!organizationId"
[initialPaymentMethod]="initialPaymentMethod"
>
-
+
-
+
{{ "zipPostalCode" | i18n }}
-
-
- {{ "address1" | i18n }}
-
-
+
+
+
+ {{ "includeVAT" | i18n }}
+
-
-
- {{ "address2" | i18n }}
-
-
-
-
-
- {{ "cityTown" | i18n }}
-
-
-
-
-
- {{ "stateProvince" | i18n }}
-
-
-
-
+
+
+
diff --git a/apps/web/src/app/billing/shared/tax-info.component.ts b/apps/web/src/app/billing/shared/tax-info.component.ts
index 48452528053..8ebec5e1dfe 100644
--- a/apps/web/src/app/billing/shared/tax-info.component.ts
+++ b/apps/web/src/app/billing/shared/tax-info.component.ts
@@ -1,18 +1,31 @@
-import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core";
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
+import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
import { ActivatedRoute } from "@angular/router";
import { Subject, takeUntil } from "rxjs";
-import { debounceTime } from "rxjs/operators";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
-import { TaxServiceAbstraction } from "@bitwarden/common/billing/abstractions/tax.service.abstraction";
-import { CountryListItem } from "@bitwarden/common/billing/models/domain";
import { ExpandedTaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/expanded-tax-info-update.request";
+import { TaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/tax-info-update.request";
+import { TaxInfoResponse } from "@bitwarden/common/billing/models/response/tax-info.response";
+import { TaxRateResponse } from "@bitwarden/common/billing/models/response/tax-rate.response";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { SharedModule } from "../../shared";
+type TaxInfoView = Omit
& {
+ includeTaxId: boolean;
+ [key: string]: unknown;
+};
+
+type CountryList = {
+ name: string;
+ value: string;
+ disabled: boolean;
+};
+
@Component({
selector: "app-tax-info",
templateUrl: "tax-info.component.html",
@@ -20,64 +33,359 @@ import { SharedModule } from "../../shared";
imports: [SharedModule],
})
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
-export class TaxInfoComponent implements OnInit, OnDestroy {
+export class TaxInfoComponent implements OnInit {
+ @Input() trialFlow = false;
+ @Output() onCountryChanged = new EventEmitter();
private destroy$ = new Subject();
- @Input() trialFlow = false;
- @Output() countryChanged = new EventEmitter();
- @Output() taxInformationChanged: EventEmitter = new EventEmitter();
-
taxFormGroup = new FormGroup({
- country: new FormControl(null, [Validators.required]),
- postalCode: new FormControl(null, [Validators.required]),
- taxId: new FormControl(null),
- line1: new FormControl(null),
- line2: new FormControl(null),
- city: new FormControl(null),
- state: new FormControl(null),
+ country: new FormControl(null, [Validators.required]),
+ postalCode: new FormControl(null),
+ includeTaxId: new FormControl(null),
+ taxId: new FormControl(null),
+ line1: new FormControl(null),
+ line2: new FormControl(null),
+ city: new FormControl(null),
+ state: new FormControl(null),
});
- protected isTaxSupported: boolean;
-
loading = true;
organizationId: string;
providerId: string;
- countryList: CountryListItem[] = this.taxService.getCountries();
+ taxInfo: TaxInfoView = {
+ taxId: null,
+ line1: null,
+ line2: null,
+ city: null,
+ state: null,
+ postalCode: null,
+ country: "US",
+ includeTaxId: false,
+ };
+ countryList: CountryList[] = [
+ { name: "-- Select --", value: "", disabled: false },
+ { name: "United States", value: "US", disabled: false },
+ { name: "China", value: "CN", disabled: false },
+ { name: "France", value: "FR", disabled: false },
+ { name: "Germany", value: "DE", disabled: false },
+ { name: "Canada", value: "CA", disabled: false },
+ { name: "United Kingdom", value: "GB", disabled: false },
+ { name: "Australia", value: "AU", disabled: false },
+ { name: "India", value: "IN", disabled: false },
+ { name: "", value: "-", disabled: true },
+ { name: "Afghanistan", value: "AF", disabled: false },
+ { name: "Ã…land Islands", value: "AX", disabled: false },
+ { name: "Albania", value: "AL", disabled: false },
+ { name: "Algeria", value: "DZ", disabled: false },
+ { name: "American Samoa", value: "AS", disabled: false },
+ { name: "Andorra", value: "AD", disabled: false },
+ { name: "Angola", value: "AO", disabled: false },
+ { name: "Anguilla", value: "AI", disabled: false },
+ { name: "Antarctica", value: "AQ", disabled: false },
+ { name: "Antigua and Barbuda", value: "AG", disabled: false },
+ { name: "Argentina", value: "AR", disabled: false },
+ { name: "Armenia", value: "AM", disabled: false },
+ { name: "Aruba", value: "AW", disabled: false },
+ { name: "Austria", value: "AT", disabled: false },
+ { name: "Azerbaijan", value: "AZ", disabled: false },
+ { name: "Bahamas", value: "BS", disabled: false },
+ { name: "Bahrain", value: "BH", disabled: false },
+ { name: "Bangladesh", value: "BD", disabled: false },
+ { name: "Barbados", value: "BB", disabled: false },
+ { name: "Belarus", value: "BY", disabled: false },
+ { name: "Belgium", value: "BE", disabled: false },
+ { name: "Belize", value: "BZ", disabled: false },
+ { name: "Benin", value: "BJ", disabled: false },
+ { name: "Bermuda", value: "BM", disabled: false },
+ { name: "Bhutan", value: "BT", disabled: false },
+ { name: "Bolivia, Plurinational State of", value: "BO", disabled: false },
+ { name: "Bonaire, Sint Eustatius and Saba", value: "BQ", disabled: false },
+ { name: "Bosnia and Herzegovina", value: "BA", disabled: false },
+ { name: "Botswana", value: "BW", disabled: false },
+ { name: "Bouvet Island", value: "BV", disabled: false },
+ { name: "Brazil", value: "BR", disabled: false },
+ { name: "British Indian Ocean Territory", value: "IO", disabled: false },
+ { name: "Brunei Darussalam", value: "BN", disabled: false },
+ { name: "Bulgaria", value: "BG", disabled: false },
+ { name: "Burkina Faso", value: "BF", disabled: false },
+ { name: "Burundi", value: "BI", disabled: false },
+ { name: "Cambodia", value: "KH", disabled: false },
+ { name: "Cameroon", value: "CM", disabled: false },
+ { name: "Cape Verde", value: "CV", disabled: false },
+ { name: "Cayman Islands", value: "KY", disabled: false },
+ { name: "Central African Republic", value: "CF", disabled: false },
+ { name: "Chad", value: "TD", disabled: false },
+ { name: "Chile", value: "CL", disabled: false },
+ { name: "Christmas Island", value: "CX", disabled: false },
+ { name: "Cocos (Keeling) Islands", value: "CC", disabled: false },
+ { name: "Colombia", value: "CO", disabled: false },
+ { name: "Comoros", value: "KM", disabled: false },
+ { name: "Congo", value: "CG", disabled: false },
+ { name: "Congo, the Democratic Republic of the", value: "CD", disabled: false },
+ { name: "Cook Islands", value: "CK", disabled: false },
+ { name: "Costa Rica", value: "CR", disabled: false },
+ { name: "Côte d'Ivoire", value: "CI", disabled: false },
+ { name: "Croatia", value: "HR", disabled: false },
+ { name: "Cuba", value: "CU", disabled: false },
+ { name: "Curaçao", value: "CW", disabled: false },
+ { name: "Cyprus", value: "CY", disabled: false },
+ { name: "Czech Republic", value: "CZ", disabled: false },
+ { name: "Denmark", value: "DK", disabled: false },
+ { name: "Djibouti", value: "DJ", disabled: false },
+ { name: "Dominica", value: "DM", disabled: false },
+ { name: "Dominican Republic", value: "DO", disabled: false },
+ { name: "Ecuador", value: "EC", disabled: false },
+ { name: "Egypt", value: "EG", disabled: false },
+ { name: "El Salvador", value: "SV", disabled: false },
+ { name: "Equatorial Guinea", value: "GQ", disabled: false },
+ { name: "Eritrea", value: "ER", disabled: false },
+ { name: "Estonia", value: "EE", disabled: false },
+ { name: "Ethiopia", value: "ET", disabled: false },
+ { name: "Falkland Islands (Malvinas)", value: "FK", disabled: false },
+ { name: "Faroe Islands", value: "FO", disabled: false },
+ { name: "Fiji", value: "FJ", disabled: false },
+ { name: "Finland", value: "FI", disabled: false },
+ { name: "French Guiana", value: "GF", disabled: false },
+ { name: "French Polynesia", value: "PF", disabled: false },
+ { name: "French Southern Territories", value: "TF", disabled: false },
+ { name: "Gabon", value: "GA", disabled: false },
+ { name: "Gambia", value: "GM", disabled: false },
+ { name: "Georgia", value: "GE", disabled: false },
+ { name: "Ghana", value: "GH", disabled: false },
+ { name: "Gibraltar", value: "GI", disabled: false },
+ { name: "Greece", value: "GR", disabled: false },
+ { name: "Greenland", value: "GL", disabled: false },
+ { name: "Grenada", value: "GD", disabled: false },
+ { name: "Guadeloupe", value: "GP", disabled: false },
+ { name: "Guam", value: "GU", disabled: false },
+ { name: "Guatemala", value: "GT", disabled: false },
+ { name: "Guernsey", value: "GG", disabled: false },
+ { name: "Guinea", value: "GN", disabled: false },
+ { name: "Guinea-Bissau", value: "GW", disabled: false },
+ { name: "Guyana", value: "GY", disabled: false },
+ { name: "Haiti", value: "HT", disabled: false },
+ { name: "Heard Island and McDonald Islands", value: "HM", disabled: false },
+ { name: "Holy See (Vatican City State)", value: "VA", disabled: false },
+ { name: "Honduras", value: "HN", disabled: false },
+ { name: "Hong Kong", value: "HK", disabled: false },
+ { name: "Hungary", value: "HU", disabled: false },
+ { name: "Iceland", value: "IS", disabled: false },
+ { name: "Indonesia", value: "ID", disabled: false },
+ { name: "Iran, Islamic Republic of", value: "IR", disabled: false },
+ { name: "Iraq", value: "IQ", disabled: false },
+ { name: "Ireland", value: "IE", disabled: false },
+ { name: "Isle of Man", value: "IM", disabled: false },
+ { name: "Israel", value: "IL", disabled: false },
+ { name: "Italy", value: "IT", disabled: false },
+ { name: "Jamaica", value: "JM", disabled: false },
+ { name: "Japan", value: "JP", disabled: false },
+ { name: "Jersey", value: "JE", disabled: false },
+ { name: "Jordan", value: "JO", disabled: false },
+ { name: "Kazakhstan", value: "KZ", disabled: false },
+ { name: "Kenya", value: "KE", disabled: false },
+ { name: "Kiribati", value: "KI", disabled: false },
+ { name: "Korea, Democratic People's Republic of", value: "KP", disabled: false },
+ { name: "Korea, Republic of", value: "KR", disabled: false },
+ { name: "Kuwait", value: "KW", disabled: false },
+ { name: "Kyrgyzstan", value: "KG", disabled: false },
+ { name: "Lao People's Democratic Republic", value: "LA", disabled: false },
+ { name: "Latvia", value: "LV", disabled: false },
+ { name: "Lebanon", value: "LB", disabled: false },
+ { name: "Lesotho", value: "LS", disabled: false },
+ { name: "Liberia", value: "LR", disabled: false },
+ { name: "Libya", value: "LY", disabled: false },
+ { name: "Liechtenstein", value: "LI", disabled: false },
+ { name: "Lithuania", value: "LT", disabled: false },
+ { name: "Luxembourg", value: "LU", disabled: false },
+ { name: "Macao", value: "MO", disabled: false },
+ { name: "Macedonia, the former Yugoslav Republic of", value: "MK", disabled: false },
+ { name: "Madagascar", value: "MG", disabled: false },
+ { name: "Malawi", value: "MW", disabled: false },
+ { name: "Malaysia", value: "MY", disabled: false },
+ { name: "Maldives", value: "MV", disabled: false },
+ { name: "Mali", value: "ML", disabled: false },
+ { name: "Malta", value: "MT", disabled: false },
+ { name: "Marshall Islands", value: "MH", disabled: false },
+ { name: "Martinique", value: "MQ", disabled: false },
+ { name: "Mauritania", value: "MR", disabled: false },
+ { name: "Mauritius", value: "MU", disabled: false },
+ { name: "Mayotte", value: "YT", disabled: false },
+ { name: "Mexico", value: "MX", disabled: false },
+ { name: "Micronesia, Federated States of", value: "FM", disabled: false },
+ { name: "Moldova, Republic of", value: "MD", disabled: false },
+ { name: "Monaco", value: "MC", disabled: false },
+ { name: "Mongolia", value: "MN", disabled: false },
+ { name: "Montenegro", value: "ME", disabled: false },
+ { name: "Montserrat", value: "MS", disabled: false },
+ { name: "Morocco", value: "MA", disabled: false },
+ { name: "Mozambique", value: "MZ", disabled: false },
+ { name: "Myanmar", value: "MM", disabled: false },
+ { name: "Namibia", value: "NA", disabled: false },
+ { name: "Nauru", value: "NR", disabled: false },
+ { name: "Nepal", value: "NP", disabled: false },
+ { name: "Netherlands", value: "NL", disabled: false },
+ { name: "New Caledonia", value: "NC", disabled: false },
+ { name: "New Zealand", value: "NZ", disabled: false },
+ { name: "Nicaragua", value: "NI", disabled: false },
+ { name: "Niger", value: "NE", disabled: false },
+ { name: "Nigeria", value: "NG", disabled: false },
+ { name: "Niue", value: "NU", disabled: false },
+ { name: "Norfolk Island", value: "NF", disabled: false },
+ { name: "Northern Mariana Islands", value: "MP", disabled: false },
+ { name: "Norway", value: "NO", disabled: false },
+ { name: "Oman", value: "OM", disabled: false },
+ { name: "Pakistan", value: "PK", disabled: false },
+ { name: "Palau", value: "PW", disabled: false },
+ { name: "Palestinian Territory, Occupied", value: "PS", disabled: false },
+ { name: "Panama", value: "PA", disabled: false },
+ { name: "Papua New Guinea", value: "PG", disabled: false },
+ { name: "Paraguay", value: "PY", disabled: false },
+ { name: "Peru", value: "PE", disabled: false },
+ { name: "Philippines", value: "PH", disabled: false },
+ { name: "Pitcairn", value: "PN", disabled: false },
+ { name: "Poland", value: "PL", disabled: false },
+ { name: "Portugal", value: "PT", disabled: false },
+ { name: "Puerto Rico", value: "PR", disabled: false },
+ { name: "Qatar", value: "QA", disabled: false },
+ { name: "Réunion", value: "RE", disabled: false },
+ { name: "Romania", value: "RO", disabled: false },
+ { name: "Russian Federation", value: "RU", disabled: false },
+ { name: "Rwanda", value: "RW", disabled: false },
+ { name: "Saint Barthélemy", value: "BL", disabled: false },
+ { name: "Saint Helena, Ascension and Tristan da Cunha", value: "SH", disabled: false },
+ { name: "Saint Kitts and Nevis", value: "KN", disabled: false },
+ { name: "Saint Lucia", value: "LC", disabled: false },
+ { name: "Saint Martin (French part)", value: "MF", disabled: false },
+ { name: "Saint Pierre and Miquelon", value: "PM", disabled: false },
+ { name: "Saint Vincent and the Grenadines", value: "VC", disabled: false },
+ { name: "Samoa", value: "WS", disabled: false },
+ { name: "San Marino", value: "SM", disabled: false },
+ { name: "Sao Tome and Principe", value: "ST", disabled: false },
+ { name: "Saudi Arabia", value: "SA", disabled: false },
+ { name: "Senegal", value: "SN", disabled: false },
+ { name: "Serbia", value: "RS", disabled: false },
+ { name: "Seychelles", value: "SC", disabled: false },
+ { name: "Sierra Leone", value: "SL", disabled: false },
+ { name: "Singapore", value: "SG", disabled: false },
+ { name: "Sint Maarten (Dutch part)", value: "SX", disabled: false },
+ { name: "Slovakia", value: "SK", disabled: false },
+ { name: "Slovenia", value: "SI", disabled: false },
+ { name: "Solomon Islands", value: "SB", disabled: false },
+ { name: "Somalia", value: "SO", disabled: false },
+ { name: "South Africa", value: "ZA", disabled: false },
+ { name: "South Georgia and the South Sandwich Islands", value: "GS", disabled: false },
+ { name: "South Sudan", value: "SS", disabled: false },
+ { name: "Spain", value: "ES", disabled: false },
+ { name: "Sri Lanka", value: "LK", disabled: false },
+ { name: "Sudan", value: "SD", disabled: false },
+ { name: "Suriname", value: "SR", disabled: false },
+ { name: "Svalbard and Jan Mayen", value: "SJ", disabled: false },
+ { name: "Swaziland", value: "SZ", disabled: false },
+ { name: "Sweden", value: "SE", disabled: false },
+ { name: "Switzerland", value: "CH", disabled: false },
+ { name: "Syrian Arab Republic", value: "SY", disabled: false },
+ { name: "Taiwan", value: "TW", disabled: false },
+ { name: "Tajikistan", value: "TJ", disabled: false },
+ { name: "Tanzania, United Republic of", value: "TZ", disabled: false },
+ { name: "Thailand", value: "TH", disabled: false },
+ { name: "Timor-Leste", value: "TL", disabled: false },
+ { name: "Togo", value: "TG", disabled: false },
+ { name: "Tokelau", value: "TK", disabled: false },
+ { name: "Tonga", value: "TO", disabled: false },
+ { name: "Trinidad and Tobago", value: "TT", disabled: false },
+ { name: "Tunisia", value: "TN", disabled: false },
+ { name: "Turkey", value: "TR", disabled: false },
+ { name: "Turkmenistan", value: "TM", disabled: false },
+ { name: "Turks and Caicos Islands", value: "TC", disabled: false },
+ { name: "Tuvalu", value: "TV", disabled: false },
+ { name: "Uganda", value: "UG", disabled: false },
+ { name: "Ukraine", value: "UA", disabled: false },
+ { name: "United Arab Emirates", value: "AE", disabled: false },
+ { name: "United States Minor Outlying Islands", value: "UM", disabled: false },
+ { name: "Uruguay", value: "UY", disabled: false },
+ { name: "Uzbekistan", value: "UZ", disabled: false },
+ { name: "Vanuatu", value: "VU", disabled: false },
+ { name: "Venezuela, Bolivarian Republic of", value: "VE", disabled: false },
+ { name: "Viet Nam", value: "VN", disabled: false },
+ { name: "Virgin Islands, British", value: "VG", disabled: false },
+ { name: "Virgin Islands, U.S.", value: "VI", disabled: false },
+ { name: "Wallis and Futuna", value: "WF", disabled: false },
+ { name: "Western Sahara", value: "EH", disabled: false },
+ { name: "Yemen", value: "YE", disabled: false },
+ { name: "Zambia", value: "ZM", disabled: false },
+ { name: "Zimbabwe", value: "ZW", disabled: false },
+ ];
+ taxRates: TaxRateResponse[];
constructor(
private apiService: ApiService,
private route: ActivatedRoute,
private logService: LogService,
private organizationApiService: OrganizationApiServiceAbstraction,
- private taxService: TaxServiceAbstraction,
) {}
get country(): string {
- return this.taxFormGroup.controls.country.value;
+ return this.taxFormGroup.get("country").value;
+ }
+
+ set country(country: string) {
+ this.taxFormGroup.get("country").setValue(country);
}
get postalCode(): string {
- return this.taxFormGroup.controls.postalCode.value;
+ return this.taxFormGroup.get("postalCode").value;
+ }
+
+ set postalCode(postalCode: string) {
+ this.taxFormGroup.get("postalCode").setValue(postalCode);
+ }
+
+ get includeTaxId(): boolean {
+ return this.taxFormGroup.get("includeTaxId").value;
+ }
+
+ set includeTaxId(includeTaxId: boolean) {
+ this.taxFormGroup.get("includeTaxId").setValue(includeTaxId);
}
get taxId(): string {
- return this.taxFormGroup.controls.taxId.value;
+ return this.taxFormGroup.get("taxId").value;
+ }
+
+ set taxId(taxId: string) {
+ this.taxFormGroup.get("taxId").setValue(taxId);
}
get line1(): string {
- return this.taxFormGroup.controls.line1.value;
+ return this.taxFormGroup.get("line1").value;
+ }
+
+ set line1(line1: string) {
+ this.taxFormGroup.get("line1").setValue(line1);
}
get line2(): string {
- return this.taxFormGroup.controls.line2.value;
+ return this.taxFormGroup.get("line2").value;
+ }
+
+ set line2(line2: string) {
+ this.taxFormGroup.get("line2").setValue(line2);
}
get city(): string {
- return this.taxFormGroup.controls.city.value;
+ return this.taxFormGroup.get("city").value;
+ }
+
+ set city(city: string) {
+ this.taxFormGroup.get("city").setValue(city);
}
get state(): string {
- return this.taxFormGroup.controls.state.value;
+ return this.taxFormGroup.get("state").value;
+ }
+
+ set state(state: string) {
+ this.taxFormGroup.get("state").setValue(state);
}
async ngOnInit() {
@@ -94,13 +402,22 @@ export class TaxInfoComponent implements OnInit, OnDestroy {
try {
const taxInfo = await this.organizationApiService.getTaxInfo(this.organizationId);
if (taxInfo) {
- this.taxFormGroup.controls.taxId.setValue(taxInfo.taxId);
- this.taxFormGroup.controls.state.setValue(taxInfo.state);
- this.taxFormGroup.controls.line1.setValue(taxInfo.line1);
- this.taxFormGroup.controls.line2.setValue(taxInfo.line2);
- this.taxFormGroup.controls.city.setValue(taxInfo.city);
- this.taxFormGroup.controls.postalCode.setValue(taxInfo.postalCode);
- this.taxFormGroup.controls.country.setValue(taxInfo.country);
+ this.taxId = taxInfo.taxId;
+ this.state = taxInfo.state;
+ this.line1 = taxInfo.line1;
+ this.line2 = taxInfo.line2;
+ this.city = taxInfo.city;
+ this.state = taxInfo.state;
+ this.postalCode = taxInfo.postalCode;
+ this.country = taxInfo.country || "US";
+ this.includeTaxId =
+ this.countrySupportsTax(this.country) &&
+ (!!taxInfo.taxId ||
+ !!taxInfo.line1 ||
+ !!taxInfo.line2 ||
+ !!taxInfo.city ||
+ !!taxInfo.state);
+ this.setTaxInfoObject();
}
} catch (e) {
this.logService.error(e);
@@ -109,79 +426,119 @@ export class TaxInfoComponent implements OnInit, OnDestroy {
try {
const taxInfo = await this.apiService.getTaxInfo();
if (taxInfo) {
- this.taxFormGroup.controls.postalCode.setValue(taxInfo.postalCode);
- this.taxFormGroup.controls.country.setValue(taxInfo.country);
+ this.postalCode = taxInfo.postalCode;
+ this.country = taxInfo.country || "US";
}
+ this.setTaxInfoObject();
} catch (e) {
this.logService.error(e);
}
}
- this.isTaxSupported = await this.taxService.isCountrySupported(
- this.taxFormGroup.controls.country.value,
- );
+ if (this.country === "US") {
+ this.taxFormGroup.get("postalCode").setValidators([Validators.required]);
+ this.taxFormGroup.get("postalCode").updateValueAndValidity();
+ }
- this.countryChanged.emit();
+ if (this.country !== "US") {
+ this.onCountryChanged.emit();
+ }
});
- this.taxFormGroup.controls.country.valueChanges
- .pipe(debounceTime(1000), takeUntil(this.destroy$))
+ this.taxFormGroup
+ .get("country")
+ .valueChanges.pipe(takeUntil(this.destroy$))
.subscribe((value) => {
- this.taxService
- .isCountrySupported(this.taxFormGroup.controls.country.value)
- .then((isSupported) => {
- this.isTaxSupported = isSupported;
- })
- .catch(() => {
- this.isTaxSupported = false;
- })
- .finally(() => {
- if (!this.isTaxSupported) {
- this.taxFormGroup.controls.taxId.setValue(null);
- this.taxFormGroup.controls.line1.setValue(null);
- this.taxFormGroup.controls.line2.setValue(null);
- this.taxFormGroup.controls.city.setValue(null);
- this.taxFormGroup.controls.state.setValue(null);
- }
-
- this.countryChanged.emit();
- });
- this.taxInformationChanged.emit();
+ if (value === "US") {
+ this.taxFormGroup.get("postalCode").setValidators([Validators.required]);
+ } else {
+ this.taxFormGroup.get("postalCode").clearValidators();
+ }
+ this.taxFormGroup.get("postalCode").updateValueAndValidity();
+ this.setTaxInfoObject();
+ this.changeCountry();
});
- this.taxFormGroup.controls.postalCode.valueChanges
- .pipe(debounceTime(1000), takeUntil(this.destroy$))
- .subscribe(() => {
- this.taxInformationChanged.emit();
- });
-
- this.taxFormGroup.controls.taxId.valueChanges
- .pipe(debounceTime(1000), takeUntil(this.destroy$))
- .subscribe(() => {
- this.taxInformationChanged.emit();
- });
-
- this.loading = false;
+ try {
+ const taxRates = await this.apiService.getTaxRates();
+ if (taxRates) {
+ this.taxRates = taxRates.data;
+ }
+ } catch (e) {
+ this.logService.error(e);
+ } finally {
+ this.loading = false;
+ }
}
- ngOnDestroy() {
- this.destroy$.next();
- this.destroy$.complete();
+ get taxRate() {
+ if (this.taxRates != null) {
+ const localTaxRate = this.taxRates.find(
+ (x) => x.country === this.country && x.postalCode === this.postalCode,
+ );
+ return localTaxRate?.rate ?? null;
+ }
+ }
+
+ setTaxInfoObject() {
+ this.taxInfo.country = this.country;
+ this.taxInfo.postalCode = this.postalCode;
+ this.taxInfo.includeTaxId = this.includeTaxId;
+ this.taxInfo.taxId = this.taxId;
+ this.taxInfo.line1 = this.line1;
+ this.taxInfo.line2 = this.line2;
+ this.taxInfo.city = this.city;
+ this.taxInfo.state = this.state;
+ }
+
+ get showTaxIdCheckbox() {
+ return (
+ (this.organizationId || this.providerId) &&
+ this.country !== "US" &&
+ this.countrySupportsTax(this.taxInfo.country)
+ );
+ }
+
+ get showTaxIdFields() {
+ return (
+ (this.organizationId || this.providerId) &&
+ this.includeTaxId &&
+ this.countrySupportsTax(this.country)
+ );
+ }
+
+ getTaxInfoRequest(): TaxInfoUpdateRequest {
+ if (this.organizationId || this.providerId) {
+ const request = new ExpandedTaxInfoUpdateRequest();
+ request.country = this.country;
+ request.postalCode = this.postalCode;
+
+ if (this.includeTaxId) {
+ request.taxId = this.taxId;
+ request.line1 = this.line1;
+ request.line2 = this.line2;
+ request.city = this.city;
+ request.state = this.state;
+ } else {
+ request.taxId = null;
+ request.line1 = null;
+ request.line2 = null;
+ request.city = null;
+ request.state = null;
+ }
+ return request;
+ } else {
+ const request = new TaxInfoUpdateRequest();
+ request.postalCode = this.postalCode;
+ request.country = this.country;
+ return request;
+ }
}
submitTaxInfo(): Promise {
this.taxFormGroup.updateValueAndValidity();
this.taxFormGroup.markAllAsTouched();
-
- const request = new ExpandedTaxInfoUpdateRequest();
- request.country = this.country;
- request.postalCode = this.postalCode;
- request.taxId = this.taxId;
- request.line1 = this.line1;
- request.line2 = this.line2;
- request.city = this.city;
- request.state = this.state;
-
+ const request = this.getTaxInfoRequest();
return this.organizationId
? this.organizationApiService.updateTaxInfo(
this.organizationId,
@@ -189,4 +546,97 @@ export class TaxInfoComponent implements OnInit, OnDestroy {
)
: this.apiService.putTaxInfo(request);
}
+
+ changeCountry() {
+ if (!this.countrySupportsTax(this.country)) {
+ this.includeTaxId = false;
+ this.taxId = null;
+ this.line1 = null;
+ this.line2 = null;
+ this.city = null;
+ this.state = null;
+ this.setTaxInfoObject();
+ }
+ this.onCountryChanged.emit();
+ }
+
+ countrySupportsTax(countryCode: string) {
+ return this.taxSupportedCountryCodes.includes(countryCode);
+ }
+
+ private taxSupportedCountryCodes: string[] = [
+ "CN",
+ "FR",
+ "DE",
+ "CA",
+ "GB",
+ "AU",
+ "IN",
+ "AD",
+ "AR",
+ "AT",
+ "BE",
+ "BO",
+ "BR",
+ "BG",
+ "CL",
+ "CO",
+ "CR",
+ "HR",
+ "CY",
+ "CZ",
+ "DK",
+ "DO",
+ "EC",
+ "EG",
+ "SV",
+ "EE",
+ "FI",
+ "GE",
+ "GR",
+ "HK",
+ "HU",
+ "IS",
+ "ID",
+ "IQ",
+ "IE",
+ "IL",
+ "IT",
+ "JP",
+ "KE",
+ "KR",
+ "LV",
+ "LI",
+ "LT",
+ "LU",
+ "MY",
+ "MT",
+ "MX",
+ "NL",
+ "NZ",
+ "NO",
+ "PE",
+ "PH",
+ "PL",
+ "PT",
+ "RO",
+ "RU",
+ "SA",
+ "RS",
+ "SG",
+ "SK",
+ "SI",
+ "ZA",
+ "ES",
+ "SE",
+ "CH",
+ "TW",
+ "TH",
+ "TR",
+ "UA",
+ "AE",
+ "UY",
+ "VE",
+ "VN",
+ ];
}
diff --git a/apps/web/src/app/billing/shared/update-license.component.ts b/apps/web/src/app/billing/shared/update-license.component.ts
index e5421776846..e580d420202 100644
--- a/apps/web/src/app/billing/shared/update-license.component.ts
+++ b/apps/web/src/app/billing/shared/update-license.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
diff --git a/apps/web/src/app/billing/shared/verify-bank-account/verify-bank-account.component.ts b/apps/web/src/app/billing/shared/verify-bank-account/verify-bank-account.component.ts
index 6f98ddad35d..d2cd473d3d3 100644
--- a/apps/web/src/app/billing/shared/verify-bank-account/verify-bank-account.component.ts
+++ b/apps/web/src/app/billing/shared/verify-bank-account/verify-bank-account.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { FormBuilder, FormControl, Validators } from "@angular/forms";
diff --git a/apps/web/src/app/common/base.accept.component.ts b/apps/web/src/app/common/base.accept.component.ts
index 4b35eb811c9..4e938fcd081 100644
--- a/apps/web/src/app/common/base.accept.component.ts
+++ b/apps/web/src/app/common/base.accept.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, OnInit } from "@angular/core";
import { ActivatedRoute, Params, Router } from "@angular/router";
import { Subject, firstValueFrom } from "rxjs";
diff --git a/apps/web/src/app/components/dynamic-avatar.component.ts b/apps/web/src/app/components/dynamic-avatar.component.ts
index 4cdfda4eba8..4381524de66 100644
--- a/apps/web/src/app/components/dynamic-avatar.component.ts
+++ b/apps/web/src/app/components/dynamic-avatar.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input, OnDestroy } from "@angular/core";
import { Subject } from "rxjs";
diff --git a/apps/web/src/app/components/environment-selector/environment-selector.component.ts b/apps/web/src/app/components/environment-selector/environment-selector.component.ts
index 132b68c6e2b..b86c068911f 100644
--- a/apps/web/src/app/components/environment-selector/environment-selector.component.ts
+++ b/apps/web/src/app/components/environment-selector/environment-selector.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { Router } from "@angular/router";
diff --git a/apps/web/src/app/components/selectable-avatar.component.ts b/apps/web/src/app/components/selectable-avatar.component.ts
index 1de722461a9..7a746481563 100644
--- a/apps/web/src/app/components/selectable-avatar.component.ts
+++ b/apps/web/src/app/components/selectable-avatar.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, EventEmitter, Input, Output } from "@angular/core";
@Component({
diff --git a/apps/web/src/app/core/core.module.ts b/apps/web/src/app/core/core.module.ts
index 79a7862178f..e3c59e13d99 100644
--- a/apps/web/src/app/core/core.module.ts
+++ b/apps/web/src/app/core/core.module.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import { APP_INITIALIZER, NgModule, Optional, SkipSelf } from "@angular/core";
import { Router } from "@angular/router";
diff --git a/apps/web/src/app/core/event.service.ts b/apps/web/src/app/core/event.service.ts
index be6a62443d3..412423a3a24 100644
--- a/apps/web/src/app/core/event.service.ts
+++ b/apps/web/src/app/core/event.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
diff --git a/apps/web/src/app/core/html-storage.service.ts b/apps/web/src/app/core/html-storage.service.ts
index d83d4c6fadb..318aed5e9f3 100644
--- a/apps/web/src/app/core/html-storage.service.ts
+++ b/apps/web/src/app/core/html-storage.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Subject } from "rxjs";
diff --git a/apps/web/src/app/core/router.service.ts b/apps/web/src/app/core/router.service.ts
index 07901628481..ff0aea47b9a 100644
--- a/apps/web/src/app/core/router.service.ts
+++ b/apps/web/src/app/core/router.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Title } from "@angular/platform-browser";
import { ActivatedRoute, NavigationEnd, Router } from "@angular/router";
diff --git a/apps/web/src/app/core/web-platform-utils.service.spec.ts b/apps/web/src/app/core/web-platform-utils.service.spec.ts
index 5b0271b8227..3b5cb96b718 100644
--- a/apps/web/src/app/core/web-platform-utils.service.spec.ts
+++ b/apps/web/src/app/core/web-platform-utils.service.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { WebPlatformUtilsService } from "./web-platform-utils.service";
describe("Web Platform Utils Service", () => {
diff --git a/apps/web/src/app/core/web-platform-utils.service.ts b/apps/web/src/app/core/web-platform-utils.service.ts
index dbd0ef593d6..3df2a7d895b 100644
--- a/apps/web/src/app/core/web-platform-utils.service.ts
+++ b/apps/web/src/app/core/web-platform-utils.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { ClientType, DeviceType } from "@bitwarden/common/enums";
diff --git a/apps/web/src/app/key-management/key-rotation/request/update-key.request.ts b/apps/web/src/app/key-management/key-rotation/request/update-key.request.ts
index 81b7d361579..d407a709d4c 100644
--- a/apps/web/src/app/key-management/key-rotation/request/update-key.request.ts
+++ b/apps/web/src/app/key-management/key-rotation/request/update-key.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { OrganizationUserResetPasswordWithIdRequest } from "@bitwarden/admin-console/common";
import { WebauthnRotateCredentialRequest } from "@bitwarden/common/auth/models/request/webauthn-rotate-credential.request";
import { SendWithIdRequest } from "@bitwarden/common/src/tools/send/models/request/send-with-id.request";
diff --git a/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts b/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts
index 41215d012aa..4f2ae8f77e0 100644
--- a/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts
+++ b/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { mock, MockProxy } from "jest-mock-extended";
import { BehaviorSubject } from "rxjs";
diff --git a/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.ts b/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.ts
index 6c2f15a02a6..ae47798420e 100644
--- a/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.ts
+++ b/apps/web/src/app/key-management/key-rotation/user-key-rotation.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { firstValueFrom } from "rxjs";
diff --git a/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts b/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts
index 68ef95fef6f..bb5a1c511c6 100644
--- a/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts
+++ b/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
import { firstValueFrom } from "rxjs";
diff --git a/apps/web/src/app/layouts/frontend-layout.component.ts b/apps/web/src/app/layouts/frontend-layout.component.ts
index e4d947c1c6a..609845f22cd 100644
--- a/apps/web/src/app/layouts/frontend-layout.component.ts
+++ b/apps/web/src/app/layouts/frontend-layout.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
diff --git a/apps/web/src/app/layouts/header/web-header.component.ts b/apps/web/src/app/layouts/header/web-header.component.ts
index 94f57f95802..2f0c9d4772b 100644
--- a/apps/web/src/app/layouts/header/web-header.component.ts
+++ b/apps/web/src/app/layouts/header/web-header.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { map, Observable } from "rxjs";
diff --git a/apps/web/src/app/layouts/org-switcher/org-switcher.component.ts b/apps/web/src/app/layouts/org-switcher/org-switcher.component.ts
index bbfa8eb396f..b09b32d060e 100644
--- a/apps/web/src/app/layouts/org-switcher/org-switcher.component.ts
+++ b/apps/web/src/app/layouts/org-switcher/org-switcher.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
diff --git a/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html b/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html
index 41346675bbb..204737eee2e 100644
--- a/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html
+++ b/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html
@@ -17,12 +17,12 @@
? 'tw-bg-primary-600 tw-font-bold !tw-text-contrast tw-ring-offset-2 hover:tw-bg-primary-600'
: ''
"
- class="tw-group tw-flex tw-h-24 tw-w-28 tw-flex-col tw-items-center tw-justify-center tw-rounded tw-p-1 tw-text-primary-600 tw-outline-none hover:tw-bg-background-alt hover:tw-text-primary-700 hover:tw-no-underline focus-visible:!tw-ring-2 focus-visible:!tw-ring-primary-700"
+ class="tw-group/product-link tw-flex tw-h-24 tw-w-28 tw-flex-col tw-items-center tw-justify-center tw-rounded tw-p-1 tw-text-primary-600 tw-outline-none hover:tw-bg-background-alt hover:tw-text-primary-700 hover:tw-no-underline focus-visible:!tw-ring-2 focus-visible:!tw-ring-primary-700"
ariaCurrentWhenActive="page"
>
{{ product.name }}
diff --git a/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.ts b/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.ts
index 5e199e24b12..4a22f628570 100644
--- a/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.ts
+++ b/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, ViewChild } from "@angular/core";
import { MenuComponent } from "@bitwarden/components";
diff --git a/apps/web/src/app/layouts/product-switcher/shared/product-switcher.service.spec.ts b/apps/web/src/app/layouts/product-switcher/shared/product-switcher.service.spec.ts
index 7c53cd86d3b..a071d0f8852 100644
--- a/apps/web/src/app/layouts/product-switcher/shared/product-switcher.service.spec.ts
+++ b/apps/web/src/app/layouts/product-switcher/shared/product-switcher.service.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { TestBed } from "@angular/core/testing";
import { ActivatedRoute, Router, convertToParamMap } from "@angular/router";
import { mock, MockProxy } from "jest-mock-extended";
diff --git a/apps/web/src/app/layouts/product-switcher/shared/product-switcher.service.ts b/apps/web/src/app/layouts/product-switcher/shared/product-switcher.service.ts
index 28474d792a5..2c16886a2d4 100644
--- a/apps/web/src/app/layouts/product-switcher/shared/product-switcher.service.ts
+++ b/apps/web/src/app/layouts/product-switcher/shared/product-switcher.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { ActivatedRoute, NavigationEnd, NavigationStart, ParamMap, Router } from "@angular/router";
import { combineLatest, concatMap, filter, map, Observable, ReplaySubject, startWith } from "rxjs";
diff --git a/apps/web/src/app/layouts/user-layout.component.ts b/apps/web/src/app/layouts/user-layout.component.ts
index 88096c9b95b..18277abebef 100644
--- a/apps/web/src/app/layouts/user-layout.component.ts
+++ b/apps/web/src/app/layouts/user-layout.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import { Component, OnInit } from "@angular/core";
import { RouterModule } from "@angular/router";
diff --git a/apps/web/src/app/platform/version.service.ts b/apps/web/src/app/platform/version.service.ts
index d82dc5590d8..83b8d30b1a9 100644
--- a/apps/web/src/app/platform/version.service.ts
+++ b/apps/web/src/app/platform/version.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { catchError, firstValueFrom, map } from "rxjs";
diff --git a/apps/web/src/app/platform/web-environment.service.spec.ts b/apps/web/src/app/platform/web-environment.service.spec.ts
index 14b5e7dcaa0..9d0140b6786 100644
--- a/apps/web/src/app/platform/web-environment.service.spec.ts
+++ b/apps/web/src/app/platform/web-environment.service.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Router } from "@angular/router";
import { mock, MockProxy } from "jest-mock-extended";
import { firstValueFrom } from "rxjs";
diff --git a/apps/web/src/app/platform/web-environment.service.ts b/apps/web/src/app/platform/web-environment.service.ts
index ebddc7491ba..1df842d6b31 100644
--- a/apps/web/src/app/platform/web-environment.service.ts
+++ b/apps/web/src/app/platform/web-environment.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Router } from "@angular/router";
import { firstValueFrom, ReplaySubject } from "rxjs";
diff --git a/apps/web/src/app/platform/web-migration-runner.spec.ts b/apps/web/src/app/platform/web-migration-runner.spec.ts
index c27be4a145e..be9cabe8d52 100644
--- a/apps/web/src/app/platform/web-migration-runner.spec.ts
+++ b/apps/web/src/app/platform/web-migration-runner.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { MockProxy, mock } from "jest-mock-extended";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
diff --git a/apps/web/src/app/secrets-manager/models/requests/request-sm-access.request.ts b/apps/web/src/app/secrets-manager/models/requests/request-sm-access.request.ts
index fb580b93ee4..805745c369d 100644
--- a/apps/web/src/app/secrets-manager/models/requests/request-sm-access.request.ts
+++ b/apps/web/src/app/secrets-manager/models/requests/request-sm-access.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Guid } from "@bitwarden/common/src/types/guid";
export class RequestSMAccessRequest {
diff --git a/apps/web/src/app/secrets-manager/secrets-manager-landing/request-sm-access.component.ts b/apps/web/src/app/secrets-manager/secrets-manager-landing/request-sm-access.component.ts
index 890cbe8ca12..8909df6cf8a 100644
--- a/apps/web/src/app/secrets-manager/secrets-manager-landing/request-sm-access.component.ts
+++ b/apps/web/src/app/secrets-manager/secrets-manager-landing/request-sm-access.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
import { Router } from "@angular/router";
diff --git a/apps/web/src/app/secrets-manager/secrets-manager-landing/sm-landing.component.ts b/apps/web/src/app/secrets-manager/secrets-manager-landing/sm-landing.component.ts
index d932e289663..3698031a5b6 100644
--- a/apps/web/src/app/secrets-manager/secrets-manager-landing/sm-landing.component.ts
+++ b/apps/web/src/app/secrets-manager/secrets-manager-landing/sm-landing.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
diff --git a/apps/web/src/app/settings/domain-rules.component.html b/apps/web/src/app/settings/domain-rules.component.html
index 1c8e5e435ec..a3bea63fb86 100644
--- a/apps/web/src/app/settings/domain-rules.component.html
+++ b/apps/web/src/app/settings/domain-rules.component.html
@@ -54,7 +54,7 @@
0">
-
+
| {{ d.domains }} |
+
+
+
- {{ name }}
+ {{ name }}
- {{ linkText }}
{{ "new" | i18n }}
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-card/integration-card.component.spec.ts b/apps/web/src/app/shared/components/integrations/integration-card/integration-card.component.spec.ts
similarity index 86%
rename from bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-card/integration-card.component.spec.ts
rename to apps/web/src/app/shared/components/integrations/integration-card/integration-card.component.spec.ts
index 94cec5f627f..c8b6a290427 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-card/integration-card.component.spec.ts
+++ b/apps/web/src/app/shared/components/integrations/integration-card/integration-card.component.spec.ts
@@ -1,9 +1,13 @@
import { ComponentFixture, TestBed } from "@angular/core/testing";
+import { mock } from "jest-mock-extended";
import { BehaviorSubject } from "rxjs";
-import { SYSTEM_THEME_OBSERVABLE } from "../../../../../../../libs/angular/src/services/injection-tokens";
-import { ThemeType } from "../../../../../../../libs/common/src/platform/enums";
-import { ThemeStateService } from "../../../../../../../libs/common/src/platform/theming/theme-state.service";
+import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-tokens";
+import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
+import { ThemeType } from "@bitwarden/common/platform/enums";
+import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service";
+import { SharedModule } from "@bitwarden/components/src/shared";
+import { I18nPipe } from "@bitwarden/components/src/shared/i18n.pipe";
import { IntegrationCardComponent } from "./integration-card.component";
@@ -19,7 +23,7 @@ describe("IntegrationCardComponent", () => {
systemTheme$.next(ThemeType.Light);
await TestBed.configureTestingModule({
- declarations: [IntegrationCardComponent],
+ imports: [IntegrationCardComponent, SharedModule],
providers: [
{
provide: ThemeStateService,
@@ -29,6 +33,14 @@ describe("IntegrationCardComponent", () => {
provide: SYSTEM_THEME_OBSERVABLE,
useValue: systemTheme$,
},
+ {
+ provide: I18nPipe,
+ useValue: mock(),
+ },
+ {
+ provide: I18nService,
+ useValue: mock(),
+ },
],
}).compileComponents();
});
@@ -39,7 +51,6 @@ describe("IntegrationCardComponent", () => {
component.name = "Integration Name";
component.image = "test-image.png";
- component.linkText = "Get started with integration";
component.linkURL = "https://example.com/";
fixture.detectChanges();
@@ -53,10 +64,8 @@ describe("IntegrationCardComponent", () => {
it("renders card body", () => {
const name = fixture.nativeElement.querySelector("h3");
- const link = fixture.nativeElement.querySelector("a");
expect(name.textContent).toBe("Integration Name");
- expect(link.textContent.trim()).toBe("Get started with integration");
});
it("assigns external rel attribute", () => {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-card/integration-card.component.ts b/apps/web/src/app/shared/components/integrations/integration-card/integration-card.component.ts
similarity index 92%
rename from bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-card/integration-card.component.ts
rename to apps/web/src/app/shared/components/integrations/integration-card/integration-card.component.ts
index bf5f5bd3112..5e47c1e0b31 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-card/integration-card.component.ts
+++ b/apps/web/src/app/shared/components/integrations/integration-card/integration-card.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import {
AfterViewInit,
Component,
@@ -13,9 +15,13 @@ import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-t
import { ThemeType } from "@bitwarden/common/platform/enums";
import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service";
+import { SharedModule } from "../../../shared.module";
+
@Component({
- selector: "sm-integration-card",
+ selector: "app-integration-card",
templateUrl: "./integration-card.component.html",
+ standalone: true,
+ imports: [SharedModule],
})
export class IntegrationCardComponent implements AfterViewInit, OnDestroy {
private destroyed$: Subject = new Subject();
@@ -24,7 +30,6 @@ export class IntegrationCardComponent implements AfterViewInit, OnDestroy {
@Input() name: string;
@Input() image: string;
@Input() imageDarkMode?: string;
- @Input() linkText: string;
@Input() linkURL: string;
/** Adds relevant `rel` attribute to external links */
diff --git a/apps/web/src/app/shared/components/integrations/integration-card/integration-card.stories.ts b/apps/web/src/app/shared/components/integrations/integration-card/integration-card.stories.ts
new file mode 100644
index 00000000000..1d1e229740f
--- /dev/null
+++ b/apps/web/src/app/shared/components/integrations/integration-card/integration-card.stories.ts
@@ -0,0 +1,63 @@
+import { Meta, StoryObj, moduleMetadata } from "@storybook/angular";
+import { of } from "rxjs";
+
+import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-tokens";
+import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
+import { ThemeTypes } from "@bitwarden/common/platform/enums";
+import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service";
+import { I18nMockService } from "@bitwarden/components";
+
+import { SharedModule } from "../../../shared.module";
+
+import { IntegrationCardComponent } from "./integration-card.component";
+
+class MockThemeService implements Partial {}
+
+export default {
+ title: "Web/Integration Layout/Integration Card",
+ component: IntegrationCardComponent,
+ decorators: [
+ moduleMetadata({
+ imports: [SharedModule],
+ providers: [
+ {
+ provide: I18nService,
+ useFactory: () => {
+ return new I18nMockService({});
+ },
+ },
+ {
+ provide: ThemeStateService,
+ useClass: MockThemeService,
+ },
+ {
+ provide: SYSTEM_THEME_OBSERVABLE,
+ useValue: of(ThemeTypes.Light),
+ },
+ ],
+ }),
+ ],
+ args: {
+ integrations: [],
+ },
+} as Meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: (args) => ({
+ props: args,
+ template: /*html*/ `
+
+ `,
+ }),
+ args: {
+ name: "Bitwarden",
+ image: "/integrations/bitwarden-vertical-blue.svg",
+ linkURL: "https://bitwarden.com",
+ },
+};
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-grid/integration-grid.component.html b/apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.component.html
similarity index 66%
rename from bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-grid/integration-grid.component.html
rename to apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.component.html
index a0c82d2f342..4b4b3ac972b 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-grid/integration-grid.component.html
+++ b/apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.component.html
@@ -1,15 +1,18 @@
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-grid/integration-grid.component.spec.ts b/apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.component.spec.ts
similarity index 61%
rename from bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-grid/integration-grid.component.spec.ts
rename to apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.component.spec.ts
index e74e057e069..c77ec455e00 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-grid/integration-grid.component.spec.ts
+++ b/apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.component.spec.ts
@@ -3,12 +3,16 @@ import { By } from "@angular/platform-browser";
import { mock } from "jest-mock-extended";
import { of } from "rxjs";
-import { SYSTEM_THEME_OBSERVABLE } from "../../../../../../../libs/angular/src/services/injection-tokens";
-import { IntegrationType } from "../../../../../../../libs/common/src/enums";
-import { ThemeType } from "../../../../../../../libs/common/src/platform/enums";
-import { ThemeStateService } from "../../../../../../../libs/common/src/platform/theming/theme-state.service";
+import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-tokens";
+import { IntegrationType } from "@bitwarden/common/enums";
+import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
+import { ThemeTypes } from "@bitwarden/common/platform/enums";
+import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service";
+import { SharedModule } from "@bitwarden/components/src/shared";
+import { I18nPipe } from "@bitwarden/components/src/shared/i18n.pipe";
+
import { IntegrationCardComponent } from "../integration-card/integration-card.component";
-import { Integration } from "../models/integration";
+import { Integration } from "../models";
import { IntegrationGridComponent } from "./integration-grid.component";
@@ -19,14 +23,12 @@ describe("IntegrationGridComponent", () => {
{
name: "Integration 1",
image: "test-image1.png",
- linkText: "Get started with integration 1",
linkURL: "https://example.com/1",
type: IntegrationType.Integration,
},
{
name: "SDK 2",
image: "test-image2.png",
- linkText: "View SDK 2",
linkURL: "https://example.com/2",
type: IntegrationType.SDK,
},
@@ -34,7 +36,7 @@ describe("IntegrationGridComponent", () => {
beforeEach(() => {
TestBed.configureTestingModule({
- declarations: [IntegrationGridComponent, IntegrationCardComponent],
+ imports: [IntegrationGridComponent, IntegrationCardComponent, SharedModule],
providers: [
{
provide: ThemeStateService,
@@ -42,7 +44,15 @@ describe("IntegrationGridComponent", () => {
},
{
provide: SYSTEM_THEME_OBSERVABLE,
- useValue: of(ThemeType.Light),
+ useValue: of(ThemeTypes.Light),
+ },
+ {
+ provide: I18nPipe,
+ useValue: mock(),
+ },
+ {
+ provide: I18nService,
+ useValue: mock({ t: (key, p1) => key + " " + p1 }),
},
],
});
@@ -50,6 +60,8 @@ describe("IntegrationGridComponent", () => {
fixture = TestBed.createComponent(IntegrationGridComponent);
component = fixture.componentInstance;
component.integrations = integrations;
+ component.ariaI18nKey = "integrationCardAriaLabel";
+ component.tooltipI18nKey = "integrationCardTooltip";
fixture.detectChanges();
});
@@ -68,7 +80,6 @@ describe("IntegrationGridComponent", () => {
expect(card.componentInstance.name).toBe("SDK 2");
expect(card.componentInstance.image).toBe("test-image2.png");
- expect(card.componentInstance.linkText).toBe("View SDK 2");
expect(card.componentInstance.linkURL).toBe("https://example.com/2");
});
@@ -78,4 +89,12 @@ describe("IntegrationGridComponent", () => {
expect(card[0].componentInstance.externalURL).toBe(false);
expect(card[1].componentInstance.externalURL).toBe(true);
});
+
+ it("has a tool tip and aria label attributes", () => {
+ const card: HTMLElement = fixture.debugElement.queryAll(By.css("li"))[0].nativeElement;
+ expect(card.title).toBe("integrationCardTooltip" + " " + integrations[0].name);
+ expect(card.getAttribute("aria-label")).toBe(
+ "integrationCardAriaLabel" + " " + integrations[0].name,
+ );
+ });
});
diff --git a/apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.component.ts b/apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.component.ts
new file mode 100644
index 00000000000..1ec3f0d8d48
--- /dev/null
+++ b/apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.component.ts
@@ -0,0 +1,24 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
+import { Component, Input } from "@angular/core";
+
+import { IntegrationType } from "@bitwarden/common/enums";
+
+import { SharedModule } from "../../../shared.module";
+import { IntegrationCardComponent } from "../integration-card/integration-card.component";
+import { Integration } from "../models";
+
+@Component({
+ selector: "app-integration-grid",
+ templateUrl: "./integration-grid.component.html",
+ standalone: true,
+ imports: [IntegrationCardComponent, SharedModule],
+})
+export class IntegrationGridComponent {
+ @Input() integrations: Integration[];
+
+ @Input() ariaI18nKey: string = "integrationCardAriaLabel";
+ @Input() tooltipI18nKey: string = "integrationCardTooltip";
+
+ protected IntegrationType = IntegrationType;
+}
diff --git a/apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.stories.ts b/apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.stories.ts
new file mode 100644
index 00000000000..2ec0bccec3d
--- /dev/null
+++ b/apps/web/src/app/shared/components/integrations/integration-grid/integration-grid.stories.ts
@@ -0,0 +1,77 @@
+import { Meta, StoryObj, moduleMetadata } from "@storybook/angular";
+import { of } from "rxjs";
+
+import { SYSTEM_THEME_OBSERVABLE } from "@bitwarden/angular/services/injection-tokens";
+import { IntegrationType } from "@bitwarden/common/enums";
+import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
+import { ThemeTypes } from "@bitwarden/common/platform/enums";
+import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service";
+import { I18nMockService } from "@bitwarden/components";
+
+import { SharedModule } from "../../../shared.module";
+import { IntegrationCardComponent } from "../integration-card/integration-card.component";
+import { IntegrationGridComponent } from "../integration-grid/integration-grid.component";
+
+class MockThemeService implements Partial {}
+
+export default {
+ title: "Web/Integration Layout/Integration Grid",
+ component: IntegrationGridComponent,
+ decorators: [
+ moduleMetadata({
+ imports: [IntegrationCardComponent, SharedModule],
+ providers: [
+ {
+ provide: I18nService,
+ useFactory: () => {
+ return new I18nMockService({
+ integrationCardAriaLabel: "Go to integration",
+ integrationCardTooltip: "Go to integration",
+ });
+ },
+ },
+ {
+ provide: ThemeStateService,
+ useClass: MockThemeService,
+ },
+ {
+ provide: SYSTEM_THEME_OBSERVABLE,
+ useValue: of(ThemeTypes.Dark),
+ },
+ ],
+ }),
+ ],
+} as Meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ render: (args) => ({
+ props: args,
+ template: /*html*/ `
+
+ `,
+ }),
+ args: {
+ integrations: [
+ {
+ name: "Card 1",
+ linkURL: "https://bitwarden.com",
+ image: "/integrations/bitwarden-vertical-blue.svg",
+ type: IntegrationType.SSO,
+ },
+ {
+ name: "Card 2",
+ linkURL: "https://bitwarden.com",
+ image: "/integrations/bitwarden-vertical-blue.svg",
+ type: IntegrationType.SDK,
+ },
+ {
+ name: "Card 3",
+ linkURL: "https://bitwarden.com",
+ image: "/integrations/bitwarden-vertical-blue.svg",
+ type: IntegrationType.SCIM,
+ },
+ ],
+ },
+};
diff --git a/apps/web/src/app/shared/components/integrations/integrations.pipe.ts b/apps/web/src/app/shared/components/integrations/integrations.pipe.ts
new file mode 100644
index 00000000000..760d9913e9e
--- /dev/null
+++ b/apps/web/src/app/shared/components/integrations/integrations.pipe.ts
@@ -0,0 +1,15 @@
+import { Pipe, PipeTransform } from "@angular/core";
+
+import { IntegrationType } from "@bitwarden/common/enums";
+
+import { Integration } from "../../../shared/components/integrations/models";
+
+@Pipe({
+ name: "filterIntegrations",
+ standalone: true,
+})
+export class FilterIntegrationsPipe implements PipeTransform {
+ transform(integrations: Integration[], type: IntegrationType): Integration[] {
+ return integrations.filter((integration) => integration.type === type);
+ }
+}
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/models/integration.ts b/apps/web/src/app/shared/components/integrations/models.ts
similarity index 95%
rename from bitwarden_license/bit-web/src/app/secrets-manager/integrations/models/integration.ts
rename to apps/web/src/app/shared/components/integrations/models.ts
index 51ca79b30f7..765b1d44a2e 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/models/integration.ts
+++ b/apps/web/src/app/shared/components/integrations/models.ts
@@ -9,7 +9,6 @@ export type Integration = {
*/
imageDarkMode?: string;
linkURL: string;
- linkText: string;
type: IntegrationType;
/**
* Shows the "New" badge until the defined date.
diff --git a/apps/web/src/app/shared/components/onboarding/onboarding-task.component.ts b/apps/web/src/app/shared/components/onboarding/onboarding-task.component.ts
index 849637d9a04..7bb86c9f669 100644
--- a/apps/web/src/app/shared/components/onboarding/onboarding-task.component.ts
+++ b/apps/web/src/app/shared/components/onboarding/onboarding-task.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input } from "@angular/core";
@Component({
diff --git a/apps/web/src/app/shared/components/onboarding/onboarding.component.ts b/apps/web/src/app/shared/components/onboarding/onboarding.component.ts
index 97ffb573ae7..23f9015b024 100644
--- a/apps/web/src/app/shared/components/onboarding/onboarding.component.ts
+++ b/apps/web/src/app/shared/components/onboarding/onboarding.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, ContentChildren, EventEmitter, Input, Output, QueryList } from "@angular/core";
import { OnboardingTaskComponent } from "./onboarding-task.component";
diff --git a/apps/web/src/app/shared/index.ts b/apps/web/src/app/shared/index.ts
index 7defcdedfda..f57648c0e40 100644
--- a/apps/web/src/app/shared/index.ts
+++ b/apps/web/src/app/shared/index.ts
@@ -1,2 +1,3 @@
export * from "./shared.module";
export * from "./loose-components.module";
+export * from "./components/index";
diff --git a/apps/web/src/app/tools/event-export/event-export.service.ts b/apps/web/src/app/tools/event-export/event-export.service.ts
index 68df258b130..f39b786b6d1 100644
--- a/apps/web/src/app/tools/event-export/event-export.service.ts
+++ b/apps/web/src/app/tools/event-export/event-export.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import * as papa from "papaparse";
diff --git a/apps/web/src/app/tools/generator.component.ts b/apps/web/src/app/tools/generator.component.ts
index f462e8fa4bf..a11c0c4a97b 100644
--- a/apps/web/src/app/tools/generator.component.ts
+++ b/apps/web/src/app/tools/generator.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, NgZone } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
diff --git a/apps/web/src/app/tools/reports/pages/breach-report.component.spec.ts b/apps/web/src/app/tools/reports/pages/breach-report.component.spec.ts
index 5df2ffd0f27..1574389a1a0 100644
--- a/apps/web/src/app/tools/reports/pages/breach-report.component.spec.ts
+++ b/apps/web/src/app/tools/reports/pages/breach-report.component.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
// eslint-disable-next-line no-restricted-imports
import { ComponentFixture, TestBed } from "@angular/core/testing";
import { ReactiveFormsModule } from "@angular/forms";
diff --git a/apps/web/src/app/tools/reports/pages/breach-report.component.ts b/apps/web/src/app/tools/reports/pages/breach-report.component.ts
index 177dcac4f2f..e1da7be06f8 100644
--- a/apps/web/src/app/tools/reports/pages/breach-report.component.ts
+++ b/apps/web/src/app/tools/reports/pages/breach-report.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
import { firstValueFrom, map } from "rxjs";
diff --git a/apps/web/src/app/tools/reports/pages/cipher-report.component.ts b/apps/web/src/app/tools/reports/pages/cipher-report.component.ts
index cfefbbe4d74..b1a46bd13a8 100644
--- a/apps/web/src/app/tools/reports/pages/cipher-report.component.ts
+++ b/apps/web/src/app/tools/reports/pages/cipher-report.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, ViewChild, ViewContainerRef, OnDestroy } from "@angular/core";
import { BehaviorSubject, Observable, Subject, takeUntil } from "rxjs";
diff --git a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.ts b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.ts
index 5cfe2cd1a9e..792ad0616f2 100644
--- a/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.ts
+++ b/apps/web/src/app/tools/reports/pages/inactive-two-factor-report.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { ModalService } from "@bitwarden/angular/services/modal.service";
diff --git a/apps/web/src/app/tools/reports/pages/reports-home.component.ts b/apps/web/src/app/tools/reports/pages/reports-home.component.ts
index 541193fafab..961c24bb017 100644
--- a/apps/web/src/app/tools/reports/pages/reports-home.component.ts
+++ b/apps/web/src/app/tools/reports/pages/reports-home.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { firstValueFrom } from "rxjs";
diff --git a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.ts
index 70cb2ed69b3..a8806acea13 100644
--- a/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.ts
+++ b/apps/web/src/app/tools/reports/pages/reused-passwords-report.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { ModalService } from "@bitwarden/angular/services/modal.service";
diff --git a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.ts b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.ts
index 26ba4885e68..f3ad6840c8b 100644
--- a/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.ts
+++ b/apps/web/src/app/tools/reports/pages/weak-passwords-report.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { ModalService } from "@bitwarden/angular/services/modal.service";
diff --git a/apps/web/src/app/tools/reports/report-utils.ts b/apps/web/src/app/tools/reports/report-utils.ts
index 58211e7ae58..460fc937f72 100644
--- a/apps/web/src/app/tools/reports/report-utils.ts
+++ b/apps/web/src/app/tools/reports/report-utils.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import * as papa from "papaparse";
/**
diff --git a/apps/web/src/app/tools/reports/shared/report-card/report-card.component.ts b/apps/web/src/app/tools/reports/shared/report-card/report-card.component.ts
index 13a2a04e0d2..da42d92bf84 100644
--- a/apps/web/src/app/tools/reports/shared/report-card/report-card.component.ts
+++ b/apps/web/src/app/tools/reports/shared/report-card/report-card.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input } from "@angular/core";
import { Icon } from "@bitwarden/components";
diff --git a/apps/web/src/app/tools/reports/shared/report-list/report-list.component.ts b/apps/web/src/app/tools/reports/shared/report-list/report-list.component.ts
index f2d9c3501bd..cd6b77f9c81 100644
--- a/apps/web/src/app/tools/reports/shared/report-list/report-list.component.ts
+++ b/apps/web/src/app/tools/reports/shared/report-list/report-list.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input } from "@angular/core";
import { ReportEntry } from "../models/report-entry";
diff --git a/apps/web/src/app/tools/send/access.component.ts b/apps/web/src/app/tools/send/access.component.ts
index 3c64ee90ca1..80439acd510 100644
--- a/apps/web/src/app/tools/send/access.component.ts
+++ b/apps/web/src/app/tools/send/access.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { FormBuilder } from "@angular/forms";
import { ActivatedRoute } from "@angular/router";
diff --git a/apps/web/src/app/tools/send/add-edit.component.ts b/apps/web/src/app/tools/send/add-edit.component.ts
index 4dc3001831d..4ce126a33bc 100644
--- a/apps/web/src/app/tools/send/add-edit.component.ts
+++ b/apps/web/src/app/tools/send/add-edit.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog";
import { DatePipe } from "@angular/common";
import { Component, Inject } from "@angular/core";
diff --git a/apps/web/src/app/tools/send/send-access-file.component.ts b/apps/web/src/app/tools/send/send-access-file.component.ts
index 1efabb5fec7..0b2a971bbe8 100644
--- a/apps/web/src/app/tools/send/send-access-file.component.ts
+++ b/apps/web/src/app/tools/send/send-access-file.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input } from "@angular/core";
import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service";
diff --git a/apps/web/src/app/tools/send/send-access-password.component.ts b/apps/web/src/app/tools/send/send-access-password.component.ts
index 63c012c3b69..bd98e9d18c8 100644
--- a/apps/web/src/app/tools/send/send-access-password.component.ts
+++ b/apps/web/src/app/tools/send/send-access-password.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
import { Subject, takeUntil } from "rxjs";
diff --git a/apps/web/src/app/tools/send/send-access-text.component.ts b/apps/web/src/app/tools/send/send-access-text.component.ts
index 290bde50cd9..6568fe482ad 100644
--- a/apps/web/src/app/tools/send/send-access-text.component.ts
+++ b/apps/web/src/app/tools/send/send-access-text.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input } from "@angular/core";
import { FormBuilder } from "@angular/forms";
diff --git a/apps/web/src/app/tools/send/send.component.ts b/apps/web/src/app/tools/send/send.component.ts
index e4c7fd7a5fa..1268e4bfb50 100644
--- a/apps/web/src/app/tools/send/send.component.ts
+++ b/apps/web/src/app/tools/send/send.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, NgZone, ViewChild, OnInit, OnDestroy, ViewContainerRef } from "@angular/core";
import { lastValueFrom } from "rxjs";
diff --git a/apps/web/src/app/vault/components/assign-collections/assign-collections-web.component.ts b/apps/web/src/app/vault/components/assign-collections/assign-collections-web.component.ts
index 4bbbda94a09..53f9f1b2cd7 100644
--- a/apps/web/src/app/vault/components/assign-collections/assign-collections-web.component.ts
+++ b/apps/web/src/app/vault/components/assign-collections/assign-collections-web.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
diff --git a/apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.ts b/apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.ts
index 514d0f8b625..42d033dc4c2 100644
--- a/apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.ts
+++ b/apps/web/src/app/vault/components/collection-dialog/collection-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { ChangeDetectorRef, Component, Inject, OnDestroy, OnInit } from "@angular/core";
import { AbstractControl, FormBuilder, Validators } from "@angular/forms";
diff --git a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts
index 2742cd52ef1..4c1b51a5482 100644
--- a/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts
+++ b/apps/web/src/app/vault/components/vault-item-dialog/vault-item-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog";
import { CommonModule } from "@angular/common";
import { Component, ElementRef, Inject, OnDestroy, OnInit, ViewChild } from "@angular/core";
@@ -281,17 +283,19 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy {
// If the cipher was newly created (via add/clone), switch the form to edit for subsequent edits.
if (this._originalFormMode === "add" || this._originalFormMode === "clone") {
this.formConfig.mode = "edit";
+ this.formConfig.initialValues = null;
}
- let cipher: Cipher;
+ let cipher = await this.cipherService.get(cipherView.id);
- // When the form config is used within the Admin Console, retrieve the cipher from the admin endpoint
- if (this.formConfig.isAdminConsole) {
+ // When the form config is used within the Admin Console, retrieve the cipher from the admin endpoint (if not found in local state)
+ if (this.formConfig.isAdminConsole && (cipher == null || this.formConfig.admin)) {
const cipherResponse = await this.apiService.getCipherAdmin(cipherView.id);
+ cipherResponse.edit = true;
+ cipherResponse.viewPassword = true;
+
const cipherData = new CipherData(cipherResponse);
cipher = new Cipher(cipherData);
- } else {
- cipher = await this.cipherService.get(cipherView.id);
}
// Store the updated cipher so any following edits use the most up to date cipher
@@ -426,6 +430,9 @@ export class VaultItemDialogComponent implements OnInit, OnDestroy {
case CipherType.SecureNote:
this.title = this.i18nService.t(partOne, this.i18nService.t("note").toLowerCase());
break;
+ case CipherType.SshKey:
+ this.title = this.i18nService.t(partOne, this.i18nService.t("typeSshKey").toLowerCase());
+ break;
}
}
diff --git a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts
index 355f0240ece..efbdb6cd857 100644
--- a/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts
+++ b/apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core";
import { firstValueFrom } from "rxjs";
diff --git a/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.ts b/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.ts
index 9656e4e8353..404e26fc210 100644
--- a/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.ts
+++ b/apps/web/src/app/vault/components/vault-items/vault-collection-row.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { CollectionAdminView, Unassigned, CollectionView } from "@bitwarden/admin-console/common";
diff --git a/apps/web/src/app/vault/components/vault-items/vault-items.component.ts b/apps/web/src/app/vault/components/vault-items/vault-items.component.ts
index 1c658663196..3e1cf173a47 100644
--- a/apps/web/src/app/vault/components/vault-items/vault-items.component.ts
+++ b/apps/web/src/app/vault/components/vault-items/vault-items.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SelectionModel } from "@angular/cdk/collections";
import { Component, EventEmitter, Input, Output } from "@angular/core";
diff --git a/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts b/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts
index f74b73b1030..4750b090f1e 100644
--- a/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts
+++ b/apps/web/src/app/vault/components/vault-items/vault-items.stories.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { importProvidersFrom } from "@angular/core";
import { RouterModule } from "@angular/router";
import { applicationConfig, Meta, moduleMetadata, StoryObj } from "@storybook/angular";
diff --git a/apps/web/src/app/vault/components/web-generator-dialog/web-generator-dialog.component.spec.ts b/apps/web/src/app/vault/components/web-generator-dialog/web-generator-dialog.component.spec.ts
index 818fb74963a..26c2d9e3890 100644
--- a/apps/web/src/app/vault/components/web-generator-dialog/web-generator-dialog.component.spec.ts
+++ b/apps/web/src/app/vault/components/web-generator-dialog/web-generator-dialog.component.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { ComponentFixture, TestBed } from "@angular/core/testing";
diff --git a/apps/web/src/app/vault/components/web-generator-dialog/web-generator-dialog.component.ts b/apps/web/src/app/vault/components/web-generator-dialog/web-generator-dialog.component.ts
index 91ab7ba7cc3..d21403dd4e5 100644
--- a/apps/web/src/app/vault/components/web-generator-dialog/web-generator-dialog.component.ts
+++ b/apps/web/src/app/vault/components/web-generator-dialog/web-generator-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { CommonModule } from "@angular/common";
import { Component, Inject } from "@angular/core";
diff --git a/apps/web/src/app/vault/individual-vault/add-edit-custom-fields.component.ts b/apps/web/src/app/vault/individual-vault/add-edit-custom-fields.component.ts
index f9e2342d07b..b492de85caa 100644
--- a/apps/web/src/app/vault/individual-vault/add-edit-custom-fields.component.ts
+++ b/apps/web/src/app/vault/individual-vault/add-edit-custom-fields.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input } from "@angular/core";
import { AddEditCustomFieldsComponent as BaseAddEditCustomFieldsComponent } from "@bitwarden/angular/vault/components/add-edit-custom-fields.component";
diff --git a/apps/web/src/app/vault/individual-vault/add-edit-v2.component.ts b/apps/web/src/app/vault/individual-vault/add-edit-v2.component.ts
index 527f00d58f8..5237db15b3c 100644
--- a/apps/web/src/app/vault/individual-vault/add-edit-v2.component.ts
+++ b/apps/web/src/app/vault/individual-vault/add-edit-v2.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { CommonModule } from "@angular/common";
import { Component, Inject, OnInit } from "@angular/core";
diff --git a/apps/web/src/app/vault/individual-vault/add-edit.component.ts b/apps/web/src/app/vault/individual-vault/add-edit.component.ts
index 8f8c4779514..7b855b470a6 100644
--- a/apps/web/src/app/vault/individual-vault/add-edit.component.ts
+++ b/apps/web/src/app/vault/individual-vault/add-edit.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DatePipe } from "@angular/common";
import { Component, OnDestroy, OnInit } from "@angular/core";
import { firstValueFrom } from "rxjs";
diff --git a/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts b/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts
index e3b974e6c09..68bceb55985 100644
--- a/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts
+++ b/apps/web/src/app/vault/individual-vault/attachments-v2.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { CommonModule } from "@angular/common";
import { Component, Inject } from "@angular/core";
diff --git a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-delete-dialog/bulk-delete-dialog.component.ts b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-delete-dialog/bulk-delete-dialog.component.ts
index 239abbf4b91..913f106004d 100644
--- a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-delete-dialog/bulk-delete-dialog.component.ts
+++ b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-delete-dialog/bulk-delete-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
diff --git a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component.ts b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component.ts
index cdf45d0669c..d68e3b9d732 100644
--- a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component.ts
+++ b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogConfig, DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject, OnInit } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
diff --git a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-share-dialog/bulk-share-dialog.component.ts b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-share-dialog/bulk-share-dialog.component.ts
index edfc617c70e..62798c21bca 100644
--- a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-share-dialog/bulk-share-dialog.component.ts
+++ b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-share-dialog/bulk-share-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogConfig, DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject, OnDestroy, OnInit } from "@angular/core";
import { firstValueFrom, map } from "rxjs";
diff --git a/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts b/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts
index 95f3e60d8c2..4d181a0510d 100644
--- a/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts
+++ b/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
import { FormBuilder } from "@angular/forms";
diff --git a/apps/web/src/app/vault/individual-vault/organization-badge/organization-name-badge.component.ts b/apps/web/src/app/vault/individual-vault/organization-badge/organization-name-badge.component.ts
index 3e37d4998de..c1f935f2001 100644
--- a/apps/web/src/app/vault/individual-vault/organization-badge/organization-name-badge.component.ts
+++ b/apps/web/src/app/vault/individual-vault/organization-badge/organization-name-badge.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input, OnChanges } from "@angular/core";
import { firstValueFrom } from "rxjs";
diff --git a/apps/web/src/app/vault/individual-vault/password-history.component.ts b/apps/web/src/app/vault/individual-vault/password-history.component.ts
index 655cd33eca7..0f96ac81715 100644
--- a/apps/web/src/app/vault/individual-vault/password-history.component.ts
+++ b/apps/web/src/app/vault/individual-vault/password-history.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { CommonModule } from "@angular/common";
import { Inject, Component } from "@angular/core";
diff --git a/apps/web/src/app/vault/individual-vault/vault-banners/vault-banners.component.html b/apps/web/src/app/vault/individual-vault/vault-banners/vault-banners.component.html
index f3ecead886b..29909e26716 100644
--- a/apps/web/src/app/vault/individual-vault/vault-banners/vault-banners.component.html
+++ b/apps/web/src/app/vault/individual-vault/vault-banners/vault-banners.component.html
@@ -9,12 +9,12 @@
{{ freeTrialMessage(organization) }}
- {{ "routeToPaymentMethodTrigger" | i18n }}
+ {{ "clickHereToAddPaymentMethod" | i18n }}
diff --git a/apps/web/src/app/vault/individual-vault/vault-banners/vault-banners.component.ts b/apps/web/src/app/vault/individual-vault/vault-banners/vault-banners.component.ts
index 72b14d5ca05..933b4899c94 100644
--- a/apps/web/src/app/vault/individual-vault/vault-banners/vault-banners.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-banners/vault-banners.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input, OnInit } from "@angular/core";
import { Router } from "@angular/router";
import { Observable } from "rxjs";
@@ -69,14 +71,14 @@ export class VaultBannersComponent implements OnInit {
freeTrialMessage(organization: FreeTrial) {
if (organization.remainingDays >= 2) {
return this.i18nService.t(
- "freeTrialEndPromptAboveTwoDays",
+ "freeTrialEndPromptMultipleDays",
organization.organizationName,
organization.remainingDays.toString(),
);
} else if (organization.remainingDays === 1) {
- return this.i18nService.t("freeTrialEndPromptForOneDay", organization.organizationName);
+ return this.i18nService.t("freeTrialEndPromptTomorrow", organization.organizationName);
} else {
- return this.i18nService.t("freeTrialEndPromptForLessThanADay", organization.organizationName);
+ return this.i18nService.t("freeTrialEndPromptToday", organization.organizationName);
}
}
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/components/link-sso.directive.ts b/apps/web/src/app/vault/individual-vault/vault-filter/components/link-sso.directive.ts
index 9286a68e8fb..a1781889c49 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/components/link-sso.directive.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/components/link-sso.directive.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { AfterContentInit, Directive, HostListener, Input } from "@angular/core";
import { SsoComponent } from "@bitwarden/angular/auth/components/sso.component";
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/components/organization-options.component.ts b/apps/web/src/app/vault/individual-vault/vault-filter/components/organization-options.component.ts
index 57eb9b1bdd9..6788471dd04 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/components/organization-options.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/components/organization-options.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Inject, OnDestroy, OnInit } from "@angular/core";
import { combineLatest, map, Observable, of, Subject, switchMap, takeUntil } from "rxjs";
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts
index 2f8a429e42e..efb1754c811 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, EventEmitter, inject, Input, OnDestroy, OnInit, Output } from "@angular/core";
import { Router } from "@angular/router";
import { firstValueFrom, Subject } from "rxjs";
@@ -6,6 +8,8 @@ import { PolicyService } from "@bitwarden/common/admin-console/abstractions/poli
import { PolicyType } from "@bitwarden/common/admin-console/enums";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction";
+import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
+import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { CipherType } from "@bitwarden/common/vault/enums";
@@ -94,6 +98,7 @@ export class VaultFilterComponent implements OnInit, OnDestroy {
protected platformUtilsService: PlatformUtilsService,
protected billingApiService: BillingApiServiceAbstraction,
protected dialogService: DialogService,
+ protected configService: ConfigService,
) {}
async ngOnInit(): Promise {
@@ -258,13 +263,16 @@ export class VaultFilterComponent implements OnInit, OnDestroy {
type: CipherType.SecureNote,
icon: "bwi-sticky-note",
},
- {
+ ];
+
+ if (await this.configService.getFeatureFlag(FeatureFlag.SSHKeyVaultItem)) {
+ allTypeFilters.push({
id: "sshKey",
name: this.i18nService.t("typeSshKey"),
type: CipherType.SshKey,
icon: "bwi-key",
- },
- ];
+ });
+ }
const typeFilterSection: VaultFilterSection = {
data$: this.vaultFilterService.buildTypeTree(
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/services/abstractions/vault-filter.service.ts b/apps/web/src/app/vault/individual-vault/vault-filter/services/abstractions/vault-filter.service.ts
index aa9d503d25f..b4f52180e52 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/services/abstractions/vault-filter.service.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/services/abstractions/vault-filter.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Observable } from "rxjs";
import { CollectionAdminView, CollectionView } from "@bitwarden/admin-console/common";
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts b/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts
index 1f0a9e135b5..25874d683be 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Router } from "@angular/router";
import { combineLatest, map, Observable } from "rxjs";
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts b/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts
index 7310a6aecec..c4ac3dc2d70 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import {
BehaviorSubject,
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/components/vault-filter-section.component.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/components/vault-filter-section.component.ts
index 93c2c7a671f..b231200a7cb 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/components/vault-filter-section.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/components/vault-filter-section.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, InjectionToken, Injector, Input, OnDestroy, OnInit } from "@angular/core";
import { Observable, Subject, takeUntil } from "rxjs";
import { map } from "rxjs/operators";
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/filter-function.spec.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/filter-function.spec.ts
index 397b7810606..3082d7cb809 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/filter-function.spec.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/filter-function.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Unassigned } from "@bitwarden/admin-console/common";
import { CipherType } from "@bitwarden/common/vault/enums";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.spec.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.spec.ts
index 79d28c75bb9..bd4f3d29b34 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.spec.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CollectionView } from "@bitwarden/admin-console/common";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { CipherType } from "@bitwarden/common/vault/enums";
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.ts
index b6fbb0838c8..c486ad800ab 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CipherType } from "@bitwarden/common/vault/enums";
import { TreeNode } from "@bitwarden/common/vault/models/domain/tree-node";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
diff --git a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts
index 169dc87550e..75b39a2ca40 100644
--- a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import {
ChangeDetectionStrategy,
diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/services/abstraction/vault-onboarding.service.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/services/abstraction/vault-onboarding.service.ts
index b1d1b4efbf8..379c97672e7 100644
--- a/apps/web/src/app/vault/individual-vault/vault-onboarding/services/abstraction/vault-onboarding.service.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/services/abstraction/vault-onboarding.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Observable } from "rxjs";
import { VaultOnboardingTasks } from "../vault-onboarding.service";
diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/services/vault-onboarding.service.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/services/vault-onboarding.service.ts
index 4f791a1a2d9..95cb568a840 100644
--- a/apps/web/src/app/vault/individual-vault/vault-onboarding/services/vault-onboarding.service.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/services/vault-onboarding.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Observable } from "rxjs";
diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts
index 778132676fa..e017bc9b35d 100644
--- a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { ComponentFixture, TestBed } from "@angular/core/testing";
import { RouterTestingModule } from "@angular/router/testing";
import { mock, MockProxy } from "jest-mock-extended";
diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts
index 94ae1a4df47..3535d31852e 100644
--- a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import {
Component,
diff --git a/apps/web/src/app/vault/individual-vault/vault.component.ts b/apps/web/src/app/vault/individual-vault/vault.component.ts
index 5f66bb49af5..18a1d8b338a 100644
--- a/apps/web/src/app/vault/individual-vault/vault.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef } from "@angular/cdk/dialog";
import {
ChangeDetectorRef,
@@ -210,7 +212,10 @@ export class VaultComponent implements OnInit, OnDestroy {
protected organizationsPaymentStatus$: Observable = combineLatest([
this.organizationService.organizations$.pipe(
- map((organizations) => organizations?.filter((org) => org.isOwner) ?? []),
+ map(
+ (organizations) =>
+ organizations?.filter((org) => org.isOwner && org.canViewBillingHistory) ?? [],
+ ),
),
this.hasSubscription$,
]).pipe(
diff --git a/apps/web/src/app/vault/individual-vault/view.component.ts b/apps/web/src/app/vault/individual-vault/view.component.ts
index 779035c972b..e9ca2bf8f8c 100644
--- a/apps/web/src/app/vault/individual-vault/view.component.ts
+++ b/apps/web/src/app/vault/individual-vault/view.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { CommonModule } from "@angular/common";
import { Component, EventEmitter, Inject, OnInit } from "@angular/core";
diff --git a/apps/web/src/app/vault/org-vault/add-edit.component.ts b/apps/web/src/app/vault/org-vault/add-edit.component.ts
index 7a4697f5af6..c3b0d0cb0b1 100644
--- a/apps/web/src/app/vault/org-vault/add-edit.component.ts
+++ b/apps/web/src/app/vault/org-vault/add-edit.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DatePipe } from "@angular/common";
import { Component } from "@angular/core";
diff --git a/apps/web/src/app/vault/org-vault/attachments.component.ts b/apps/web/src/app/vault/org-vault/attachments.component.ts
index 2f3f477cb23..c8badffb36f 100644
--- a/apps/web/src/app/vault/org-vault/attachments.component.ts
+++ b/apps/web/src/app/vault/org-vault/attachments.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
diff --git a/apps/web/src/app/vault/org-vault/bulk-collections-dialog/bulk-collections-dialog.component.ts b/apps/web/src/app/vault/org-vault/bulk-collections-dialog/bulk-collections-dialog.component.ts
index f86a321dfbd..0fc7b6a31aa 100644
--- a/apps/web/src/app/vault/org-vault/bulk-collections-dialog/bulk-collections-dialog.component.ts
+++ b/apps/web/src/app/vault/org-vault/bulk-collections-dialog/bulk-collections-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { Component, Inject, OnDestroy } from "@angular/core";
import { FormBuilder } from "@angular/forms";
diff --git a/apps/web/src/app/vault/org-vault/collection-badge/collection-name.badge.component.ts b/apps/web/src/app/vault/org-vault/collection-badge/collection-name.badge.component.ts
index 1189f06343a..3235797b882 100644
--- a/apps/web/src/app/vault/org-vault/collection-badge/collection-name.badge.component.ts
+++ b/apps/web/src/app/vault/org-vault/collection-badge/collection-name.badge.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input } from "@angular/core";
import { CollectionView } from "@bitwarden/admin-console/common";
diff --git a/apps/web/src/app/vault/org-vault/group-badge/group-name-badge.component.ts b/apps/web/src/app/vault/org-vault/group-badge/group-name-badge.component.ts
index 98c49f59548..4ed145a732f 100644
--- a/apps/web/src/app/vault/org-vault/group-badge/group-name-badge.component.ts
+++ b/apps/web/src/app/vault/org-vault/group-badge/group-name-badge.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input, OnChanges } from "@angular/core";
import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request";
diff --git a/apps/web/src/app/vault/org-vault/services/admin-console-cipher-form-config.service.spec.ts b/apps/web/src/app/vault/org-vault/services/admin-console-cipher-form-config.service.spec.ts
index 05c40fe2e79..25976c4fb82 100644
--- a/apps/web/src/app/vault/org-vault/services/admin-console-cipher-form-config.service.spec.ts
+++ b/apps/web/src/app/vault/org-vault/services/admin-console-cipher-form-config.service.spec.ts
@@ -8,6 +8,7 @@ import { PolicyService } from "@bitwarden/common/admin-console/abstractions/poli
import { OrganizationUserStatusType } from "@bitwarden/common/admin-console/enums";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { CipherId } from "@bitwarden/common/types/guid";
+import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { RoutedVaultFilterService } from "../../individual-vault/vault-filter/services/routed-vault-filter.service";
@@ -52,12 +53,16 @@ describe("AdminConsoleCipherFormConfigService", () => {
const organization$ = new BehaviorSubject(testOrg as Organization);
const organizations$ = new BehaviorSubject([testOrg, testOrg2] as Organization[]);
const getCipherAdmin = jest.fn().mockResolvedValue(null);
+ const getCipher = jest.fn().mockResolvedValue(null);
beforeEach(async () => {
getCipherAdmin.mockClear();
getCipherAdmin.mockResolvedValue({ id: cipherId, name: "Test Cipher - (admin)" });
- await TestBed.configureTestingModule({
+ getCipher.mockClear();
+ getCipher.mockResolvedValue({ id: cipherId, name: "Test Cipher" });
+
+ TestBed.configureTestingModule({
providers: [
AdminConsoleCipherFormConfigService,
{ provide: OrganizationService, useValue: { get$: () => organization$, organizations$ } },
@@ -74,14 +79,14 @@ describe("AdminConsoleCipherFormConfigService", () => {
useValue: { filter$: new BehaviorSubject({ organizationId: testOrg.id }) },
},
{ provide: ApiService, useValue: { getCipherAdmin } },
+ { provide: CipherService, useValue: { get: getCipher } },
],
});
+ adminConsoleConfigService = TestBed.inject(AdminConsoleCipherFormConfigService);
});
describe("buildConfig", () => {
it("sets individual attributes", async () => {
- adminConsoleConfigService = TestBed.inject(AdminConsoleCipherFormConfigService);
-
const { folders, hideIndividualVaultFields } = await adminConsoleConfigService.buildConfig(
"add",
cipherId,
@@ -92,8 +97,6 @@ describe("AdminConsoleCipherFormConfigService", () => {
});
it("sets mode based on passed mode", async () => {
- adminConsoleConfigService = TestBed.inject(AdminConsoleCipherFormConfigService);
-
const { mode } = await adminConsoleConfigService.buildConfig("edit", cipherId);
expect(mode).toBe("edit");
@@ -122,8 +125,6 @@ describe("AdminConsoleCipherFormConfigService", () => {
});
it("sets `allowPersonalOwnership`", async () => {
- adminConsoleConfigService = TestBed.inject(AdminConsoleCipherFormConfigService);
-
policyAppliesToActiveUser$.next(true);
let result = await adminConsoleConfigService.buildConfig("clone", cipherId);
@@ -138,8 +139,6 @@ describe("AdminConsoleCipherFormConfigService", () => {
});
it("disables personal ownership when not cloning", async () => {
- adminConsoleConfigService = TestBed.inject(AdminConsoleCipherFormConfigService);
-
policyAppliesToActiveUser$.next(false);
let result = await adminConsoleConfigService.buildConfig("add", cipherId);
@@ -172,14 +171,32 @@ describe("AdminConsoleCipherFormConfigService", () => {
expect(result.organizations).toEqual([testOrg, testOrg2]);
});
- it("retrieves the cipher from the admin service", async () => {
+ it("retrieves the cipher from the admin service when canEditAllCiphers is true", async () => {
getCipherAdmin.mockResolvedValue({ id: cipherId, name: "Test Cipher - (admin)" });
+ testOrg.canEditAllCiphers = true;
- adminConsoleConfigService = TestBed.inject(AdminConsoleCipherFormConfigService);
-
- await adminConsoleConfigService.buildConfig("add", cipherId);
+ await adminConsoleConfigService.buildConfig("edit", cipherId);
expect(getCipherAdmin).toHaveBeenCalledWith(cipherId);
});
+
+ it("retrieves the cipher from the admin service when not found in local state", async () => {
+ getCipherAdmin.mockResolvedValue({ id: cipherId, name: "Test Cipher - (admin)" });
+ testOrg.canEditAllCiphers = false;
+ getCipher.mockResolvedValue(null);
+
+ await adminConsoleConfigService.buildConfig("edit", cipherId);
+
+ expect(getCipherAdmin).toHaveBeenCalledWith(cipherId);
+ });
+
+ it("retrieves the cipher from local state when admin is not required", async () => {
+ testOrg.canEditAllCiphers = false;
+
+ await adminConsoleConfigService.buildConfig("edit", cipherId);
+
+ expect(getCipherAdmin).not.toHaveBeenCalled();
+ expect(getCipher).toHaveBeenCalledWith(cipherId);
+ });
});
});
diff --git a/apps/web/src/app/vault/org-vault/services/admin-console-cipher-form-config.service.ts b/apps/web/src/app/vault/org-vault/services/admin-console-cipher-form-config.service.ts
index 457b4e83d03..0d3db55d3d6 100644
--- a/apps/web/src/app/vault/org-vault/services/admin-console-cipher-form-config.service.ts
+++ b/apps/web/src/app/vault/org-vault/services/admin-console-cipher-form-config.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { inject, Injectable } from "@angular/core";
import { combineLatest, filter, firstValueFrom, map, switchMap } from "rxjs";
@@ -5,8 +7,10 @@ import { CollectionAdminService } from "@bitwarden/admin-console/common";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
-import { PolicyType, OrganizationUserStatusType } from "@bitwarden/common/admin-console/enums";
+import { OrganizationUserStatusType, PolicyType } from "@bitwarden/common/admin-console/enums";
+import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { CipherId } from "@bitwarden/common/types/guid";
+import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { CipherType } from "@bitwarden/common/vault/enums";
import { CipherData } from "@bitwarden/common/vault/models/data/cipher.data";
import { Cipher } from "@bitwarden/common/vault/models/domain/cipher";
@@ -25,6 +29,7 @@ export class AdminConsoleCipherFormConfigService implements CipherFormConfigServ
private organizationService: OrganizationService = inject(OrganizationService);
private routedVaultFilterService: RoutedVaultFilterService = inject(RoutedVaultFilterService);
private collectionAdminService: CollectionAdminService = inject(CollectionAdminService);
+ private cipherService: CipherService = inject(CipherService);
private apiService: ApiService = inject(ApiService);
private allowPersonalOwnership$ = this.policyService
@@ -57,7 +62,6 @@ export class AdminConsoleCipherFormConfigService implements CipherFormConfigServ
cipherId?: CipherId,
cipherType?: CipherType,
): Promise {
- const cipher = await this.getCipher(cipherId);
const [organization, allowPersonalOwnership, allOrganizations, allCollections] =
await firstValueFrom(
combineLatest([
@@ -74,7 +78,7 @@ export class AdminConsoleCipherFormConfigService implements CipherFormConfigServ
// Only allow the user to assign to their personal vault when cloning and
// the policies are enabled for it.
const allowPersonalOwnershipOnlyForClone = mode === "clone" ? allowPersonalOwnership : false;
-
+ const cipher = await this.getCipher(cipherId, organization);
return {
mode,
cipherType: cipher?.type ?? cipherType ?? CipherType.Login,
@@ -89,14 +93,26 @@ export class AdminConsoleCipherFormConfigService implements CipherFormConfigServ
};
}
- private async getCipher(id?: CipherId): Promise {
+ private async getCipher(id: CipherId | null, organization: Organization): Promise {
if (id == null) {
- return Promise.resolve(null);
+ return null;
}
- // Retrieve the cipher through the means of an admin
+ const localCipher = await this.cipherService.get(id);
+
+ // Fetch from the API because we don't need the permissions in local state OR the cipher was not found (e.g. unassigned)
+ if (organization.canEditAllCiphers || localCipher == null) {
+ return await this.getCipherFromAdminApi(id);
+ }
+
+ return localCipher;
+ }
+
+ private async getCipherFromAdminApi(id: CipherId): Promise {
const cipherResponse = await this.apiService.getCipherAdmin(id);
+ // Ensure admin response includes permissions that allow editing
cipherResponse.edit = true;
+ cipherResponse.viewPassword = true;
const cipherData = new CipherData(cipherResponse);
return new Cipher(cipherData);
diff --git a/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.component.ts b/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.component.ts
index 211d2346230..0a8a6c9da94 100644
--- a/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.component.ts
+++ b/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.component.ts
@@ -1,9 +1,12 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from "@angular/core";
import { firstValueFrom, Subject } from "rxjs";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction";
+import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { TreeNode } from "@bitwarden/common/vault/models/domain/tree-node";
@@ -42,6 +45,7 @@ export class VaultFilterComponent
protected platformUtilsService: PlatformUtilsService,
protected billingApiService: BillingApiServiceAbstraction,
protected dialogService: DialogService,
+ protected configService: ConfigService,
) {
super(
vaultFilterService,
@@ -50,6 +54,7 @@ export class VaultFilterComponent
platformUtilsService,
billingApiService,
dialogService,
+ configService,
);
}
diff --git a/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts b/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts
index be3707acc03..d28148c49dc 100644
--- a/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts
+++ b/apps/web/src/app/vault/org-vault/vault-header/vault-header.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core";
import { Router } from "@angular/router";
diff --git a/apps/web/src/app/vault/org-vault/vault.component.html b/apps/web/src/app/vault/org-vault/vault.component.html
index 9e9264e77cd..52f3ea026ff 100644
--- a/apps/web/src/app/vault/org-vault/vault.component.html
+++ b/apps/web/src/app/vault/org-vault/vault.component.html
@@ -10,12 +10,12 @@
{{ freeTrial.message }}
- {{ "routeToPaymentMethodTrigger" | i18n }}
+ {{ "clickHereToAddPaymentMethod" | i18n }}
diff --git a/apps/web/src/app/vault/org-vault/vault.component.ts b/apps/web/src/app/vault/org-vault/vault.component.ts
index 18cc6e49abc..e1aca825960 100644
--- a/apps/web/src/app/vault/org-vault/vault.component.ts
+++ b/apps/web/src/app/vault/org-vault/vault.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef } from "@angular/cdk/dialog";
import {
ChangeDetectorRef,
@@ -592,7 +594,9 @@ export class VaultComponent implements OnInit, OnDestroy {
organization$,
this.hasSubscription$.pipe(filter((hasSubscription) => hasSubscription !== null)),
]).pipe(
- filter(([org, hasSubscription]) => org.isOwner && hasSubscription),
+ filter(
+ ([org, hasSubscription]) => org.isOwner && hasSubscription && org.canViewBillingHistory,
+ ),
switchMap(([org]) =>
combineLatest([
of(org),
diff --git a/apps/web/src/app/vault/services/web-cipher-form-generation.service.ts b/apps/web/src/app/vault/services/web-cipher-form-generation.service.ts
index cfa0b28dbf0..8fa51e34e2a 100644
--- a/apps/web/src/app/vault/services/web-cipher-form-generation.service.ts
+++ b/apps/web/src/app/vault/services/web-cipher-form-generation.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { inject, Injectable } from "@angular/core";
import { firstValueFrom } from "rxjs";
diff --git a/apps/web/src/app/vault/settings/purge-vault.component.ts b/apps/web/src/app/vault/settings/purge-vault.component.ts
index 9a677af7b5d..80b0448a39c 100644
--- a/apps/web/src/app/vault/settings/purge-vault.component.ts
+++ b/apps/web/src/app/vault/settings/purge-vault.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
import { FormControl, FormGroup } from "@angular/forms";
diff --git a/apps/web/src/app/vault/utils/collection-utils.ts b/apps/web/src/app/vault/utils/collection-utils.ts
index dacd6547c4e..2926ff3acee 100644
--- a/apps/web/src/app/vault/utils/collection-utils.ts
+++ b/apps/web/src/app/vault/utils/collection-utils.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import {
CollectionAdminView,
CollectionView,
diff --git a/apps/web/src/connectors/captcha.ts b/apps/web/src/connectors/captcha.ts
index 0362c9121f5..01a14a79a23 100644
--- a/apps/web/src/connectors/captcha.ts
+++ b/apps/web/src/connectors/captcha.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { b64Decode, getQsParam } from "./common";
declare let hcaptcha: any;
diff --git a/apps/web/src/connectors/duo-redirect.ts b/apps/web/src/connectors/duo-redirect.ts
index a113c6b9756..0f067b583b9 100644
--- a/apps/web/src/connectors/duo-redirect.ts
+++ b/apps/web/src/connectors/duo-redirect.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { getQsParam } from "./common";
import { TranslationService } from "./translation.service";
diff --git a/apps/web/src/connectors/sso.ts b/apps/web/src/connectors/sso.ts
index e049c64e5d9..3ec6a8f7a3d 100644
--- a/apps/web/src/connectors/sso.ts
+++ b/apps/web/src/connectors/sso.ts
@@ -1,4 +1,6 @@
-import { getQsParam } from "./common";
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
+import { getQsParam } from "./common";
require("./sso.scss");
diff --git a/apps/web/src/connectors/translation.service.ts b/apps/web/src/connectors/translation.service.ts
index 266ded7ce9c..309693081bc 100644
--- a/apps/web/src/connectors/translation.service.ts
+++ b/apps/web/src/connectors/translation.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { TranslationService as BaseTranslationService } from "@bitwarden/common/platform/services/translation.service";
import { SupportedTranslationLocales } from "../translation-constants";
diff --git a/apps/web/src/connectors/webauthn-fallback.ts b/apps/web/src/connectors/webauthn-fallback.ts
index 980a8b3dbf4..971bc5e44a1 100644
--- a/apps/web/src/connectors/webauthn-fallback.ts
+++ b/apps/web/src/connectors/webauthn-fallback.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { b64Decode, getQsParam } from "./common";
import { buildDataString, parseWebauthnJson } from "./common-webauthn";
import { TranslationService } from "./translation.service";
diff --git a/apps/web/src/connectors/webauthn.ts b/apps/web/src/connectors/webauthn.ts
index f3979bf62e6..14ba8a280ee 100644
--- a/apps/web/src/connectors/webauthn.ts
+++ b/apps/web/src/connectors/webauthn.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { b64Decode, getQsParam } from "./common";
import { buildDataString, parseWebauthnJson } from "./common-webauthn";
diff --git a/apps/web/src/images/integrations/aws-color.svg b/apps/web/src/images/integrations/aws-color.svg
new file mode 100644
index 00000000000..963b65027db
--- /dev/null
+++ b/apps/web/src/images/integrations/aws-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/aws-darkmode.svg b/apps/web/src/images/integrations/aws-darkmode.svg
new file mode 100644
index 00000000000..64c9ba3cf94
--- /dev/null
+++ b/apps/web/src/images/integrations/aws-darkmode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/azure-active-directory.svg b/apps/web/src/images/integrations/azure-active-directory.svg
new file mode 100644
index 00000000000..22ea64f1f03
--- /dev/null
+++ b/apps/web/src/images/integrations/azure-active-directory.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/bitwarden-vertical-blue.svg b/apps/web/src/images/integrations/bitwarden-vertical-blue.svg
new file mode 100644
index 00000000000..5d5200364d8
--- /dev/null
+++ b/apps/web/src/images/integrations/bitwarden-vertical-blue.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/jumpcloud-darkmode.svg b/apps/web/src/images/integrations/jumpcloud-darkmode.svg
new file mode 100644
index 00000000000..6969fceeb84
--- /dev/null
+++ b/apps/web/src/images/integrations/jumpcloud-darkmode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-auth0-badge-color.svg b/apps/web/src/images/integrations/logo-auth0-badge-color.svg
new file mode 100644
index 00000000000..24887cc7510
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-auth0-badge-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-duo-color.svg b/apps/web/src/images/integrations/logo-duo-color.svg
new file mode 100644
index 00000000000..0959a215708
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-duo-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-elastic-badge-color.svg b/apps/web/src/images/integrations/logo-elastic-badge-color.svg
new file mode 100644
index 00000000000..f6e00f3d40d
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-elastic-badge-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-google-badge-color.svg b/apps/web/src/images/integrations/logo-google-badge-color.svg
new file mode 100644
index 00000000000..c5a8fe50363
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-google-badge-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-jumpcloud-badge-color.svg b/apps/web/src/images/integrations/logo-jumpcloud-badge-color.svg
new file mode 100644
index 00000000000..9349186d8a1
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-jumpcloud-badge-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-keycloak-icon.svg b/apps/web/src/images/integrations/logo-keycloak-icon.svg
new file mode 100644
index 00000000000..862ffcb6c2b
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-keycloak-icon.svg
@@ -0,0 +1,23 @@
+
diff --git a/apps/web/src/images/integrations/logo-microsoft-entra-id-color.svg b/apps/web/src/images/integrations/logo-microsoft-entra-id-color.svg
new file mode 100644
index 00000000000..a6150c29c62
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-microsoft-entra-id-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-microsoft-intune-color.svg b/apps/web/src/images/integrations/logo-microsoft-intune-color.svg
new file mode 100644
index 00000000000..2611cf4b3b8
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-microsoft-intune-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-microsoft-sentinel-color.svg b/apps/web/src/images/integrations/logo-microsoft-sentinel-color.svg
new file mode 100644
index 00000000000..93135526c6f
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-microsoft-sentinel-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-okta-symbol-black.svg b/apps/web/src/images/integrations/logo-okta-symbol-black.svg
new file mode 100644
index 00000000000..876727ad56d
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-okta-symbol-black.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-onelogin-badge-color.svg b/apps/web/src/images/integrations/logo-onelogin-badge-color.svg
new file mode 100644
index 00000000000..e2d9ccbc0c1
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-onelogin-badge-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-panther-round-color.svg b/apps/web/src/images/integrations/logo-panther-round-color.svg
new file mode 100644
index 00000000000..bed05507681
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-panther-round-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-ping-identity-badge-color.svg b/apps/web/src/images/integrations/logo-ping-identity-badge-color.svg
new file mode 100644
index 00000000000..e34762c249c
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-ping-identity-badge-color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-rapid7-black.svg b/apps/web/src/images/integrations/logo-rapid7-black.svg
new file mode 100644
index 00000000000..e2bb7a6f4a8
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-rapid7-black.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/logo-splunk-black.svg b/apps/web/src/images/integrations/logo-splunk-black.svg
new file mode 100644
index 00000000000..d25247bfca8
--- /dev/null
+++ b/apps/web/src/images/integrations/logo-splunk-black.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/okta-darkmode.svg b/apps/web/src/images/integrations/okta-darkmode.svg
new file mode 100644
index 00000000000..e16e0d3c700
--- /dev/null
+++ b/apps/web/src/images/integrations/okta-darkmode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/onelogin-darkmode.svg b/apps/web/src/images/integrations/onelogin-darkmode.svg
new file mode 100644
index 00000000000..764b1684faa
--- /dev/null
+++ b/apps/web/src/images/integrations/onelogin-darkmode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/rapid7-darkmode.svg b/apps/web/src/images/integrations/rapid7-darkmode.svg
new file mode 100644
index 00000000000..b5f25aae8bd
--- /dev/null
+++ b/apps/web/src/images/integrations/rapid7-darkmode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/images/integrations/splunk-darkmode.svg b/apps/web/src/images/integrations/splunk-darkmode.svg
new file mode 100644
index 00000000000..a4515c0a18c
--- /dev/null
+++ b/apps/web/src/images/integrations/splunk-darkmode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index 25172f7c779..06728929912 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -3903,30 +3903,30 @@
"updateBrowserDesc": {
"message": "You are using an unsupported web browser. The web vault may not function properly."
},
- "freeTrialEndPrompt": {
- "message": "Your free trial ends in $COUNT$ days. To maintain your subscription,",
+ "freeTrialEndPromptCount": {
+ "message": "Your free trial ends in $COUNT$ days.",
"placeholders": {
"count": {
- "content": "$1",
- "example": "You must set up 2FA on your user account before you can join this organization."
- }
- }
- },
- "freeTrialEndPromptAboveTwoDays": {
- "message": "$ORGANIZATION$, your free trial ends in $COUNT$ days. To maintain your subscription,",
- "placeholders": {
- "count": {
- "content": "$2",
- "example": "organization name"
- },
- "organization": {
"content": "$1",
"example": "remaining days"
}
}
},
- "freeTrialEndPromptForOneDay": {
- "message": "$ORGANIZATION$, your free trial ends tomorrow. To maintain your subscription,",
+ "freeTrialEndPromptMultipleDays": {
+ "message": "$ORGANIZATION$, your free trial ends in $COUNT$ days.",
+ "placeholders": {
+ "count": {
+ "content": "$2",
+ "example": "remaining days"
+ },
+ "organization": {
+ "content": "$1",
+ "example": "organization name"
+ }
+ }
+ },
+ "freeTrialEndPromptTomorrow": {
+ "message": "$ORGANIZATION$, your free trial ends tomorrow.",
"placeholders": {
"organization": {
"content": "$1",
@@ -3934,11 +3934,11 @@
}
}
},
- "freeTrialEndPromptForOneDayNoOrgName": {
- "message": "Your free trial ends tomorrow. To maintain your subscription,"
+ "freeTrialEndPromptTomorrowNoOrgName": {
+ "message": "Your free trial ends tomorrow."
},
- "freeTrialEndPromptForLessThanADay": {
- "message": "$ORGANIZATION$, your free trial ends today. To maintain your subscription,",
+ "freeTrialEndPromptToday": {
+ "message": "$ORGANIZATION$, your free trial ends today.",
"placeholders": {
"organization": {
"content": "$1",
@@ -3946,11 +3946,11 @@
}
}
},
- "freeTrialEndingSoonWithoutOrgName": {
- "message": "Your free trial ends today. To maintain your subscription,"
+ "freeTrialEndingTodayWithoutOrgName": {
+ "message": "Your free trial ends today."
},
- "routeToPaymentMethodTrigger": {
- "message": "add a payment method."
+ "clickHereToAddPaymentMethod": {
+ "message": "Click here to add a payment method."
},
"joinOrganization": {
"message": "Join organization"
@@ -6831,6 +6831,10 @@
"message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning",
"description": "the text, 'SCIM', is an acronym and should not be translated."
},
+ "scimIntegrationDescription": {
+ "message": "Automatically provision users and groups with your preferred identity provider via SCIM provisioning. Find supported integrations",
+ "description": "the text, 'SCIM', is an acronym and should not be translated."
+ },
"scimEnabledCheckboxDesc": {
"message": "Enable SCIM",
"description": "the text, 'SCIM', is an acronym and should not be translated."
@@ -9025,44 +9029,103 @@
"sdksDesc": {
"message": "Use Bitwarden Secrets Manager SDK in the following programming languages to build your own applications."
},
- "setUpGithubActions": {
- "message": "Set up Github Actions"
+ "singleSignOn": {
+ "message": "Single sign-on"
},
- "setUpKubernetes": {
- "message": "Set up Kubernetes"
+ "ssoDescStart": {
+ "message": "Configure",
+ "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider."
},
- "setUpGitlabCICD": {
- "message": "Set up GitLab CI/CD"
+ "ssoDescEnd": {
+ "message": "for Bitwarden using the implementation guide for your Identity Provider.",
+ "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider."
},
- "setUpAnsible": {
- "message": "Set up Ansible"
+ "userProvisioning":{
+ "message": "User provisioning"
},
- "rustSDKRepo": {
- "message": "View Rust repository"
+ "scimIntegration": {
+ "message": "SCIM"
},
- "cSharpSDKRepo": {
- "message": "View C# repository"
+ "scimIntegrationDescStart": {
+ "message": "Configure ",
+ "description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider"
},
- "cPlusPlusSDKRepo": {
- "message": "View C++ repository"
+ "scimIntegrationDescEnd": {
+ "message": "(System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider.",
+ "description": "This represents the end of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider"
},
- "jsWebAssemblySDKRepo": {
- "message": "View JS WebAssembly repository"
+ "bwdc":{
+ "message": "Bitwarden Directory Connector"
},
- "javaSDKRepo": {
- "message": "View Java repository"
+ "bwdcDesc": {
+ "message": "Configure Bitwarden Directory Connector to automatically provision users and groups using the implementation guide for your Identity Provider."
},
- "pythonSDKRepo": {
- "message": "View Python repository"
+ "eventManagement":{
+ "message": "Event management"
},
- "phpSDKRepo": {
- "message": "View php repository"
+ "eventManagementDesc":{
+ "message": "Integrate Bitwarden event logs with your SIEM (system information and event management) system by using the implementation guide for your platform."
},
- "rubySDKRepo": {
- "message": "View Ruby repository"
+ "deviceManagement":{
+ "message": "Device management"
},
- "goSDKRepo": {
- "message": "View Go repository"
+ "deviceManagementDesc":{
+ "message": "Configure device management for Bitwarden using the implementation guide for your platform."
+
+ },
+ "integrationCardTooltip":{
+ "message": "Launch $INTEGRATION$ implementation guide.",
+ "placeholders": {
+ "integration": {
+ "content": "$1",
+ "example": "Google"
+ }
+ }
+ },
+ "smIntegrationTooltip":{
+ "message": "Set up $INTEGRATION$.",
+ "placeholders": {
+ "integration": {
+ "content": "$1",
+ "example": "Google"
+ }
+ }
+ },
+ "smSdkTooltip":{
+ "message": "View $SDK$ repository",
+ "placeholders": {
+ "sdk": {
+ "content": "$1",
+ "example": "Rust"
+ }
+ }
+ },
+ "integrationCardAriaLabel":{
+ "message": "open $INTEGRATION$ implementation guide in a new tab.",
+ "placeholders": {
+ "integration": {
+ "content": "$1",
+ "example": "google"
+ }
+ }
+ },
+ "smSdkAriaLabel":{
+ "message": "view $SDK$ repository in a new tab.",
+ "placeholders": {
+ "sdk": {
+ "content": "$1",
+ "example": "rust"
+ }
+ }
+ },
+ "smIntegrationCardAriaLabel":{
+ "message": "set up $INTEGRATION$ implementation guide in a new tab.",
+ "placeholders": {
+ "integration": {
+ "content": "$1",
+ "example": "google"
+ }
+ }
},
"createNewClientToManageAsProvider": {
"message": "Create a new client organization to manage as a Provider. Additional seats will be reflected in the next billing cycle."
@@ -9224,18 +9287,6 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
- "billingInvalidTaxIdError": {
- "message": "Invalid tax ID, if you believe this is an error please contact support."
- },
- "billingTaxIdTypeInferenceError": {
- "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
- },
- "billingPreviewInvalidTaxIdError": {
- "message": "Invalid tax ID, if you believe this is an error please contact support."
- },
- "billingPreviewInvoiceError": {
- "message": "An error occurred while previewing the invoice. Please try again later."
- },
"unverified": {
"message": "Unverified"
},
diff --git a/apps/web/src/scss/plugins.scss b/apps/web/src/scss/plugins.scss
index f4aa428532c..5fbd32ac4ee 100644
--- a/apps/web/src/scss/plugins.scss
+++ b/apps/web/src/scss/plugins.scss
@@ -12,7 +12,7 @@
}
#web-authn-frame {
- height: 290px;
+ height: 315px;
@include themify($themes) {
background: themed("imgLoading") 0 0 no-repeat;
}
diff --git a/apps/web/src/theme.ts b/apps/web/src/theme.ts
index 57193fadee4..870e30c80e0 100644
--- a/apps/web/src/theme.ts
+++ b/apps/web/src/theme.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
// Set theme on page load
// This is done outside the Angular app to avoid a flash of unthemed content before it loads
const setTheme = () => {
diff --git a/bitwarden_license/bit-cli/src/admin-console/device-approval/approve-all.command.ts b/bitwarden_license/bit-cli/src/admin-console/device-approval/approve-all.command.ts
index bb00c50ab12..db63a3c1c68 100644
--- a/bitwarden_license/bit-cli/src/admin-console/device-approval/approve-all.command.ts
+++ b/bitwarden_license/bit-cli/src/admin-console/device-approval/approve-all.command.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { firstValueFrom } from "rxjs";
import { OrganizationAuthRequestService } from "@bitwarden/bit-common/admin-console/auth-requests";
diff --git a/bitwarden_license/bit-cli/src/admin-console/device-approval/deny-all.command.ts b/bitwarden_license/bit-cli/src/admin-console/device-approval/deny-all.command.ts
index db73773f086..f5dff801f27 100644
--- a/bitwarden_license/bit-cli/src/admin-console/device-approval/deny-all.command.ts
+++ b/bitwarden_license/bit-cli/src/admin-console/device-approval/deny-all.command.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { firstValueFrom } from "rxjs";
import { Response } from "@bitwarden/cli/models/response";
diff --git a/bitwarden_license/bit-cli/src/service-container.ts b/bitwarden_license/bit-cli/src/service-container.ts
index f82efecdceb..9e659c1a59d 100644
--- a/bitwarden_license/bit-cli/src/service-container.ts
+++ b/bitwarden_license/bit-cli/src/service-container.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import {
OrganizationAuthRequestService,
OrganizationAuthRequestApiService,
diff --git a/bitwarden_license/bit-cli/tsconfig.json b/bitwarden_license/bit-cli/tsconfig.json
index 9440a03375a..e3d6cc5c7b7 100644
--- a/bitwarden_license/bit-cli/tsconfig.json
+++ b/bitwarden_license/bit-cli/tsconfig.json
@@ -29,7 +29,12 @@
],
"@bitwarden/node/*": ["../../libs/node/src/*"],
"@bitwarden/bit-common/*": ["../../bitwarden_license/bit-common/src/*"]
- }
+ },
+ "plugins": [
+ {
+ "name": "typescript-strict-plugin"
+ }
+ ]
},
"include": ["src", "src/**/*.spec.ts"]
}
diff --git a/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts b/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts
index b2c4c1c04f9..4c4507e5cb8 100644
--- a/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts
+++ b/bitwarden_license/bit-common/src/admin-console/auth-requests/organization-auth-request.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import {
OrganizationUserApiService,
OrganizationUserResetPasswordDetailsResponse,
diff --git a/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-auth-request.view.ts b/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-auth-request.view.ts
index d9f36013521..d32d6fcfbc7 100644
--- a/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-auth-request.view.ts
+++ b/bitwarden_license/bit-common/src/admin-console/auth-requests/pending-auth-request.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { View } from "@bitwarden/common/models/view/view";
import { PendingOrganizationAuthRequestResponse } from ".";
diff --git a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/password-health.service.ts b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/password-health.service.ts
index 4070b23d29e..f2f9a9868f7 100644
--- a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/password-health.service.ts
+++ b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/password-health.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Inject, Injectable } from "@angular/core";
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
diff --git a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts
index 4a4cbe312c2..760877ff8bc 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/device-approvals/device-approvals.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { BehaviorSubject, Subject, switchMap, takeUntil, tap } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component.ts b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component.ts
index 7141f867882..ae3dfc28d9e 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-add-edit-dialog/domain-add-edit-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject, OnDestroy, OnInit } from "@angular/core";
import { FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-verification.component.ts b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-verification.component.ts
index 9c0bae10526..26347a515a0 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-verification.component.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/domain-verification/domain-verification.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute, Params } from "@angular/router";
import {
diff --git a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/scim.component.html b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/scim.component.html
index e30883515e0..7ade2e6c63d 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/scim.component.html
+++ b/bitwarden_license/bit-web/src/app/admin-console/organizations/manage/scim.component.html
@@ -1,6 +1,11 @@
-{{ "scimDescription" | i18n }}
+
+ {{ "scimIntegrationDescription" | i18n }}
+
+
-
+
{{ "submit" | i18n }}
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.ts
index 079174b48b5..46fd6989681 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit, ViewChild } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
import { ActivatedRoute, Router } from "@angular/router";
@@ -109,7 +111,9 @@ export class SetupComponent implements OnInit, OnDestroy {
try {
this.formGroup.markAllAsTouched();
- if (!this.manageTaxInformationComponent.validate() || !this.formGroup.valid) {
+ const formIsValid = this.formGroup.valid && this.manageTaxInformationComponent.touch();
+
+ if (!formIsValid) {
return;
}
@@ -127,11 +131,14 @@ export class SetupComponent implements OnInit, OnDestroy {
request.taxInfo.country = taxInformation.country;
request.taxInfo.postalCode = taxInformation.postalCode;
- request.taxInfo.taxId = taxInformation.taxId;
- request.taxInfo.line1 = taxInformation.line1;
- request.taxInfo.line2 = taxInformation.line2;
- request.taxInfo.city = taxInformation.city;
- request.taxInfo.state = taxInformation.state;
+
+ if (taxInformation.includeTaxId) {
+ request.taxInfo.taxId = taxInformation.taxId;
+ request.taxInfo.line1 = taxInformation.line1;
+ request.taxInfo.line2 = taxInformation.line2;
+ request.taxInfo.city = taxInformation.city;
+ request.taxInfo.state = taxInformation.state;
+ }
const provider = await this.providerApiService.postProviderSetup(this.providerId, request);
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/verify-recover-delete-provider.component.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/verify-recover-delete-provider.component.ts
index 68264593b8e..83a87d8bc6c 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/verify-recover-delete-provider.component.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/providers/verify-recover-delete-provider.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit, SecurityContext } from "@angular/core";
import { DomSanitizer } from "@angular/platform-browser";
import { ActivatedRoute, Router } from "@angular/router";
diff --git a/bitwarden_license/bit-web/src/app/auth/sso/sso.component.ts b/bitwarden_license/bit-web/src/app/auth/sso/sso.component.ts
index e37da8c7840..87f2a3dd9d9 100644
--- a/bitwarden_license/bit-web/src/app/auth/sso/sso.component.ts
+++ b/bitwarden_license/bit-web/src/app/auth/sso/sso.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import {
AbstractControl,
diff --git a/bitwarden_license/bit-web/src/app/billing/providers/billing-history/provider-billing-history.component.ts b/bitwarden_license/bit-web/src/app/billing/providers/billing-history/provider-billing-history.component.ts
index 70dd9d676b3..cf45d404c01 100644
--- a/bitwarden_license/bit-web/src/app/billing/providers/billing-history/provider-billing-history.component.ts
+++ b/bitwarden_license/bit-web/src/app/billing/providers/billing-history/provider-billing-history.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DatePipe } from "@angular/common";
import { Component } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
diff --git a/bitwarden_license/bit-web/src/app/billing/providers/clients/create-client-dialog.component.html b/bitwarden_license/bit-web/src/app/billing/providers/clients/create-client-dialog.component.html
index e72b9ed661a..a08f5710f1e 100644
--- a/bitwarden_license/bit-web/src/app/billing/providers/clients/create-client-dialog.component.html
+++ b/bitwarden_license/bit-web/src/app/billing/providers/clients/create-client-dialog.component.html
@@ -22,7 +22,7 @@
{{ "selected" | i18n }}
diff --git a/bitwarden_license/bit-web/src/app/billing/providers/clients/create-client-dialog.component.ts b/bitwarden_license/bit-web/src/app/billing/providers/clients/create-client-dialog.component.ts
index 25c07630546..18910491a0c 100644
--- a/bitwarden_license/bit-web/src/app/billing/providers/clients/create-client-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/billing/providers/clients/create-client-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { Component, Inject, OnInit } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
@@ -67,7 +69,7 @@ export class CreateClientDialogComponent implements OnInit {
switch (selected) {
case true: {
return [
- "tw-group",
+ "tw-group/plan-card-container",
"tw-cursor-pointer",
"tw-block",
"tw-rounded",
diff --git a/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-client-name-dialog.component.ts b/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-client-name-dialog.component.ts
index 2e71a6c2d76..0a75ee4999d 100644
--- a/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-client-name-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-client-name-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-client-subscription-dialog.component.ts b/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-client-subscription-dialog.component.ts
index b87c110ee32..ee0e5c07c68 100644
--- a/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-client-subscription-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-client-subscription-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { Component, Inject, OnInit } from "@angular/core";
import { FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-clients.component.ts b/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-clients.component.ts
index b41702e47a3..d413551b743 100644
--- a/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-clients.component.ts
+++ b/bitwarden_license/bit-web/src/app/billing/providers/clients/manage-clients.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { ActivatedRoute, Router } from "@angular/router";
diff --git a/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription-status.component.ts b/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription-status.component.ts
index dea7d4ca197..6cf0b21169b 100644
--- a/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription-status.component.ts
+++ b/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription-status.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DatePipe } from "@angular/common";
import { Component, Input } from "@angular/core";
diff --git a/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription.component.ts b/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription.component.ts
index 1ea888d6ebc..a6b27b9f3dd 100644
--- a/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription.component.ts
+++ b/bitwarden_license/bit-web/src/app/billing/providers/subscription/provider-subscription.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { Subject, concatMap, takeUntil } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-grid/integration-grid.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-grid/integration-grid.component.ts
deleted file mode 100644
index 058d59d702c..00000000000
--- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integration-grid/integration-grid.component.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Component, Input } from "@angular/core";
-
-import { IntegrationType } from "@bitwarden/common/enums";
-
-import { Integration } from "../models/integration";
-
-@Component({
- selector: "sm-integration-grid",
- templateUrl: "./integration-grid.component.html",
-})
-export class IntegrationGridComponent {
- @Input() integrations: Integration[];
-
- protected IntegrationType = IntegrationType;
-}
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.html
index a2f21888613..db3db75897d 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.html
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.html
@@ -4,7 +4,11 @@
{{ "integrationsDesc" | i18n }}
-
+
@@ -12,5 +16,9 @@
{{ "sdks" | i18n }}
{{ "sdksDesc" | i18n }}
-
+
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.spec.ts
index 6c8ea28bc2f..e4a65f7ddd8 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.spec.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.spec.ts
@@ -4,14 +4,17 @@ import { By } from "@angular/platform-browser";
import { mock } from "jest-mock-extended";
import { of } from "rxjs";
+import { SharedModule } from "@bitwarden/components/src/shared";
+import {
+ IntegrationCardComponent,
+ IntegrationGridComponent,
+} from "@bitwarden/web-vault/app/shared";
+
import { SYSTEM_THEME_OBSERVABLE } from "../../../../../../libs/angular/src/services/injection-tokens";
import { I18nService } from "../../../../../../libs/common/src/platform/abstractions/i18n.service";
import { ThemeType } from "../../../../../../libs/common/src/platform/enums";
import { ThemeStateService } from "../../../../../../libs/common/src/platform/theming/theme-state.service";
-import { I18nPipe } from "../../../../../../libs/components/src/shared/i18n.pipe";
-import { IntegrationCardComponent } from "./integration-card/integration-card.component";
-import { IntegrationGridComponent } from "./integration-grid/integration-grid.component";
import { IntegrationsComponent } from "./integrations.component";
@Component({
@@ -31,18 +34,12 @@ describe("IntegrationsComponent", () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- declarations: [
- IntegrationsComponent,
- IntegrationGridComponent,
- IntegrationCardComponent,
- MockHeaderComponent,
- MockNewMenuComponent,
- I18nPipe,
- ],
+ declarations: [IntegrationsComponent, MockHeaderComponent, MockNewMenuComponent],
+ imports: [IntegrationGridComponent, IntegrationCardComponent, SharedModule],
providers: [
{
provide: I18nService,
- useValue: mock ({ t: (key) => key }),
+ useValue: mock(),
},
{
provide: ThemeStateService,
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.ts
index 9e846d45034..b8f9386d715 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.component.ts
@@ -1,9 +1,7 @@
import { Component } from "@angular/core";
import { IntegrationType } from "@bitwarden/common/enums";
-import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
-
-import { Integration } from "./models/integration";
+import { Integration } from "@bitwarden/web-vault/app/shared";
@Component({
selector: "sm-integrations",
@@ -12,11 +10,10 @@ import { Integration } from "./models/integration";
export class IntegrationsComponent {
private integrationsAndSdks: Integration[] = [];
- constructor(i18nService: I18nService) {
+ constructor() {
this.integrationsAndSdks = [
{
name: "Rust",
- linkText: i18nService.t("rustSDKRepo"),
linkURL: "https://github.com/bitwarden/sdk",
image: "../../../../../../../images/secrets-manager/sdks/rust.svg",
imageDarkMode: "../../../../../../../images/secrets-manager/sdks/rust-white.svg",
@@ -24,7 +21,6 @@ export class IntegrationsComponent {
},
{
name: "GitHub Actions",
- linkText: i18nService.t("setUpGithubActions"),
linkURL: "https://bitwarden.com/help/github-actions-integration/",
image: "../../../../../../../images/secrets-manager/integrations/github.svg",
imageDarkMode: "../../../../../../../images/secrets-manager/integrations/github-white.svg",
@@ -32,7 +28,6 @@ export class IntegrationsComponent {
},
{
name: "GitLab CI/CD",
- linkText: i18nService.t("setUpGitlabCICD"),
linkURL: "https://bitwarden.com/help/gitlab-integration/",
image: "../../../../../../../images/secrets-manager/integrations/gitlab.svg",
imageDarkMode: "../../../../../../../images/secrets-manager/integrations/gitlab-white.svg",
@@ -40,35 +35,30 @@ export class IntegrationsComponent {
},
{
name: "Ansible",
- linkText: i18nService.t("setUpAnsible"),
linkURL: "https://bitwarden.com/help/ansible-integration/",
image: "../../../../../../../images/secrets-manager/integrations/ansible.svg",
type: IntegrationType.Integration,
},
{
name: "C#",
- linkText: i18nService.t("cSharpSDKRepo"),
linkURL: "https://github.com/bitwarden/sdk/tree/main/languages/csharp",
image: "../../../../../../../images/secrets-manager/sdks/c-sharp.svg",
type: IntegrationType.SDK,
},
{
name: "C++",
- linkText: i18nService.t("cPlusPlusSDKRepo"),
linkURL: "https://github.com/bitwarden/sdk/tree/main/languages/cpp",
image: "../../../../../../../images/secrets-manager/sdks/c-plus-plus.png",
type: IntegrationType.SDK,
},
{
name: "Go",
- linkText: i18nService.t("goSDKRepo"),
linkURL: "https://github.com/bitwarden/sdk/tree/main/languages/go",
image: "../../../../../../../images/secrets-manager/sdks/go.svg",
type: IntegrationType.SDK,
},
{
name: "Java",
- linkText: i18nService.t("javaSDKRepo"),
linkURL: "https://github.com/bitwarden/sdk/tree/main/languages/java",
image: "../../../../../../../images/secrets-manager/sdks/java.svg",
imageDarkMode: "../../../../../../../images/secrets-manager/sdks/java-white.svg",
@@ -76,35 +66,30 @@ export class IntegrationsComponent {
},
{
name: "JS WebAssembly",
- linkText: i18nService.t("jsWebAssemblySDKRepo"),
linkURL: "https://github.com/bitwarden/sdk/tree/main/languages/js",
image: "../../../../../../../images/secrets-manager/sdks/wasm.svg",
type: IntegrationType.SDK,
},
{
name: "php",
- linkText: i18nService.t("phpSDKRepo"),
linkURL: "https://github.com/bitwarden/sdk/tree/main/languages/php",
image: "../../../../../../../images/secrets-manager/sdks/php.svg",
type: IntegrationType.SDK,
},
{
name: "Python",
- linkText: i18nService.t("pythonSDKRepo"),
linkURL: "https://github.com/bitwarden/sdk/tree/main/languages/python",
image: "../../../../../../../images/secrets-manager/sdks/python.svg",
type: IntegrationType.SDK,
},
{
name: "Ruby",
- linkText: i18nService.t("rubySDKRepo"),
linkURL: "https://github.com/bitwarden/sdk/tree/main/languages/ruby",
image: "../../../../../../../images/secrets-manager/sdks/ruby.png",
type: IntegrationType.SDK,
},
{
name: "Kubernetes Operator",
- linkText: i18nService.t("setUpKubernetes"),
linkURL: "https://bitwarden.com/help/secrets-manager-kubernetes-operator/",
image: "../../../../../../../images/secrets-manager/integrations/kubernetes.svg",
type: IntegrationType.Integration,
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.module.ts b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.module.ts
index 0d26b626f16..b79892f5ed6 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.module.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/integrations/integrations.module.ts
@@ -1,15 +1,22 @@
import { NgModule } from "@angular/core";
+import {
+ IntegrationCardComponent,
+ IntegrationGridComponent,
+} from "@bitwarden/web-vault/app/shared";
+
import { SecretsManagerSharedModule } from "../shared/sm-shared.module";
-import { IntegrationCardComponent } from "./integration-card/integration-card.component";
-import { IntegrationGridComponent } from "./integration-grid/integration-grid.component";
import { IntegrationsRoutingModule } from "./integrations-routing.module";
import { IntegrationsComponent } from "./integrations.component";
@NgModule({
- imports: [SecretsManagerSharedModule, IntegrationsRoutingModule],
- declarations: [IntegrationsComponent, IntegrationGridComponent, IntegrationCardComponent],
- providers: [],
+ imports: [
+ SecretsManagerSharedModule,
+ IntegrationsRoutingModule,
+ IntegrationCardComponent,
+ IntegrationGridComponent,
+ ],
+ declarations: [IntegrationsComponent],
})
export class IntegrationsModule {}
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts
index 32ff1c944fc..adf01afd10c 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/layout/navigation.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/access-policy.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/access-policy.view.ts
index 0863bb0cccf..676f1447f3e 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/access-policy.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/access-policy.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
class BaseAccessPolicyView {
read: boolean;
write: boolean;
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/potential-grantee.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/potential-grantee.view.ts
index 5a6af6eb13c..75649f8a43b 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/potential-grantee.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/potential-grantee.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class PotentialGranteeView {
id: string;
name: string;
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/project-people-access-policies.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/project-people-access-policies.view.ts
index 9a35e76a615..2cf3986d10d 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/project-people-access-policies.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/project-people-access-policies.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { GroupAccessPolicyView, UserAccessPolicyView } from "./access-policy.view";
export class ProjectPeopleAccessPoliciesView {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/project-service-accounts-access-policies.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/project-service-accounts-access-policies.view.ts
index 9faaa29b697..94ecdab5318 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/project-service-accounts-access-policies.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/project-service-accounts-access-policies.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { ServiceAccountAccessPolicyView } from "./access-policy.view";
export class ProjectServiceAccountsAccessPoliciesView {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/secret-access-policies.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/secret-access-policies.view.ts
index 8742021a421..41cf4e637a3 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/secret-access-policies.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/secret-access-policies.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import {
GroupAccessPolicyView,
UserAccessPolicyView,
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/service-account-granted-policies.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/service-account-granted-policies.view.ts
index e055daa199a..9a007b823ca 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/service-account-granted-policies.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/service-account-granted-policies.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { GrantedProjectAccessPolicyView } from "./access-policy.view";
export class ServiceAccountGrantedPoliciesView {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/service-account-people-access-policies.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/service-account-people-access-policies.view.ts
index 2ef4eedc33e..2fd7e54994d 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/service-account-people-access-policies.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/access-policies/service-account-people-access-policies.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { GroupAccessPolicyView, UserAccessPolicyView } from "./access-policy.view";
export class ServiceAccountPeopleAccessPoliciesView {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts
index 5f0aa9647cf..df15d3fc373 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class ProjectListView {
id: string;
organizationId: string;
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts
index 09091d2a754..7f501467d32 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class ProjectView {
id: string;
organizationId: string;
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-list.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-list.view.ts
index a8c4ea51c38..7d28236d6f7 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-list.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-list.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SecretProjectView } from "./secret-project.view";
export class SecretListView {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-project.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-project.view.ts
index 7feb2804b9c..50951b0cd90 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-project.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-project.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class SecretProjectView {
id: string;
name: string;
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret.view.ts
index f08a639a590..5d221ba03df 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SecretProjectView } from "./secret-project.view";
export class SecretView {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/service-account.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/service-account.view.ts
index a0ce182a02d..3df383ef96c 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/service-account.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/service-account.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class ServiceAccountView {
id: string;
organizationId: string;
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html
index 31746e7601c..2de9a4c4f30 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.html
@@ -10,12 +10,12 @@
{{ freeTrial.message }}
- {{ "routeToPaymentMethodTrigger" | i18n }}
+ {{ "clickHereToAddPaymentMethod" | i18n }}
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts
index 3585f09faf6..a95192e0d91 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/overview/overview.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute, Router } from "@angular/router";
import {
@@ -140,7 +142,7 @@ export class OverviewComponent implements OnInit, OnDestroy {
});
this.freeTrial$ = org$.pipe(
- filter((org) => org.isOwner),
+ filter((org) => org.isOwner && org.canViewBillingHistory && org.canViewSubscription),
switchMap((org) =>
combineLatest([
of(org),
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-delete-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-delete-dialog.component.ts
index feb366823cb..3380d280d44 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-delete-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-delete-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject, OnInit } from "@angular/core";
import {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts
index 09f3d9573ac..f266ff0adf0 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject, OnInit } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/guards/project-access.guard.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/guards/project-access.guard.ts
index 1f694d6999a..2c6723a56a2 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/guards/project-access.guard.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/guards/project-access.guard.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { inject } from "@angular/core";
import { ActivatedRouteSnapshot, CanActivateFn, createUrlTreeFromSnapshot } from "@angular/router";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/requests/project.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/requests/project.request.ts
index 8e9f2c72c10..18d3dad6ea6 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/requests/project.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/requests/project.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { EncString } from "@bitwarden/common/platform/models/domain/enc-string";
export class ProjectRequest {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts
index db1ee181e6c..ee2395b3f83 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Subject } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts
index 2500416880b..4a0c37cb4a9 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-people.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core";
import { FormControl, FormGroup } from "@angular/forms";
import { ActivatedRoute, Router } from "@angular/router";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.ts
index ce42fcada60..b9c6d86cefc 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-secrets.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { combineLatest, combineLatestWith, filter, Observable, startWith, switchMap } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts
index 4ac14b3b362..d289f9f7b1f 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project-service-accounts.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core";
import { FormControl, FormGroup } from "@angular/forms";
import { ActivatedRoute } from "@angular/router";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts
index fb7f2d74528..08c9446e485 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts
index fd59014642a..8ced29fa08e 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/projects/projects.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { combineLatest, lastValueFrom, Observable, startWith, switchMap } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-delete.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-delete.component.ts
index 10d58bc2ea5..40d359e9246 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-delete.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-delete.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts
index b656570a54c..c12930bb048 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/dialog/secret-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { ChangeDetectorRef, Component, Inject, OnDestroy, OnInit } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/requests/secret.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/requests/secret.request.ts
index 9723bc9ed6c..e8658112a50 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/requests/secret.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/requests/secret.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SecretAccessPoliciesRequest } from "../../shared/access-policies/models/requests/secret-access-policies.request";
export class SecretRequest {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts
index 4547831ae1d..950d3c42ccb 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Subject } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts
index 1744e970361..5d1ed780816 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secrets.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { combineLatestWith, Observable, startWith, switchMap } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.ts
index e24b0488b2c..caca8c92aa8 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SelectionModel } from "@angular/cdk/collections";
import { Component, EventEmitter, Input, Output } from "@angular/core";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts
index 25ad93706ab..a4f0c077efd 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access.service.ts
index 6b04e53feba..8eb4a5120a2 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access.service.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Subject } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-create-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-create-dialog.component.ts
index ecada8be72a..5aca91166a6 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-create-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-create-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject, OnInit } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-dialog.component.ts
index fbc00587897..4f761f7f279 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject, OnInit } from "@angular/core";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/expiration-options.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/expiration-options.component.ts
index e224b8e1e9a..2273b42897c 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/expiration-options.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/expiration-options.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DatePipe } from "@angular/common";
import { Component, Input, OnDestroy, OnInit } from "@angular/core";
import {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts
index 47deeb2a418..96e3b58b633 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/config/config.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute, Params } from "@angular/router";
import { Subject, concatMap, takeUntil } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.ts
index c44daced812..58587065265 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-delete-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
import {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.ts
index 27e9152b474..bf283ad5a5b 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/dialog/service-account-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject, OnInit } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/event-logs/service-accounts-events.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/event-logs/service-accounts-events.component.ts
index f231a273fc5..6538ae49adb 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/event-logs/service-accounts-events.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/event-logs/service-accounts-events.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { Subject, takeUntil } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/guards/service-account-access.guard.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/guards/service-account-access.guard.ts
index 0aa83aa0e96..0f182a5ca8c 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/guards/service-account-access.guard.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/guards/service-account-access.guard.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { inject } from "@angular/core";
import { ActivatedRouteSnapshot, CanActivateFn, createUrlTreeFromSnapshot } from "@angular/router";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/access-token.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/access-token.request.ts
index 3801e7398fe..37232cc86ff 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/access-token.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/access-token.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { EncString } from "@bitwarden/common/platform/models/domain/enc-string";
export class AccessTokenRequest {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/revoke-access-tokens.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/revoke-access-tokens.request.ts
index 51266e802a0..4ef87e3090e 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/revoke-access-tokens.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/revoke-access-tokens.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class RevokeAccessTokensRequest {
ids: string[];
}
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/service-account.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/service-account.request.ts
index 47221b2b82a..6d7d688fee0 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/service-account.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/requests/service-account.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { EncString } from "@bitwarden/common/platform/models/domain/enc-string";
export class ServiceAccountRequest {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/view/access-token.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/view/access-token.view.ts
index e9678a0f3fc..2ecece44956 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/view/access-token.view.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/models/view/access-token.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class AccessTokenView {
id: string;
name: string;
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts
index 58675b15b37..a57251c4f77 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/people/service-account-people.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core";
import { FormControl, FormGroup } from "@angular/forms";
import { ActivatedRoute, Router } from "@angular/router";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts
index 2ee95848012..34a48af3055 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/projects/service-account-projects.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core";
import { FormControl, FormGroup } from "@angular/forms";
import { ActivatedRoute } from "@angular/router";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.ts
index de2544ffd26..74465e8ecef 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { Subject, combineLatest, filter, startWith, switchMap, takeUntil } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts
index dcca8719483..a85f5c5e09a 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Subject } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.ts
index 75edd0f0932..cbffc80aa05 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts-list.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SelectionModel } from "@angular/cdk/collections";
import { Component, EventEmitter, Input, OnDestroy, Output } from "@angular/core";
import { Subject, takeUntil } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.component.ts
index d015cccd99d..b134cb94cde 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-accounts.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { combineLatest, Observable, startWith, switchMap } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/error/sm-import-error-line.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/error/sm-import-error-line.ts
index 79efeaec09d..e204934b2aa 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/error/sm-import-error-line.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/error/sm-import-error-line.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class SecretsManagerImportErrorLine {
id: number;
type: "Project" | "Secret";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/error/sm-import-error.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/error/sm-import-error.ts
index e362a8f2593..da008ce277a 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/error/sm-import-error.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/error/sm-import-error.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SecretsManagerImportErrorLine } from "./sm-import-error-line";
export class SecretsManagerImportError extends Error {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-import.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-import.request.ts
index 4ef2a7181eb..7f5ba46777c 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-import.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-import.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SecretsManagerImportedProjectRequest } from "./sm-imported-project.request";
import { SecretsManagerImportedSecretRequest } from "./sm-imported-secret.request";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-imported-project.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-imported-project.request.ts
index bee91972bb8..12e8f8452dc 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-imported-project.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-imported-project.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { EncString } from "@bitwarden/common/platform/models/domain/enc-string";
export class SecretsManagerImportedProjectRequest {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-imported-secret.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-imported-secret.request.ts
index 55c5382b3ad..f9629e7c317 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-imported-secret.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/requests/sm-imported-secret.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { EncString } from "@bitwarden/common/platform/models/domain/enc-string";
export class SecretsManagerImportedSecretRequest {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/sm-export.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/sm-export.ts
index 96203210789..0025ab592bd 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/sm-export.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/models/sm-export.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class SecretsManagerExport {
projects: SecretsManagerExportProject[];
secrets: SecretsManagerExportSecret[];
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts
index 713a93b643d..d607eabbe0f 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-export.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
import { ActivatedRoute } from "@angular/router";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.ts
index 3e46ea7f316..262f1a6b161 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/porting/sm-import.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { FormControl, FormGroup } from "@angular/forms";
import { ActivatedRoute } from "@angular/router";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts
index 4051be51a7a..9ae9b2acec3 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Subject } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting.service.ts
index 8f29e38a9e5..825a5ccc7ec 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting.service.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { formatDate } from "@angular/common";
import { Injectable } from "@angular/core";
import { firstValueFrom } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy-selector/access-policy-selector.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy-selector/access-policy-selector.component.ts
index bf0091b619c..34de4e4860b 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy-selector/access-policy-selector.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy-selector/access-policy-selector.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, forwardRef, Input, OnDestroy, OnInit } from "@angular/core";
import {
ControlValueAccessor,
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy-selector/models/ap-item-view.type.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy-selector/models/ap-item-view.type.ts
index 52a91c5fd6d..607336e4747 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy-selector/models/ap-item-view.type.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy-selector/models/ap-item-view.type.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { SelectItemView } from "@bitwarden/components";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts
index c5de1e02787..4ae80d4decc 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.spec.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { mock } from "jest-mock-extended";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts
index 9d0752b9878..920e12ef0cf 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { Subject } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/access-policy.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/access-policy.request.ts
index 527ab3a6028..ab8e096d5d5 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/access-policy.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/access-policy.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class AccessPolicyRequest {
granteeId: string;
read: boolean;
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/granted-policy.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/granted-policy.request.ts
index ddfca2bfb2b..888863c7efe 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/granted-policy.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/granted-policy.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class GrantedPolicyRequest {
grantedId: string;
read: boolean;
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/secret-access-policies.request.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/secret-access-policies.request.ts
index ac49dd49744..c3ede30ed5b 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/secret-access-policies.request.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/models/requests/secret-access-policies.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { AccessPolicyRequest } from "./access-policy.request";
export class SecretAccessPoliciesRequest {
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/dialogs/bulk-status-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/dialogs/bulk-status-dialog.component.ts
index 8472ddb7b89..e2a851a6b82 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/dialogs/bulk-status-dialog.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/dialogs/bulk-status-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject, OnInit } from "@angular/core";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.ts
index ce499ee9bda..8b046b7ff95 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/new-menu.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { Subject, takeUntil, concatMap } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.ts
index 2d01908a365..0ca5ba09074 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SelectionModel } from "@angular/cdk/collections";
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { map } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.ts
index 81c96c6b961..37b9524238f 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/secrets-list.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SelectionModel } from "@angular/cdk/collections";
import { Component, EventEmitter, Input, OnDestroy, Output } from "@angular/core";
import { Subject, takeUntil } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/trash/dialog/secret-hard-delete.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/trash/dialog/secret-hard-delete.component.ts
index 9e9d41a29b9..d5c527abbb7 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/trash/dialog/secret-hard-delete.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/trash/dialog/secret-hard-delete.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/trash/dialog/secret-restore.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/trash/dialog/secret-restore.component.ts
index eae6c7c9b9e..75b935b851a 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/trash/dialog/secret-restore.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/trash/dialog/secret-restore.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/trash/trash.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/trash/trash.component.ts
index 917cea025c6..3a21dbe3b68 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/trash/trash.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/trash/trash.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { combineLatestWith, Observable, startWith, switchMap } from "rxjs";
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/access-intelligence-routing.module.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/access-intelligence-routing.module.ts
index c13cc0efae8..993d9c0a134 100644
--- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/access-intelligence-routing.module.ts
+++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/access-intelligence-routing.module.ts
@@ -1,15 +1,14 @@
import { NgModule } from "@angular/core";
import { RouterModule, Routes } from "@angular/router";
-import { canAccessFeature } from "@bitwarden/angular/platform/guard/feature-flag.guard";
-import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
+import { organizationPermissionsGuard } from "@bitwarden/web-vault/app/admin-console/organizations/guards/org-permissions.guard";
import { RiskInsightsComponent } from "./risk-insights.component";
const routes: Routes = [
{
path: "risk-insights",
- canActivate: [canAccessFeature(FeatureFlag.AccessIntelligence)],
+ canActivate: [organizationPermissionsGuard((org) => org.useRiskInsights)],
component: RiskInsightsComponent,
data: {
titleId: "RiskInsights",
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 c755aa72598..6ee2ecf1690 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
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, DestroyRef, inject, OnInit } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { FormControl } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts
index 43ff3d458bc..99f68aa9c72 100644
--- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts
+++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/critical-applications.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, DestroyRef, inject, OnInit } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { FormControl } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health-members-uri.component.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health-members-uri.component.ts
index ffc9a7911e5..89597685799 100644
--- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health-members-uri.component.ts
+++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health-members-uri.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import { Component, DestroyRef, inject, OnInit } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health-members.component.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health-members.component.ts
index 19eded0de64..0fff93de8d6 100644
--- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health-members.component.ts
+++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health-members.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, DestroyRef, inject, OnInit } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { FormControl, FormsModule } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health.component.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health.component.ts
index 8ae14562f36..06f7de439cf 100644
--- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health.component.ts
+++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/password-health.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import { Component, DestroyRef, inject, OnInit } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
diff --git a/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.ts b/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.ts
index 2308de28735..5ea39bd0513 100644
--- a/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.ts
+++ b/bitwarden_license/bit-web/src/app/tools/access-intelligence/risk-insights.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import { Component, OnInit } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
diff --git a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/member-access-report.component.ts b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/member-access-report.component.ts
index c547c53d739..6aaaf1a4066 100644
--- a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/member-access-report.component.ts
+++ b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/member-access-report.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, OnInit } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { FormControl } from "@angular/forms";
diff --git a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.abstraction.ts b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.abstraction.ts
index 5d17f8a0174..9919da8d08e 100644
--- a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.abstraction.ts
+++ b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.abstraction.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { OrganizationId } from "@bitwarden/common/src/types/guid";
import { MemberAccessExportItem } from "../view/member-access-export.view";
diff --git a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts
index 443edc1d2fc..b7ff5551e2c 100644
--- a/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts
+++ b/bitwarden_license/bit-web/src/app/tools/reports/member-access-report/services/member-access-report.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { CollectionAccessSelectionView } from "@bitwarden/admin-console/common";
diff --git a/bitwarden_license/bit-web/tsconfig.json b/bitwarden_license/bit-web/tsconfig.json
index 3ccdade273e..09de92d355d 100644
--- a/bitwarden_license/bit-web/tsconfig.json
+++ b/bitwarden_license/bit-web/tsconfig.json
@@ -46,6 +46,7 @@
"../../apps/web/src/**/*.spec.ts",
"../../libs/common/src/platform/services/**/*.worker.ts",
- "src/**/*.stories.ts"
+ "src/**/*.stories.ts",
+ "src/**/*.spec.ts"
]
}
diff --git a/clients.code-workspace b/clients.code-workspace
index a424f91eeb4..1b956c25cee 100644
--- a/clients.code-workspace
+++ b/clients.code-workspace
@@ -65,6 +65,7 @@
"angular.enable-strict-mode-prompt": false,
"typescript.preferences.importModuleSpecifier": "project-relative",
"javascript.preferences.importModuleSpecifier": "project-relative",
+ "typescript.tsdk": "root/node_modules/typescript/lib",
},
"extensions": {
"recommendations": [
diff --git a/libs/admin-console/src/common/collections/abstractions/collection-admin.service.ts b/libs/admin-console/src/common/collections/abstractions/collection-admin.service.ts
index 6ade8c8bed6..36222b16794 100644
--- a/libs/admin-console/src/common/collections/abstractions/collection-admin.service.ts
+++ b/libs/admin-console/src/common/collections/abstractions/collection-admin.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CollectionDetailsResponse } from "@bitwarden/admin-console/common";
import { CollectionAccessSelectionView, CollectionAdminView } from "../models";
diff --git a/libs/admin-console/src/common/collections/abstractions/collection.service.ts b/libs/admin-console/src/common/collections/abstractions/collection.service.ts
index 6b590bcddaf..61fc94b271c 100644
--- a/libs/admin-console/src/common/collections/abstractions/collection.service.ts
+++ b/libs/admin-console/src/common/collections/abstractions/collection.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Observable } from "rxjs";
import { CollectionId, OrganizationId, UserId } from "@bitwarden/common/types/guid";
diff --git a/libs/admin-console/src/common/collections/abstractions/vnext-collection.service.ts b/libs/admin-console/src/common/collections/abstractions/vnext-collection.service.ts
index 4b5828ccf3b..53098cdcc27 100644
--- a/libs/admin-console/src/common/collections/abstractions/vnext-collection.service.ts
+++ b/libs/admin-console/src/common/collections/abstractions/vnext-collection.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Observable } from "rxjs";
import { OrganizationId, UserId } from "@bitwarden/common/types/guid";
diff --git a/libs/admin-console/src/common/collections/models/bulk-collection-access.request.ts b/libs/admin-console/src/common/collections/models/bulk-collection-access.request.ts
index 35dd31c821e..27a0e652f6b 100644
--- a/libs/admin-console/src/common/collections/models/bulk-collection-access.request.ts
+++ b/libs/admin-console/src/common/collections/models/bulk-collection-access.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request";
export class BulkCollectionAccessRequest {
diff --git a/libs/admin-console/src/common/collections/models/collection-access-selection.view.ts b/libs/admin-console/src/common/collections/models/collection-access-selection.view.ts
index e7dd3df8824..9f61def9b22 100644
--- a/libs/admin-console/src/common/collections/models/collection-access-selection.view.ts
+++ b/libs/admin-console/src/common/collections/models/collection-access-selection.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { View } from "@bitwarden/common/models/view/view";
interface SelectionResponseLike {
diff --git a/libs/admin-console/src/common/collections/models/collection-admin.view.ts b/libs/admin-console/src/common/collections/models/collection-admin.view.ts
index 1cf65a2495f..cfc9996cd7a 100644
--- a/libs/admin-console/src/common/collections/models/collection-admin.view.ts
+++ b/libs/admin-console/src/common/collections/models/collection-admin.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { CollectionAccessSelectionView } from "./collection-access-selection.view";
diff --git a/libs/admin-console/src/common/collections/models/collection-with-id.request.ts b/libs/admin-console/src/common/collections/models/collection-with-id.request.ts
index d74aeb740ac..ca24e139517 100644
--- a/libs/admin-console/src/common/collections/models/collection-with-id.request.ts
+++ b/libs/admin-console/src/common/collections/models/collection-with-id.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Collection } from "./collection";
import { CollectionRequest } from "./collection.request";
diff --git a/libs/admin-console/src/common/collections/models/collection.request.ts b/libs/admin-console/src/common/collections/models/collection.request.ts
index c8b3476e6a6..4244bf1e780 100644
--- a/libs/admin-console/src/common/collections/models/collection.request.ts
+++ b/libs/admin-console/src/common/collections/models/collection.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request";
import { Collection } from "./collection";
diff --git a/libs/admin-console/src/common/collections/models/collection.ts b/libs/admin-console/src/common/collections/models/collection.ts
index 2fbc035b4db..f14ccb20141 100644
--- a/libs/admin-console/src/common/collections/models/collection.ts
+++ b/libs/admin-console/src/common/collections/models/collection.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import Domain from "@bitwarden/common/platform/models/domain/domain-base";
import { EncString } from "@bitwarden/common/platform/models/domain/enc-string";
import { OrgKey } from "@bitwarden/common/types/key";
diff --git a/libs/admin-console/src/common/collections/models/collection.view.ts b/libs/admin-console/src/common/collections/models/collection.view.ts
index 037509634b4..1ce76608df1 100644
--- a/libs/admin-console/src/common/collections/models/collection.view.ts
+++ b/libs/admin-console/src/common/collections/models/collection.view.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Jsonify } from "type-fest";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
diff --git a/libs/admin-console/src/common/collections/services/default-collection-admin.service.ts b/libs/admin-console/src/common/collections/services/default-collection-admin.service.ts
index 08518534984..6aafbaf4678 100644
--- a/libs/admin-console/src/common/collections/services/default-collection-admin.service.ts
+++ b/libs/admin-console/src/common/collections/services/default-collection-admin.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request";
import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service";
diff --git a/libs/admin-console/src/common/collections/services/default-collection.service.ts b/libs/admin-console/src/common/collections/services/default-collection.service.ts
index c83bb6fb16d..4070c92f27c 100644
--- a/libs/admin-console/src/common/collections/services/default-collection.service.ts
+++ b/libs/admin-console/src/common/collections/services/default-collection.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { combineLatest, firstValueFrom, map, Observable, of, switchMap } from "rxjs";
import { Jsonify } from "type-fest";
diff --git a/libs/admin-console/src/common/collections/services/default-vnext-collection.service.ts b/libs/admin-console/src/common/collections/services/default-vnext-collection.service.ts
index 8ca1ab7fcf0..5f2985b8400 100644
--- a/libs/admin-console/src/common/collections/services/default-vnext-collection.service.ts
+++ b/libs/admin-console/src/common/collections/services/default-vnext-collection.service.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { combineLatest, firstValueFrom, map, Observable, of, switchMap } from "rxjs";
import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service";
diff --git a/libs/admin-console/src/common/organization-user/models/requests/organization-user-accept-init.request.ts b/libs/admin-console/src/common/organization-user/models/requests/organization-user-accept-init.request.ts
index 20d87a774e6..9aec866c603 100644
--- a/libs/admin-console/src/common/organization-user/models/requests/organization-user-accept-init.request.ts
+++ b/libs/admin-console/src/common/organization-user/models/requests/organization-user-accept-init.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { OrganizationKeysRequest } from "@bitwarden/common/admin-console/models/request/organization-keys.request";
export class OrganizationUserAcceptInitRequest {
diff --git a/libs/admin-console/src/common/organization-user/models/requests/organization-user-accept.request.ts b/libs/admin-console/src/common/organization-user/models/requests/organization-user-accept.request.ts
index e2aada131fb..1f94374694c 100644
--- a/libs/admin-console/src/common/organization-user/models/requests/organization-user-accept.request.ts
+++ b/libs/admin-console/src/common/organization-user/models/requests/organization-user-accept.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class OrganizationUserAcceptRequest {
token: string;
// Used to auto-enroll in master password reset
diff --git a/libs/admin-console/src/common/organization-user/models/requests/organization-user-confirm.request.ts b/libs/admin-console/src/common/organization-user/models/requests/organization-user-confirm.request.ts
index abd487495f1..62988801424 100644
--- a/libs/admin-console/src/common/organization-user/models/requests/organization-user-confirm.request.ts
+++ b/libs/admin-console/src/common/organization-user/models/requests/organization-user-confirm.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class OrganizationUserConfirmRequest {
key: string;
}
diff --git a/libs/admin-console/src/common/organization-user/models/requests/organization-user-invite.request.ts b/libs/admin-console/src/common/organization-user/models/requests/organization-user-invite.request.ts
index 1793beccbef..9eef5027dc0 100644
--- a/libs/admin-console/src/common/organization-user/models/requests/organization-user-invite.request.ts
+++ b/libs/admin-console/src/common/organization-user/models/requests/organization-user-invite.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { OrganizationUserType } from "@bitwarden/common/admin-console/enums";
import { PermissionsApi } from "@bitwarden/common/admin-console/models/api/permissions.api";
import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request";
diff --git a/libs/admin-console/src/common/organization-user/models/requests/organization-user-reset-password-enrollment.request.ts b/libs/admin-console/src/common/organization-user/models/requests/organization-user-reset-password-enrollment.request.ts
index 4526b227d92..f106438d440 100644
--- a/libs/admin-console/src/common/organization-user/models/requests/organization-user-reset-password-enrollment.request.ts
+++ b/libs/admin-console/src/common/organization-user/models/requests/organization-user-reset-password-enrollment.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { SecretVerificationRequest } from "@bitwarden/common/auth/models/request/secret-verification.request";
export class OrganizationUserResetPasswordEnrollmentRequest extends SecretVerificationRequest {
diff --git a/libs/admin-console/src/common/organization-user/models/requests/organization-user-reset-password.request.ts b/libs/admin-console/src/common/organization-user/models/requests/organization-user-reset-password.request.ts
index b0c4e483b95..7d060e3390e 100644
--- a/libs/admin-console/src/common/organization-user/models/requests/organization-user-reset-password.request.ts
+++ b/libs/admin-console/src/common/organization-user/models/requests/organization-user-reset-password.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
export class OrganizationUserResetPasswordRequest {
newMasterPasswordHash: string;
key: string;
diff --git a/libs/admin-console/src/common/organization-user/models/requests/organization-user-update.request.ts b/libs/admin-console/src/common/organization-user/models/requests/organization-user-update.request.ts
index 283af4f081f..b93c7c5cb89 100644
--- a/libs/admin-console/src/common/organization-user/models/requests/organization-user-update.request.ts
+++ b/libs/admin-console/src/common/organization-user/models/requests/organization-user-update.request.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { OrganizationUserType } from "@bitwarden/common/admin-console/enums";
import { PermissionsApi } from "@bitwarden/common/admin-console/models/api/permissions.api";
import { SelectionReadOnlyRequest } from "@bitwarden/common/admin-console/models/request/selection-read-only.request";
diff --git a/libs/angular/src/admin-console/components/collections.component.ts b/libs/angular/src/admin-console/components/collections.component.ts
index 304ff4411cb..0b19935985a 100644
--- a/libs/angular/src/admin-console/components/collections.component.ts
+++ b/libs/angular/src/admin-console/components/collections.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, EventEmitter, Input, OnInit, Output } from "@angular/core";
import { firstValueFrom, map } from "rxjs";
diff --git a/libs/angular/src/admin-console/validators/not-allowed-value-async.validator.ts b/libs/angular/src/admin-console/validators/not-allowed-value-async.validator.ts
index 9108ba61393..775ca591bf2 100644
--- a/libs/angular/src/admin-console/validators/not-allowed-value-async.validator.ts
+++ b/libs/angular/src/admin-console/validators/not-allowed-value-async.validator.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { AbstractControl, AsyncValidatorFn, ValidationErrors } from "@angular/forms";
export function notAllowedValueAsync(
diff --git a/libs/angular/src/auth/components/base-login-decryption-options-v1.component.ts b/libs/angular/src/auth/components/base-login-decryption-options-v1.component.ts
index df99503b6d7..ca3906cead3 100644
--- a/libs/angular/src/auth/components/base-login-decryption-options-v1.component.ts
+++ b/libs/angular/src/auth/components/base-login-decryption-options-v1.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, OnDestroy, OnInit } from "@angular/core";
import { FormBuilder, FormControl } from "@angular/forms";
import { ActivatedRoute, Router } from "@angular/router";
diff --git a/libs/angular/src/auth/components/base-login-via-webauthn.component.ts b/libs/angular/src/auth/components/base-login-via-webauthn.component.ts
index c2bd1becf28..82d93ff0b8b 100644
--- a/libs/angular/src/auth/components/base-login-via-webauthn.component.ts
+++ b/libs/angular/src/auth/components/base-login-via-webauthn.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, OnInit } from "@angular/core";
import { Router } from "@angular/router";
diff --git a/libs/angular/src/auth/components/captcha-protected.component.ts b/libs/angular/src/auth/components/captcha-protected.component.ts
index 7186f6c3c48..76e62a38b4d 100644
--- a/libs/angular/src/auth/components/captcha-protected.component.ts
+++ b/libs/angular/src/auth/components/captcha-protected.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, Input } from "@angular/core";
import { firstValueFrom } from "rxjs";
diff --git a/libs/angular/src/auth/components/change-password.component.ts b/libs/angular/src/auth/components/change-password.component.ts
index dc181c54066..7f54f35cb2a 100644
--- a/libs/angular/src/auth/components/change-password.component.ts
+++ b/libs/angular/src/auth/components/change-password.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, OnDestroy, OnInit } from "@angular/core";
import { Subject, firstValueFrom, map, takeUntil } from "rxjs";
diff --git a/libs/angular/src/auth/components/environment-selector.component.ts b/libs/angular/src/auth/components/environment-selector.component.ts
index fa81f1d2c01..c984b7f0cba 100644
--- a/libs/angular/src/auth/components/environment-selector.component.ts
+++ b/libs/angular/src/auth/components/environment-selector.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { animate, state, style, transition, trigger } from "@angular/animations";
import { ConnectedPosition } from "@angular/cdk/overlay";
import { Component, EventEmitter, Output, Input, OnInit, OnDestroy } from "@angular/core";
diff --git a/libs/angular/src/auth/components/environment.component.ts b/libs/angular/src/auth/components/environment.component.ts
index 25f10553308..315eb756574 100644
--- a/libs/angular/src/auth/components/environment.component.ts
+++ b/libs/angular/src/auth/components/environment.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, EventEmitter, Output } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
diff --git a/libs/angular/src/auth/components/hint.component.ts b/libs/angular/src/auth/components/hint.component.ts
index f7ae1e4c182..09648314a9c 100644
--- a/libs/angular/src/auth/components/hint.component.ts
+++ b/libs/angular/src/auth/components/hint.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, OnInit } from "@angular/core";
import { Router } from "@angular/router";
import { firstValueFrom } from "rxjs";
diff --git a/libs/angular/src/auth/components/lock.component.ts b/libs/angular/src/auth/components/lock.component.ts
index f0d1163c24d..20ad37fd2b4 100644
--- a/libs/angular/src/auth/components/lock.component.ts
+++ b/libs/angular/src/auth/components/lock.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, NgZone, OnDestroy, OnInit } from "@angular/core";
import { Router } from "@angular/router";
import { firstValueFrom, Subject } from "rxjs";
diff --git a/libs/angular/src/auth/components/login-v1.component.ts b/libs/angular/src/auth/components/login-v1.component.ts
index 31145191898..0775114bd8c 100644
--- a/libs/angular/src/auth/components/login-v1.component.ts
+++ b/libs/angular/src/auth/components/login-v1.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, ElementRef, NgZone, OnDestroy, OnInit, ViewChild } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
import { ActivatedRoute, NavigationSkipped, Router } from "@angular/router";
diff --git a/libs/angular/src/auth/components/login-via-auth-request-v1.component.ts b/libs/angular/src/auth/components/login-via-auth-request-v1.component.ts
index 69a76343719..386068ff783 100644
--- a/libs/angular/src/auth/components/login-via-auth-request-v1.component.ts
+++ b/libs/angular/src/auth/components/login-via-auth-request-v1.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, OnDestroy, OnInit } from "@angular/core";
import { IsActiveMatchOptions, Router } from "@angular/router";
import { Subject, firstValueFrom, map, takeUntil } from "rxjs";
diff --git a/libs/angular/src/auth/components/register.component.ts b/libs/angular/src/auth/components/register.component.ts
index ec78a1692ad..279294f4c06 100644
--- a/libs/angular/src/auth/components/register.component.ts
+++ b/libs/angular/src/auth/components/register.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, EventEmitter, Input, OnInit, Output } from "@angular/core";
import { AbstractControl, UntypedFormBuilder, ValidatorFn, Validators } from "@angular/forms";
import { Router } from "@angular/router";
diff --git a/libs/angular/src/auth/components/remove-password.component.ts b/libs/angular/src/auth/components/remove-password.component.ts
index 4b8e9cc52f0..74cb00a14b8 100644
--- a/libs/angular/src/auth/components/remove-password.component.ts
+++ b/libs/angular/src/auth/components/remove-password.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, OnInit } from "@angular/core";
import { Router } from "@angular/router";
import { firstValueFrom, map } from "rxjs";
diff --git a/libs/angular/src/auth/components/set-password.component.ts b/libs/angular/src/auth/components/set-password.component.ts
index b323f7ef1a4..166707a19ea 100644
--- a/libs/angular/src/auth/components/set-password.component.ts
+++ b/libs/angular/src/auth/components/set-password.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, OnInit } from "@angular/core";
import { ActivatedRoute, Router } from "@angular/router";
import { firstValueFrom, of } from "rxjs";
diff --git a/libs/angular/src/auth/components/set-pin.component.ts b/libs/angular/src/auth/components/set-pin.component.ts
index 1e3c1e6d564..7005f6e15c6 100644
--- a/libs/angular/src/auth/components/set-pin.component.ts
+++ b/libs/angular/src/auth/components/set-pin.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogRef } from "@angular/cdk/dialog";
import { Directive, OnInit } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
diff --git a/libs/angular/src/auth/components/sso.component.ts b/libs/angular/src/auth/components/sso.component.ts
index ac64ae02462..8b4df78175f 100644
--- a/libs/angular/src/auth/components/sso.component.ts
+++ b/libs/angular/src/auth/components/sso.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, OnInit } from "@angular/core";
import { ActivatedRoute, NavigationExtras, Router } from "@angular/router";
import { firstValueFrom } from "rxjs";
diff --git a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-authenticator.component.ts b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-authenticator.component.ts
index 59359ab873f..bdf69f7420f 100644
--- a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-authenticator.component.ts
+++ b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-authenticator.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogModule } from "@angular/cdk/dialog";
import { CommonModule } from "@angular/common";
import { Component, EventEmitter, Output } from "@angular/core";
diff --git a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-duo.component.ts b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-duo.component.ts
index 3c3443d2935..3131cc042f7 100644
--- a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-duo.component.ts
+++ b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-duo.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogModule } from "@angular/cdk/dialog";
import { CommonModule } from "@angular/common";
import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core";
diff --git a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-email.component.ts b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-email.component.ts
index 72d7e6a76c8..8f01403cdbb 100644
--- a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-email.component.ts
+++ b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-email.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogModule } from "@angular/cdk/dialog";
import { CommonModule } from "@angular/common";
import { Component, EventEmitter, OnInit, Output } from "@angular/core";
diff --git a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-webauthn.component.ts b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-webauthn.component.ts
index 7e9f6486911..ba3b645c68d 100644
--- a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-webauthn.component.ts
+++ b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth-webauthn.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DialogModule } from "@angular/cdk/dialog";
import { CommonModule } from "@angular/common";
import { Component, EventEmitter, Inject, OnDestroy, OnInit, Output } from "@angular/core";
diff --git a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth.component.ts b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth.component.ts
index 58edeed93e9..6aca189a79e 100644
--- a/libs/angular/src/auth/components/two-factor-auth/two-factor-auth.component.ts
+++ b/libs/angular/src/auth/components/two-factor-auth/two-factor-auth.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import { Component, Inject, OnInit, ViewChild } from "@angular/core";
import { FormBuilder, ReactiveFormsModule, Validators } from "@angular/forms";
diff --git a/libs/angular/src/auth/components/two-factor-icon.component.ts b/libs/angular/src/auth/components/two-factor-icon.component.ts
index 338ea25a3f3..c75078e413a 100644
--- a/libs/angular/src/auth/components/two-factor-icon.component.ts
+++ b/libs/angular/src/auth/components/two-factor-icon.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input } from "@angular/core";
import { EmailIcon } from "../icons/email.icon";
diff --git a/libs/angular/src/auth/components/two-factor.component.ts b/libs/angular/src/auth/components/two-factor.component.ts
index 33269e28e96..18bfe546600 100644
--- a/libs/angular/src/auth/components/two-factor.component.ts
+++ b/libs/angular/src/auth/components/two-factor.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, Inject, OnInit, OnDestroy } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { ActivatedRoute, NavigationExtras, Router } from "@angular/router";
diff --git a/libs/angular/src/auth/components/update-password.component.ts b/libs/angular/src/auth/components/update-password.component.ts
index 3c442b7913e..1d1057d9aa6 100644
--- a/libs/angular/src/auth/components/update-password.component.ts
+++ b/libs/angular/src/auth/components/update-password.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive } from "@angular/core";
import { Router } from "@angular/router";
diff --git a/libs/angular/src/auth/components/update-temp-password.component.ts b/libs/angular/src/auth/components/update-temp-password.component.ts
index e00e21fe811..3fb1f7400ec 100644
--- a/libs/angular/src/auth/components/update-temp-password.component.ts
+++ b/libs/angular/src/auth/components/update-temp-password.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, OnInit } from "@angular/core";
import { Router } from "@angular/router";
import { firstValueFrom, map } from "rxjs";
diff --git a/libs/angular/src/auth/components/user-verification-prompt.component.ts b/libs/angular/src/auth/components/user-verification-prompt.component.ts
index 4b25a7cc0fe..ceb4eb1941c 100644
--- a/libs/angular/src/auth/components/user-verification-prompt.component.ts
+++ b/libs/angular/src/auth/components/user-verification-prompt.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive } from "@angular/core";
import { FormBuilder } from "@angular/forms";
diff --git a/libs/angular/src/auth/components/user-verification.component.ts b/libs/angular/src/auth/components/user-verification.component.ts
index 385c9b9acf5..7af53805a09 100644
--- a/libs/angular/src/auth/components/user-verification.component.ts
+++ b/libs/angular/src/auth/components/user-verification.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Directive, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core";
import { ControlValueAccessor, FormControl, Validators } from "@angular/forms";
import { Subject, takeUntil } from "rxjs";
diff --git a/libs/angular/src/auth/guards/auth.guard.ts b/libs/angular/src/auth/guards/auth.guard.ts
index 1486b9b57d8..8d20d7323da 100644
--- a/libs/angular/src/auth/guards/auth.guard.ts
+++ b/libs/angular/src/auth/guards/auth.guard.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { inject } from "@angular/core";
import {
ActivatedRouteSnapshot,
diff --git a/libs/angular/src/billing/components/add-account-credit-dialog/add-account-credit-dialog.component.ts b/libs/angular/src/billing/components/add-account-credit-dialog/add-account-credit-dialog.component.ts
index d3c262c4b7d..cebd81846c1 100644
--- a/libs/angular/src/billing/components/add-account-credit-dialog/add-account-credit-dialog.component.ts
+++ b/libs/angular/src/billing/components/add-account-credit-dialog/add-account-credit-dialog.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { DIALOG_DATA, DialogConfig, DialogRef } from "@angular/cdk/dialog";
import { Component, ElementRef, Inject, OnInit, ViewChild } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
diff --git a/libs/angular/src/billing/components/invoices/invoices.component.ts b/libs/angular/src/billing/components/invoices/invoices.component.ts
index 9949391cd89..8984c1afe65 100644
--- a/libs/angular/src/billing/components/invoices/invoices.component.ts
+++ b/libs/angular/src/billing/components/invoices/invoices.component.ts
@@ -1,3 +1,5 @@
+// FIXME: Update this file to be type safe and remove this and next line
+// @ts-strict-ignore
import { Component, Input, OnInit } from "@angular/core";
import {
diff --git a/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.html b/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.html
index fbd8af4f8b9..0b041bd4c06 100644
--- a/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.html
+++ b/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.html
@@ -1,7 +1,7 @@
|