Skip to content

Commit ff2e0f6

Browse files
MKirovaMKirova
authored andcommitted
Merge branch 'mkirova/row-pinning-base' of https://github.com/IgniteUI/igniteui-angular.git
2 parents fb738e4 + a848917 commit ff2e0f6

File tree

11 files changed

+135
-84
lines changed

11 files changed

+135
-84
lines changed

projects/igniteui-angular/src/lib/core/styles/components/grid/_excel-filtering-theme.scss

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,18 @@
1616

1717
%grid-excel-filter {
1818
display: block;
19-
}
20-
21-
%grid-excel-filter--inline {
2219
width: 100%;
20+
height: 100%;
2321
flex-grow: 1;
22+
box-shadow: igx-elevation($elevations, 12);
2423
overflow: auto;
24+
}
25+
26+
%grid-excel-filter--inline {
27+
box-shadow: none;
2528

2629
%grid-excel-menu {
27-
display: flex;
28-
flex-direction: column;
2930
width: 100%;
30-
height: 100%;
31-
box-shadow: none;
32-
33-
%grid-excel-main {
34-
display: flex;
35-
flex-direction: column;
36-
flex-grow: 1;
37-
overflow: hidden;
38-
}
39-
40-
%grid-excel-main igx-list {
41-
flex-grow: 1;
42-
overflow: hidden;
43-
}
4431
}
4532
}
4633

@@ -67,10 +54,12 @@
6754
}
6855

