Skip to content

Commit 246ef13

Browse files
nicoleoliveirajhosefmarks
authored andcommitted
feat(page-dynamic-edit): adiciona propriedade serviceMetadataApi
Criação da propriedade `serviceMetadataApi` para poder buscar os metadados de uma fonte diferente da fonte original dos dados. Fixes DTHFUI-2618
1 parent 7e3d6bd commit 246ef13

File tree

8 files changed

+135
-26
lines changed

8 files changed

+135
-26
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export * from './po-page-dynamic-edit.component';
2-
export * from './po-page-dynamic-edit-actions.interface';
3-
export * from './po-page-dynamic-edit-field.interface';
2+
export * from './interfaces/po-page-dynamic-edit-actions.interface';
3+
export * from './interfaces/po-page-dynamic-edit-field.interface';
44

55
export * from './po-page-dynamic-edit.module';

projects/templates/src/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-actions.interface.ts renamed to projects/templates/src/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-actions.interface.ts

File renamed without changes.

projects/templates/src/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-field.interface.ts renamed to projects/templates/src/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-field.interface.ts

File renamed without changes.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { PoPageDynamicEditOptions } from './po-page-dynamic-edit-options.interface';
2+
3+
/**
4+
* @docsExtends PoPageDynamicEditOptions
5+
*
6+
* @usedBy PoPageDynamicEditComponent
7+
*
8+
* @description
9+
*
10+
* <a id="po-page-dynamic-edit-metadata"></a>
11+
*
12+
* Interface para o metadata de uma página dinâmica.
13+
*/
14+
export interface PoPageDynamicEditMetadata extends PoPageDynamicEditOptions {
15+
16+
/**
17+
* Cria automaticamente as rotas de edição (novo/duplicate) e detalhes caso sejam definidas ações na propriedade `p-actions`
18+
*
19+
* As rotas criadas serão baseadas na propriedade `p-actions`.
20+
*
21+
* > Para o correto funcionamento não pode haver nenhuma rota coringa (`**`) especificada.
22+
*
23+
* @default false
24+
*/
25+
autoRouter?: boolean;
26+
27+
/** Versão do metadado devolvido pelo backend. */
28+
version: number;
29+
30+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { PoBreadcrumb } from '@portinari/portinari-ui';
2+
3+
import { PoPageDynamicEditField } from './po-page-dynamic-edit-field.interface';
4+
import { PoPageDynamicEditActions } from './po-page-dynamic-edit-actions.interface';
5+
6+
export interface PoPageDynamicEditOptions {
7+
8+
/**
9+
* Lista dos campos usados.
10+
*/
11+
fields?: Array<PoPageDynamicEditField>;
12+
13+
/**
14+
* Ações que o usuário poderá executar na página através de botões.
15+
*/
16+
actions?: PoPageDynamicEditActions;
17+
18+
/**
19+
* Objeto com propriedades do breadcrumb.
20+
*/
21+
breadcrumb?: PoBreadcrumb;
22+
23+
/**
24+
* Título da página.
25+
*/
26+
title?: string;
27+
}

projects/templates/src/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.spec.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import * as util from './../../utils/util';
1212
import { configureTestSuite, expectPropertiesValues } from './../../util-test/util-expect.spec';
1313

1414
import { PoPageDynamicEditComponent } from './po-page-dynamic-edit.component';
15-
import { PoPageDynamicEditActions } from './po-page-dynamic-edit-actions.interface';
15+
import { PoPageDynamicEditActions } from './interfaces/po-page-dynamic-edit-actions.interface';
1616
import { PoDynamicFormStubComponent } from './test/po-dynamic-form-stub-component';
1717

1818
describe('PoPageDynamicEditComponent: ', () => {
@@ -274,7 +274,8 @@ describe('PoPageDynamicEditComponent: ', () => {
274274

275275
component.ngOnInit();
276276

277-
expect(component['poPageDynamicService'].configServiceApi).toHaveBeenCalledWith({ endpoint: component.serviceApi });
277+
expect(component['poPageDynamicService'].configServiceApi)
278+
.toHaveBeenCalledWith({ endpoint: component.serviceApi, metadata: undefined });
278279
expect(component['loadData']).toHaveBeenCalledWith(id, duplicate);
279280

280281
expect(component['loadMetadata']).not.toHaveBeenCalled();
@@ -288,7 +289,8 @@ describe('PoPageDynamicEditComponent: ', () => {
288289
const activatedRoute: any = {
289290
snapshot: {
290291
data: {
291-
serviceApi: 'localhost:4300/api/people'
292+
serviceApi: 'localhost:4300/api/people',
293+
serviceMetadataApi: 'metadata'
292294
},
293295
params: { id },
294296
queryParams: { duplicate }
@@ -306,7 +308,8 @@ describe('PoPageDynamicEditComponent: ', () => {
306308

307309
component.ngOnInit();
308310

309-
expect(component['poPageDynamicService'].configServiceApi).toHaveBeenCalledWith({ endpoint: component.serviceApi });
311+
expect(component['poPageDynamicService'].configServiceApi)
312+
.toHaveBeenCalledWith({ endpoint: component.serviceApi, metadata: 'metadata' });
310313
expect(component['loadMetadata']).toHaveBeenCalledWith(id, duplicate);
311314

312315
expect(component['loadData']).not.toHaveBeenCalled();

projects/templates/src/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.ts

Lines changed: 64 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import {
1414

1515
import * as util from './../../utils/util';
1616

17-
import { PoPageDynamicEditActions } from './po-page-dynamic-edit-actions.interface';
18-
import { PoPageDynamicEditField } from './po-page-dynamic-edit-field.interface';
17+
import { PoPageDynamicEditActions } from './interfaces/po-page-dynamic-edit-actions.interface';
18+
import { PoPageDynamicEditField } from './interfaces/po-page-dynamic-edit-field.interface';
1919
import { PoPageDynamicService } from './po-page-dynamic.service';
2020

2121
export const poPageDynamicEditLiteralsDefault = {
@@ -69,6 +69,63 @@ export const poPageDynamicEditLiteralsDefault = {
6969
* O `po-page-dynamic-edit` é uma página que pode servir para editar ou criar novos registros,
7070
* o mesmo também suporta metadados conforme especificado na documentação.
7171
*
72+
* ### Utilização via rota
73+
*
74+
* Ao utilizar as rotas para carregar o template, o `page-dynamic-edit` disponibiliza propriedades para
75+
* poder especificar o endpoint dos dados e dos metadados. Exemplo de utilização:
76+
*
77+
* ```
78+
* {
79+
* path: 'people',
80+
* component: PoPageDynamicEditComponent,
81+
* data: {
82+
* serviceApi: 'http://localhost:3000/v1/people', // endpoint dos dados
83+
* serviceMetadataApi: 'http://localhost:3000/v1/metadata' // endpoint dos metadados
84+
* }
85+
* }
86+
* ```
87+
*
88+
* Para carregar com um recurso já existente, deve-se ser incluído um parâmetro na rota chamado `id`:
89+
*
90+
* ```
91+
* {
92+
* path: 'people/:id',
93+
* component: PoPageDynamicEditComponent,
94+
* data: {
95+
* serviceApi: 'http://localhost:3000/v1/people', // endpoint dos dados
96+
* serviceMetadataApi: 'http://localhost:3000/v1/metadata' // endpoint dos metadados
97+
* }
98+
* }
99+
* ```
100+
*
101+
* A requisição dos metadados é feita na inicialização do template para buscar os metadados da página passando o
102+
* tipo do metadado esperado e a versão cacheada pelo browser.
103+
*
104+
* O formato esperado na resposta da requisição está especificado na interface
105+
* [PoPageDynamicEditMetadata](/documentation/po-page-dynamic-edit#po-page-dynamic-edit-metadata). Por exemplo:
106+
*
107+
* ```
108+
* {
109+
* version: 1,
110+
* title: 'Person edit',
111+
* fields: [
112+
* { property: 'id', key: true, disabled: true },
113+
* { property: 'status' },
114+
* { property: 'name' },
115+
* { property: 'nickname' },
116+
* { property: 'birthdate', label: 'Birth date' },
117+
* { property: 'genre' },
118+
* { property: 'city' },
119+
* { property: 'country' }
120+
* ]
121+
* }
122+
* ```
123+
*
124+
* > Caso o endpoint dos metadados não seja especificado, será feito uma requisição utilizando o `serviceApi` da seguinte forma:
125+
* ```
126+
* GET {end-point}/metadata?type=edit&version={version}
127+
* ```
128+
*
72129
* @example
73130
*
74131
* <example name="po-page-dynamic-edit-basic" title="Portinari Page Dynamic Edit Basic">
@@ -171,7 +228,7 @@ export class PoPageDynamicEditComponent implements OnInit {
171228
/**
172229
* @description
173230
*
174-
* Endpoint usado pelo template para requisição do recurso que serão exibido para edição.
231+
* Endpoint usado pelo template para requisição do recurso que será exibido para edição.
175232
*
176233
* Para as ações de `save` e `saveNew`, será feito uma requisição de criação nesse mesmo endpoint passando os valores
177234
* preenchidos pelo usuário via payload.
@@ -202,10 +259,6 @@ export class PoPageDynamicEditComponent implements OnInit {
202259
* ```
203260
* { "name": "Fulano", "city": "Smallville" }
204261
* ```
205-
* > Caso esteja usando metadados com o template, será disparado uma requisição na inicialização do template para buscar
206-
* > os metadados da página passando o tipo do metadado esperado e a versão cacheada pelo browser.
207-
* >
208-
* > `GET {end-point}/metadata?type=create&version={version}`
209262
*
210263
* Caso queira que o template carregue um recurso já existente, deve-se ser incluído um parametro na rota chamado `id`.
211264
*
@@ -240,11 +293,6 @@ export class PoPageDynamicEditComponent implements OnInit {
240293
* ```
241294
* { "name": "Fulano", "city": "Metropolis" }
242295
* ```
243-
*
244-
* > Caso esteja usando metadados com o template, será disparado uma requisição na inicialização do template para buscar
245-
* > os metadados da página passando o tipo do metadado esperado e a versão cacheada pelo browser.
246-
* >
247-
* > `GET {end-point}/metadata?type=edit&version={version}`
248296
*/
249297
@Input('p-service-api') serviceApi: string;
250298

@@ -266,15 +314,13 @@ export class PoPageDynamicEditComponent implements OnInit {
266314
const paramId = this.activatedRoute.snapshot.params['id'];
267315
const duplicate = this.activatedRoute.snapshot.queryParams['duplicate'];
268316

269-
if (this.activatedRoute.snapshot.data.serviceApi) {
270-
this.serviceApi = this.activatedRoute.snapshot.data.serviceApi;
271-
272-
this.poPageDynamicService.configServiceApi({ endpoint: this.serviceApi });
317+
const { serviceApi, serviceMetadataApi } = this.activatedRoute.snapshot.data;
318+
this.serviceApi = serviceApi || this.serviceApi;
319+
this.poPageDynamicService.configServiceApi({ endpoint: this.serviceApi, metadata: serviceMetadataApi });
273320

321+
if (serviceApi) {
274322
this.loadMetadata(paramId, duplicate);
275323
} else {
276-
this.poPageDynamicService.configServiceApi({ endpoint: this.serviceApi });
277-
278324
this.loadData(paramId, duplicate);
279325
}
280326
}

projects/templates/src/lib/components/po-page-dynamic-edit/po-page-dynamic.service.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,25 @@ import { map } from 'rxjs/operators';
88
export class PoPageDynamicService {
99

1010
private endpoint = '/';
11+
private metadata: string;
1112

1213
readonly headers: HttpHeaders = new HttpHeaders({
1314
'X-PORTINARI-SCREEN-LOCK': 'true'
1415
});
1516

1617
constructor(private http: HttpClient) { }
1718

18-
configServiceApi(config: { endpoint?: string } = {}) {
19+
configServiceApi(config: { endpoint?: string, metadata?: string } = {}) {
1920
this.endpoint = config.endpoint;
21+
this.metadata = config.metadata || this.metadata;
2022
}
2123

2224
getMetadata(type: string = 'list'): Observable<any> {
2325
const key = `${this.endpoint}-${type}-metadata`;
2426
const cache = JSON.parse(localStorage.getItem(key)) || {};
27+
const metadataUrlBase = this.metadata || `${this.endpoint}/metadata`;
2528

26-
const url = `${this.endpoint}/metadata?type=${type}&version=${cache.version || ''}`;
29+
const url = `${metadataUrlBase}?type=${type}&version=${cache.version || ''}`;
2730

2831
return this.http.get(url).pipe(map((response: any) => {
2932
if (response.version === cache.version) {

0 commit comments

Comments
 (0)