Skip to content

Commit 1824602

Browse files
samir-ayoubjhonyeduardo
authored andcommitted
feat(page-default): define literais para idiomas suportados
Definidas literais para o componente para que traduza de acordo com idioma suportado. Agora também permite a customização da literal. Fixes DTHFUI-1896
1 parent f1b3364 commit 1824602

File tree

8 files changed

+213
-20
lines changed

8 files changed

+213
-20
lines changed

projects/ui/src/lib/components/po-page/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export * from './po-page-default/po-page-default.component';
22
export * from './po-page-default/po-page-default.interface';
3+
export * from './po-page-default/po-page-default-literals.interface';
34
export * from './po-page-detail/po-page-detail-literals.interface';
45
export * from './po-page-detail/po-page-detail.component';
56
export * from './po-page-edit/po-page-edit-literals.interface';

projects/ui/src/lib/components/po-page/po-page-default/po-page-default-base.component.spec.ts

Lines changed: 88 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,117 @@
11
import { Directive } from '@angular/core';
22
import { fakeAsync, tick } from '@angular/core/testing';
33

4-
import { PoPageDefaultBaseComponent } from './po-page-default-base.component';
4+
import * as UtilFunctions from './../../../utils/util';
55
import { expectPropertiesValues } from '../../../util-test/util-expect.spec';
6+
import { PoLanguageService } from './../../../services/po-language/po-language.service';
7+
import { poLocaleDefault } from './../../../services/po-language/po-language.constant';
8+
9+
import { PoPageDefaultBaseComponent, poPageDefaultLiteralsDefault } from './po-page-default-base.component';
610

711
@Directive()
812
class PoPageDefaultComponent extends PoPageDefaultBaseComponent {
913
setDropdownActions() {}
1014
}
1115

