Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(grid): fix column resize line positioning and column resizing for scaled grid - master #15208

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { IgxAvatarComponent } from '../../avatar/avatar.component';
import { IColumnResizeEventArgs, IgxColumnComponent } from '../public_api';
import { Size } from "../common/enums";
import { setElementSize } from '../../test-utils/helper-utils.spec';
import { IgxColumnResizerDirective } from '../resizing/resizer.directive';

describe('IgxGrid - Deferred Column Resizing #grid', () => {

Expand Down Expand Up @@ -133,6 +134,27 @@ describe('IgxGrid - Deferred Column Resizing #grid', () => {
expect(grid.columnList.get(1).width).toEqual('70px');
}));

it('should calculate correctly resizer position and column width when grid is scaled and zoomed', fakeAsync(() => {
grid.nativeElement.style.transform = 'scale(1.2)';
grid.nativeElement.style.setProperty('zoom', '1.05');
fixture.detectChanges();
headerResArea = GridFunctions.getHeaderResizeArea(headers[1]).nativeElement;
UIInteractions.simulateMouseEvent('mousedown', headerResArea, 153, 0);
tick(200);
fixture.detectChanges();

const resizer = GridFunctions.getResizer(fixture);
const resizerDirective = resizer.componentInstance.resizer as IgxColumnResizerDirective;
const leftSetterSpy = spyOnProperty(resizerDirective, 'left', 'set').and.callThrough();
UIInteractions.simulateMouseEvent('mousemove', resizer.nativeElement, 200, 5);
UIInteractions.simulateMouseEvent('mouseup', resizer.nativeElement, 200, 5);
fixture.detectChanges();

expect(leftSetterSpy).toHaveBeenCalled();
expect(parseInt(leftSetterSpy.calls.mostRecent().args[0].toFixed(0))).toEqual(200);
expect(parseInt(grid.columnList.get(1).headerCell.nativeElement.getBoundingClientRect().width.toFixed(0))).toEqual(173);
}));

it('should be able to resize column to the minWidth < defaultMinWidth', fakeAsync(() => {
const column = grid.getColumnByName('ID');
column.minWidth = 'a';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
[restrictHResizeMax]="colResizingService.restrictResizeMax"
[restrictHResizeMin]="colResizingService.restrictResizeMin"
[restrictResizerTop]="restrictResizerTop"
(resizeEnd)="colResizingService.resizeColumn($event)">
(resizeEnd)="colResizingService.resizeColumn($event, resizer.ratio)">
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,13 @@ export class IgxColumnResizerDirective implements OnInit, OnDestroy {
@Output() public resize = new Subject<any>();

private _left: number;
private _ratio: number = 1;
private _destroy = new Subject<boolean>();

public get ratio(): number {
return this._ratio;
}

constructor(
public element: ElementRef<HTMLElement>,
@Inject(DOCUMENT) public document,
Expand All @@ -56,7 +61,7 @@ export class IgxColumnResizerDirective implements OnInit, OnDestroy {
.pipe(
takeUntil(this._destroy),
takeUntil<MouseEvent>(this.resizeEnd),
map((event) => event.clientX - offset),
map((event) => (event.clientX - offset) / (this._ratio)),
))
)
.subscribe((pos) => {
Expand Down Expand Up @@ -113,8 +118,12 @@ export class IgxColumnResizerDirective implements OnInit, OnDestroy {
public onMousedown(event: MouseEvent) {
event.preventDefault();
const parent = this.element.nativeElement.parentElement.parentElement;

this.left = this._left = event.clientX - parent.getBoundingClientRect().left;
const parentRectWidth = parent.getBoundingClientRect().width;
const parentComputedWidth = parseFloat(window.getComputedStyle(parent).width);
if (Math.abs(parentRectWidth - parentComputedWidth) > 1) {
this._ratio = parentRectWidth / parentComputedWidth;
}
this.left = this._left = (event.clientX - parent.getBoundingClientRect().left) / this._ratio;
this.top = (event.target as HTMLElement).getBoundingClientRect().top - parent.getBoundingClientRect().top;

this.resizeStart.next(event);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class IgxColumnResizingService {
* @hidden
*/
public getColumnHeaderRenderedWidth() {
return this.column.headerCell.nativeElement.getBoundingClientRect().width;
return parseFloat(window.getComputedStyle(this.column.headerCell.nativeElement).width);
}

/**
Expand Down Expand Up @@ -101,9 +101,9 @@ export class IgxColumnResizingService {
/**
* Resizes the column regaridng to the column minWidth and maxWidth.
*/
public resizeColumn(event: MouseEvent) {
public resizeColumn(event: MouseEvent, ratio: number = 1) {
this.showResizer = false;
const diff = event.clientX - this.startResizePos;
const diff = (event.clientX - this.startResizePos) / ratio;

const colWidth = this.column.width;
const isPercentageWidth = colWidth && typeof colWidth === 'string' && colWidth.indexOf('%') !== -1;
Expand Down
Loading