6956
%grid-excel-menu {
57+
display: flex;
58+
flex-direction: column;
59+
height: 100%;
7060
width: 320px;
7161
min-width: 320px;
7262
background: --var($theme, 'filtering-row-background');
73-
box-shadow: igx-elevation($elevations, 12);
7463
border-radius: 4px;
7564

7665
@include igx-button-group(igx-button-group-theme(
@@ -227,10 +216,15 @@
227216
}
228217

229218
%grid-excel-main {
230-
display: block;
219+
display: flex;
220+
flex-direction: column;
221+
flex-grow: 1;
222+
overflow: hidden;
231223
padding: 0 rem(16px);
232224

233225
igx-list {
226+
flex-grow: 1;
227+
overflow: hidden;
234228
margin: rem(8px) -#{rem(16px)} 0;
235229
border: 0;
236230
border-top: 1px dashed igx-color($palette, 'grays', 300);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { AutoPositionStrategy } from '../../../services/overlay/position/auto-position-strategy';
2+
import { ConnectedFit } from '../../../services/overlay/utilities';
3+
4+
/** @hidden */
5+
export class ExcelStylePositionStrategy extends AutoPositionStrategy {
6+
protected shouldFitInViewPort(connectedFit: ConnectedFit) {
7+
return true;
8+
}
9+
10+
protected fitInViewport(element: HTMLElement, connectedFit: ConnectedFit) {
11+
const heightOverflow = connectedFit.contentElementRect.height - connectedFit.viewPortRect.height;
12+
if (heightOverflow > 0) {
13+
element.style.width = 'auto';
14+
element.style.height = `${connectedFit.viewPortRect.height}px`;
15+
} else {
16+
element.style.height = `${Math.max(
17+
connectedFit.viewPortRect.height - connectedFit.targetRect.bottom - 1,
18+
connectedFit.contentElementRect.height)}px`;
19+
}
20+
21+
super.fitInViewport(element, connectedFit);
22+
}
23+
}

projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-search.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
</igx-icon>
2020
</igx-input-group>
2121

22-
<igx-list #list [displayDensity]="displayDensity" [style.height.px]="listSize" [isLoading]="isLoading">
22+
<igx-list #list [displayDensity]="displayDensity" [isLoading]="isLoading">
2323
<div [style.overflow]="'hidden'" [style.position]="'relative'">
2424
<igx-list-item
2525
*igxFor="let item of data | excelStyleSearchFilter: searchValue; scrollOrientation : 'vertical'; containerSize: containerSize; itemSize: itemSize">

projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-search.component.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ import { IgxForOfDirective } from '../../../directives/for-of/for_of.directive';
1616
import { FilterListItem } from './grid.excel-style-filtering.component';
1717
import { IgxListComponent } from '../../../list';
1818

19-
const SEARCH_LIST_HEIGHT = 250;
20-
2119
@Directive({
2220
selector: '[igxExcelStyleLoading]'
2321
})
@@ -134,11 +132,7 @@ export class IgxExcelStyleSearchComponent implements AfterViewInit {
134132
return itemSize;
135133
}
136134

137-
public get listSize() {
138-
return this.inline ? null : SEARCH_LIST_HEIGHT;
139-
}
140-
141135
public get containerSize() {
142-
return this.inline ? this.list.element.nativeElement.offsetHeight : SEARCH_LIST_HEIGHT;
136+
return this.list.element.nativeElement.offsetHeight;
143137
}
144138
}

projects/igniteui-angular/src/lib/grids/filtering/excel-style/grid.excel-style-filtering.component.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@
5252
'igx-excel-filter__menu--compact': grid.displayDensity === 'compact'
5353
}"
5454
[id]="overlayComponentId"
55-
(keydown)="onKeyDown($event)">
55+
(keydown)="onKeyDown($event)"
56+
[style.min-height]="minHeight"
57+
[style.max-height]="maxHeight">
5658

5759
<header class="igx-excel-filter__menu-header">
5860
<h4>{{ column.header || column.field }}</h4>
@@ -136,7 +138,7 @@ <h4>{{ column.header || column.field }}</h4>
136138
</footer>
137139
</article>
138140

139-
<igx-drop-down
141+
<igx-drop-down
140142
*ngIf="column"
141143
#subMenu
142144
[maxHeight]="'397px'"

projects/igniteui-angular/src/lib/grids/filtering/excel-style/grid.excel-style-filtering.component.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import { takeUntil } from 'rxjs/operators';
3939
import { ISelectionEventArgs, IgxDropDownComponent } from '../../../drop-down';
4040
import { IgxColumnComponent } from '../../columns/column.component';
4141
import { IgxGridBaseDirective } from '../../grid-base.directive';
42+
import { DisplayDensity } from '../../../core/density';
4243

4344
/**
4445
*@hidden
@@ -202,6 +203,36 @@ export class IgxGridExcelStyleFilteringComponent implements OnDestroy {
202203
scrollStrategy: new AbsoluteScrollStrategy()
203204
};
204205

206+
/**
207+
* @hidden @internal
208+
*/
209+
get minHeight() {
210+
if (!this.inline) {
211+
let minHeight = 600;
212+
switch (this.grid.displayDensity) {
213+
case DisplayDensity.cosy: minHeight = 465; break;
214+
case DisplayDensity.compact: minHeight = 330; break;
215+
default: break;
216+
}
217+
return `${minHeight}px`;
218+
}
219+
}
220+
221+
/**
222+
* @hidden @internal
223+
*/
224+
@HostBinding('style.max-height') get maxHeight() {
225+
if (!this.inline) {
226+
let maxHeight = 730;
227+
switch (this.grid.displayDensity) {
228+
case DisplayDensity.cosy: maxHeight = 565; break;
229+
case DisplayDensity.compact: maxHeight = 405; break;
230+
default: break;
231+
}
232+
return `${maxHeight}px`;
233+
}
234+
}
235+
205236
/**
206237
* @hidden @internal
207238
*/

projects/igniteui-angular/src/lib/grids/grid/grid-filtering-ui.spec.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2671,7 +2671,7 @@ describe('IgxGrid - Filtering actions - Excel style filtering #grid', () => {
26712671
const excelMenu = GridFunctions.getExcelStyleFilteringComponent(fix);
26722672
const checkbox: any[] = Array.from(GridFunctions.getExcelStyleFilteringCheckboxes(fix, excelMenu));
26732673

2674-
expect(checkbox.map(c => c.checked)).toEqual([false, false, false, false, false, false, false, false]);
2674+
expect(checkbox.map(c => c.checked)).toEqual([false, false, false, false, false, false, false ]);
26752675
}));
26762676

26772677
it('Should not select values in list if two values with Or operator are entered and contains operand.', fakeAsync(() => {
@@ -2713,8 +2713,8 @@ describe('IgxGrid - Filtering actions - Excel style filtering #grid', () => {
27132713
const excelMenu = GridFunctions.getExcelStyleFilteringComponent(fix);
27142714
const checkbox: any[] = Array.from(GridFunctions.getExcelStyleFilteringCheckboxes(fix, excelMenu));
27152715

2716-
expect(checkbox.map(c => c.checked)).toEqual([true, false, false, true, false, false, true, false]);
2717-
expect(checkbox.map(c => c.indeterminate)).toEqual([true, false, false, false, false, false, false, false]);
2716+
expect(checkbox.map(c => c.checked)).toEqual([true, false, false, true, false, false, true]);
2717+
expect(checkbox.map(c => c.indeterminate)).toEqual([true, false, false, false, false, false, false]);
27182718
}));
27192719

27202720
it('Should change filter when changing And/Or operator.', fakeAsync(() => {
@@ -3411,15 +3411,15 @@ describe('IgxGrid - Filtering actions - Excel style filtering #grid', () => {
34113411
fix.detectChanges();
34123412

34133413
// Verify scrollbar's scrollTop.
3414-
expect(scrollbar.scrollTop >= 610 && scrollbar.scrollTop <= 615).toBe(true,
3414+
expect(scrollbar.scrollTop >= 680 && scrollbar.scrollTop <= 690).toBe(true,
34153415
'search scrollbar has incorrect scrollTop');
34163416
// Verify display container height.
34173417
const displayContainer = searchComponent.querySelector('igx-display-container');
34183418
const displayContainerRect = displayContainer.getBoundingClientRect();
3419-
expect(displayContainerRect.height).toBe(288, 'incorrect search display container height');
3419+
expect(displayContainerRect.height).toBe(216, 'incorrect search display container height');
34203420
// Verify rendered list items count.
34213421
const listItems = displayContainer.querySelectorAll('igx-list-item');
3422-
expect(listItems.length).toBe(12, 'incorrect rendered list items count');
3422+
expect(listItems.length).toBe(9, 'incorrect rendered list items count');
34233423
}));
34243424

34253425
it('should correctly display all items in search list after filtering it', (async () => {
@@ -3691,8 +3691,8 @@ describe('IgxGrid - Filtering actions - Excel style filtering #grid', () => {
36913691
fix.detectChanges();
36923692

36933693
verifyExcelStyleFilterAvailableOptions(fix,
3694-
['Select All', '(Blanks)', '0', '20', '100', '127', '254', '702'],
3695-
[true, true, true, true, true, true, true, true]);
3694+
['Select All', '(Blanks)', '0', '20', '100', '127', '254'],
3695+
[true, true, true, true, true, true, true]);
36963696

36973697
GridFunctions.clickExcelFilterIcon(fix, 'ProductName');
36983698
tick(100);

projects/igniteui-angular/src/lib/grids/headers/grid-header.component.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ElasticPositionStrategy } from './../../services/overlay/position/elastic-position-strategy';
12
import {
23
ChangeDetectionStrategy,
34
ChangeDetectorRef,
@@ -23,13 +24,13 @@ import { IgxColumnResizingService } from '../resizing/resizing.service';
2324
import { IgxOverlayService } from '../../services/overlay/overlay';
2425
import { IgxGridExcelStyleFilteringComponent } from '../filtering/excel-style/grid.excel-style-filtering.component';
2526
import { OverlaySettings, PositionSettings, VerticalAlignment } from '../../services/overlay/utilities';
26-
import { AutoPositionStrategy } from '../../services/overlay/position/auto-position-strategy';
2727
import { useAnimation } from '@angular/animations';
2828
import { filter, takeUntil } from 'rxjs/operators';
2929
import { Subject } from 'rxjs';
3030
import { fadeIn, fadeOut } from '../../animations/main';
3131
import { AbsoluteScrollStrategy } from '../../services/overlay/scroll/absolute-scroll-strategy';
3232
import { GridType } from '../common/grid.interface';
33+
import { ExcelStylePositionStrategy } from '../filtering/excel-style/excel-style-position-strategy';
3334

3435
/**
3536
* @hidden
@@ -233,7 +234,7 @@ export class IgxGridHeaderComponent implements DoCheck, OnInit, OnDestroy {
233234
this._filterMenuOverlaySettings = {
234235
closeOnOutsideClick: true,
235236
modal: false,
236-
positionStrategy: new AutoPositionStrategy(this._filterMenuPositionSettings),
237+
positionStrategy: new ExcelStylePositionStrategy(this._filterMenuPositionSettings),
237238
scrollStrategy: new AbsoluteScrollStrategy()
238239
};
239240

projects/igniteui-angular/src/lib/services/overlay/position/base-fit-position-strategy.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ export abstract class BaseFitPositionStrategy extends ConnectedPositioningStrate
1616
this.settings = Object.assign({}, this._initialSettings);
1717
connectedFit.viewPortRect = Util.getViewportRect(document);
1818
this.updateViewPortFit(connectedFit);
19-
if (connectedFit.fitHorizontal.back < 0 || connectedFit.fitHorizontal.forward < 0 ||
20-
connectedFit.fitVertical.back < 0 || connectedFit.fitVertical.forward < 0) {
19+
if (this.shouldFitInViewPort(connectedFit)) {
2120
this.fitInViewport(contentElement, connectedFit);
2221
}
2322
}
@@ -83,6 +82,15 @@ export abstract class BaseFitPositionStrategy extends ConnectedPositioningStrate
8382
return targetRect.bottom + targetRect.height * startPoint + elementRect.height * direction + offset;
8483
}
8584

85+
/**
86+
* Returns whether the element should fit in viewport
87+
* @param connectedFit connectedFit object containing all necessary parameters
88+
*/
89+
protected shouldFitInViewPort(connectedFit: ConnectedFit) {
90+
return connectedFit.fitHorizontal.back < 0 || connectedFit.fitHorizontal.forward < 0 ||
91+
connectedFit.fitVertical.back < 0 || connectedFit.fitVertical.forward < 0;
92+
}
93+
8694
/**
8795
* Fits the element into viewport according to the position settings
8896
* @param element element to fit in viewport
@@ -92,5 +100,3 @@ export abstract class BaseFitPositionStrategy extends ConnectedPositioningStrate
92100
element: HTMLElement,
93101
connectedFit: ConnectedFit);
94102
}
95-
96-

src/app/grid-filtering/grid-filtering.sample.html

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Demonstrates grid's filtering functionality.
44
</app-page-header>
55

6-
6+
77

88
<div class="sample-content">
99
<div class="sample-column">
@@ -18,17 +18,18 @@
1818
[allowFiltering]="true"
1919
[filterMode]="'excelStyleFilter'"
2020
[allowAdvancedFiltering]="true"
21+
[advancedFilteringExpressionsTree]="advancedFilteringTree"
2122
[rowSelectable]="true"
2223
[paging]="false"
2324
[width]="'980px'"
24-
[height]="'600px'"
25+
[height]="'600px'"
2526
[showToolbar]="true"
26-
[columnHiding]="true"
27+
[columnHiding]="true"
2728
[columnPinning]="true"
28-
[exportExcel]="true"
29-
[exportCsv]="true"
29+
[exportExcel]="true"
30+
[exportCsv]="true"
3031
exportText="Export"
31-
exportExcelText="Export to Excel"
32+
exportExcelText="Export to Excel"
3233
exportCsvText="Export to CSV">
3334
<igx-column *ngFor="let c of columns" [field]="c.field"
3435
[header]="c.header"

0 commit comments

Comments
 (0)