1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-10 13:23:34 +00:00

[PM-6418] Fix environment selector on desktop (#8046)

Fix environment selector being broken on desktop. When selecting self-hosted and filling in a url, the selector fails to update when returning and instead produces the following console error.
This commit is contained in:
Oscar Hinton
2024-04-02 22:31:12 +02:00
committed by GitHub
parent 165f9c460a
commit a4475e8232
3 changed files with 71 additions and 74 deletions

View File

@@ -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 = "";

View File

@@ -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>

View File

@@ -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",