Skip to content

Commit 5809027

Browse files
jcorrea97rafaellmarques
authored andcommitted
feat(multiselect): cria propriedade p-append-in-body
cria propriedade `p-append-in-body` para renderizar o dropdown do componente fora do conteúdo principal fixes DTHFUI-7742
1 parent 21e8adc commit 5809027

File tree

4 files changed

+53
-15
lines changed

4 files changed

+53
-15
lines changed

projects/ui/src/lib/components/po-field/po-multiselect/po-multiselect-base.component.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,20 @@ export abstract class PoMultiselectBaseComponent implements ControlValueAccessor
135135
*/
136136
@Output('p-change') change: EventEmitter<any> = new EventEmitter<any>();
137137

138+
/**
139+
* @optional
140+
*
141+
* @description
142+
*
143+
* Define que o dropdown do multiselect será incluido no body da página e não suspenso com a caixa de texto do componente.
144+
* Opção necessária para o caso de uso do componente em páginas que necessitam renderizar o multiselect fora do conteúdo principal.
145+
*
146+
* > Obs: O uso dessa propriedade pode acarretar na perda sequencial da tabulação da página
147+
*
148+
* @default `false`
149+
*/
150+
@Input({ alias: 'p-append-in-body', transform: convertToBoolean }) appendBox?: boolean = false;
151+
138152
selectedOptions: Array<PoMultiselectOption | any> = [];
139153
visibleOptionsDropdown: Array<PoMultiselectOption | any> = [];
140154
visibleDisclaimers = [];

projects/ui/src/lib/components/po-field/po-multiselect/po-multiselect.component.html

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@
55
[p-required]="required"
66
[p-show-required]="showRequired"
77
>
8-
<div class="po-field-container-content" [class.po-multiselect-show]="dropdownOpen">
8+
<div
9+
cdkOverlayOrigin
10+
#trigger="cdkOverlayOrigin"
11+
class="po-field-container-content"
12+
[class.po-multiselect-show]="dropdownOpen"
13+
>
914
<div
1015
#inputElement
1116
[tabindex]="disabled ? -1 : 0"
@@ -47,6 +52,22 @@
4752
</div>
4853
</div>
4954

55+
<ng-container *ngIf="appendBox; then dropdownCDK; else dropdownDefault"> </ng-container>
56+
57+
<ng-template #dropdownDefault>
58+
<ng-container *ngTemplateOutlet="dropdownListbox"> </ng-container>
59+
</ng-template>
60+
61+
<ng-template #dropdownCDK>
62+
<ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]="trigger" [cdkConnectedOverlayOpen]="true">
63+
<ng-container *ngTemplateOutlet="dropdownListbox"></ng-container>
64+
</ng-template>
65+
</ng-template>
66+
67+
<po-field-container-bottom [p-help]="help" [p-disabled]="disabled"></po-field-container-bottom>
68+
</po-field-container>
69+
70+
<ng-template #dropdownListbox>
5071
<po-multiselect-dropdown
5172
#dropdownElement
5273
[p-searching]="isServerSearching"
@@ -65,6 +86,4 @@
6586
(p-close-dropdown)="controlDropdownVisibility(false)"
6687
>
6788
</po-multiselect-dropdown>
68-
69-
<po-field-container-bottom [p-help]="help" [p-disabled]="disabled"></po-field-container-bottom>
70-
</po-field-container>
89+
</ng-template>

projects/ui/src/lib/components/po-field/po-multiselect/po-multiselect.component.spec.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ComponentFixture, fakeAsync, flush, TestBed } from '@angular/core/testi
22
import { HttpClient, HttpHandler } from '@angular/common/http';
33
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
44
import { Observable, of, throwError } from 'rxjs';
5+
import { OverlayModule } from '@angular/cdk/overlay';
56

67
import * as UtilsFunction from '../../../utils/util';
78

