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 - 19.0.x #15060

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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