Browse Source
* [PM-169][PM-142][PM-191] Add Environments to Web and Desktop (#5294) * [PM-1351] Add property to server-config.response. Change config to be able to fetch without being authed. * [PM-1351] fetch every hour. * [PM-1351] fetch on vault sync. * [PM-1351] browser desktop fetch configs on sync complete. * [PM-1351] Add methods to retrieve feature flags * [PM-1351] Add enum to use as key to get values feature flag values * [PM-1351] Remove debug code * [PM-1351] Get flags when unauthed. Add enums as params. Hourly always fetch. * [PM-1351] add check for authed user using auth service * [PM-169] Web: add drop down to select environment * [PM-169] Fix pop up menu margins. Add DisplayEuEnvironmentFlag. * [PM-169] Change menu name. * [PM-169] Add environment selector ts and html. Add declaration and import on login.module * [PM-169] Add environment selector to desktop. * [PM-169] Ignore lint error. * [PM-169] add takeUntil to subscribes * [PM-191] PR Fixes, code format * [PM-168] Add Environments to extension login/registration (#5434)pull/5481/head
28 changed files with 463 additions and 42 deletions
|
After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
@ -1,5 +1,34 @@ |
|||||||
<router-outlet></router-outlet> |
<router-outlet></router-outlet> |
||||||
<div class="container my-5 text-muted text-center"> |
<div class="container my-5 text-muted text-center"> |
||||||
|
<div class="tw-mb-1"> |
||||||
|
<bit-menu #environmentOptions> |
||||||
|
<a bitMenuItem href="https://vault.bitwarden.com" class="pr-4"> |
||||||
|
<i |
||||||
|
class="bwi bwi-fw bwi-sm bwi-check pb-1" |
||||||
|
aria-hidden="true" |
||||||
|
[style.visibility]="isEuServer ? 'hidden' : 'visible'" |
||||||
|
></i> |
||||||
|
<img src="../../images/us_flag.png" alt="" class="pb-1 mr-1" /> |
||||||
|
{{ "us" | i18n }} |
||||||
|
</a> |
||||||
|
<a bitMenuItem href="https://vault.bitwarden.eu" class="pr-4" *ngIf="euServerFlagEnabled"> |
||||||
|
<i |
||||||
|
class="bwi bwi-fw bwi-sm bwi-check pb-1" |
||||||
|
aria-hidden="true" |
||||||
|
[style.visibility]="isEuServer ? 'visible' : 'hidden'" |
||||||
|
></i> |
||||||
|
<img src="../../images/eu_flag.png" alt="" class="pb-1 mr-1" /> |
||||||
|
{{ "eu" | i18n }} |
||||||
|
</a> |
||||||
|
</bit-menu> |
||||||
|
{{ "region" | i18n }}: |
||||||
|
<a [routerLink]="[]" [bitMenuTriggerFor]="environmentOptions"> |
||||||
|
<b>{{ isEuServer ? ("eu" | i18n) : ("us" | i18n) }}</b |
||||||
|
><i class="bwi bwi-fw bwi-sm bwi-angle-down" aria-hidden="true"></i> |
||||||
|
</a> |
||||||
|
<br /> |
||||||
|
</div> |
||||||
|
|
||||||
© {{ year }} Bitwarden Inc. <br /> |
© {{ year }} Bitwarden Inc. <br /> |
||||||
{{ "versionNumber" | i18n : version }} |
{{ "versionNumber" | i18n : version }} |
||||||
</div> |
</div> |
||||||
|
|||||||
|
After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
@ -0,0 +1,86 @@ |
|||||||
|
<label class="environment-selector-btn"> |
||||||
|
{{ "region" | i18n }}: |
||||||
|
<a |
||||||
|
(click)="toggle(null)" |
||||||
|
cdkOverlayOrigin |
||||||
|
#trigger="cdkOverlayOrigin" |
||||||
|
aria-haspopup="menu" |
||||||
|
aria-controls="cdk-overlay-container" |
||||||
|
[ngSwitch]="selectedEnvironment" |
||||||
|
> |
||||||
|
<label *ngSwitchCase="ServerEnvironmentType.US" class="text-primary">{{ "us" | i18n }}</label> |
||||||
|
<label *ngSwitchCase="ServerEnvironmentType.EU" class="text-primary">{{ "eu" | i18n }}</label> |
||||||
|
<label *ngSwitchCase="ServerEnvironmentType.SelfHosted" class="text-primary">{{ |
||||||
|
"selfHosted" | i18n |
||||||
|
}}</label> |
||||||
|
<i class="bwi bwi-fw bwi-sm bwi-angle-down" aria-hidden="true"></i> |
||||||
|
</a> |
||||||
|
</label> |
||||||
|
|
||||||
|
<ng-template |
||||||
|
cdkConnectedOverlay |
||||||
|
[cdkConnectedOverlayOrigin]="trigger" |
||||||
|
(backdropClick)="close()" |
||||||
|
(detach)="close()" |
||||||
|
[cdkConnectedOverlayOpen]="isOpen" |
||||||
|
[cdkConnectedOverlayPositions]="overlayPostition" |
||||||
|
> |
||||||
|
<div class="box-content"> |
||||||
|
<div class="environment-selector-dialog" [@transformPanel]="'open'" role="dialog"> |
||||||
|
<button |
||||||
|
type="button" |
||||||
|
class="environment-selector-dialog-item" |
||||||
|
(click)="toggle(ServerEnvironmentType.US)" |
||||||
|
> |
||||||
|
<i |
||||||
|
class="bwi bwi-fw bwi-sm bwi-check" |
||||||
|
style="padding-bottom: 1px" |
||||||
|
aria-hidden="true" |
||||||
|
[style.visibility]=" |
||||||
|
selectedEnvironment === ServerEnvironmentType.US ? 'visible' : 'hidden' |
||||||
|
" |
||||||
|
></i> |
||||||
|
<img class="img-us" alt="" /> |
||||||
|
<span>{{ "us" | i18n }}</span> |
||||||
|
</button> |
||||||
|
<br /> |
||||||
|
<button |
||||||
|
type="button" |
||||||
|
class="environment-selector-dialog-item" |
||||||
|
(click)="toggle(ServerEnvironmentType.EU)" |
||||||
|
> |
||||||
|
<i |
||||||
|
class="bwi bwi-fw bwi-sm bwi-check" |
||||||
|
style="padding-bottom: 1px" |
||||||
|
aria-hidden="true" |
||||||
|
[style.visibility]=" |
||||||
|
selectedEnvironment === ServerEnvironmentType.EU ? 'visible' : 'hidden' |
||||||
|
" |
||||||
|
></i> |
||||||
|
<img class="img-eu" alt="" /> |
||||||
|
<span>{{ "eu" | i18n }}</span> |
||||||
|
</button> |
||||||
|
<br /> |
||||||
|
<button |
||||||
|
type="button" |
||||||
|
class="environment-selector-dialog-item" |
||||||
|
(click)="toggle(ServerEnvironmentType.SelfHosted)" |
||||||
|
> |
||||||
|
<i |
||||||
|
class="bwi bwi-fw bwi-sm bwi-check" |
||||||
|
style="padding-bottom: 1px" |
||||||
|
aria-hidden="true" |
||||||
|
[style.visibility]=" |
||||||
|
selectedEnvironment === ServerEnvironmentType.SelfHosted ? 'visible' : 'hidden' |
||||||
|
" |
||||||
|
></i> |
||||||
|
<i |
||||||
|
class="bwi bwi-fw bwi-sm bwi-pencil-square" |
||||||
|
style="padding-bottom: 1px" |
||||||
|
aria-hidden="true" |
||||||
|
></i> |
||||||
|
<span>{{ "selfHosted" | i18n }}</span> |
||||||
|
</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</ng-template> |
||||||
@ -0,0 +1,103 @@ |
|||||||
|
import { animate, state, style, transition, trigger } from "@angular/animations"; |
||||||
|
import { ConnectedPosition } from "@angular/cdk/overlay"; |
||||||
|
import { Component, EventEmitter, OnDestroy, OnInit, Output } from "@angular/core"; |
||||||
|
import { Router } from "@angular/router"; |
||||||
|
import { Subject } from "rxjs"; |
||||||
|
|
||||||
|
import { ConfigServiceAbstraction } from "@bitwarden/common/abstractions/config/config.service.abstraction"; |
||||||
|
import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service"; |
||||||
|
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; |
||||||
|
|
||||||
|
@Component({ |
||||||
|
selector: "environment-selector", |
||||||
|
templateUrl: "environment-selector.component.html", |
||||||
|
animations: [ |
||||||
|
trigger("transformPanel", [ |
||||||
|
state( |
||||||
|
"void", |
||||||
|
style({ |
||||||
|
opacity: 0, |
||||||
|
}) |
||||||
|
), |
||||||
|
transition( |
||||||
|
"void => open", |
||||||
|
animate( |
||||||
|
"100ms linear", |
||||||
|
style({ |
||||||
|
opacity: 1, |
||||||
|
}) |
||||||
|
) |
||||||
|
), |
||||||
|
transition("* => void", animate("100ms linear", style({ opacity: 0 }))), |
||||||
|
]), |
||||||
|
], |
||||||
|
}) |
||||||
|
export class EnvironmentSelectorComponent implements OnInit, OnDestroy { |
||||||
|
@Output() onOpenSelfHostedSettings = new EventEmitter(); |
||||||
|
isOpen = false; |
||||||
|
showingModal = false; |
||||||
|
selectedEnvironment: ServerEnvironment; |
||||||
|
ServerEnvironmentType = ServerEnvironment; |
||||||
|
euServerFlagEnabled: boolean; |
||||||
|
overlayPostition: ConnectedPosition[] = [ |
||||||
|
{ |
||||||
|
originX: "start", |
||||||
|
originY: "bottom", |
||||||
|
overlayX: "start", |
||||||
|
overlayY: "top", |
||||||
|
}, |
||||||
|
]; |
||||||
|
protected componentDestroyed$: Subject<void> = new Subject(); |
||||||
|
|
||||||
|
constructor( |
||||||
|
protected environmentService: EnvironmentService, |
||||||
|
protected configService: ConfigServiceAbstraction, |
||||||
|
protected router: Router |
||||||
|
) {} |
||||||
|
|
||||||
|
async ngOnInit() { |
||||||
|
this.euServerFlagEnabled = await this.configService.getFeatureFlagBool( |
||||||
|
FeatureFlag.DisplayEuEnvironmentFlag |
||||||
|
); |
||||||
|
this.updateEnvironmentInfo(); |
||||||
|
} |
||||||
|
|
||||||
|
ngOnDestroy(): void { |
||||||
|
this.componentDestroyed$.next(); |
||||||
|
this.componentDestroyed$.complete(); |
||||||
|
} |
||||||
|
|
||||||
|
async toggle(option: ServerEnvironment) { |
||||||
|
this.isOpen = !this.isOpen; |
||||||
|
if (option === ServerEnvironment.EU) { |
||||||
|
await this.environmentService.setUrls({ base: "https://vault.bitwarden.eu" }); |
||||||
|
} else if (option === ServerEnvironment.US) { |
||||||
|
await this.environmentService.setUrls({ base: "https://vault.bitwarden.com" }); |
||||||
|
} else if (option === ServerEnvironment.SelfHosted) { |
||||||
|
this.onOpenSelfHostedSettings.emit(); |
||||||
|
} |
||||||
|
this.updateEnvironmentInfo(); |
||||||
|
} |
||||||
|
|
||||||
|
updateEnvironmentInfo() { |
||||||
|
const webvaultUrl = this.environmentService.getWebVaultUrl(); |
||||||
|
if (this.environmentService.isSelfHosted()) { |
||||||
|
this.selectedEnvironment = ServerEnvironment.SelfHosted; |
||||||
|
} else if (webvaultUrl != null && webvaultUrl.includes("bitwarden.eu")) { |
||||||
|
this.selectedEnvironment = ServerEnvironment.EU; |
||||||
|
} else { |
||||||
|
this.selectedEnvironment = ServerEnvironment.US; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
close() { |
||||||
|
this.isOpen = false; |
||||||
|
this.updateEnvironmentInfo(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
enum ServerEnvironment { |
||||||
|
US = "US", |
||||||
|
EU = "EU", |
||||||
|
SelfHosted = "Self-hosted", |
||||||
|
} |
||||||
Loading…
Reference in new issue