From 164d398abcaf29785b7a92aaedcd749c27493850 Mon Sep 17 00:00:00 2001 From: Cilibiu Bogdan Date: Tue, 14 May 2019 14:52:03 +0300 Subject: [PATCH] [ADF-4227] Material Dialog - change direction option based on textOrientation (#4716) * change matDialog direction based on textOrientation * move dialog providers to material.module * extend initial options * move UserPreferencesService from factory * update module * update test * material dialog correct reference * extend default global options * tests --- lib/core/core.module.ts | 8 +++ lib/core/material.module.ts | 9 ++- lib/core/services/dialog-config-factory.ts | 23 +++++++ .../services/dialog-config.service.spec.ts | 69 +++++++++++++++++++ lib/core/services/dialog-config.service.ts | 52 ++++++++++++++ lib/core/testing/core.testing.module.ts | 5 +- 6 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 lib/core/services/dialog-config-factory.ts create mode 100644 lib/core/services/dialog-config.service.spec.ts create mode 100644 lib/core/services/dialog-config.service.ts diff --git a/lib/core/core.module.ts b/lib/core/core.module.ts index 4fc25a86d9..2df3c8ade1 100644 --- a/lib/core/core.module.ts +++ b/lib/core/core.module.ts @@ -53,6 +53,8 @@ import { SortingPickerModule } from './sorting-picker/sorting-picker.module'; import { IconModule } from './icon/icon.module'; import { TranslateLoaderService } from './services/translate-loader.service'; import { ExtensionsModule } from '@alfresco/adf-extensions'; +import { dialogConfigFactory } from './services/dialog-config-factory'; +import { DialogConfigService } from './services/dialog-config.service'; @NgModule({ imports: [ @@ -135,6 +137,12 @@ export class CoreModule { AlfrescoApiService ], multi: true + }, + { + provide: APP_INITIALIZER, + useFactory: dialogConfigFactory, + deps: [ DialogConfigService], + multi: true } ] }; diff --git a/lib/core/material.module.ts b/lib/core/material.module.ts index f414d7b467..59c69749d7 100644 --- a/lib/core/material.module.ts +++ b/lib/core/material.module.ts @@ -24,7 +24,7 @@ import { MatInputModule, MatListModule, MatNativeDateModule, MatOptionModule, MatProgressSpinnerModule, MatRadioModule, MatRippleModule, MatSelectModule, MatSlideToggleModule, MatTableModule, MatTabsModule, MatMenuModule, MatProgressBarModule, MatSidenavModule, MatSnackBarModule, MatToolbarModule, - MatTooltipModule, MatExpansionModule + MatTooltipModule, MatExpansionModule, MAT_DIALOG_DEFAULT_OPTIONS, MatDialogConfig } from '@angular/material'; export function modules() { @@ -40,6 +40,13 @@ export function modules() { @NgModule({ imports: modules(), + providers: [ + MatDialogConfig, + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: MAT_DIALOG_DEFAULT_OPTIONS + } + ], exports: modules() }) export class MaterialModule {} diff --git a/lib/core/services/dialog-config-factory.ts b/lib/core/services/dialog-config-factory.ts new file mode 100644 index 0000000000..1318f31acc --- /dev/null +++ b/lib/core/services/dialog-config-factory.ts @@ -0,0 +1,23 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { DialogConfigService } from '../services/dialog-config.service'; + +export function dialogConfigFactory( + dialogConfigService: DialogConfigService +): Function { + return () => dialogConfigService.loadDefaults(); +} diff --git a/lib/core/services/dialog-config.service.spec.ts b/lib/core/services/dialog-config.service.spec.ts new file mode 100644 index 0000000000..354df78b66 --- /dev/null +++ b/lib/core/services/dialog-config.service.spec.ts @@ -0,0 +1,69 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TestBed } from '@angular/core/testing'; +import { DialogConfigService } from './dialog-config.service'; +import { CoreTestingModule } from '../testing/core.testing.module'; +import { setupTestBed } from '../testing/setupTestBed'; +import { MAT_DIALOG_DEFAULT_OPTIONS, MatDialogConfig } from '@angular/material/dialog'; +import { UserPreferencesService } from './user-preferences.service'; +import { Direction } from '@angular/cdk/bidi'; + +describe('DialogConfigService', () => { + let matDialogConfig: MatDialogConfig; + let userPreferencesService: UserPreferencesService; + let matDialogGlobalOptions: MatDialogConfig; + + setupTestBed({ + imports: [CoreTestingModule], + providers: [ + DialogConfigService, + UserPreferencesService, + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: MAT_DIALOG_DEFAULT_OPTIONS + } + ] + }); + + beforeEach(() => { + userPreferencesService = TestBed.get(UserPreferencesService); + matDialogConfig = TestBed.get(MatDialogConfig); + matDialogGlobalOptions = TestBed.get(MAT_DIALOG_DEFAULT_OPTIONS); + }); + + it('should load custom defaults', () => { + expect(matDialogConfig).toEqual(jasmine.objectContaining({ + autoFocus: true, + closeOnNavigation: true + })); + }); + + it('should set dialog direction option on textOrientation event', () => { + userPreferencesService.set('textOrientation', 'rtl'); + + expect(matDialogGlobalOptions).toEqual(jasmine.objectContaining({ + direction: 'rtl' + })); + + userPreferencesService.set('textOrientation', 'ltr'); + + expect(matDialogGlobalOptions).toEqual(jasmine.objectContaining({ + direction: 'ltr' + })); + }); +}); diff --git a/lib/core/services/dialog-config.service.ts b/lib/core/services/dialog-config.service.ts new file mode 100644 index 0000000000..5529daa78a --- /dev/null +++ b/lib/core/services/dialog-config.service.ts @@ -0,0 +1,52 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* spellchecker: disable */ +import { Injectable, Inject } from '@angular/core'; +import { MAT_DIALOG_DEFAULT_OPTIONS, MatDialogConfig } from '@angular/material/dialog'; +import { Direction } from '@angular/cdk/bidi'; +import { UserPreferencesService } from '../services/user-preferences.service'; + +@Injectable({ + providedIn: 'root' +}) +export class DialogConfigService { + constructor( + @Inject(MAT_DIALOG_DEFAULT_OPTIONS) private defaultOptions: MatDialogConfig, + private matDialogConfig: MatDialogConfig, + private userPreferencesService: UserPreferencesService + ) { + this.userPreferencesService + .select('textOrientation') + .subscribe((direction: Direction) => { + this.changeDirection(direction); + }); + } + + loadDefaults() { + Object.assign(this.defaultOptions, this.matDialogConfig, { + autoFocus: true, + closeOnNavigation: true + }); + } + + private changeDirection(direction: Direction) { + Object.assign(this.defaultOptions, this.matDialogConfig, { + direction + }); + } +} diff --git a/lib/core/testing/core.testing.module.ts b/lib/core/testing/core.testing.module.ts index 9d5e937935..bbe171b658 100644 --- a/lib/core/testing/core.testing.module.ts +++ b/lib/core/testing/core.testing.module.ts @@ -28,6 +28,7 @@ import { TranslationMock } from '../mock/translation.service.mock'; import { DatePipe } from '@angular/common'; import { CookieService } from '../services/cookie.service'; import { CookieServiceMock } from '../mock/cookie.service.mock'; +import { DialogConfigService } from 'core/services/dialog-config.service'; @NgModule({ imports: [NoopAnimationsModule, RouterTestingModule, CoreModule.forRoot()], @@ -36,7 +37,9 @@ import { CookieServiceMock } from '../mock/cookie.service.mock'; { provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock }, { provide: AppConfigService, useClass: AppConfigServiceMock }, { provide: TranslationService, useClass: TranslationMock }, - { provide: CookieService, useClass: CookieServiceMock } + { provide: CookieService, useClass: CookieServiceMock }, + { provide: DialogConfigService, useValue: { loadDefaults: () => {} } } + ], exports: [ NoopAnimationsModule