Skip to content

Commit 36dd76c

Browse files
committed
feat(components): implementa help adicional ao p-help
Implementa help adicional ao p-help, permitindo exibir um tooltip ou disparar um evento. fixes DTHFUI-10443
1 parent ad4f38f commit 36dd76c

File tree

102 files changed

+2627
-1007
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

102 files changed

+2627
-1007
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { PoDynamicFormField } from '@po-ui/ng-components';
66
* @description
77
*
88
* Interface dos fields usados para compor o template `po-page-dynamic-edit`.
9+
* Herda as definições da interface
10+
* [PoDynamicFormField](https://po-ui.io/documentation/po-dynamic-form).
911
*/
1012
export interface PoPageDynamicEditField extends PoDynamicFormField {
1113
/** Indica se o campo será duplicado caso seja executada a ação de duplicação. */

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,14 @@ export class SamplePoPageDynamicEditUserComponent {
3737
{ property: 'name', divider: 'Personal data', required: true },
3838
{ property: 'nickname' },
3939
{ property: 'email', label: 'E-mail' },
40-
{ property: 'birthdate', label: 'Birth date', type: 'date' },
40+
{
41+
property: 'birthdate',
42+
label: 'Birth date',
43+
type: 'date',
44+
errorMessage: 'Invalid date.',
45+
help: 'Enter or select a valid date.',
46+
additionalHelpTooltip: 'Please enter a valid date in the format MMDDYYYY.'
47+
},
4148
{ property: 'genre', options: ['female', 'male', 'others'], gridLgColumns: 6 },
4249
{ property: 'nationality' },
4350
{ property: 'birthPlace', label: 'Place of birth' },

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

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,41 @@ import { PoDynamicField } from '../po-dynamic-field.interface';
3636
* Interface para definição das propriedades dos campos de entrada que serão criados dinamicamente.
3737
*/
3838
export interface PoDynamicFormField extends PoDynamicField {
39+
/**
40+
* Evento disparado ao clicar no ícone de ajuda adicional.
41+
* Este evento ativa automaticamente a exibição do ícone de ajuda adicional ao `p-help`.
42+
*
43+
* **Componentes compatíveis:** `po-checkbox`, `po-checkbox-group`, `po-combo`, `po-datepicker`, `po-datepicker-range`,
44+
* `po-decimal`, `po-email`, `po-input`, `po-login`, `po-lookup`, `po-multiselect`, `po-number`, `po-password`,
45+
* `po-radio-group`, `po-rich-text`, `po-select`, `po-switch`, `po-textarea`, `po-upload`, `po-url`.
46+
*/
47+
additionalHelp?: Function;
48+
49+
/**
50+
* Exibe um ícone de ajuda adicional ao `p-help`, com o texto desta propriedade no tooltip.
51+
* Se o evento `p-additional-help` estiver definido, o tooltip não será exibido.
52+
* **Como boa prática, indica-se utilizar um texto com até 140 caracteres.**
53+
*
54+
* **Componentes compatíveis:** `po-checkbox`, `po-checkbox-group`, `po-combo`, `po-datepicker`, `po-datepicker-range`,
55+
* `po-decimal`, `po-email`, `po-input`, `po-login`, `po-lookup`, `po-multiselect`, `po-number`, `po-password`,
56+
* `po-radio-group`, `po-rich-text`, `po-select`, `po-switch`, `po-textarea`, `po-upload`, `po-url`.
57+
*/
58+
additionalHelpTooltip?: string;
59+
60+
/**
61+
* Define que o `listbox` e/ou tooltip (`p-additional-help-tooltip` e/ou `p-error-limit`) serão incluídos no body da
62+
* página e não dentro do componente. Essa opção é necessária para cenários com containers que possuem scroll ou
63+
* overflow escondido, garantindo o posicionamento correto de ambos próximo ao elemento.
64+
*
65+
* > O uso dessa propriedade pode acarretar na perda sequencial da tabulação da página.
66+
* Quando utilizado com `p-additional-help-tooltip`, leitores de tela como o NVDA podem não ler o conteúdo do tooltip.
67+
*
68+
* **Componentes compatíveis:** `po-checkbox`, `po-checkbox-group`, `po-combo`, `po-datepicker`, `po-datepicker-range`,
69+
* `po-decimal`, `po-email`, `po-input`, `po-login`, `po-lookup`, `po-multiselect`, `po-number`, `po-password`,
70+
* `po-radio-group`, `po-rich-text`, `po-select`, `po-switch`, `po-textarea`, `po-upload`, `po-url`.
71+
*/
72+
appendBox?: boolean;
73+
3974
/**
4075
* Define as colunas para utilização da busca avançada. Usada somente em conjunto com a propriedade `searchService`,
4176
* essa propriedade deve receber um array de objetos que implementam a interface [`PoLookupColumn`](/documentation/po-lookup).
@@ -298,8 +333,6 @@ export interface PoDynamicFormField extends PoDynamicField {
298333
*/
299334
errorLimit?: boolean;
300335

301-
errorAppendBox?: boolean;
302-
303336
/**
304337
* Função executada para realizar a validação assíncrona personalizada.
305338
* Executada ao disparar o output `change` ou `change-model`, dependendo do valor da propriedade `triggerMode`.

projects/ui/src/lib/components/po-dynamic/po-dynamic-form/po-dynamic-form-fields/po-dynamic-form-fields.component.html

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
<ng-template #poContent let-fields>
1111
<ng-container *ngFor="let field of fields; trackBy: trackBy">
1212
<po-divider *ngIf="field?.divider?.trim()" class="po-sm-12" [p-label]="field.divider"> </po-divider>
13-
1413
<po-datepicker
1514
#component
1615
*ngIf="compareTo(field.control, 'datepicker')"
1716
[name]="field.property"
1817
[(ngModel)]="value[field.property]"
1918
[ngClass]="field.componentClass"
19+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
20+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
2021
[p-clean]="field.clean"
2122
[p-disabled]="isDisabled(field)"
2223
[p-error-pattern]="field.errorMessage"
@@ -38,6 +39,7 @@
3839
[p-show-required]="field.showRequired"
3940
(p-change)="onChangeField(field)"
4041
[p-placeholder]="field.placeholder"
42+
(p-additional-help)="field.additionalHelp?.($event)"
4143
>
4244
</po-datepicker>
4345

@@ -47,6 +49,8 @@
4749
[name]="field.property"
4850
[(ngModel)]="value[field.property]"
4951
[ngClass]="field.componentClass"
52+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
53+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
5054
[p-clean]="field.clean"
5155
[p-disabled]="isDisabled(field)"
5256
[p-auto-focus]="field.focus"
@@ -62,6 +66,7 @@
6266
[p-field-error-message]="field.errorMessage"
6367
[p-error-limit]="field.errorLimit"
6468
[p-show-required]="field.showRequired"
69+
(p-additional-help)="field.additionalHelp?.($event)"
6570
(p-change)="onChangeField(field)"
6671
>
6772
</po-datepicker-range>
@@ -72,6 +77,8 @@
7277
[name]="field.property"
7378
[(ngModel)]="value[field.property]"
7479
[ngClass]="field.componentClass"
80+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
81+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
7582
[p-clean]="field.clean"
7683
[p-disabled]="isDisabled(field)"
7784
[p-error-pattern]="field.errorMessage"
@@ -90,6 +97,7 @@
9097
[p-required]="field.required"
9198
[p-required-field-error-message]="field.requiredFieldErrorMessage"
9299
[p-show-required]="field.showRequired"
100+
(p-additional-help)="field.additionalHelp?.($event)"
93101
(p-change)="onChangeField(field)"
94102
(p-change-model)="onChangeFieldModel(field)"
95103
[p-icon]="field.icon"
@@ -104,6 +112,8 @@
104112
[name]="field.property"
105113
[(ngModel)]="value[field.property]"
106114
[ngClass]="field.componentClass"
115+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
116+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
107117
[p-clean]="field.clean"
108118
[p-disabled]="isDisabled(field)"
109119
[p-error-pattern]="field.errorMessage"
@@ -123,6 +133,7 @@
123133
[p-required]="field.required"
124134
[p-required-field-error-message]="field.requiredFieldErrorMessage"
125135
[p-show-required]="field.showRequired"
136+
(p-additional-help)="field.additionalHelp?.($event)"
126137
(p-change)="onChangeField(field)"
127138
(p-change-model)="onChangeFieldModel(field)"
128139
[p-icon]="field.icon"
@@ -136,6 +147,8 @@
136147
[name]="field.property"
137148
[(ngModel)]="value[field.property]"
138149
[ngClass]="field.componentClass"
150+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
151+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
139152
[p-clean]="field.clean"
140153
[p-error-pattern]="field.errorMessage"
141154
[p-error-limit]="field.errorLimit"
@@ -158,6 +171,7 @@
158171
[p-required]="field.required"
159172
[p-required-field-error-message]="field.requiredFieldErrorMessage"
160173
[p-show-required]="field.showRequired"
174+
(p-additional-help)="field.additionalHelp?.($event)"
161175
(p-change)="onChangeField(field)"
162176
(p-change-model)="onChangeFieldModel(field)"
163177
[p-placeholder]="field.placeholder"
@@ -170,6 +184,8 @@
170184
[name]="field.property"
171185
[(ngModel)]="value[field.property]"
172186
[ngClass]="field.componentClass"
187+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
188+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
173189
[p-field-label]="field.fieldLabel"
174190
[p-field-value]="field.fieldValue"
175191
[p-disabled]="isDisabled(field)"
@@ -181,6 +197,7 @@
181197
[p-field-error-message]="field.errorMessage"
182198
[p-error-limit]="field.errorLimit"
183199
[p-show-required]="field.showRequired"
200+
(p-additional-help)="field.additionalHelp?.($event)"
184201
(p-change)="onChangeField(field)"
185202
[p-placeholder]="field.placeholder"
186203
[p-readonly]="field.readonly"
@@ -193,6 +210,8 @@
193210
[name]="field.property"
194211
[(ngModel)]="value[field.property]"
195212
[ngClass]="field.componentClass"
213+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
214+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
196215
[p-columns]="field.columns || 3"
197216
[p-auto-focus]="field.focus"
198217
[p-disabled]="isDisabled(field)"
@@ -204,6 +223,7 @@
204223
[p-field-error-message]="field.errorMessage"
205224
[p-error-limit]="field.errorLimit"
206225
[p-show-required]="field.showRequired"
226+
(p-additional-help)="field.additionalHelp?.($event)"
207227
(p-change)="onChangeField(field)"
208228
>
209229
</po-radio-group>
@@ -214,6 +234,8 @@
214234
[name]="field.property"
215235
[(ngModel)]="value[field.property]"
216236
[ngClass]="field.componentClass"
237+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
238+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
217239
[p-disabled]="isDisabled(field)"
218240
[p-format-model]="field.formatModel"
219241
[p-help]="field.help"
@@ -222,6 +244,7 @@
222244
[p-label-on]="field.booleanTrue"
223245
[p-label-position]="field.labelPosition"
224246
[p-hide-label-status]="field.hideLabelStatus"
247+
(p-additional-help)="field.additionalHelp?.($event)"
225248
(p-change)="onChangeField(field)"
226249
>
227250
</po-switch>
@@ -232,10 +255,13 @@
232255
[name]="field.property"
233256
[(ngModel)]="value[field.property]"
234257
[ngClass]="field.componentClass"
258+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
259+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
235260
[p-auto-focus]="field.focus"
236261
[p-disabled]="isDisabled(field)"
237262
[p-label]="field.label"
238263
[p-size]="field.size"
264+
(p-additional-help)="field.additionalHelp?.($event)"
239265
(p-change)="onChangeField(field)"
240266
>
241267
</po-checkbox>
@@ -247,6 +273,8 @@
247273
[(ngModel)]="value[field.property]"
248274
[ngClass]="field.componentClass"
249275
p-emit-object-value
276+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
277+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
250278
[p-auto-focus]="field.focus"
251279
[p-clean]="field.clean"
252280
[p-disabled]="isDisabled(field)"
@@ -275,6 +303,7 @@
275303
[p-disabled-tab-filter]="field.disabledTabFilter"
276304
[p-debounce-time]="field.debounceTime"
277305
[p-change-on-enter]="field.changeOnEnter"
306+
(p-additional-help)="field.additionalHelp?.($event)"
278307
>
279308
</po-combo>
280309

@@ -286,6 +315,8 @@
286315
p-field-label="label"
287316
p-field-value="value"
288317
[ngClass]="field.componentClass"
318+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
319+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
289320
[p-clean]="field.clean"
290321
[p-columns]="field.columns"
291322
[p-disabled]="isDisabled(field)"
@@ -310,6 +341,7 @@
310341
(p-change)="onChangeField(field)"
311342
[p-placeholder]="field.placeholder"
312343
[p-advanced-filters]="field.advancedFilters"
344+
(p-additional-help)="field.additionalHelp?.($event)"
313345
(p-change-visible-columns)="field.changeVisibleColumns?.($event)"
314346
(p-restore-column-manager)="field.columnRestoreManager?.($event)"
315347
>
@@ -321,6 +353,8 @@
321353
[name]="field.property"
322354
[(ngModel)]="value[field.property]"
323355
[ngClass]="field.componentClass"
356+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
357+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
324358
[p-columns]="field.columns || 3"
325359
[p-auto-focus]="field.focus"
326360
[p-disabled]="isDisabled(field)"
@@ -332,6 +366,7 @@
332366
[p-show-required]="field.showRequired"
333367
[p-field-error-message]="field.errorMessage"
334368
[p-error-limit]="field.errorLimit"
369+
(p-additional-help)="field.additionalHelp?.($event)"
335370
(p-change)="onChangeField(field)"
336371
>
337372
</po-checkbox-group>
@@ -342,6 +377,8 @@
342377
[name]="field.property"
343378
[(ngModel)]="value[field.property]"
344379
[ngClass]="field.componentClass"
380+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
381+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
345382
[p-disabled]="isDisabled(field)"
346383
[p-auto-focus]="field.focus"
347384
[p-auto-height]="field.autoHeight"
@@ -365,6 +402,7 @@
365402
[p-placeholder-search]="field.placeholderSearch"
366403
[p-hide-search]="field.hideSearch"
367404
[p-hide-select-all]="field.hideSelectAll"
405+
(p-additional-help)="field.additionalHelp?.($event)"
368406
>
369407
</po-multiselect>
370408

@@ -374,6 +412,8 @@
374412
[name]="field.property"
375413
[(ngModel)]="value[field.property]"
376414
[ngClass]="field.componentClass"
415+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
416+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
377417
[p-disabled]="isDisabled(field)"
378418
[p-auto-focus]="field.focus"
379419
[p-help]="field.help"
@@ -387,6 +427,7 @@
387427
[p-error-limit]="field.errorLimit"
388428
[p-show-required]="field.showRequired"
389429
[p-rows]="field.rows"
430+
(p-additional-help)="field.additionalHelp?.($event)"
390431
(p-change)="onChangeField(field)"
391432
(p-change-model)="onChangeFieldModel(field)"
392433
[p-placeholder]="field.placeholder"
@@ -399,6 +440,8 @@
399440
[name]="field.property"
400441
[(ngModel)]="value[field.property]"
401442
[ngClass]="field.componentClass"
443+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
444+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
402445
[p-clean]="field.clean"
403446
[p-disabled]="isDisabled(field)"
404447
[p-error-pattern]="field.errorMessage"
@@ -418,6 +461,7 @@
418461
[p-required]="field.required"
419462
[p-required-field-error-message]="field.requiredFieldErrorMessage"
420463
[p-show-required]="field.showRequired"
464+
(p-additional-help)="field.additionalHelp?.($event)"
421465
(p-change)="onChangeField(field)"
422466
(p-change-model)="onChangeFieldModel(field)"
423467
[p-placeholder]="field.placeholder"
@@ -429,6 +473,8 @@
429473
*ngIf="compareTo(field.control, 'upload')"
430474
[(ngModel)]="value[field.property]"
431475
[ngClass]="field.componentClass"
476+
[additionalHelpEventTrigger]="field.additionalHelp ? 'event' : 'noEvent'"
477+
[p-additional-help-tooltip]="field.additionalHelpTooltip"
432478
[p-auto-upload]="field.autoUpload"
433479
[p-directory]="field.directory"
434480
[p-disabled]="isDisabled(field)"
@@ -453,6 +499,7 @@
453499
[p-optional]="field.optional"
454500
[p-required]="field.required"
455501
[p-show-required]="field.showRequired"
502+
(p-additional-help)="field.additionalHelp?.($event)"
456503
(p-change)="onChangeField(field)"
457504
(p-change-model)="onChangeFieldModel(field)"
458505
[p-url]="field.url"

projects/ui/src/lib/components/po-dynamic/po-dynamic-form/samples/sample-po-dynamic-form-container/sample-po-dynamic-form-container.component.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ export class SamplePoDynamicFormContainerComponent implements OnInit {
4141
gridSmColumns: 12,
4242
maxValue: '2010-01-01',
4343
errorMessage: 'The date must be before the year 2010.',
44-
order: -1
44+
order: -1,
45+
help: 'Enter or select a valid date.',
46+
additionalHelpTooltip: 'Please enter a valid date in the format MMDDYYYY.'
4547
},
4648
{ property: 'cpf', label: 'CPF', mask: '999.999.999-99', gridColumns: 6, gridSmColumns: 12, visible: false },
4749
{ property: 'cnpj', label: 'CNPJ', mask: '99.999.999/9999-99', gridColumns: 6, gridSmColumns: 12, visible: false },
@@ -61,7 +63,9 @@ export class SamplePoDynamicFormContainerComponent implements OnInit {
6163
secret: true,
6264
pattern: '[a-zA]{5}[Z0-9]{3}',
6365
errorMessage: 'At least 5 alphabetic and 3 numeric characters are required.',
64-
placeholder: 'Type your password'
66+
placeholder: 'Type your password',
67+
help: 'Password must include a combination of letters and numbers.',
68+
additionalHelpTooltip: 'At least 5 alphabetic and 3 numeric characters are required.'
6569
},
6670
{
6771
property: 'rememberSecretKey',
@@ -111,7 +115,9 @@ export class SamplePoDynamicFormContainerComponent implements OnInit {
111115
container: 'Work data',
112116
range: true,
113117
gridColumns: 5,
114-
gridSmColumns: 12
118+
gridSmColumns: 12,
119+
help: 'Enter or select a valid date range.',
120+
additionalHelpTooltip: 'Ensure the start date is earlier than or equal to the end date.'
115121
},
116122
{
117123
property: 'entryTime',

0 commit comments

Comments
 (0)