argos/dmp-frontend/src/app/ui/user-profile/user-profile.component.ts

195 lines
6.8 KiB
TypeScript
Raw Normal View History

2018-11-27 18:33:17 +01:00
import { Component, OnDestroy, OnInit } from '@angular/core';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
2018-11-27 18:33:17 +01:00
import { ActivatedRoute, Params, Router } from '@angular/router';
import { CultureInfo } from '@app/core/model/culture-info';
import { DmpModel } from '@app/core/model/dmp/dmp';
import { UserListingModel } from '@app/core/model/user/user-listing';
import { AuthService } from '@app/core/services/auth/auth.service';
import { CultureService } from '@app/core/services/culture/culture-service';
import { UserService } from '@app/core/services/user/user.service';
import { BaseComponent } from '@common/base/base.component';
2018-08-24 17:21:02 +02:00
import { TranslateService } from '@ngx-translate/core';
2018-11-27 18:33:17 +01:00
import * as moment from 'moment-timezone';
2019-09-23 10:17:03 +02:00
import { Observable, of } from 'rxjs';
import { map, takeUntil } from 'rxjs/operators';
import { LanguageService } from '@app/core/services/language/language.service';
2020-04-10 16:16:37 +02:00
import { isNullOrUndefined } from 'util';
import { Oauth2DialogService } from '../misc/oauth2-dialog/service/oauth2-dialog.service';
import { ConfigurationService } from '@app/core/services/configuration/configuration.service';
2018-08-24 17:21:02 +02:00
2018-08-30 13:09:36 +02:00
const availableLanguages: any[] = require('../../../assets/resources/language.json');
2018-08-24 17:21:02 +02:00
@Component({
2018-10-05 17:00:54 +02:00
selector: 'app-user-profile',
templateUrl: './user-profile.component.html',
styleUrls: ['./user-profile.component.scss'],
2018-08-24 17:21:02 +02:00
})
2018-11-27 18:33:17 +01:00
export class UserProfileComponent extends BaseComponent implements OnInit, OnDestroy {
2018-08-24 17:21:02 +02:00
2018-10-05 17:00:54 +02:00
user: Observable<UserListingModel>;
currentUserId: string;
cultures: Observable<CultureInfo[]>;
timezones: Observable<any[]>;
editMode = false;
languages = availableLanguages;
2020-04-10 16:16:37 +02:00
zenodoToken: string;
2020-07-17 12:19:10 +02:00
zenodoEmail: String;
2018-10-05 17:00:54 +02:00
formGroup: FormGroup;
constructor(
2019-01-18 18:03:45 +01:00
private userService: UserService,
2018-10-05 17:00:54 +02:00
private route: ActivatedRoute,
private router: Router,
private authService: AuthService,
private language: TranslateService,
private cultureService: CultureService,
private authentication: AuthService,
2020-04-10 16:16:37 +02:00
private languageService: LanguageService,
private configurationService: ConfigurationService,
private oauth2DialogService: Oauth2DialogService
2018-11-27 18:33:17 +01:00
) { super(); }
2018-10-05 17:00:54 +02:00
ngOnInit() {
2018-11-27 18:33:17 +01:00
this.route.params
.pipe(takeUntil(this._destroyed))
.subscribe((params: Params) => {
this.currentUserId = this.authService.current().id;
const userId = !params['id'] ? 'me' : params['id'];
2019-09-23 10:17:03 +02:00
this.user = this.userService.getUser(userId).pipe(map(result => {
2020-07-17 12:19:10 +02:00
//result['additionalinfo'] = JSON.parse(result['additionalinfo']);
//this.zenodoToken = result['additionalinfo']['zenodoToken'];
this.zenodoEmail = result['zenodoEmail'];
2018-11-27 18:33:17 +01:00
this.formGroup = new FormBuilder().group({
2020-07-17 12:19:10 +02:00
language: new FormControl(result['language'] ? availableLanguages.filter(x => x.value === result['language']['value']).pop() : '', [Validators.required]),
timezone: new FormControl(result['timezone'], [Validators.required]),
culture: new FormControl(result['culture'], [Validators.required])
2018-11-27 18:33:17 +01:00
});
//this.formGroup.get('language').valueChanges.pipe(takeUntil(this._destroyed)).subscribe(x => { if (x) this.translate.use(x.value) })
this.formGroup.get('timezone').valueChanges
.pipe(takeUntil(this._destroyed))
.subscribe(x => { if (x) { this.timezones = this._filterTimezone(x); } });
this.formGroup.get('culture').valueChanges
.pipe(takeUntil(this._destroyed))
.subscribe(x => { if (x) { this.cultures = this._filterCulture(x); } });
this.formGroup.disable();
return result;
2019-09-23 10:17:03 +02:00
}));
2018-10-05 17:00:54 +02:00
});
}
ngOnDestroy(): void {
}
2019-06-05 09:20:17 +02:00
logout(): void {
this.authentication.logout();
}
2019-01-18 18:03:45 +01:00
getUserRole(dmp: DmpModel) {
2020-03-09 15:50:12 +01:00
if (dmp.creator.id === this.currentUserId) {
2020-04-10 16:16:37 +02:00
return this.language.instant('USER-PROFILE.DMPS.CREATOR');
} else if (dmp.associatedUsers.map(x => x.id).indexOf(this.currentUserId) !== -1) {
return this.language.instant('USER-PROFILE.DMPS.MEMBER');
}
2018-10-05 17:00:54 +02:00
}
showAllDmps() {
2019-01-18 18:03:45 +01:00
this.router.navigate(['/plans']);
2018-10-05 17:00:54 +02:00
}
2019-01-18 18:03:45 +01:00
navigateToDmp(dmp: DmpModel) {
this.router.navigate(['/plans/edit/' + dmp.id]);
2018-10-05 17:00:54 +02:00
}
private _filterTimezone(value: string): Observable<any[]> {
if (value && typeof value === 'string') {
const filterValue = value.toLowerCase();
2019-09-23 10:17:03 +02:00
return of(moment.tz.names().filter(option => option.toLowerCase().includes(filterValue)));
2018-10-05 17:00:54 +02:00
} else {
2019-09-23 10:17:03 +02:00
return of(moment.tz.names());
2018-10-05 17:00:54 +02:00
}
}
private _filterCulture(value: string): Observable<any[]> {
if (value && typeof value === 'string') {
const filterValue = value.toLowerCase();
2019-09-23 10:17:03 +02:00
return of(this.cultureService.getCultureValues().filter(option => option.displayName.toLowerCase().includes(filterValue)));
2018-10-05 17:00:54 +02:00
} else {
2019-09-23 10:17:03 +02:00
return of(this.cultureService.getCultureValues());
2018-10-05 17:00:54 +02:00
}
}
displayFn(culture?: CultureInfo): string | undefined {
return culture ? culture.displayName + '-' + culture.nativeName : undefined;
}
save() {
}
public unlock() {
this.editMode = true;
this.formGroup.enable();
}
public lock() {
if (!this.formGroup.valid) { return; }
2019-01-18 18:03:45 +01:00
this.userService.updateUserSettings(this.formGroup.value)
2018-11-27 18:33:17 +01:00
.pipe(takeUntil(this._destroyed))
.subscribe(
x => {
this.editMode = false;
this.languageService.changeLanguage(this.formGroup.value.language.value);
2018-11-27 18:33:17 +01:00
this.authService.current().culture = this.formGroup.value.culture.name;
this.formGroup.disable();
this.authService.me()
.pipe(takeUntil(this._destroyed))
.subscribe(result => this.router.navigate(['/profile']));
2019-09-23 10:17:03 +02:00
// .subscribe(result => window.location.reload());
2018-11-27 18:33:17 +01:00
},
error => {
console.log(error);
});
2018-10-05 17:00:54 +02:00
}
2018-08-30 13:09:36 +02:00
public applyFallbackAvatar(ev: Event) {
(ev.target as HTMLImageElement).src = 'assets/images/profile-placeholder.png';
}
2020-04-10 16:16:37 +02:00
public hasZenodo(): boolean {
2020-07-17 12:19:10 +02:00
return !isNullOrUndefined(this.zenodoEmail) && this.zenodoEmail !== "";
2020-04-10 16:16:37 +02:00
}
public loginToZenodo() {
this.showOauth2Dialog(this.getAccessUrl());
}
getAccessUrl(): string {
const redirectUri = this.configurationService.app + 'oauth2';
const url = this.configurationService.loginProviders.zenodoConfiguration.oauthUrl
+ '?client_id=' + this.configurationService.loginProviders.zenodoConfiguration.clientId
+ '&response_type=code&scope=deposit:write+deposit:actions+user:email&state=astate&redirect_uri='
+ redirectUri;
return url;
}
showOauth2Dialog(url: string) {
this.oauth2DialogService.login(url)
.pipe(takeUntil(this._destroyed))
.subscribe(code => {
if (!isNullOrUndefined(code)) {
this.userService.registerDOIToken(code, this.configurationService.app + 'oauth2')
.pipe(takeUntil(this._destroyed))
.subscribe(() => this.router.navigate(['/reload']).then(() => this.router.navigate(['/profile'])));
}
});
}
public RemoveZenodo() {
this.userService.deleteDOIToken()
.pipe(takeUntil(this._destroyed))
.subscribe(() => this.router.navigate(['/reload']).then(() => this.router.navigate(['/profile'])));
}
2018-08-24 17:21:02 +02:00
}