Pull request #320: RED-2798
Merge in RED/ui from RED-2798 to master * commit '426f5d6aa39b167701eda9d20c6aded32e7ecbe8': added filePreviewTooltip key added dictionary instead of keys array removed useless language service logic and added readonly keys removed useless stuff and renamed form language saved in preferences and removed localstorage
This commit is contained in:
commit
e39c4acdc5
@ -36,6 +36,7 @@ import { HELP_DOCS, IqserHelpModeModule, MAX_RETRIES_ON_SERVER_ERROR, ServerErro
|
||||
import { KeycloakService } from 'keycloak-angular';
|
||||
import { GeneralSettingsService } from '@services/general-settings.service';
|
||||
import { BreadcrumbsComponent } from '@components/breadcrumbs/breadcrumbs.component';
|
||||
import { UserPreferenceService } from '@services/user-preference.service';
|
||||
|
||||
export function httpLoaderFactory(httpClient: HttpClient): PruningTranslationLoader {
|
||||
return new PruningTranslationLoader(httpClient, '/assets/i18n/', '.json');
|
||||
@ -110,17 +111,11 @@ const components = [AppComponent, AuthErrorComponent, NotificationsComponent, Sp
|
||||
multi: true,
|
||||
useClass: HttpCacheInterceptor,
|
||||
},
|
||||
{
|
||||
provide: APP_INITIALIZER,
|
||||
multi: true,
|
||||
useFactory: languageInitializer,
|
||||
deps: [LanguageService],
|
||||
},
|
||||
{
|
||||
provide: APP_INITIALIZER,
|
||||
multi: true,
|
||||
useFactory: configurationInitializer,
|
||||
deps: [KeycloakService, Title, ConfigService, GeneralSettingsService],
|
||||
deps: [KeycloakService, Title, ConfigService, GeneralSettingsService, LanguageService, UserPreferenceService],
|
||||
},
|
||||
{
|
||||
provide: MissingTranslationHandler,
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { UserPreferenceService } from '@services/user-preference.service';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class LanguageService {
|
||||
constructor(private readonly _translateService: TranslateService) {
|
||||
constructor(private readonly _translateService: TranslateService, private readonly _userPreferenceService: UserPreferenceService) {
|
||||
_translateService.addLangs(['en', 'de']);
|
||||
}
|
||||
|
||||
@ -13,17 +14,15 @@ export class LanguageService {
|
||||
return this._translateService.currentLang;
|
||||
}
|
||||
|
||||
languageAvailable(language: string): boolean {
|
||||
return this._translateService.getLangs().includes(language);
|
||||
}
|
||||
|
||||
chooseAndSetInitialLanguage() {
|
||||
let defaultLang: string;
|
||||
const localStorageLang = localStorage.getItem('redaction.language');
|
||||
// const browserLang = this._translateService.getBrowserLang();
|
||||
const browserLang = 'en'; // Force language to english until translations are ready
|
||||
if (this._translateService.getLangs().includes(localStorageLang)) {
|
||||
defaultLang = localStorageLang;
|
||||
} else if (this._translateService.getLangs().includes(browserLang)) {
|
||||
defaultLang = browserLang;
|
||||
} else {
|
||||
defaultLang = 'en';
|
||||
let defaultLang = 'en';
|
||||
const userPreferenceLang = this._userPreferenceService.getLanguage();
|
||||
if (this.languageAvailable(userPreferenceLang)) {
|
||||
defaultLang = userPreferenceLang;
|
||||
}
|
||||
document.documentElement.lang = defaultLang;
|
||||
this._translateService.setDefaultLang(defaultLang);
|
||||
@ -31,7 +30,7 @@ export class LanguageService {
|
||||
}
|
||||
|
||||
async changeLanguage(language: string) {
|
||||
localStorage.setItem('redaction.language', language);
|
||||
await this._userPreferenceService.saveLanguage(language);
|
||||
document.documentElement.lang = language;
|
||||
await this._translateService.use(language).toPromise();
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
<form (submit)="save()" [formGroup]="formGroup">
|
||||
<form (submit)="save()" [formGroup]="form">
|
||||
<div class="dialog-content">
|
||||
<div class="dialog-content-left">
|
||||
<div class="iqser-input-group required">
|
||||
@ -30,7 +30,7 @@
|
||||
</div>
|
||||
|
||||
<div class="dialog-actions">
|
||||
<button [disabled]="formGroup.invalid || !(profileChanged || languageChanged)" color="primary" mat-flat-button type="submit">
|
||||
<button [disabled]="form.invalid || !(profileChanged || languageChanged)" color="primary" mat-flat-button type="submit">
|
||||
{{ 'user-profile-screen.actions.save' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -17,7 +17,7 @@ import { LanguageService } from '../../../../../i18n/language.service';
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
})
|
||||
export class UserProfileScreenComponent implements OnInit {
|
||||
readonly formGroup: FormGroup = this._getForm();
|
||||
readonly form: FormGroup = this._getForm();
|
||||
changePasswordUrl: SafeResourceUrl;
|
||||
translations = languagesTranslations;
|
||||
|
||||
@ -50,15 +50,15 @@ export class UserProfileScreenComponent implements OnInit {
|
||||
}
|
||||
|
||||
get languageChanged(): boolean {
|
||||
return this._profileModel['language'] !== this.formGroup.get('language').value;
|
||||
return this._profileModel['language'] !== this.form.get('language').value;
|
||||
}
|
||||
|
||||
get profileChanged(): boolean {
|
||||
const keys = Object.keys(this.formGroup.getRawValue());
|
||||
const keys = Object.keys(this.form.getRawValue());
|
||||
keys.splice(keys.indexOf('language'), 1);
|
||||
|
||||
for (const key of keys) {
|
||||
if (this._profileModel[key] !== this.formGroup.get(key).value) {
|
||||
if (this._profileModel[key] !== this.form.get(key).value) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -78,11 +78,11 @@ export class UserProfileScreenComponent implements OnInit {
|
||||
this._loadingService.start();
|
||||
|
||||
if (this.languageChanged) {
|
||||
await this._languageService.changeLanguage(this.formGroup.get('language').value);
|
||||
await this._languageService.changeLanguage(this.form.get('language').value);
|
||||
}
|
||||
|
||||
if (this.profileChanged) {
|
||||
const value = this.formGroup.value as IProfile;
|
||||
const value = this.form.value as IProfile;
|
||||
delete value.language;
|
||||
|
||||
await this._userService
|
||||
@ -108,9 +108,9 @@ export class UserProfileScreenComponent implements OnInit {
|
||||
};
|
||||
if (this._userService.currentUser.email) {
|
||||
// disable email if it's already set
|
||||
this.formGroup.get('email').disable();
|
||||
this.form.get('email').disable();
|
||||
}
|
||||
this.formGroup.patchValue(this._profileModel, { emitEvent: false });
|
||||
this.form.patchValue(this._profileModel, { emitEvent: false });
|
||||
} catch (e) {
|
||||
} finally {
|
||||
this._loadingService.stop();
|
||||
|
||||
@ -3,13 +3,18 @@ import { GenericService, List, RequiredParam, Validate } from '@iqser/common-ui'
|
||||
|
||||
type UserAttributes = Record<string, List>;
|
||||
|
||||
const KEYS = {
|
||||
language: 'Language',
|
||||
dossierRecent: 'Dossier-Recent',
|
||||
filePreviewTooltips: 'File-Preview-Tooltips',
|
||||
} as const;
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class UserPreferenceService extends GenericService<UserAttributes> {
|
||||
constructor(protected readonly _injector: Injector) {
|
||||
super(_injector, 'attributes');
|
||||
this.reload();
|
||||
}
|
||||
|
||||
private _userAttributes: UserAttributes = {};
|
||||
@ -24,23 +29,34 @@ export class UserPreferenceService extends GenericService<UserAttributes> {
|
||||
}
|
||||
|
||||
getLastOpenedFileForDossier(dossierId: string): string {
|
||||
const key = `Dossier-Recent-${dossierId}`;
|
||||
const key = `${KEYS.dossierRecent}-${dossierId}`;
|
||||
return this._getAttribute(key);
|
||||
}
|
||||
|
||||
async saveLastOpenedFileForDossier(dossierId: string, fileId: string): Promise<void> {
|
||||
const key = `Dossier-Recent-${dossierId}`;
|
||||
const key = `${KEYS.dossierRecent}-${dossierId}`;
|
||||
this.userAttributes[key] = [fileId];
|
||||
await this.savePreferences([fileId], key).toPromise();
|
||||
}
|
||||
|
||||
getLanguage(): string {
|
||||
const key = KEYS.language;
|
||||
return this._getAttribute(key);
|
||||
}
|
||||
|
||||
async saveLanguage(language: string): Promise<void> {
|
||||
const key = KEYS.language;
|
||||
this.userAttributes[key] = [language];
|
||||
await this.savePreferences([language], key).toPromise();
|
||||
}
|
||||
|
||||
getFilePreviewTooltipsPreference(): boolean {
|
||||
const key = 'File-Preview-Tooltips';
|
||||
const key = KEYS.filePreviewTooltips;
|
||||
return this._getAttribute(key, 'false') === 'true';
|
||||
}
|
||||
|
||||
async toggleFilePreviewTooltipsPreference(): Promise<void> {
|
||||
const key = 'File-Preview-Tooltips';
|
||||
const key = KEYS.filePreviewTooltips;
|
||||
const currentValue = this.getFilePreviewTooltipsPreference();
|
||||
const nextValue = [(!currentValue).toString()];
|
||||
this.userAttributes[key] = nextValue;
|
||||
|
||||
@ -4,12 +4,16 @@ import { Title } from '@angular/platform-browser';
|
||||
import { of } from 'rxjs';
|
||||
import { KeycloakEventType, KeycloakService } from 'keycloak-angular';
|
||||
import { GeneralSettingsService } from '@services/general-settings.service';
|
||||
import { LanguageService } from '@i18n/language.service';
|
||||
import { UserPreferenceService } from '@services/user-preference.service';
|
||||
|
||||
export function configurationInitializer(
|
||||
keycloakService: KeycloakService,
|
||||
title: Title,
|
||||
configService: ConfigService,
|
||||
generalSettingsService: GeneralSettingsService,
|
||||
languageService: LanguageService,
|
||||
userPreferenceService: UserPreferenceService,
|
||||
) {
|
||||
return () =>
|
||||
keycloakService.keycloakEvents$
|
||||
@ -21,6 +25,8 @@ export function configurationInitializer(
|
||||
title.setTitle('RedactManager');
|
||||
return of({});
|
||||
}),
|
||||
tap(() => userPreferenceService.reload()),
|
||||
tap(() => languageService.chooseAndSetInitialLanguage()),
|
||||
take(1),
|
||||
)
|
||||
.toPromise();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user