diff --git a/CHANGELOG.md b/CHANGELOG.md index 850637d75b5..5175d114b53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,9 @@ All notable changes for each version of this project will be documented in this - The `igx-drop-down-item` now allows for `igxPrefix`, `igxSuffix` and `igx-divider` directives to be passed as `ng-content` and they will be renderer accordingly in the item's content. - `IgxGrid` - Added support for exporting grouped data. + - `onPagingDone` output is removed. Use the `paging` and `pagingDone` outputs exposed by the `IgxPaginator`. +- `IgxPaginator` + - `paging` and `pagingDone` events are now emitted. - `IgxInput` now supports `type="file"` and its styling upon all themes. _Note: validation of file type input is not yet supported._ @@ -57,6 +60,8 @@ All notable changes for each version of this project will be documented in this - `IgxGrid`, `IgxHierarchicalGrid`, `IgxTreeGrid` - Added new property `selectRowOnClick` that determines whether clicking over a row will change its selection state or not. Set to `true` by default. - `GridPagingMode` enum members rename - `local` to `Local` and `remote` to `Remote`. Example: `GridPagingMode.Local`. + - **Breaking Change**: + - The grids deprecate the `page` and `perPage` properties, also the `onPagingDone` output. Use the corresponding `IgxPaginator` otuputs/inputs.. ## 11.0.4 diff --git a/projects/igniteui-angular/src/lib/grids/common/events.ts b/projects/igniteui-angular/src/lib/grids/common/events.ts index 822ffefe354..b01640c8b90 100644 --- a/projects/igniteui-angular/src/lib/grids/common/events.ts +++ b/projects/igniteui-angular/src/lib/grids/common/events.ts @@ -70,14 +70,6 @@ export interface IPinColumnEventArgs extends IBaseEventArgs { export interface IPinColumnCancellableEventArgs extends IPinColumnEventArgs, CancelableEventArgs { } -/** - * The event arguments after a page is changed. - */ -export interface IPageEventArgs extends IBaseEventArgs { - previous: number; - current: number; -} - export interface IRowDataEventArgs extends IBaseEventArgs { data: any; } diff --git a/projects/igniteui-angular/src/lib/grids/grid-base.directive.ts b/projects/igniteui-angular/src/lib/grids/grid-base.directive.ts index 003e5307eb5..389b4bb0d2b 100644 --- a/projects/igniteui-angular/src/lib/grids/grid-base.directive.ts +++ b/projects/igniteui-angular/src/lib/grids/grid-base.directive.ts @@ -117,7 +117,6 @@ import { IRowSelectionEventArgs, IPinColumnEventArgs, IGridEditEventArgs, - IPageEventArgs, IRowDataEventArgs, IColumnResizeEventArgs, IColumnMovingStartEventArgs, @@ -140,8 +139,7 @@ import { IFilteringEventArgs, IColumnVisibilityChangedEventArgs, IColumnVisibilityChangingEventArgs, - IPinColumnCancellableEventArgs, - IColumnResizingEventArgs + IPinColumnCancellableEventArgs } from './common/events'; import { IgxAdvancedFilteringDialogComponent } from './filtering/advanced-filtering/advanced-filtering-dialog.component'; import { GridType } from './common/grid.interface'; @@ -155,7 +153,7 @@ import { IgxGridExcelStyleFilteringComponent } from './filtering/excel-style/gri import { IgxSnackbarComponent } from '../snackbar/snackbar.component'; import { v4 as uuidv4 } from 'uuid'; import { IgxActionStripComponent } from '../action-strip/action-strip.component'; -import { DeprecateProperty } from '../core/deprecateDecorators'; +import { DeprecateMethod, DeprecateProperty } from '../core/deprecateDecorators'; let FAKE_ROW_ID = -1; @@ -292,6 +290,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements public onScroll = new EventEmitter(); /** + * @deprecated Use `IgxPaginator` corresponding output instead. * Emitted after the current page is changed. * * @example @@ -304,10 +303,12 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements * } * ``` */ + @DeprecateProperty('Use the corresponding output exposed by the `igx-paginator`.') @Output() public pageChange = new EventEmitter(); /** + * @deprecated Use `IgxPaginator` corresponding output instead. * Emitted when `perPage` property value of the grid is changed. * * @example @@ -320,6 +321,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements * } * ``` */ + @DeprecateProperty('Use the corresponding output exposed by the `igx-paginator`.') @Output() public perPageChange = new EventEmitter(); @@ -669,19 +671,6 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements @Output() public onFilteringDone = new EventEmitter(); - /** - * Emitted after paging is performed. - * - * @remarks - * Returns an object consisting of the previous and next pages. - * @example - * ```html - * - * ``` - */ - @Output() - public onPagingDone = new EventEmitter(); - /** * Emitted when a row added through the API. * @@ -1451,7 +1440,6 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements return; } this.selectionService.clear(true); - this.onPagingDone.emit({ previous: this._page, current: val }); this._page = val; this.pageChange.emit(this._page); this.navigateTo(0); @@ -1480,7 +1468,11 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements this.selectionService.clear(true); this._perPage = val; this.perPageChange.emit(this._perPage); - this.page = 0; + + if (this.totalPages !== 0 && this._page >= this.totalPages) { + this.page = this.totalPages - 1; + } + this.endEdit(true); this.notifyChanges(); } @@ -2936,6 +2928,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements public abstract id: string; abstract data: any[]; abstract filteredData: any[]; + /** * Returns an array containing the filtered sorted data. * @@ -3070,6 +3063,53 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements this.cdr.detach(); } + /** + * @deprecated Use `IgxPaginator` corresponding method instead. + * Goes to the desired page index. + * + * @example + * ```typescript + * this.grid1.paginate(1); + * ``` + * @param val + */ + @DeprecateProperty('Use the corresponding method exposed by the `igx-paginator`.') + public paginate(val: number): void { + if (val < 0 || val > this.totalPages - 1) { + return; + } + + this.page = val; + } + + /** + * @deprecated Use `IgxPaginator` corresponding method instead. + * Goes to the next page, if the grid is not already at the last page. + * + * @example + * ```typescript + * this.grid1.nextPage(); + * ``` + */ + @DeprecateProperty('Use the corresponding method exposed by the `igx-paginator`.') + public nextPage(): void { + this.paginate(this._page + 1); + } + + /** + * @deprecated Use `IgxPaginator` corresponding methods instead. + * Goes to the previous page, if the grid is not already at the first page. + * + * @example + * ```typescript + * this.grid1.previousPage(); + * ``` + */ + @DeprecateProperty('Use the corresponding method exposed by the `igx-paginator`.') + public previousPage(): void { + this.paginate(this._page - 1); + } + /** * @hidden * @internal @@ -3290,11 +3330,6 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements }); }); - this.onPagingDone.pipe(destructor).subscribe(() => { - this.endEdit(true); - this.selectionService.clear(true); - }); - this.onColumnMoving.pipe(destructor).subscribe(() => this.endEdit(true)); this.onColumnResized.pipe(destructor).subscribe(() => this.endEdit(true)); @@ -3370,6 +3405,12 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements }); } + /** @hidden @internal */ + public _pagingDone() { + this.endEdit(true); + this.selectionService.clear(true); + } + /** * @hidden */ @@ -3794,7 +3835,6 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements this._userOutletDirective = val; } - /** * Gets the default row height. * @@ -4101,6 +4141,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements } /** + * @deprecated Use `IgxPaginator` corresponding method instead. * Gets the total number of pages. * * @example @@ -4108,14 +4149,16 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements * const totalPages = this.grid.totalPages; * ``` */ + @DeprecateProperty('Use the corresponding method exposed by the `igx-paginator`.') public get totalPages(): number { if (this.pagingState) { return this.pagingState.metadata.countPages; } - return this._totalRecords >= 0 ? Math.ceil(this._totalRecords / this.perPage) : -1; + return this._totalRecords >= 0 ? Math.ceil(this._totalRecords / this._perPage) : -1; } /** + * @deprecated Use `IgxPaginator` corresponding method instead. * Gets if the current page is the first page. * * @example @@ -4123,36 +4166,9 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements * const firstPage = this.grid.isFirstPage; * ``` */ + @DeprecateProperty('Use the corresponding method exposed by the `igx-paginator`.') public get isFirstPage(): boolean { - return this.page === 0; - } - - /** - * Goes to the next page, if the grid is not already at the last page. - * - * @example - * ```typescript - * this.grid1.nextPage(); - * ``` - */ - public nextPage(): void { - if (!this.isLastPage) { - this.page += 1; - } - } - - /** - * Goes to the previous page, if the grid is not already at the first page. - * - * @example - * ```typescript - * this.grid1.previousPage(); - * ``` - */ - public previousPage(): void { - if (!this.isFirstPage) { - this.page -= 1; - } + return this._page === 0; } /** @@ -4179,6 +4195,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements } /** + * @deprecated * Returns if the current page is the last page. * * @example @@ -4186,8 +4203,9 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements * const lastPage = this.grid.isLastPage; * ``` */ + @DeprecateMethod('Use the corresponding method exposed by the `igx-paginator`.') public get isLastPage(): boolean { - return this.page + 1 >= this.totalPages; + return this._page + 1 >= this.totalPages; } /** @@ -4284,23 +4302,6 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements this._columnsReordered(column, target); } - /** - * Goes to the desired page index. - * - * @example - * ```typescript - * this.grid1.paginate(1); - * ``` - * @param val - */ - public paginate(val: number): void { - if (val < 0 || val > this.totalPages - 1) { - return; - } - - this.page = val; - } - /** * Manually marks the `IgxGridComponent` for change detection. * @@ -6729,7 +6730,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements // eslint-disable-next-line prefer-const for (let [row, set] of selectionMap) { - row = this.paging ? row + (this.perPage * this.page) : row; + row = this.paging ? row + (this._perPage * this._page) : row; row = isRemote ? row - this.virtualizationState.startIndex : row; if (!source[row] || source[row].detailsData !== undefined) { continue; @@ -6845,7 +6846,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements const rowIndex = inCollection.indexOf(row); const page = Math.floor(rowIndex / this.perPage); - if (this.page !== page) { + if (this._page !== page) { delayScrolling = true; this.page = page; } diff --git a/projects/igniteui-angular/src/lib/grids/grid/grid.component.html b/projects/igniteui-angular/src/lib/grids/grid/grid.component.html index 78fe5828255..ee73a8b1f0f 100644 --- a/projects/igniteui-angular/src/lib/grids/grid/grid.component.html +++ b/projects/igniteui-angular/src/lib/grids/grid/grid.component.html @@ -243,7 +243,7 @@ - + diff --git a/projects/igniteui-angular/src/lib/grids/grid/grid.pagination.spec.ts b/projects/igniteui-angular/src/lib/grids/grid/grid.pagination.spec.ts index 7f1a0b4df1e..ff411e58284 100644 --- a/projects/igniteui-angular/src/lib/grids/grid/grid.pagination.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/grid/grid.pagination.spec.ts @@ -84,19 +84,16 @@ describe('IgxGrid - Grid Paging #grid', () => { it('should paginate data API', () => { // Goto page 3 through API and listen for event - spyOn(grid.onPagingDone, 'emit'); grid.paginate(2); fix.detectChanges(); - expect(grid.onPagingDone.emit).toHaveBeenCalled(); verifyGridPager(fix, 3, '7', '3\xA0of\xA04', []); // Go to next page grid.nextPage(); fix.detectChanges(); - expect(grid.onPagingDone.emit).toHaveBeenCalledTimes(2); expect(grid.isLastPage).toBe(true); verifyGridPager(fix, 1, '10', '4\xA0of\xA04', []); @@ -105,14 +102,12 @@ describe('IgxGrid - Grid Paging #grid', () => { fix.detectChanges(); expect(grid.isLastPage).toBe(true); - expect(grid.onPagingDone.emit).toHaveBeenCalledTimes(2); verifyGridPager(fix, 1, '10', '4\xA0of\xA04', []); // Go to previous page grid.previousPage(); fix.detectChanges(); - expect(grid.onPagingDone.emit).toHaveBeenCalledTimes(3); verifyGridPager(fix, 3, '7', '3\xA0of\xA04', []); expect(grid.isLastPage).toBe(false); expect(grid.isFirstPage).toBe(false); @@ -121,7 +116,6 @@ describe('IgxGrid - Grid Paging #grid', () => { grid.paginate(0); fix.detectChanges(); - expect(grid.onPagingDone.emit).toHaveBeenCalledTimes(4); verifyGridPager(fix, 3, '1', '1\xA0of\xA04', []); expect(grid.isFirstPage).toBe(true); @@ -129,7 +123,6 @@ describe('IgxGrid - Grid Paging #grid', () => { grid.previousPage(); fix.detectChanges(); - expect(grid.onPagingDone.emit).toHaveBeenCalledTimes(4); verifyGridPager(fix, 3, '1', '1\xA0of\xA04', []); expect(grid.isFirstPage).toBe(true); @@ -137,7 +130,6 @@ describe('IgxGrid - Grid Paging #grid', () => { grid.paginate(-3); fix.detectChanges(); - expect(grid.onPagingDone.emit).toHaveBeenCalledTimes(4); verifyGridPager(fix, 3, '1', '1\xA0of\xA04', []); }); @@ -197,15 +189,15 @@ describe('IgxGrid - Grid Paging #grid', () => { expect(grid.nativeElement.querySelectorAll('.igx-paginator > select').length).toEqual(0); }); - it('change paging pages per page API', (async () => { + it('change paging pages per page API', fakeAsync(() => { grid.height = '300px'; grid.perPage = 2; - await wait(); + tick(); fix.detectChanges(); grid.page = 1; - await wait(); + tick(); fix.detectChanges(); expect(grid.paging).toBeTruthy(); @@ -213,33 +205,28 @@ describe('IgxGrid - Grid Paging #grid', () => { verifyGridPager(fix, 2, '3', '2\xA0of\xA05', []); // Change page size to be 5 - spyOn(grid.onPagingDone, 'emit'); grid.perPage = 5; - await wait(); + tick(); fix.detectChanges(); let vScrollBar = grid.verticalScrollContainer.getScroll(); - expect(grid.onPagingDone.emit).toHaveBeenCalledTimes(1); - verifyGridPager(fix, 5, '1', '1\xA0of\xA02', [true, true, false, false]); + verifyGridPager(fix, 5, '6', '2\xA0of\xA02', [false, false, true, true]); expect(vScrollBar.scrollHeight).toBeGreaterThanOrEqual(250); expect(vScrollBar.scrollHeight).toBeLessThanOrEqual(255); // Change page size to be 33 grid.perPage = 33; - await wait(); + tick(); fix.detectChanges(); vScrollBar = grid.verticalScrollContainer.getScroll(); - // onPagingDone should be emitted only if we have a change in the page number - expect(grid.onPagingDone.emit).toHaveBeenCalledTimes(1); - verifyGridPager(fix, 5, '1', '1\xA0of\xA01', [true, true, true, true]); + verifyGridPager(fix, 10, '1', '1\xA0of\xA01', [true, true, true, true]); expect(vScrollBar.scrollHeight).toBeGreaterThanOrEqual(500); expect(vScrollBar.scrollHeight).toBeLessThanOrEqual(510); // Change page size to be negative grid.perPage = -7; - await wait(); + tick(); fix.detectChanges(); - expect(grid.onPagingDone.emit).toHaveBeenCalledTimes(1); - verifyGridPager(fix, 5, '1', '1\xA0of\xA01', [true, true, true, true]); + verifyGridPager(fix, 10, '1', '1\xA0of\xA01', [true, true, true, true]); expect(vScrollBar.scrollHeight).toBeGreaterThanOrEqual(500); expect(vScrollBar.scrollHeight).toBeLessThanOrEqual(510); })); diff --git a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.html b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.html index 60ac7bd7506..70054720aec 100644 --- a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.html +++ b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.html @@ -210,7 +210,7 @@ + [(perPage)]="perPage" (pagingDone)="_pagingDone()"> diff --git a/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid.component.html b/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid.component.html index f6c7ebfa137..6b96dd0607d 100644 --- a/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid.component.html +++ b/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid.component.html @@ -177,7 +177,7 @@ + [(perPage)]="perPage" (pagingDone)="_pagingDone()"> diff --git a/projects/igniteui-angular/src/lib/paginator/interfaces.ts b/projects/igniteui-angular/src/lib/paginator/interfaces.ts new file mode 100644 index 00000000000..084d42a2e98 --- /dev/null +++ b/projects/igniteui-angular/src/lib/paginator/interfaces.ts @@ -0,0 +1,16 @@ +import { IBaseEventArgs, CancelableBrowserEventArgs } from '../core/utils'; + +/** + * The event arguments after a page is changed. + * `oldPage` is the last active page, `newPage` is the current page. + */ +export interface IPagingDoneEventArgs extends IBaseEventArgs { + oldPage: number; + newPage: number; +} + +/** + * The event arguments before a page is changed. + * `oldPage` is the currently active page, `newPage` is the page that will be active if the operation completes succesfully. + */ +export interface IPagingEventArgs extends CancelableBrowserEventArgs, IPagingDoneEventArgs { } diff --git a/projects/igniteui-angular/src/lib/paginator/paginator.component.html b/projects/igniteui-angular/src/lib/paginator/paginator.component.html index bf190f61d25..862dbce20c0 100644 --- a/projects/igniteui-angular/src/lib/paginator/paginator.component.html +++ b/projects/igniteui-angular/src/lib/paginator/paginator.component.html @@ -1,7 +1,11 @@
- @@ -11,10 +15,24 @@