1216
describe('PoPageDefaultBaseComponent:', () => {
13-
const component = new PoPageDefaultComponent();
17+
let languageService: PoLanguageService;
18+
let component: PoPageDefaultComponent;
19+
20+
beforeEach(() => {
21+
languageService = new PoLanguageService();
22+
component = new PoPageDefaultComponent(languageService);
23+
});
1424

1525
it('should be created', () => {
1626
expect(component instanceof PoPageDefaultBaseComponent).toBeTruthy();
1727
});
1828

19-
it('should get title and call recalculateHeaderSize when set title', fakeAsync(() => {
20-
component.poPageContent = <any>{
21-
recalculateHeaderSize: () => {}
22-
};
29+
describe('Properties:', () => {
30+
describe('p-literals:', () => {
31+
it('should be in portuguese if `getShortLanguage` return an unsupported language.', () => {
32+
component['language'] = 'zw';
33+
34+
component.literals = {};
2335

24-
spyOn(component.poPageContent, 'recalculateHeaderSize');
36+
expect(component.literals).toEqual(poPageDefaultLiteralsDefault[poLocaleDefault]);
37+
});
2538

26-
component.title = 'teste';
39+
it('should be in portuguese if `getShortLanguage` return `pt`.', () => {
40+
component['language'] = 'pt';
2741

28-
tick();
42+
component.literals = {};
2943

30-
expect(component.title).toBe('teste');
31-
expect(component.poPageContent.recalculateHeaderSize).toHaveBeenCalled();
32-
}));
44+
expect(component.literals).toEqual(poPageDefaultLiteralsDefault.pt);
45+
});
3346

34-
describe('Properties:', () => {
35-
it('should update property `p-actions` to empty if is invalid values.', () => {
47+
it('should be in english if `getShortLanguage` return `en`.', () => {
48+
component['language'] = 'en';
49+
50+
component.literals = {};
51+
52+
expect(component.literals).toEqual(poPageDefaultLiteralsDefault.en);
53+
});
54+
55+
it('should be in spanish if `getShortLanguage` return `es`.', () => {
56+
component['language'] = 'es';
57+
58+
component.literals = {};
59+
60+
expect(component.literals).toEqual(poPageDefaultLiteralsDefault.es);
61+
});
62+
63+
it('should be in russian if `getShortLanguage` return `ru`.', () => {
64+
component['language'] = 'ru';
65+
66+
component.literals = {};
67+
68+
expect(component.literals).toEqual(poPageDefaultLiteralsDefault.ru);
69+
});
70+
71+
it('should accept custom literals.', () => {
72+
spyOn(UtilFunctions, <any>'browserLanguage').and.returnValue(poLocaleDefault);
73+
74+
const customLiterals = poPageDefaultLiteralsDefault[poLocaleDefault];
75+
76+
// Custom some literals
77+
customLiterals.otherActions = 'Other actions';
78+
79+
component.literals = customLiterals;
80+
81+
expect(component.literals).toEqual(customLiterals);
82+
});
83+
84+
it('should update property with default literals if is setted with invalid values.', () => {
85+
const invalidValues = [null, undefined, false, true, '', 'literals', 0, 10, [], [1, 2], () => {}];
86+
87+
component['language'] = poLocaleDefault;
88+
89+
expectPropertiesValues(component, 'literals', invalidValues, poPageDefaultLiteralsDefault[poLocaleDefault]);
90+
});
91+
});
92+
93+
it('p-title: should get title and call recalculateHeaderSize when set title', fakeAsync(() => {
94+
component.poPageContent = <any>{
95+
recalculateHeaderSize: () => {}
96+
};
97+
98+
spyOn(component.poPageContent, 'recalculateHeaderSize');
99+
100+
component.title = 'teste';
101+
102+
tick();
103+
104+
expect(component.title).toBe('teste');
105+
expect(component.poPageContent.recalculateHeaderSize).toHaveBeenCalled();
106+
}));
107+
108+
it('p-actions: should update property `p-actions` to empty if is invalid values.', () => {
36109
const invalidValues = [undefined, null, '', true, false, 0, 1, 'string', [], {}];
37110

38111
expectPropertiesValues(component, 'actions', invalidValues, []);
39112
});
40113

41-
it('should update property `p-actions` if is valid values.', () => {
114+
it('p-actions: should update property `p-actions` if is valid values.', () => {
42115
const validValues = [[{ label: 'Share', icon: 'po-icon-share' }]];
43116

44117
expectPropertiesValues(component, 'actions', validValues, validValues);

projects/ui/src/lib/components/po-page/po-page-default/po-page-default-base.component.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,28 @@
11
import { Input, ViewChild, Directive } from '@angular/core';
22

3+
import { PoLanguageService } from './../../../services/po-language/po-language.service';
4+
import { poLocaleDefault } from './../../../services/po-language/po-language.constant';
5+
36
import { PoBreadcrumb } from '../../po-breadcrumb/po-breadcrumb.interface';
47
import { PoPageAction } from '../po-page-action.interface';
8+
import { PoPageDefaultLiterals } from './po-page-default-literals.interface';
59
import { PoPageContentComponent } from '../po-page-content/po-page-content.component';
610

11+
export const poPageDefaultLiteralsDefault = {
12+
en: <PoPageDefaultLiterals>{
13+
otherActions: 'Other actions'
14+
},
15+
es: <PoPageDefaultLiterals>{
16+
otherActions: 'Otras acciones'
17+
},
18+
pt: <PoPageDefaultLiterals>{
19+
otherActions: 'Outras ações'
20+
},
21+
ru: <PoPageDefaultLiterals>{
22+
otherActions: 'Другие действия'
23+
}
24+
};
25+
726
/**
827
* @description
928
*
@@ -12,8 +31,11 @@ import { PoPageContentComponent } from '../po-page-content/po-page-content.compo
1231
@Directive()
1332
export abstract class PoPageDefaultBaseComponent {
1433
private _actions?: Array<PoPageAction> = [];
34+
private _literals: PoPageDefaultLiterals;
1535
private _title: string;
1636

37+
protected language: string;
38+
1739
@ViewChild(PoPageContentComponent, { static: true }) poPageContent: PoPageContentComponent;
1840

1941
/**
@@ -35,6 +57,55 @@ export abstract class PoPageDefaultBaseComponent {
3557
/** Objeto com propriedades do breadcrumb. */
3658
@Input('p-breadcrumb') breadcrumb?: PoBreadcrumb;
3759

60+
/**
61+
* @optional
62+
*
63+
* @description
64+
*
65+
* Objeto com as literais usadas no `po-page-default`.
66+
*
67+
* Existem duas maneiras de customizar o componente, passando um objeto com todas as literais disponíveis:
68+
*
69+
* ```
70+
* const customLiterals: PoPageDefaultLiterals = {
71+
* otherActions: 'Mais ações'
72+
* };
73+
* ```
74+
*
75+
* Ou passando apenas as literais que deseja customizar:
76+
*
77+
* ```
78+
* const customLiterals: PoPageDefaultLiterals = {
79+
* otherActions: 'Ações da página'
80+
* };
81+
* ```
82+
*
83+
* E para carregar as literais customizadas, basta apenas passar o objeto para o componente.
84+
*
85+
* ```
86+
* <po-page-default
87+
* [p-literals]="customLiterals">
88+
* </po-page-default>
89+
* ```
90+
*
91+
* > O valor padrão será traduzido de acordo com o idioma configurado no [`PoI18nService`](/documentation/po-i18n) ou *browser*.
92+
*/
93+
@Input('p-literals') set literals(value: PoPageDefaultLiterals) {
94+
if (value instanceof Object && !(value instanceof Array)) {
95+
this._literals = {
96+
...poPageDefaultLiteralsDefault[poLocaleDefault],
97+
...poPageDefaultLiteralsDefault[this.language],
98+
...value
99+
};
100+
} else {
101+
this._literals = poPageDefaultLiteralsDefault[this.language];
102+
}
103+
}
104+
105+
get literals() {
106+
return this._literals || poPageDefaultLiteralsDefault[this.language];
107+
}
108+
38109
/** Título da página. */
39110
@Input('p-title') set title(title: string) {
40111
this._title = title;
@@ -45,6 +116,10 @@ export abstract class PoPageDefaultBaseComponent {
45116
return this._title;
46117
}
47118

119+
constructor(languageService: PoLanguageService) {
120+
this.language = languageService.getShortLanguage();
121+
}
122+
48123
// Seta a lista de ações no dropdown.
49124
abstract setDropdownActions();
50125
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* @usedBy PoPageDefaultComponent
3+
*
4+
* @description
5+
*
6+
* Interface para definição das literais usadas no `po-page-default`.
7+
*/
8+
export interface PoPageDefaultLiterals {
9+
/** Legenda do `po-dropdown` de ações. */
10+
otherActions?: string;
11+
}

projects/ui/src/lib/components/po-page/po-page-default/po-page-default.component.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
<po-page-header *ngIf="hasPageHeader()" [p-breadcrumb]="breadcrumb" [p-title]="title">
44
<!-- OPERATIONS -->
55
<div class="po-page-header-actions">
6-
<po-dropdown *ngIf="actions.length > limitPrimaryActions" p-label="Outras ações" [p-actions]="dropdownActions">
6+
<po-dropdown
7+
*ngIf="actions.length > limitPrimaryActions"
8+
[p-label]="literals.otherActions"
9+
[p-actions]="dropdownActions"
10+
>
711
</po-dropdown>
812

913
<po-button

projects/ui/src/lib/components/po-page/po-page-default/po-page-default.component.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { AfterContentInit, Component, OnChanges, Renderer2, SimpleChange, ViewContainerRef } from '@angular/core';
22
import { Router } from '@angular/router';
33

4+
import { PoLanguageService } from './../../../services/po-language/po-language.service';
5+
46
import { callFunction, isExternalLink, isTypeof, openExternalLink } from '../../../utils/util';
57
import { PoPageAction } from '../po-page-action.interface';
68

@@ -38,8 +40,13 @@ export class PoPageDefaultComponent extends PoPageDefaultBaseComponent implement
3840

3941
private maxWidthMobile: number = 480;
4042

41-
constructor(viewRef: ViewContainerRef, private renderer: Renderer2, private router: Router) {
42-
super();
43+
constructor(
44+
viewRef: ViewContainerRef,
45+
languageService: PoLanguageService,
46+
private renderer: Renderer2,
47+
private router: Router
48+
) {
49+
super(languageService);
4350
}
4451

4552
public ngAfterContentInit(): void {

projects/ui/src/lib/components/po-page/po-page-default/samples/sample-po-page-default-labs/sample-po-page-default-labs.component.html

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
<po-page-default [p-actions]="actions" [p-breadcrumb]="breadcrumb" [p-title]="title"> </po-page-default>
1+
<po-page-default [p-actions]="actions" [p-breadcrumb]="breadcrumb" [p-literals]="customLiterals" [p-title]="title">
2+
</po-page-default>
23

34
<hr />
45

@@ -132,6 +133,16 @@
132133
<form #formPage="ngForm">
133134
<div class="po-row">
134135
<po-input class="po-md-12" name="title" [(ngModel)]="title" p-label="Title" p-required> </po-input>
136+
137+
<po-input
138+
class="po-lg-12"
139+
name="literals"
140+
[(ngModel)]="literals"
141+
p-help='Ex.: {"otherActions": "Mais ações"}'
142+
p-label="Literals"
143+
(p-change)="changeLiterals()"
144+
>
145+
</po-input>
135146
</div>
136147

137148
<div class="po-row">

projects/ui/src/lib/components/po-page/po-page-default/samples/sample-po-page-default-labs/sample-po-page-default-labs.component.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { PoBreadcrumb, PoBreadcrumbItem } from '@po-ui/ng-components';
44
import { PoCheckboxGroupOption, PoSelectOption } from '@po-ui/ng-components';
55

66
import { PoNotificationService } from '@po-ui/ng-components';
7-
import { PoPageAction } from '@po-ui/ng-components';
7+
import { PoPageAction, PoPageDefaultLiterals } from '@po-ui/ng-components';
88

99
@Component({
1010
selector: 'sample-po-page-default-labs',
@@ -16,6 +16,8 @@ export class SamplePoPageDefaultLabsComponent implements OnInit {
1616
breadcrumb: PoBreadcrumb;
1717
breadcrumbItem: PoBreadcrumbItem;
1818
breadcrumbParams: any;
19+
customLiterals: PoPageDefaultLiterals;
20+
literals: string;
1921
title: string;
2022

2123
public readonly actionOptions: Array<PoCheckboxGroupOption> = [
@@ -67,11 +69,20 @@ export class SamplePoPageDefaultLabsComponent implements OnInit {
6769
this.breadcrumbParams = {};
6870
}
6971

72+
changeLiterals() {
73+
try {
74+
this.customLiterals = JSON.parse(this.literals);
75+
} catch {
76+
this.customLiterals = undefined;
77+
}
78+
}
79+
7080
restore() {
7181
this.actions = [];
7282
this.breadcrumb = { items: [] };
7383
this.breadcrumbItem = { label: undefined, link: undefined };
7484
this.breadcrumbParams = {};
85+
this.literals = '';
7586
this.title = 'PO Page Default';
7687
this.restoreActionForm();
7788
}

0 commit comments

Comments
 (0)