user-profile > added "switch tenant" option
This commit is contained in:
parent
ca4e7e6feb
commit
6f7ed58523
|
@ -3,7 +3,31 @@
|
||||||
<div class="profile">
|
<div class="profile">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div *ngIf="user | async as userProfile; else loading" class="user-profile">
|
<div *ngIf="user | async as userProfile; else loading" class="user-profile">
|
||||||
<div class="col user-profile-title">{{'USER-DIALOG.USER-PROFILE' | translate}}</div>
|
<div class="row user-profile-title">
|
||||||
|
<div class="col mb-2">
|
||||||
|
{{'USER-DIALOG.USER-PROFILE' | translate}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div *ngIf="tenantFormGroup" class="col-auto mr-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<mat-form-field class="w-100">
|
||||||
|
<mat-label>Tenant</mat-label>
|
||||||
|
<mat-select placeholder="Tenant" [formControl]="this.tenantFormGroup.get('tenantCode')">
|
||||||
|
<ng-container *ngFor="let tenant of tenants | async">
|
||||||
|
<mat-option [value]="tenant">{{ tenant }}</mat-option>
|
||||||
|
</ng-container>
|
||||||
|
</mat-select>
|
||||||
|
</mat-form-field>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-lg-auto mt-1">
|
||||||
|
<button mat-mini-fab (click)="switchTenant()">
|
||||||
|
<mat-icon class="mat-mini-fab-icon">refresh</mat-icon>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="row profile-content" [formGroup]="formGroup">
|
<div class="row profile-content" [formGroup]="formGroup">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="row mb-4">
|
<div class="row mb-4">
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
|
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
|
||||||
import { Component, OnDestroy, OnInit } from '@angular/core';
|
import { Component, OnDestroy, OnInit } from '@angular/core';
|
||||||
import { UntypedFormArray, UntypedFormGroup } from '@angular/forms';
|
import { FormBuilder, UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
import { MatDialog } from '@angular/material/dialog';
|
||||||
import { ActivatedRoute, Params, Router } from '@angular/router';
|
import { ActivatedRoute, Params, Router } from '@angular/router';
|
||||||
import { RoleOrganizationType } from '@app/core/common/enum/role-organization-type';
|
import { RoleOrganizationType } from '@app/core/common/enum/role-organization-type';
|
||||||
|
@ -22,12 +22,16 @@ import { FormValidationErrorsDialogComponent } from '@common/forms/form-validati
|
||||||
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import * as moment from 'moment-timezone';
|
import * as moment from 'moment-timezone';
|
||||||
import { Observable, of } from 'rxjs';
|
import { Observable, from, of } from 'rxjs';
|
||||||
import { map, takeUntil } from 'rxjs/operators';
|
import { map, takeUntil } from 'rxjs/operators';
|
||||||
import { AddAccountDialogComponent } from './add-account/add-account-dialog.component';
|
import { AddAccountDialogComponent } from './add-account/add-account-dialog.component';
|
||||||
import { UserProfileEditorModel } from './user-profile-editor.model';
|
import { UserProfileEditorModel } from './user-profile-editor.model';
|
||||||
import { nameof } from 'ts-simple-nameof';
|
import { nameof } from 'ts-simple-nameof';
|
||||||
import { Guid } from '@common/types/guid';
|
import { Guid } from '@common/types/guid';
|
||||||
|
import { BaseHttpParams } from '@common/http/base-http-params';
|
||||||
|
import { InterceptorType } from '@common/http/interceptors/interceptor-type';
|
||||||
|
import { PrincipalService } from '@app/core/services/http/principal.service';
|
||||||
|
import { KeycloakService } from 'keycloak-angular';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-user-profile',
|
selector: 'app-user-profile',
|
||||||
|
@ -51,6 +55,7 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes
|
||||||
errorMessages = [];
|
errorMessages = [];
|
||||||
nestedCount = [];
|
nestedCount = [];
|
||||||
nestedIndex = 0;
|
nestedIndex = 0;
|
||||||
|
tenants: Observable<Array<string>>;
|
||||||
|
|
||||||
organisationsAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = {
|
organisationsAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = {
|
||||||
filterFn: this.filterOrganisations.bind(this),
|
filterFn: this.filterOrganisations.bind(this),
|
||||||
|
@ -61,6 +66,8 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes
|
||||||
};
|
};
|
||||||
|
|
||||||
formGroup: UntypedFormGroup;
|
formGroup: UntypedFormGroup;
|
||||||
|
tenantFormGroup: UntypedFormGroup;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private userService: UserService,
|
private userService: UserService,
|
||||||
private route: ActivatedRoute,
|
private route: ActivatedRoute,
|
||||||
|
@ -75,7 +82,10 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes
|
||||||
private dialog: MatDialog,
|
private dialog: MatDialog,
|
||||||
public enumUtils: EnumUtils,
|
public enumUtils: EnumUtils,
|
||||||
private httpClient: HttpClient,
|
private httpClient: HttpClient,
|
||||||
private matomoService: MatomoService
|
private matomoService: MatomoService,
|
||||||
|
private formBuilder: UntypedFormBuilder,
|
||||||
|
private keycloakService: KeycloakService,
|
||||||
|
private principalService: PrincipalService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this.languages = this.languageService.getAvailableLanguagesCodes();
|
this.languages = this.languageService.getAvailableLanguagesCodes();
|
||||||
|
@ -100,6 +110,9 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
this.tenantFormGroup = this.formBuilder.group({
|
||||||
|
tenantCode: [this.authService.selectedTenant(), [Validators.required]]
|
||||||
|
});
|
||||||
this.matomoService.trackPageView('User Profile');
|
this.matomoService.trackPageView('User Profile');
|
||||||
this.route.params
|
this.route.params
|
||||||
.pipe(takeUntil(this._destroyed))
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
@ -149,6 +162,8 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes
|
||||||
.pipe(takeUntil(this._destroyed))
|
.pipe(takeUntil(this._destroyed))
|
||||||
.subscribe(x => { if (x) { this.cultures = this._filterCulture(x); } });
|
.subscribe(x => { if (x) { this.cultures = this._filterCulture(x); } });
|
||||||
// this.initializeDisabledFormGroup();
|
// this.initializeDisabledFormGroup();
|
||||||
|
|
||||||
|
this.tenants = this.loadUserTenants();
|
||||||
this.unlock();
|
this.unlock();
|
||||||
return result;
|
return result;
|
||||||
}));
|
}));
|
||||||
|
@ -407,4 +422,29 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Switch Tenant
|
||||||
|
loadUserTenants(): Observable<Array<string>> {
|
||||||
|
const params = new BaseHttpParams();
|
||||||
|
params.interceptorContext = {
|
||||||
|
excludedInterceptors: [InterceptorType.TenantHeaderInterceptor]
|
||||||
|
};
|
||||||
|
return this.principalService.myTenants({ params: params });
|
||||||
|
}
|
||||||
|
|
||||||
|
switchTenant(): void {
|
||||||
|
if (this.tenantFormGroup.valid === false) return;
|
||||||
|
|
||||||
|
const selectedTenant = this.tenantFormGroup.get('tenantCode').value;
|
||||||
|
this.formSubmit(selectedTenant);
|
||||||
|
this.loadUser();
|
||||||
|
}
|
||||||
|
|
||||||
|
formSubmit(selectedTenant: string): void {
|
||||||
|
this.authService.selectedTenant(selectedTenant);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadUser(): void {
|
||||||
|
const returnUrl = '/profile';
|
||||||
|
this.authService.prepareAuthRequest(from(this.keycloakService.getToken()), {}).pipe(takeUntil(this._destroyed)).subscribe(() => this.authService.onAuthenticateSuccess(returnUrl), (error) => this.authService.onAuthenticateError(error));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue