Skip to content

Commit c4ac760

Browse files
CarlosAlmeida01alinelariguet
authored andcommitted
feat(po-dynamic-view): adiciona format aos valores
1 parent 5e47c82 commit c4ac760

File tree

3 files changed

+93
-33
lines changed

3 files changed

+93
-33
lines changed

projects/ui/src/lib/components/po-dynamic/po-dynamic-view/po-dynamic-view-base.component.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,39 @@ describe('PoDynamicViewBaseComponent:', () => {
397397
expect(newField.value).toEqual(listName);
398398
});
399399

400+
it('transformArrayValue: should return a concatenated string of multiple properties from an array of objects', () => {
401+
const inputArray = [
402+
{ id: 1, name: 'Company1', ssn: '261-81-7609' },
403+
{ id: 2, name: 'Company2', ssn: '527-84-6773' }
404+
];
405+
const field = {
406+
property: 'company',
407+
label: 'Company',
408+
fieldLabel: 'name',
409+
fieldValue: 'id',
410+
format: ['id', 'name', 'ssn']
411+
};
412+
413+
const result = component['transformArrayValue'](inputArray, field);
414+
415+
expect(result).toBe('1 - Company1 - 261-81-7609, 2 - Company2 - 527-84-6773');
416+
});
417+
418+
it('transformArrayValue: should return a concatenated string of properties from a single object', () => {
419+
const inputArray = [{ id: 1, name: 'Company1', ssn: '261-81-7609' }];
420+
const field = {
421+
property: 'company',
422+
label: 'Company',
423+
fieldLabel: 'name',
424+
fieldValue: 'id',
425+
format: ['id', 'name', 'ssn']
426+
};
427+
428+
const result = component['transformArrayValue'](inputArray, field);
429+
430+
expect(result).toBe('1 - Company1 - 261-81-7609');
431+
});
432+
400433
it(`createField: should call 'transformFieldLabel' and return a fieldLabel property`, () => {
401434
const field = { property: 'name', label: 'Nome', fieldLabel: 'title', fieldValue: 'id' };
402435
component.value = { name: 'Test Name', title: 'Title Test', id: 123 };

projects/ui/src/lib/components/po-dynamic/po-dynamic-view/po-dynamic-view-base.component.ts

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -259,21 +259,27 @@ export class PoDynamicViewBaseComponent {
259259

260260
private transformArrayValue(valueProperty: any, field: PoDynamicViewField) {
261261
const valueArray = Array.isArray(valueProperty) ? valueProperty : [valueProperty];
262-
const arrayWithLabel = valueArray.map(item => ({
263-
value: item[field.fieldValue] || item.value,
264-
label: item[field.fieldLabel] || item.label
265-
}));
266-
267-
const labels = arrayWithLabel.map(optionValue => {
268-
if (optionValue.label) {
269-
const labelTranformed = this.transformValue(field.type, optionValue.label, field.format);
270-
if (field.concatLabelValue && optionValue.value) {
271-
return `${labelTranformed} - ${optionValue.value}`;
272-
} else {
273-
return labelTranformed;
262+
let labels: Array<string>;
263+
264+
if (Array.isArray(field.format)) {
265+
labels = valueArray.map(objectData => this.formatField(objectData, field.format));
266+
} else {
267+
const arrayWithLabel = valueArray.map(item => ({
268+
value: item[field.fieldValue] || item.value,
269+
label: item[field.fieldLabel] || item.label
270+
}));
271+
272+
labels = arrayWithLabel.map(optionValue => {
273+
if (optionValue.label) {
274+
const labelTranformed = this.transformValue(field.type, optionValue.label, field.format);
275+
if (field.concatLabelValue && optionValue.value) {
276+
return `${labelTranformed} - ${optionValue.value}`;
277+
} else {
278+
return labelTranformed;
279+
}
274280
}
275-
}
276-
});
281+
});
282+
}
277283

278284
if (labels[0] !== undefined && labels.join()) {
279285
return labels.join(', ');
@@ -318,4 +324,20 @@ export class PoDynamicViewBaseComponent {
318324

319325
return transformedValue;
320326
}
327+
328+
private formatField(objectSelected, properties) {
329+
let formattedField;
330+
if (Array.isArray(properties)) {
331+
for (const property of properties) {
332+
if (objectSelected && objectSelected[property]) {
333+
if (!formattedField) {
334+
formattedField = objectSelected[property];
335+
} else {
336+
formattedField += ' - ' + objectSelected[property];
337+
}
338+
}
339+
}
340+
}
341+
return formattedField;
342+
}
321343
}

projects/ui/src/lib/components/po-dynamic/po-dynamic-view/po-dynamic-view-field.interface.ts

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -96,26 +96,31 @@ export interface PoDynamicViewField extends PoDynamicField {
9696
isArrayOrObject?: boolean;
9797

9898
/**
99-
* Formato de exibição do valor do campo.
100-
*
101-
* Aplicado para casos específicos de acordo com o tipo do campo.
102-
*
103-
* **types**:
104-
* - `currency`: Aceita valores definidos para a propriedade `currencyCode` do
105-
* [**CurrencyPipe**](https://angular.io/api/common/CurrencyPipe)
106-
* + Exemplos: 'BRL', 'USD'.
107-
* - `date`: Aceita valores definidos para a propriedade `format` do [**DatePipe**](https://angular.io/api/common/DatePipe)
108-
* e também aceita os caracteres de dia(dd), mês(MM) e ano (yyyy ou yy),
109-
* caso não seja informado um formato o mesmo será 'dd/MM/yyyy'. Exemplos: 'dd/MM/yyyy', 'dd-MM-yy', 'mm/dd/yyyy'.
110-
* - `time`: Aceita apenas os caracteres de hora(HH), minutos(mm), segundos(ss) e
111-
* milisegundos(f-ffffff), os milisegundos são opcionais, caso não seja informado um formato o mesmo será
112-
* 'HH:mm:ss'. Exemplos: 'HH:mm', 'HH:mm:ss.ffffff', 'HH:mm:ss.ff', 'mm:ss.fff'.
113-
* - `number`: Aceita valores definidos para a propriedade `digitsInfo` do [**DecimalPipe**](https://angular.io/api/common/DecimalPipe)
114-
* para formatação, e caso não seja informado, o número será exibido na sua forma original.
115-
*
116-
* + Exemplo: com o valor de entrada: `50` e a valor para formatação: `'1.2-5'` o resultado será: `50.00`.
99+
* Define o formato de exibição para o valor de um campo.
100+
*
101+
* - Quando `format` é uma `string`, o formato aplicado depende da propriedade **type** segue como usar cada tipo:
102+
* - `currency`: Utiliza códigos de moeda definidos pelo [CurrencyPipe](https://angular.io/api/common/CurrencyPipe).
103+
* Exemplos: Use 'BRL' para Real Brasileiro e 'USD' para Dólar Americano.
104+
* - `date`: Adota formatos de data especificados pelo [DatePipe](https://angular.io/api/common/DatePipe).
105+
* Suporta formatos personalizados, como dia (dd), mês (MM) e ano (yyyy ou yy).
106+
* Formato padrão é 'dd/MM/yyyy'. Exemplos: 'dd/MM/yyyy', 'dd-MM-yy', 'mm/dd/yyyy'.
107+
* - `time`: Aceita formatos de tempo, incluindo hora (HH), minutos (mm), segundos (ss) e opcionalmente
108+
* milisegundos (f-ffffff). Formato padrão é 'HH:mm:ss'. Exemplos: 'HH:mm', 'HH:mm:ss.ffffff', 'HH:mm:ss.ff'.
109+
* - `number`: Usa especificações do [DecimalPipe](https://angular.io/api/common/DecimalPipe) para formatação numérica.
110+
* Na ausência de um formato específico, o número é exibido como fornecido.
111+
* Exemplo: Entrada `50`, formato `'1.2-5'`, resulta em `50.00`.
112+
*
113+
* - Quando `format` é um `Array<string>`:
114+
* - Cada elemento do array representa uma propriedade do objeto.
115+
* - Os valores dessas propriedades são concatenados, separados pelo padrão ' - '.
116+
* - Exemplo: Para `format: ["id", "name"]` e um objeto `{ id: 1, name: 'Carlos Diego' }`,
117+
* o resultado será `'1 - Carlos Diego'`.
118+
*
119+
* @example Para formatar um campo de moeda, use format: "BRL".
120+
* Para um campo de data, use format: "dd/MM/yyyy".
121+
* Para combinar propriedades de um objeto em um campo, use format: ["id", "name"].
117122
*/
118-
format?: string;
123+
format?: string | Array<string>;
119124

120125
/**
121126
* Informa a ordem de exibição do campo.

0 commit comments

Comments
 (0)