@@ -212,7 +223,7 @@
class="form-check-input"
type="checkbox"
name="manageSso"
- id="managePolicies"
+ id="manageSso"
[ngModelOptions]="{ standalone: true }"
[(ngModel)]="permissions.manageSso"
/>
@@ -345,7 +356,7 @@
@@ -359,7 +370,7 @@
[ngModelOptions]="{ standalone: true }"
[(ngModel)]="c.hidePasswords"
name="Collection[{{ i }}].HidePasswords"
- [disabled]="!c.checked"
+ [disabled]="!$any(c).checked"
/>
|
@@ -368,7 +379,7 @@
[ngModelOptions]="{ standalone: true }"
[(ngModel)]="c.readOnly"
name="Collection[{{ i }}].ReadOnly"
- [disabled]="!c.checked"
+ [disabled]="!$any(c).checked"
/>
|
diff --git a/apps/web/src/app/organizations/manage/member-dialog/member-dialog.component.ts b/apps/web/src/app/organizations/manage/member-dialog/member-dialog.component.ts
index 1f0a559af26..88530b6999a 100644
--- a/apps/web/src/app/organizations/manage/member-dialog/member-dialog.component.ts
+++ b/apps/web/src/app/organizations/manage/member-dialog/member-dialog.component.ts
@@ -6,6 +6,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
+import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction";
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
import { OrganizationUserStatusType } from "@bitwarden/common/enums/organizationUserStatusType";
import { OrganizationUserType } from "@bitwarden/common/enums/organizationUserType";
@@ -57,6 +58,7 @@ export class MemberDialogComponent implements OnInit {
access: "all" | "selected" = "selected";
collections: CollectionView[] = [];
organizationUserType = OrganizationUserType;
+ canUseCustomPermissions: boolean;
protected tabIndex: MemberDialogTab;
// Stub, to be filled out in upcoming PRs
@@ -104,6 +106,7 @@ export class MemberDialogComponent implements OnInit {
private i18nService: I18nService,
private collectionService: CollectionService,
private platformUtilsService: PlatformUtilsService,
+ private organizationService: OrganizationService,
private logService: LogService,
private formBuilder: FormBuilder
) {}
@@ -111,6 +114,9 @@ export class MemberDialogComponent implements OnInit {
async ngOnInit() {
this.editMode = this.loading = this.params.organizationUserId != null;
this.tabIndex = this.params.initialTab ?? MemberDialogTab.Role;
+
+ const organization = this.organizationService.get(this.params.organizationId);
+ this.canUseCustomPermissions = organization.useCustomPermissions;
await this.loadCollections();
if (this.editMode) {
@@ -185,6 +191,14 @@ export class MemberDialogComponent implements OnInit {
}
submit = async () => {
+ if (!this.canUseCustomPermissions && this.type === OrganizationUserType.Custom) {
+ this.platformUtilsService.showToast(
+ "error",
+ null,
+ this.i18nService.t("customNonEnterpriseError")
+ );
+ return;
+ }
let collections: SelectionReadOnlyRequest[] = null;
if (this.access !== "all") {
collections = this.collections
@@ -194,30 +208,9 @@ export class MemberDialogComponent implements OnInit {
try {
if (this.editMode) {
- const request = new OrganizationUserUpdateRequest();
- request.accessAll = this.access === "all";
- request.type = this.type;
- request.collections = collections;
- request.permissions = this.setRequestPermissions(
- request.permissions ?? new PermissionsApi(),
- request.type !== OrganizationUserType.Custom
- );
- await this.apiService.putOrganizationUser(
- this.params.organizationId,
- this.params.organizationUserId,
- request
- );
+ await this.updateUser(collections);
} else {
- const request = new OrganizationUserInviteRequest();
- request.emails = [...new Set(this.emails.trim().split(/\s*,\s*/))];
- request.accessAll = this.access === "all";
- request.type = this.type;
- request.permissions = this.setRequestPermissions(
- request.permissions ?? new PermissionsApi(),
- request.type !== OrganizationUserType.Custom
- );
- request.collections = collections;
- await this.apiService.postOrganizationUserInvite(this.params.organizationId, request);
+ await this.inviteUser(collections);
}
this.platformUtilsService.showToast(
@@ -331,6 +324,35 @@ export class MemberDialogComponent implements OnInit {
private close(result: MemberDialogResult) {
this.dialogRef.close(result);
}
+
+ async updateUser(collections: SelectionReadOnlyRequest[]) {
+ const request = new OrganizationUserUpdateRequest();
+ request.accessAll = this.access === "all";
+ request.type = this.type;
+ request.collections = collections;
+ request.permissions = this.setRequestPermissions(
+ request.permissions ?? new PermissionsApi(),
+ request.type !== OrganizationUserType.Custom
+ );
+ await this.apiService.putOrganizationUser(
+ this.params.organizationId,
+ this.params.organizationUserId,
+ request
+ );
+ }
+
+ async inviteUser(collections: SelectionReadOnlyRequest[]) {
+ const request = new OrganizationUserInviteRequest();
+ request.emails = [...new Set(this.emails.trim().split(/\s*,\s*/))];
+ request.accessAll = this.access === "all";
+ request.type = this.type;
+ request.permissions = this.setRequestPermissions(
+ request.permissions ?? new PermissionsApi(),
+ request.type !== OrganizationUserType.Custom
+ );
+ request.collections = collections;
+ await this.apiService.postOrganizationUserInvite(this.params.organizationId, request);
+ }
}
/**
diff --git a/apps/web/src/app/organizations/settings/organization-billing.component.ts b/apps/web/src/app/organizations/manage/user-add-edit.component.html
similarity index 100%
rename from apps/web/src/app/organizations/settings/organization-billing.component.ts
rename to apps/web/src/app/organizations/manage/user-add-edit.component.html
diff --git a/apps/web/src/app/organizations/manage/user-groups.component.html b/apps/web/src/app/organizations/manage/user-groups.component.html
index 347125e9825..217af6ea44b 100644
--- a/apps/web/src/app/organizations/manage/user-groups.component.html
+++ b/apps/web/src/app/organizations/manage/user-groups.component.html
@@ -34,7 +34,7 @@
diff --git a/apps/web/src/app/organizations/organization.module.ts b/apps/web/src/app/organizations/organization.module.ts
index e54c894c834..8d790e86385 100644
--- a/apps/web/src/app/organizations/organization.module.ts
+++ b/apps/web/src/app/organizations/organization.module.ts
@@ -2,8 +2,6 @@ import { NgModule } from "@angular/core";
import { ApiService as ApiServiceAbstraction } from "@bitwarden/common/abstractions/api.service";
-import { SharedModule } from "../shared";
-
import { CoreOrganizationModule } from "./core";
import { GroupAddEditComponent } from "./manage/group-add-edit.component";
import { GroupsComponent } from "./manage/groups.component";
@@ -14,12 +12,7 @@ import { GroupService } from "./services/group/group.service";
import { SharedOrganizationModule } from "./shared";
@NgModule({
- imports: [
- SharedModule,
- OrganizationsRoutingModule,
- SharedOrganizationModule,
- CoreOrganizationModule,
- ],
+ imports: [OrganizationsRoutingModule, SharedOrganizationModule, CoreOrganizationModule],
declarations: [GroupsComponent, GroupAddEditComponent, UserGroupsComponent],
providers: [
{
diff --git a/apps/web/src/app/organizations/policies/policies.component.ts b/apps/web/src/app/organizations/policies/policies.component.ts
index 0a316f5597d..717e35ac968 100644
--- a/apps/web/src/app/organizations/policies/policies.component.ts
+++ b/apps/web/src/app/organizations/policies/policies.component.ts
@@ -29,7 +29,7 @@ export class PoliciesComponent implements OnInit {
organization: Organization;
private orgPolicies: PolicyResponse[];
- private policiesEnabledMap: Map = new Map();
+ protected policiesEnabledMap: Map = new Map();
constructor(
private route: ActivatedRoute,
diff --git a/apps/web/src/app/organizations/shared/components/access-selector/access-selector.component.html b/apps/web/src/app/organizations/shared/components/access-selector/access-selector.component.html
index f695a9d212b..45cf04ba931 100644
--- a/apps/web/src/app/organizations/shared/components/access-selector/access-selector.component.html
+++ b/apps/web/src/app/organizations/shared/components/access-selector/access-selector.component.html
@@ -53,11 +53,13 @@
{{ item.labelName }}
-
+
{{ "invited" | i18n }}
- {{ item.email }}
+
+ {{ $any(item).email }}
+
@@ -110,11 +112,11 @@
|
- {{ item.role | userType: "-" }}
+ {{ $any(item).role | userType: "-" }}
|
- {{ item.viaGroupName ?? "-" }}
+ {{ $any(item).viaGroupName ?? "-" }}
|
diff --git a/apps/web/src/app/organizations/shared/components/collection-dialog/collection-dialog.component.html b/apps/web/src/app/organizations/shared/components/collection-dialog/collection-dialog.component.html
index 944f38f387b..c3d8d708d39 100644
--- a/apps/web/src/app/organizations/shared/components/collection-dialog/collection-dialog.component.html
+++ b/apps/web/src/app/organizations/shared/components/collection-dialog/collection-dialog.component.html
@@ -44,7 +44,7 @@
{{ "search" | i18n }}
+
+
+
+
diff --git a/apps/web/src/app/organizations/shared/components/search-input/search-input.component.ts b/apps/web/src/app/organizations/shared/components/search-input/search-input.component.ts
new file mode 100644
index 00000000000..4bdcf665cd5
--- /dev/null
+++ b/apps/web/src/app/organizations/shared/components/search-input/search-input.component.ts
@@ -0,0 +1,54 @@
+import { Component, Input } from "@angular/core";
+import { ControlValueAccessor, NG_VALUE_ACCESSOR } from "@angular/forms";
+
+let nextId = 0;
+
+@Component({
+ selector: "app-search-input",
+ templateUrl: "./search-input.component.html",
+ providers: [
+ {
+ provide: NG_VALUE_ACCESSOR,
+ multi: true,
+ useExisting: SearchInputComponent,
+ },
+ ],
+})
+export class SearchInputComponent implements ControlValueAccessor {
+ private notifyOnChange: (v: string) => void;
+ private notifyOnTouch: () => void;
+
+ protected id = `search-id-${nextId++}`;
+ protected searchText: string;
+
+ @Input() disabled: boolean;
+ @Input() placeholder: string;
+
+ onChange(searchText: string) {
+ if (this.notifyOnChange != undefined) {
+ this.notifyOnChange(searchText);
+ }
+ }
+
+ onTouch() {
+ if (this.notifyOnTouch != undefined) {
+ this.notifyOnTouch();
+ }
+ }
+
+ registerOnChange(fn: (v: string) => void): void {
+ this.notifyOnChange = fn;
+ }
+
+ registerOnTouched(fn: () => void): void {
+ this.notifyOnTouch = fn;
+ }
+
+ writeValue(searchText: string): void {
+ this.searchText = searchText;
+ }
+
+ setDisabledState(isDisabled: boolean) {
+ this.disabled = isDisabled;
+ }
+}
diff --git a/apps/web/src/app/organizations/shared/components/search-input/search-input.stories.ts b/apps/web/src/app/organizations/shared/components/search-input/search-input.stories.ts
new file mode 100644
index 00000000000..ee72e91ad5f
--- /dev/null
+++ b/apps/web/src/app/organizations/shared/components/search-input/search-input.stories.ts
@@ -0,0 +1,36 @@
+import { FormsModule, ReactiveFormsModule } from "@angular/forms";
+import { Meta, moduleMetadata, Story } from "@storybook/angular";
+
+import { JslibModule } from "@bitwarden/angular/jslib.module";
+import { InputModule } from "@bitwarden/components/src/input/input.module";
+
+import { PreloadedEnglishI18nModule } from "../../../../tests/preloaded-english-i18n.module";
+
+import { SearchInputComponent } from "./search-input.component";
+
+export default {
+ title: "Web/Organizations/Search Input",
+ component: SearchInputComponent,
+ decorators: [
+ moduleMetadata({
+ imports: [
+ InputModule,
+ FormsModule,
+ ReactiveFormsModule,
+ PreloadedEnglishI18nModule,
+ JslibModule,
+ ],
+ providers: [],
+ }),
+ ],
+} as Meta;
+
+const Template: Story = (args: SearchInputComponent) => ({
+ props: args,
+ template: `
+
+ `,
+});
+
+export const Default = Template.bind({});
+Default.args = {};
diff --git a/apps/web/src/app/organizations/shared/shared-organization.module.ts b/apps/web/src/app/organizations/shared/shared-organization.module.ts
index 9cb62027d4c..7979b6e2f36 100644
--- a/apps/web/src/app/organizations/shared/shared-organization.module.ts
+++ b/apps/web/src/app/organizations/shared/shared-organization.module.ts
@@ -1,10 +1,14 @@
import { NgModule } from "@angular/core";
+import { SharedModule } from "../../shared/shared.module";
+
import { AccessSelectorModule } from "./components/access-selector";
import { CollectionDialogModule } from "./components/collection-dialog";
+import { SearchInputComponent } from "./components/search-input/search-input.component";
@NgModule({
- imports: [CollectionDialogModule, AccessSelectorModule],
- exports: [CollectionDialogModule, AccessSelectorModule],
+ imports: [SharedModule, CollectionDialogModule, AccessSelectorModule],
+ declarations: [SearchInputComponent],
+ exports: [SharedModule, CollectionDialogModule, AccessSelectorModule],
})
export class SharedOrganizationModule {}
diff --git a/apps/web/src/app/organizations/tools/import-export/org-export.component.ts b/apps/web/src/app/organizations/tools/import-export/org-export.component.ts
index 626b3ef2bc6..a7ab72edfae 100644
--- a/apps/web/src/app/organizations/tools/import-export/org-export.component.ts
+++ b/apps/web/src/app/organizations/tools/import-export/org-export.component.ts
@@ -4,7 +4,7 @@ import { ActivatedRoute } from "@angular/router";
import { ModalService } from "@bitwarden/angular/services/modal.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { ExportService } from "@bitwarden/common/abstractions/export.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -27,7 +27,7 @@ export class OrganizationExportComponent extends ExportComponent {
i18nService: I18nService,
platformUtilsService: PlatformUtilsService,
exportService: ExportService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
private route: ActivatedRoute,
policyService: PolicyService,
logService: LogService,
@@ -41,7 +41,7 @@ export class OrganizationExportComponent extends ExportComponent {
i18nService,
platformUtilsService,
exportService,
- eventService,
+ eventCollectionService,
policyService,
logService,
userVerificationService,
@@ -76,7 +76,7 @@ export class OrganizationExportComponent extends ExportComponent {
}
async collectEvent(): Promise {
- await this.eventService.collect(
+ await this.eventCollectionService.collect(
EventType.Organization_ClientExportedVault,
null,
null,
diff --git a/apps/web/src/app/organizations/vault/add-edit.component.ts b/apps/web/src/app/organizations/vault/add-edit.component.ts
index e8138b1abc7..dbbbf42dd02 100644
--- a/apps/web/src/app/organizations/vault/add-edit.component.ts
+++ b/apps/web/src/app/organizations/vault/add-edit.component.ts
@@ -4,7 +4,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
@@ -18,7 +18,6 @@ import { StateService } from "@bitwarden/common/abstractions/state.service";
import { TotpService } from "@bitwarden/common/abstractions/totp.service";
import { CipherData } from "@bitwarden/common/models/data/cipher.data";
import { Cipher } from "@bitwarden/common/models/domain/cipher";
-import { Organization } from "@bitwarden/common/models/domain/organization";
import { CipherCreateRequest } from "@bitwarden/common/models/request/cipher-create.request";
import { CipherRequest } from "@bitwarden/common/models/request/cipher.request";
@@ -29,7 +28,6 @@ import { AddEditComponent as BaseAddEditComponent } from "../../vault/add-edit.c
templateUrl: "../../vault/add-edit.component.html",
})
export class AddEditComponent extends BaseAddEditComponent {
- organization: Organization;
originalCipher: Cipher = null;
constructor(
@@ -44,7 +42,7 @@ export class AddEditComponent extends BaseAddEditComponent {
passwordGenerationService: PasswordGenerationService,
private apiService: ApiService,
messagingService: MessagingService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
policyService: PolicyService,
logService: LogService,
passwordRepromptService: PasswordRepromptService,
@@ -61,7 +59,7 @@ export class AddEditComponent extends BaseAddEditComponent {
totpService,
passwordGenerationService,
messagingService,
- eventService,
+ eventCollectionService,
policyService,
organizationService,
logService,
diff --git a/apps/web/src/app/organizations/vault/ciphers.component.ts b/apps/web/src/app/organizations/vault/vault-items.component.ts
similarity index 87%
rename from apps/web/src/app/organizations/vault/ciphers.component.ts
rename to apps/web/src/app/organizations/vault/vault-items.component.ts
index 558c09d5e30..e7ee2cb28e6 100644
--- a/apps/web/src/app/organizations/vault/ciphers.component.ts
+++ b/apps/web/src/app/organizations/vault/vault-items.component.ts
@@ -2,7 +2,7 @@ import { Component, EventEmitter, Output } from "@angular/core";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction";
@@ -12,21 +12,17 @@ import { SearchService } from "@bitwarden/common/abstractions/search.service";
import { StateService } from "@bitwarden/common/abstractions/state.service";
import { TokenService } from "@bitwarden/common/abstractions/token.service";
import { TotpService } from "@bitwarden/common/abstractions/totp.service";
-import { Organization } from "@bitwarden/common/models/domain/organization";
import { CipherView } from "@bitwarden/common/models/view/cipher.view";
-import { CiphersComponent as BaseCiphersComponent } from "../../vault/ciphers.component";
+import { VaultItemsComponent as BaseVaultItemsComponent } from "../../vault/vault-items.component";
@Component({
- selector: "app-org-vault-ciphers",
- templateUrl: "../../vault/ciphers.component.html",
+ selector: "app-org-vault-items",
+ templateUrl: "../../vault/vault-items.component.html",
})
-export class CiphersComponent extends BaseCiphersComponent {
+export class VaultItemsComponent extends BaseVaultItemsComponent {
@Output() onEventsClicked = new EventEmitter();
- organization: Organization;
- accessEvents = false;
-
protected allCiphers: CipherView[] = [];
constructor(
@@ -34,7 +30,7 @@ export class CiphersComponent extends BaseCiphersComponent {
i18nService: I18nService,
platformUtilsService: PlatformUtilsService,
cipherService: CipherService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
totpService: TotpService,
passwordRepromptService: PasswordRepromptService,
logService: LogService,
@@ -48,7 +44,7 @@ export class CiphersComponent extends BaseCiphersComponent {
i18nService,
platformUtilsService,
cipherService,
- eventService,
+ eventCollectionService,
totpService,
stateService,
passwordRepromptService,
@@ -86,6 +82,7 @@ export class CiphersComponent extends BaseCiphersComponent {
async search(timeout: number = null) {
await super.search(timeout, this.allCiphers);
}
+
events(c: CipherView) {
this.onEventsClicked.emit(c);
}
diff --git a/apps/web/src/app/organizations/vault/vault.component.html b/apps/web/src/app/organizations/vault/vault.component.html
index d579b08ae2d..aff0437309a 100644
--- a/apps/web/src/app/organizations/vault/vault.component.html
+++ b/apps/web/src/app/organizations/vault/vault.component.html
@@ -19,8 +19,8 @@
diff --git a/apps/web/src/app/organizations/vault/vault.component.ts b/apps/web/src/app/organizations/vault/vault.component.ts
index f7f5ceda49f..477c795ccba 100644
--- a/apps/web/src/app/organizations/vault/vault.component.ts
+++ b/apps/web/src/app/organizations/vault/vault.component.ts
@@ -29,9 +29,9 @@ import { EntityEventsComponent } from "../manage/entity-events.component";
import { AddEditComponent } from "./add-edit.component";
import { AttachmentsComponent } from "./attachments.component";
-import { CiphersComponent } from "./ciphers.component";
import { CollectionsComponent } from "./collections.component";
import { VaultFilterComponent } from "./vault-filter/vault-filter.component";
+import { VaultItemsComponent } from "./vault-items.component";
const BroadcasterSubscriptionId = "OrgVaultComponent";
@@ -42,7 +42,7 @@ const BroadcasterSubscriptionId = "OrgVaultComponent";
export class VaultComponent implements OnInit, OnDestroy {
@ViewChild("vaultFilter", { static: true })
vaultFilterComponent: VaultFilterComponent;
- @ViewChild(CiphersComponent, { static: true }) ciphersComponent: CiphersComponent;
+ @ViewChild(VaultItemsComponent, { static: true }) vaultItemsComponent: VaultItemsComponent;
@ViewChild("attachments", { read: ViewContainerRef, static: true })
attachmentsModalRef: ViewContainerRef;
@ViewChild("cipherAddEdit", { read: ViewContainerRef, static: true })
@@ -82,11 +82,11 @@ export class VaultComponent implements OnInit, OnDestroy {
// eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe
this.route.parent.params.subscribe(async (params: any) => {
this.organization = this.organizationService.get(params.organizationId);
- this.ciphersComponent.organization = this.organization;
+ this.vaultItemsComponent.organization = this.organization;
/* eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe, rxjs/no-nested-subscribe */
this.route.queryParams.pipe(first()).subscribe(async (qParams) => {
- this.ciphersComponent.searchText = this.vaultFilterComponent.searchText = qParams.search;
+ this.vaultItemsComponent.searchText = this.vaultFilterComponent.searchText = qParams.search;
if (!this.organization.canViewAllCollections) {
await this.syncService.fullSync(false);
this.broadcasterService.subscribe(BroadcasterSubscriptionId, (message: any) => {
@@ -96,7 +96,7 @@ export class VaultComponent implements OnInit, OnDestroy {
if (message.successfully) {
await Promise.all([
this.vaultFilterService.reloadCollections(),
- this.ciphersComponent.refresh(),
+ this.vaultItemsComponent.refresh(),
]);
this.changeDetectorRef.detectChanges();
}
@@ -106,13 +106,15 @@ export class VaultComponent implements OnInit, OnDestroy {
});
}
- await this.ciphersComponent.reload(
+ await this.vaultItemsComponent.reload(
this.activeFilter.buildFilter(),
this.activeFilter.isDeleted
);
if (qParams.viewEvents != null) {
- const cipher = this.ciphersComponent.ciphers.filter((c) => c.id === qParams.viewEvents);
+ const cipher = this.vaultItemsComponent.ciphers.filter(
+ (c) => c.id === qParams.viewEvents
+ );
if (cipher.length > 0) {
this.viewEvents(cipher[0]);
}
@@ -151,8 +153,8 @@ export class VaultComponent implements OnInit, OnDestroy {
async applyVaultFilter(filter: VaultFilter) {
this.activeFilter = filter;
- this.ciphersComponent.showAddNew = !this.activeFilter.isDeleted;
- await this.ciphersComponent.reload(
+ this.vaultItemsComponent.showAddNew = !this.activeFilter.isDeleted;
+ await this.vaultItemsComponent.reload(
this.activeFilter.buildFilter(),
this.activeFilter.isDeleted
);
@@ -160,8 +162,8 @@ export class VaultComponent implements OnInit, OnDestroy {
}
filterSearchText(searchText: string) {
- this.ciphersComponent.searchText = searchText;
- this.ciphersComponent.search(200);
+ this.vaultItemsComponent.searchText = searchText;
+ this.vaultItemsComponent.search(200);
}
async editCipherAttachments(cipher: CipherView) {
@@ -188,7 +190,7 @@ export class VaultComponent implements OnInit, OnDestroy {
// eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe
modal.onClosed.subscribe(async () => {
if (madeAttachmentChanges) {
- await this.ciphersComponent.refresh();
+ await this.vaultItemsComponent.refresh();
}
madeAttachmentChanges = false;
});
@@ -207,7 +209,7 @@ export class VaultComponent implements OnInit, OnDestroy {
// eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe
comp.onSavedCollections.subscribe(async () => {
modal.close();
- await this.ciphersComponent.refresh();
+ await this.vaultItemsComponent.refresh();
});
}
);
@@ -247,17 +249,17 @@ export class VaultComponent implements OnInit, OnDestroy {
// eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe
comp.onSavedCipher.subscribe(async () => {
modal.close();
- await this.ciphersComponent.refresh();
+ await this.vaultItemsComponent.refresh();
});
// eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe
comp.onDeletedCipher.subscribe(async () => {
modal.close();
- await this.ciphersComponent.refresh();
+ await this.vaultItemsComponent.refresh();
});
// eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe
comp.onRestoredCipher.subscribe(async () => {
modal.close();
- await this.ciphersComponent.refresh();
+ await this.vaultItemsComponent.refresh();
});
}
);
diff --git a/apps/web/src/app/organizations/vault/vault.module.ts b/apps/web/src/app/organizations/vault/vault.module.ts
index e924d9a3b01..9cd3b7a9ab3 100644
--- a/apps/web/src/app/organizations/vault/vault.module.ts
+++ b/apps/web/src/app/organizations/vault/vault.module.ts
@@ -2,15 +2,22 @@ import { NgModule } from "@angular/core";
import { LooseComponentsModule } from "../../shared/loose-components.module";
import { SharedModule } from "../../shared/shared.module";
+import { OrganizationBadgeModule } from "../../vault/organization-badge/organization-badge.module";
-import { CiphersComponent } from "./ciphers.component";
import { VaultFilterModule } from "./vault-filter/vault-filter.module";
+import { VaultItemsComponent } from "./vault-items.component";
import { VaultRoutingModule } from "./vault-routing.module";
import { VaultComponent } from "./vault.component";
@NgModule({
- imports: [VaultRoutingModule, VaultFilterModule, SharedModule, LooseComponentsModule],
- declarations: [VaultComponent, CiphersComponent],
+ imports: [
+ VaultRoutingModule,
+ VaultFilterModule,
+ SharedModule,
+ LooseComponentsModule,
+ OrganizationBadgeModule,
+ ],
+ declarations: [VaultComponent, VaultItemsComponent],
exports: [VaultComponent],
})
export class VaultModule {}
diff --git a/apps/web/src/app/oss-routing.module.ts b/apps/web/src/app/oss-routing.module.ts
index f77043a777e..76b81f27ea3 100644
--- a/apps/web/src/app/oss-routing.module.ts
+++ b/apps/web/src/app/oss-routing.module.ts
@@ -15,7 +15,6 @@ import { LoginWithDeviceComponent } from "./accounts/login/login-with-device.com
import { LoginComponent } from "./accounts/login/login.component";
import { RecoverDeleteComponent } from "./accounts/recover-delete.component";
import { RecoverTwoFactorComponent } from "./accounts/recover-two-factor.component";
-import { RegisterComponent } from "./accounts/register.component";
import { RemovePasswordComponent } from "./accounts/remove-password.component";
import { SetPasswordComponent } from "./accounts/set-password.component";
import { SsoComponent } from "./accounts/sso.component";
@@ -69,16 +68,15 @@ const routes: Routes = [
{ path: "2fa", component: TwoFactorComponent, canActivate: [UnauthGuard] },
{
path: "register",
- component: RegisterComponent,
+ component: TrialInitiationComponent,
canActivate: [UnauthGuard],
data: { titleId: "createAccount" },
},
- buildFlaggedRoute("showTrial", {
+ {
path: "trial",
- component: TrialInitiationComponent,
- canActivate: [UnauthGuard],
- data: { titleId: "startTrial" },
- }),
+ redirectTo: "register",
+ pathMatch: "full",
+ },
{
path: "sso",
component: SsoComponent,
diff --git a/apps/web/src/app/reports/pages/weak-passwords-report.component.ts b/apps/web/src/app/reports/pages/weak-passwords-report.component.ts
index dabb835d725..b6a2278285f 100644
--- a/apps/web/src/app/reports/pages/weak-passwords-report.component.ts
+++ b/apps/web/src/app/reports/pages/weak-passwords-report.component.ts
@@ -8,6 +8,7 @@ import { PasswordRepromptService } from "@bitwarden/common/abstractions/password
import { StateService } from "@bitwarden/common/abstractions/state.service";
import { CipherType } from "@bitwarden/common/enums/cipherType";
import { CipherView } from "@bitwarden/common/models/view/cipher.view";
+import { BadgeTypes } from "@bitwarden/components";
import { CipherReportComponent } from "./cipher-report.component";
@@ -16,7 +17,7 @@ import { CipherReportComponent } from "./cipher-report.component";
templateUrl: "weak-passwords-report.component.html",
})
export class WeakPasswordsReportComponent extends CipherReportComponent implements OnInit {
- passwordStrengthMap = new Map();
+ passwordStrengthMap = new Map();
private passwordStrengthCache = new Map();
@@ -110,7 +111,7 @@ export class WeakPasswordsReportComponent extends CipherReportComponent implemen
return true;
}
- private scoreKey(score: number): [string, string] {
+ private scoreKey(score: number): [string, BadgeTypes] {
switch (score) {
case 4:
return ["strong", "success"];
diff --git a/apps/web/src/app/reports/shared/report-card/report-card.component.ts b/apps/web/src/app/reports/shared/report-card/report-card.component.ts
index 063d52bc682..13a2a04e0d2 100644
--- a/apps/web/src/app/reports/shared/report-card/report-card.component.ts
+++ b/apps/web/src/app/reports/shared/report-card/report-card.component.ts
@@ -1,5 +1,7 @@
import { Component, Input } from "@angular/core";
+import { Icon } from "@bitwarden/components";
+
import { ReportVariant } from "../models/report-variant";
@Component({
@@ -10,7 +12,7 @@ export class ReportCardComponent {
@Input() title: string;
@Input() description: string;
@Input() route: string;
- @Input() icon: string;
+ @Input() icon: Icon;
@Input() variant: ReportVariant;
protected get disabled() {
diff --git a/apps/web/src/app/send/access.component.html b/apps/web/src/app/send/access.component.html
index b5818610203..91ae288d3c2 100644
--- a/apps/web/src/app/send/access.component.html
+++ b/apps/web/src/app/send/access.component.html
@@ -81,7 +81,7 @@
id="text"
rows="8"
name="Text"
- [(ngModel)]="sendText"
+ [ngModel]="sendText"
class="form-control"
readonly
>
diff --git a/apps/web/src/app/send/add-edit.component.html b/apps/web/src/app/send/add-edit.component.html
index dcc60a3c7af..dd9f61c6c58 100644
--- a/apps/web/src/app/send/add-edit.component.html
+++ b/apps/web/src/app/send/add-edit.component.html
@@ -55,7 +55,7 @@
name="Type_{{ o.value }}"
id="type_{{ o.value }}"
[value]="o.value"
- (change)="typeChanged(o)"
+ (change)="typeChanged()"
[checked]="send.type === o.value"
/>
|