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:
Eduard Cziszter 2021-12-10 16:59:32 +01:00 committed by Dan Percic
commit e39c4acdc5
6 changed files with 50 additions and 34 deletions

View File

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

View File

@ -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();
}

View File

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

View File

@ -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();

View File

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

View File

@ -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();