@@ -37,7 +38,7 @@ describe('PoMultiselectComponent:', () => {
3738

3839
beforeEach(async () => {
3940
await TestBed.configureTestingModule({
40-
imports: [HttpClientTestingModule],
41+
imports: [HttpClientTestingModule, OverlayModule],
4142
declarations: [
4243
PoDisclaimerComponent,
4344
PoFieldContainerComponent,
@@ -71,6 +72,7 @@ describe('PoMultiselectComponent:', () => {
7172
});
7273

7374
it('should call function wasClickedOnToggle', () => {
75+
fixture.detectChanges();
7476
component.openDropdown(true);
7577
const documentBody = document.body;
7678
const event = document.createEvent('MouseEvents');
@@ -232,15 +234,15 @@ describe('PoMultiselectComponent:', () => {
232234
{ label: 'label2', value: 2 }
233235
];
234236
component.selectedOptions = [{ label: 'label2', value: 2 }];
235-
237+
fixture.detectChanges();
236238
spyOn(component.dropdown, 'scrollTo');
237239
component.scrollToSelectedOptions();
238240
expect(component.dropdown.scrollTo).toHaveBeenCalledWith(1);
239241
});
240242

241243
it('shouldn`t call dropdown.scrollTo', () => {
242244
component.selectedOptions = [];
243-
245+
fixture.detectChanges();
244246
spyOn(component.dropdown, 'scrollTo');
245247
component.scrollToSelectedOptions();
246248
expect(component.dropdown.scrollTo).not.toHaveBeenCalled();
@@ -268,7 +270,7 @@ describe('PoMultiselectComponent:', () => {
268270

269271
it('should call controlDropdownVisibility in wasClickedOnToggle', () => {
270272
component.dropdownOpen = true;
271-
273+
fixture.detectChanges();
272274
const event = document.createEvent('MouseEvents');
273275
event.initEvent('click', false, true);
274276

@@ -765,7 +767,7 @@ describe('PoMultiselectComponent:', () => {
765767
call 'dropdown.controlVisibility' with 'false', 'setVisibleOptionsDropdown' with 'options' and 'removeListeners'.`, () => {
766768
component.dropdownIcon = undefined;
767769
component.dropdownOpen = undefined;
768-
770+
fixture.detectChanges();
769771
const controlVisibilitySpy = spyOn(component.dropdown, 'controlVisibility');
770772
const setVisibleOptionsDropdownSpy = spyOn(component, 'setVisibleOptionsDropdown');
771773
const removeListenersSpy = spyOn(component, <any>'removeListeners');
@@ -834,7 +836,7 @@ describe('PoMultiselectComponent:', () => {
834836
'initializeListeners', 'scrollToSelectedOptions', 'changeDetector.detectChanges' and 'setPositionDropdown'.`, () => {
835837
component.dropdownIcon = undefined;
836838
component.dropdownOpen = undefined;
837-
839+
fixture.detectChanges();
838840
const controlVisibilitySpy = spyOn(component.dropdown, 'controlVisibility');
839841
const setVisibleOptionsDropdownSpy = spyOn(component, 'setVisibleOptionsDropdown');
840842
const initializeListenersSpy = spyOn(component, <any>'initializeListeners');
@@ -873,7 +875,7 @@ describe('PoMultiselectComponent:', () => {
873875
const customPositions = ['top', 'bottom'];
874876
const isSetElementWidth = true;
875877
const poMultiselectContainerOffset = 8;
876-
878+
fixture.detectChanges();
877879
const setElementsSpy = spyOn(component['controlPosition'], 'setElements');
878880
const adjustContainerPositionSpy = spyOn(component, <any>'adjustContainerPosition');
879881

@@ -1025,7 +1027,7 @@ describe('PoMultiselectComponent:', () => {
10251027
const wasClickedOnToggleSpy = spyOn(component, 'wasClickedOnToggle');
10261028

10271029
clickOutEvent();
1028-
1030+
fixture.detectChanges();
10291031
expect(wasClickedOnToggleSpy).not.toHaveBeenCalled();
10301032

10311033
component['open']();
@@ -1052,6 +1054,7 @@ describe('PoMultiselectComponent:', () => {
10521054
});
10531055

10541056
it(`open: should call 'wasClickedOnToggle' if dropdown list is opened and click window.`, () => {
1057+
fixture.detectChanges();
10551058
const wasClickedOnToggleSpy = spyOn(component, 'wasClickedOnToggle');
10561059

10571060
component['open']();
@@ -1061,15 +1064,17 @@ describe('PoMultiselectComponent:', () => {
10611064
});
10621065

10631066
it(`open: should call 'updateVisibleItems' if dropdown list is opened and resize window.`, () => {
1064-
const updateVisibleItemsSpy = spyOn(component, 'updateVisibleItems');
1067+
fixture.detectChanges();
10651068

1069+
const updateVisibleItemsSpy = spyOn(component, 'updateVisibleItems');
10661070
component['open']();
10671071
newEvent('resize');
10681072

10691073
expect(updateVisibleItemsSpy).toHaveBeenCalled();
10701074
});
10711075

10721076
it(`open: should call 'adjustContainerPosition' if dropdown list is opened and scroll window.`, () => {
1077+
fixture.detectChanges();
10731078
const adjustContainerPositionSpy = spyOn(component, <any>'adjustContainerPosition');
10741079

10751080
component['open']();

projects/ui/src/lib/components/po-field/po-multiselect/po-multiselect.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ export class PoMultiselectComponent
103103
@ContentChild(PoMultiselectOptionTemplateDirective, { static: true })
104104
multiselectOptionTemplate: PoMultiselectOptionTemplateDirective;
105105

106-
@ViewChild('dropdownElement', { read: ElementRef, static: true }) dropdownElement: ElementRef;
107-
@ViewChild('dropdownElement', { static: true }) dropdown;
106+
@ViewChild('dropdownElement', { read: ElementRef }) dropdownElement: ElementRef;
107+
@ViewChild('dropdownElement') dropdown;
108108
@ViewChild('iconElement', { read: ElementRef, static: true }) iconElement: ElementRef;
109109
@ViewChild('inputElement', { read: ElementRef, static: true }) inputElement: ElementRef;
110110

0 commit comments

Comments
 (0)