mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 17:23:37 +00:00
Merge branch 'main' into autofill/pm-5189-fix-issues-present-with-inline-menu-rendering-in-iframes
This commit is contained in:
@@ -3,7 +3,6 @@ import { FormBuilder } from "@angular/forms";
|
|||||||
import { ActivatedRoute, Router } from "@angular/router";
|
import { ActivatedRoute, Router } from "@angular/router";
|
||||||
import { Subject, takeUntil } from "rxjs";
|
import { Subject, takeUntil } from "rxjs";
|
||||||
|
|
||||||
import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components/environment-selector.component";
|
|
||||||
import { LoginComponent as BaseLoginComponent } from "@bitwarden/angular/auth/components/login.component";
|
import { LoginComponent as BaseLoginComponent } from "@bitwarden/angular/auth/components/login.component";
|
||||||
import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service";
|
import { FormValidationErrorsService } from "@bitwarden/angular/platform/abstractions/form-validation-errors.service";
|
||||||
import { ModalService } from "@bitwarden/angular/services/modal.service";
|
import { ModalService } from "@bitwarden/angular/services/modal.service";
|
||||||
@@ -37,8 +36,6 @@ const BroadcasterSubscriptionId = "LoginComponent";
|
|||||||
export class LoginComponent extends BaseLoginComponent implements OnDestroy {
|
export class LoginComponent extends BaseLoginComponent implements OnDestroy {
|
||||||
@ViewChild("environment", { read: ViewContainerRef, static: true })
|
@ViewChild("environment", { read: ViewContainerRef, static: true })
|
||||||
environmentModal: ViewContainerRef;
|
environmentModal: ViewContainerRef;
|
||||||
@ViewChild("environmentSelector", { read: ViewContainerRef, static: true })
|
|
||||||
environmentSelector: EnvironmentSelectorComponent;
|
|
||||||
|
|
||||||
protected componentDestroyed$: Subject<void> = new Subject();
|
protected componentDestroyed$: Subject<void> = new Subject();
|
||||||
webVaultHostname = "";
|
webVaultHostname = "";
|
||||||
|
|||||||
@@ -26,6 +26,10 @@ export class OrganizationUserView {
|
|||||||
twoFactorEnabled: boolean;
|
twoFactorEnabled: boolean;
|
||||||
usesKeyConnector: boolean;
|
usesKeyConnector: boolean;
|
||||||
hasMasterPassword: boolean;
|
hasMasterPassword: boolean;
|
||||||
|
/**
|
||||||
|
* True if this organizaztion user has been granted access to Secrets Manager, false otherwise.
|
||||||
|
*/
|
||||||
|
accessSecretsManager: boolean;
|
||||||
|
|
||||||
collections: CollectionAccessSelectionView[] = [];
|
collections: CollectionAccessSelectionView[] = [];
|
||||||
groups: string[] = [];
|
groups: string[] = [];
|
||||||
|
|||||||
@@ -571,7 +571,8 @@ export class PeopleComponent
|
|||||||
}
|
}
|
||||||
|
|
||||||
async bulkEnableSM() {
|
async bulkEnableSM() {
|
||||||
const users = this.getCheckedUsers();
|
const users = this.getCheckedUsers().filter((ou) => !ou.accessSecretsManager);
|
||||||
|
|
||||||
if (users.length === 0) {
|
if (users.length === 0) {
|
||||||
this.platformUtilsService.showToast(
|
this.platformUtilsService.showToast(
|
||||||
"error",
|
"error",
|
||||||
@@ -588,6 +589,7 @@ export class PeopleComponent
|
|||||||
|
|
||||||
await lastValueFrom(dialogRef.closed);
|
await lastValueFrom(dialogRef.closed);
|
||||||
this.selectAll(false);
|
this.selectAll(false);
|
||||||
|
await this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
async events(user: OrganizationUserView) {
|
async events(user: OrganizationUserView) {
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
import { Component, OnInit } from "@angular/core";
|
|
||||||
import { ActivatedRoute } from "@angular/router";
|
|
||||||
import { map, Observable, switchMap } from "rxjs";
|
|
||||||
|
|
||||||
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
|
|
||||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
templateUrl: "organization-billing-tab.component.html",
|
|
||||||
})
|
|
||||||
export class OrganizationBillingTabComponent implements OnInit {
|
|
||||||
showPaymentAndHistory$: Observable<boolean>;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private route: ActivatedRoute,
|
|
||||||
private organizationService: OrganizationService,
|
|
||||||
private platformUtilsService: PlatformUtilsService,
|
|
||||||
) {}
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
this.showPaymentAndHistory$ = this.route.params.pipe(
|
|
||||||
switchMap((params) => this.organizationService.get$(params.organizationId)),
|
|
||||||
map(
|
|
||||||
(org) =>
|
|
||||||
!this.platformUtilsService.isSelfHost() &&
|
|
||||||
org.canViewBillingHistory &&
|
|
||||||
org.canEditPaymentMethods,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -41,7 +41,7 @@ export class BulkMoveDialogComponent implements OnInit {
|
|||||||
cipherIds: string[] = [];
|
cipherIds: string[] = [];
|
||||||
|
|
||||||
formGroup = this.formBuilder.group({
|
formGroup = this.formBuilder.group({
|
||||||
folderId: ["", [Validators.required]],
|
folderId: ["", [Validators.nullValidator]],
|
||||||
});
|
});
|
||||||
folders$: Observable<FolderView[]>;
|
folders$: Observable<FolderView[]>;
|
||||||
|
|
||||||
|
|||||||
@@ -1,79 +1,81 @@
|
|||||||
<div class="environment-selector-btn">
|
<ng-container
|
||||||
{{ "loggingInOn" | i18n }}:
|
*ngIf="{
|
||||||
<button
|
selectedRegion: selectedRegion$ | async
|
||||||
type="button"
|
} as data"
|
||||||
(click)="toggle(null)"
|
|
||||||
cdkOverlayOrigin
|
|
||||||
#trigger="cdkOverlayOrigin"
|
|
||||||
aria-haspopup="dialog"
|
|
||||||
aria-controls="cdk-overlay-container"
|
|
||||||
>
|
|
||||||
<span class="text-primary">
|
|
||||||
<ng-container *ngIf="selectedRegion$ | async as selectedRegion; else fallback">
|
|
||||||
{{ selectedRegion.domain }}
|
|
||||||
</ng-container>
|
|
||||||
<ng-template #fallback>
|
|
||||||
{{ "selfHostedServer" | i18n }}
|
|
||||||
</ng-template>
|
|
||||||
</span>
|
|
||||||
<i class="bwi bwi-fw bwi-sm bwi-angle-down" aria-hidden="true"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<ng-template
|
|
||||||
cdkConnectedOverlay
|
|
||||||
[cdkConnectedOverlayOrigin]="trigger"
|
|
||||||
[cdkConnectedOverlayOpen]="isOpen"
|
|
||||||
[cdkConnectedOverlayPositions]="overlayPosition"
|
|
||||||
[cdkConnectedOverlayHasBackdrop]="true"
|
|
||||||
[cdkConnectedOverlayBackdropClass]="'cdk-overlay-transparent-backdrop'"
|
|
||||||
(backdropClick)="isOpen = false"
|
|
||||||
(detach)="close()"
|
|
||||||
>
|
>
|
||||||
<div class="box-content">
|
<div class="environment-selector-btn">
|
||||||
<div
|
{{ "loggingInOn" | i18n }}:
|
||||||
class="environment-selector-dialog"
|
<button
|
||||||
[@transformPanel]="'open'"
|
type="button"
|
||||||
cdkTrapFocus
|
(click)="toggle(null)"
|
||||||
cdkTrapFocusAutoCapture
|
cdkOverlayOrigin
|
||||||
role="dialog"
|
#trigger="cdkOverlayOrigin"
|
||||||
aria-modal="true"
|
aria-haspopup="dialog"
|
||||||
|
aria-controls="cdk-overlay-container"
|
||||||
>
|
>
|
||||||
<ng-container *ngFor="let region of availableRegions">
|
<span class="text-primary">
|
||||||
|
<ng-container *ngIf="data.selectedRegion; else fallback">
|
||||||
|
{{ data.selectedRegion.domain }}
|
||||||
|
</ng-container>
|
||||||
|
<ng-template #fallback>
|
||||||
|
{{ "selfHostedServer" | i18n }}
|
||||||
|
</ng-template>
|
||||||
|
</span>
|
||||||
|
<i class="bwi bwi-fw bwi-sm bwi-angle-down" aria-hidden="true"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ng-template
|
||||||
|
cdkConnectedOverlay
|
||||||
|
[cdkConnectedOverlayOrigin]="trigger"
|
||||||
|
[cdkConnectedOverlayOpen]="isOpen"
|
||||||
|
[cdkConnectedOverlayPositions]="overlayPosition"
|
||||||
|
[cdkConnectedOverlayHasBackdrop]="true"
|
||||||
|
[cdkConnectedOverlayBackdropClass]="'cdk-overlay-transparent-backdrop'"
|
||||||
|
(backdropClick)="isOpen = false"
|
||||||
|
(detach)="close()"
|
||||||
|
>
|
||||||
|
<div class="box-content">
|
||||||
|
<div
|
||||||
|
class="environment-selector-dialog"
|
||||||
|
[@transformPanel]="'open'"
|
||||||
|
cdkTrapFocus
|
||||||
|
cdkTrapFocusAutoCapture
|
||||||
|
role="dialog"
|
||||||
|
aria-modal="true"
|
||||||
|
>
|
||||||
|
<ng-container *ngFor="let region of availableRegions">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="environment-selector-dialog-item"
|
||||||
|
(click)="toggle(region.key)"
|
||||||
|
[attr.aria-pressed]="data.selectedRegion === region ? 'true' : 'false'"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="bwi bwi-fw bwi-sm bwi-check"
|
||||||
|
style="padding-bottom: 1px"
|
||||||
|
aria-hidden="true"
|
||||||
|
[style.visibility]="data.selectedRegion === region ? 'visible' : 'hidden'"
|
||||||
|
></i>
|
||||||
|
<span>{{ region.domain }}</span>
|
||||||
|
</button>
|
||||||
|
<br />
|
||||||
|
</ng-container>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="environment-selector-dialog-item"
|
class="environment-selector-dialog-item"
|
||||||
(click)="toggle(region.key)"
|
(click)="toggle(ServerEnvironmentType.SelfHosted)"
|
||||||
[attr.aria-pressed]="selectedEnvironment === region.key ? 'true' : 'false'"
|
[attr.aria-pressed]="data.selectedRegion ? 'false' : 'true'"
|
||||||
>
|
>
|
||||||
<i
|
<i
|
||||||
class="bwi bwi-fw bwi-sm bwi-check"
|
class="bwi bwi-fw bwi-sm bwi-check"
|
||||||
style="padding-bottom: 1px"
|
style="padding-bottom: 1px"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
[style.visibility]="selectedEnvironment === region.key ? 'visible' : 'hidden'"
|
[style.visibility]="data.selectedRegion ? 'hidden' : 'visible'"
|
||||||
></i>
|
></i>
|
||||||
<span>{{ region.domain }}</span>
|
<span>{{ "selfHostedServer" | i18n }}</span>
|
||||||
</button>
|
</button>
|
||||||
<br />
|
</div>
|
||||||
</ng-container>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
class="environment-selector-dialog-item"
|
|
||||||
(click)="toggle(ServerEnvironmentType.SelfHosted)"
|
|
||||||
[attr.aria-pressed]="
|
|
||||||
selectedEnvironment === ServerEnvironmentType.SelfHosted ? 'true' : 'false'
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<i
|
|
||||||
class="bwi bwi-fw bwi-sm bwi-check"
|
|
||||||
style="padding-bottom: 1px"
|
|
||||||
aria-hidden="true"
|
|
||||||
[style.visibility]="
|
|
||||||
selectedEnvironment === ServerEnvironmentType.SelfHosted ? 'visible' : 'hidden'
|
|
||||||
"
|
|
||||||
></i>
|
|
||||||
<span>{{ "selfHostedServer" | i18n }}</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</ng-template>
|
||||||
</ng-template>
|
</ng-container>
|
||||||
|
|||||||
@@ -36,11 +36,9 @@ import {
|
|||||||
})
|
})
|
||||||
export class EnvironmentSelectorComponent {
|
export class EnvironmentSelectorComponent {
|
||||||
@Output() onOpenSelfHostedSettings = new EventEmitter();
|
@Output() onOpenSelfHostedSettings = new EventEmitter();
|
||||||
isOpen = false;
|
protected isOpen = false;
|
||||||
showingModal = false;
|
protected ServerEnvironmentType = Region;
|
||||||
selectedEnvironment: Region;
|
protected overlayPosition: ConnectedPosition[] = [
|
||||||
ServerEnvironmentType = Region;
|
|
||||||
overlayPosition: ConnectedPosition[] = [
|
|
||||||
{
|
{
|
||||||
originX: "start",
|
originX: "start",
|
||||||
originY: "bottom",
|
originY: "bottom",
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<div
|
<div
|
||||||
class="tw-my-2 tw-border-0 tw-border-t tw-border-solid tw-border-t-secondary-500"
|
class="tw-my-2 tw-border-0 tw-border-t tw-border-solid tw-border-t-secondary-500"
|
||||||
role="separator"
|
role="separator"
|
||||||
|
aria-hidden="true"
|
||||||
></div>
|
></div>
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ export class MenuTriggerForDirective implements OnDestroy {
|
|||||||
}
|
}
|
||||||
this.destroyMenu();
|
this.destroyMenu();
|
||||||
});
|
});
|
||||||
|
this.menu.keyManager.setFirstItemActive();
|
||||||
this.keyDownEventsSub =
|
this.keyDownEventsSub =
|
||||||
this.menu.keyManager &&
|
this.menu.keyManager &&
|
||||||
this.overlayRef
|
this.overlayRef
|
||||||
|
|||||||
Reference in New Issue
Block a user