settings enhancements (#449)

* settings enhancements

* save state to local storage

* improve settings dialog

* toggle library features from settings

* fixes for app config service
This commit is contained in:
Denys Vuika
2018-06-22 14:20:33 +01:00
committed by GitHub
parent 265781c540
commit daf7082079
5 changed files with 80 additions and 30 deletions

View File

@@ -9,7 +9,7 @@
"© 2017 - 2018 Alfresco Software, Inc. All rights reserved." "© 2017 - 2018 Alfresco Software, Inc. All rights reserved."
}, },
"experimental": { "experimental": {
"libraries": true "libraries": false
}, },
"headerColor": "#2196F3", "headerColor": "#2196F3",
"languagePicker": false, "languagePicker": false,

View File

@@ -1,18 +1,18 @@
<adf-toolbar class="app-menu" [style.background-color]="backgroundColor"> <adf-toolbar class="app-menu" [style.background-color]="headerColor$ | async">
<adf-toolbar-title> <adf-toolbar-title>
<a class="app-menu__title" title="{{ appName }}" [routerLink]="[ '/' ]"> <a class="app-menu__title" title="{{ appName$ | async }}" [routerLink]="[ '/' ]">
<img [src]="logo" alt="{{ appName }}" /> <img [src]="logo" alt="{{ appName$ | async }}" />
</a> </a>
</adf-toolbar-title> </adf-toolbar-title>
</adf-toolbar> </adf-toolbar>
<form [formGroup]="form" novalidate (ngSubmit)="apply(form.value, form.valid)">
<mat-accordion multi="true" displayMode="flat">
<mat-expansion-panel [expanded]="true">
<mat-expansion-panel-header>
<mat-panel-title>{{ 'APP.SETTINGS.REPOSITORY-SETTINGS' | translate }}</mat-panel-title>
</mat-expansion-panel-header>
<mat-accordion multi="true" displayMode="flat">
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title>{{ 'APP.SETTINGS.REPOSITORY-SETTINGS' | translate }}</mat-panel-title>
</mat-expansion-panel-header>
<form [formGroup]="form" novalidate (ngSubmit)="apply(form.value, form.valid)">
<div> <div>
<mat-form-field class="settings-input"> <mat-form-field class="settings-input">
<input matInput <input matInput
@@ -37,7 +37,32 @@
{{ 'APP.SETTINGS.APPLY' | translate }} {{ 'APP.SETTINGS.APPLY' | translate }}
</button> </button>
</div> </div>
</form>
</mat-expansion-panel>
</mat-expansion-panel> <mat-expansion-panel>
</mat-accordion> <mat-expansion-panel-header>
</form> <mat-panel-title>
{{ 'APP.SETTINGS.APPLICATION-SETTINGS' | translate }}
</mat-panel-title>
</mat-expansion-panel-header>
<mat-checkbox
[ngModel]="languagePicker$ | async"
(change)="onLanguagePickerValueChanged($event)">
Language Picker
</mat-checkbox>
</mat-expansion-panel>
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title>
{{ 'APP.SETTINGS.EXPERIMENTAL-FEATURES' | translate }}
</mat-panel-title>
</mat-expansion-panel-header>
<mat-checkbox
[(ngModel)]="libraries"
(change)="onChangeLibrariesFeature($event)">
Library Management
</mat-checkbox>
</mat-expansion-panel>
</mat-accordion>

View File

@@ -23,10 +23,15 @@
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { Component, ViewEncapsulation, SecurityContext, OnInit } from '@angular/core'; import { Component, ViewEncapsulation, OnInit } from '@angular/core';
import { AppConfigService, StorageService, SettingsService } from '@alfresco/adf-core'; import { AppConfigService, StorageService, SettingsService } from '@alfresco/adf-core';
import { DomSanitizer } from '@angular/platform-browser';
import { Validators, FormGroup, FormBuilder } from '@angular/forms'; import { Validators, FormGroup, FormBuilder } from '@angular/forms';
import { Observable } from 'rxjs/Rx';
import { Store } from '@ngrx/store';
import { AppStore } from '../../store/states';
import { appLanguagePicker, selectHeaderColor, selectAppName } from '../../store/selectors/app.selectors';
import { MatCheckboxChange } from '@angular/material';
import { SetLanguagePickerAction } from '../../store/actions';
@Component({ @Component({
selector: 'aca-settings', selector: 'aca-settings',
@@ -37,38 +42,38 @@ import { Validators, FormGroup, FormBuilder } from '@angular/forms';
export class SettingsComponent implements OnInit { export class SettingsComponent implements OnInit {
private defaultPath = '/assets/images/alfresco-logo-white.svg'; private defaultPath = '/assets/images/alfresco-logo-white.svg';
private defaultBackgroundColor = '#2196F3';
form: FormGroup; form: FormGroup;
appName$: Observable<string>;
headerColor$: Observable<string>;
languagePicker$: Observable<boolean>;
libraries: boolean;
constructor( constructor(
private store: Store<AppStore>,
private appConfig: AppConfigService, private appConfig: AppConfigService,
private sanitizer: DomSanitizer,
private settingsService: SettingsService, private settingsService: SettingsService,
private storage: StorageService, private storage: StorageService,
private fb: FormBuilder) { private fb: FormBuilder) {
this.appName$ = store.select(selectAppName);
this.languagePicker$ = store.select(appLanguagePicker);
this.headerColor$ = store.select(selectHeaderColor);
} }
get appName(): string {
return <string>this.appConfig.get('application.name');
}
get logo() { get logo() {
return this.appConfig.get('application.logo', this.defaultPath); return this.appConfig.get('application.logo', this.defaultPath);
} }
get backgroundColor() {
const color = this.appConfig.get('headerColor', this.defaultBackgroundColor);
return this.sanitizer.sanitize(SecurityContext.STYLE, color);
}
ngOnInit() { ngOnInit() {
this.form = this.fb.group({ this.form = this.fb.group({
ecmHost: ['', [Validators.required, Validators.pattern('^(http|https):\/\/.*[^/]$')]] ecmHost: ['', [Validators.required, Validators.pattern('^(http|https):\/\/.*[^/]$')]]
}); });
this.reset(); this.reset();
const libraries = this.appConfig.get('experimental.libraries');
this.libraries = (libraries === true || libraries === 'true');
} }
apply(model: any, isValid: boolean) { apply(model: any, isValid: boolean) {
@@ -83,4 +88,13 @@ export class SettingsComponent implements OnInit {
ecmHost: this.storage.getItem('ecmHost') || this.settingsService.ecmHost ecmHost: this.storage.getItem('ecmHost') || this.settingsService.ecmHost
}); });
} }
onLanguagePickerValueChanged(event: MatCheckboxChange) {
this.storage.setItem('languagePicker', event.checked.toString());
this.store.dispatch(new SetLanguagePickerAction(event.checked));
}
onChangeLibrariesFeature(event: MatCheckboxChange) {
this.storage.setItem('experimental.libraries', event.checked.toString());
}
} }

View File

@@ -24,7 +24,7 @@
*/ */
import { Directive, TemplateRef, ViewContainerRef, Input } from '@angular/core'; import { Directive, TemplateRef, ViewContainerRef, Input } from '@angular/core';
import { AppConfigService } from '@alfresco/adf-core'; import { AppConfigService, StorageService } from '@alfresco/adf-core';
import { environment } from '../../environments/environment'; import { environment } from '../../environments/environment';
@Directive({ @Directive({
@@ -35,13 +35,22 @@ export class ExperimentalDirective {
constructor( constructor(
private templateRef: TemplateRef<any>, private templateRef: TemplateRef<any>,
private viewContainerRef: ViewContainerRef, private viewContainerRef: ViewContainerRef,
private storage: StorageService,
private config: AppConfigService private config: AppConfigService
) {} ) {}
@Input() set ifExperimental(featureKey: string) { @Input() set ifExperimental(featureKey: string) {
const key = `experimental.${featureKey}`;
const override = this.storage.getItem(key);
if (override === 'true') {
this.viewContainerRef.createEmbeddedView(this.templateRef);
return;
}
if (!environment.production) { if (!environment.production) {
const value = this.config.get<boolean>(`experimental.${featureKey}`); const value = this.config.get(key);
if (value) { if (value === true || value === 'true') {
this.viewContainerRef.createEmbeddedView(this.templateRef); this.viewContainerRef.createEmbeddedView(this.templateRef);
return; return;
} }

View File

@@ -4,7 +4,9 @@
"SIGN_IN": "Sign in", "SIGN_IN": "Sign in",
"SIGN_OUT": "Sign out", "SIGN_OUT": "Sign out",
"SETTINGS": { "SETTINGS": {
"APPLICATION-SETTINGS": "Application Settings",
"REPOSITORY-SETTINGS": "Repository Settings", "REPOSITORY-SETTINGS": "Repository Settings",
"EXPERIMENTAL-FEATURES": "Experimental Features",
"INVALID-VALUE-FORMAT": "Invalid value format", "INVALID-VALUE-FORMAT": "Invalid value format",
"REQUIRED-FIELD": "This field is required", "REQUIRED-FIELD": "This field is required",
"RESET": "Reset", "RESET": "Reset",