Skip to content
Snippets Groups Projects
Commit 2cecbac8 authored by Florent Poittevin's avatar Florent Poittevin
Browse files

Fix sort event raised at each model update on datatable

parent 8a87555a
No related branches found
No related tags found
1 merge request!9Fpo/add sort paginate and search feature on data table
<div class="data-table"> <div class="data-table">
<p-table <p-table
[columns]="columns" [columns]="columns"
[value]="datas" [value]="datas"
selectionMode="single" selectionMode="single"
[responsive]="true" [responsive]="true"
[sortMode]="disableSort == true ? 'off' : 'single'" [sortMode]="'single'"
(sortFunction)="backendSort($event)" [lazy]="true"
[customSort]="true"> (onLazyLoad)="backendSort($event)"
<ng-template pTemplate="header" let-columns> [customSort]="true">
<tr> <ng-template pTemplate="header" let-columns>
<th *ngFor="let col of columns" <tr>
[pSortableColumn]="col.field"> <th *ngFor="let col of columns"
{{col.header | translate}} [pSortableColumn]="col.field">
<p-sortIcon [field]="col.field"></p-sortIcon> {{col.header | translate}}
</th> <p-sortIcon [field]="col.field"></p-sortIcon>
</tr> </th>
<tr> </tr>
<th *ngFor="let col of columns" [ngSwitch]="col.type" class="data-table-filter"> <tr>
<div *ngSwitchCase="fieldTypeString"> <th *ngFor="let col of columns" [ngSwitch]="col.type" class="data-table-filter">
<mat-form-field style="width: 100%" appearance="fill" [floatLabel]="'never'"> <div *ngSwitchCase="fieldTypeString">
<input #filter matInput (keyup)="onValueChange(col, $event.target.value)" [value]="getValue(col.field)"> <mat-form-field style="width: 100%" appearance="fill" [floatLabel]="'never'">
<button mat-button *ngIf="filter.value" matSuffix mat-icon-button aria-label="Clear" (click)="filter.value='';onValueChange(col, filter.value)"> <input #filter matInput (keyup)="onValueChange(col, $event.target.value)" [value]="getValue(col.field)">
<fa-icon matSuffix icon="times"></fa-icon> <button mat-button *ngIf="filter.value" matSuffix mat-icon-button aria-label="Clear" (click)="filter.value='';onValueChange(col, filter.value)">
</button> <fa-icon matSuffix icon="times"></fa-icon>
</mat-form-field> </button>
</div> </mat-form-field>
</th> </div>
</tr> </th>
</ng-template> </tr>
<ng-template pTemplate="body" let-rowData let-value let-columns="columns"> </ng-template>
<tr pSelectableRow="row" (click)="showDetail(rowData)"> <ng-template pTemplate="body" let-rowData let-value let-columns="columns">
<td *ngFor="let col of columns"> <tr pSelectableRow="row" (click)="showDetail(rowData)">
{{getCellData(rowData, col)}} <td *ngFor="let col of columns">
</td> {{getCellData(rowData, col)}}
</tr> </td>
</ng-template> </tr>
</p-table> </ng-template>
<div *ngIf="isDatasPresent === false" class="no-datas"> </p-table>
{{'table.nodata' | translate}} <div *ngIf="isDatasPresent === false" class="no-datas">
</div> {{'table.nodata' | translate}}
</div>
<dlcm-paginator *ngIf="isDatasPresent === true" <dlcm-paginator *ngIf="isDatasPresent === true"
#paginator #paginator
[pagingModel]="queryParameters.paging" [pagingModel]="queryParameters.paging"
(pageEvent)="pageEvent($event)"> (pageEvent)="pageEvent($event)">
</dlcm-paginator> </dlcm-paginator>
</div> </div>
...@@ -9,16 +9,18 @@ import { ...@@ -9,16 +9,18 @@ import {
ViewChild, ViewChild,
ViewEncapsulation, ViewEncapsulation,
} from "@angular/core"; } from "@angular/core";
import {PaginatorComponent} from '@app/shared/components/paginator/paginator.component'; import {PaginatorComponent} from "@app/shared/components/paginator/paginator.component";
import {FieldTypeEnum} from "@app/shared/enums/field-type.enum"; import {FieldTypeEnum} from "@app/shared/enums/field-type.enum";
import {OrderEnum} from "@app/shared/enums/order.enum";
import {DataTableColumnsModel} from "@app/shared/models/data-table-columns.model"; import {DataTableColumnsModel} from "@app/shared/models/data-table-columns.model";
import {PagingModel} from '@app/shared/models/paging.model'; import {PagingModel} from "@app/shared/models/paging.model";
import {QueryParametersModel} from '@app/shared/models/query-parameters.model'; import {QueryParametersModel} from "@app/shared/models/query-parameters.model";
import {SortModel} from '@app/shared/models/sort.model'; import {SortModel} from "@app/shared/models/sort.model";
import {MapUtil} from '@app/shared/utils/map.util'; import {MapUtil} from "@app/shared/utils/map.util";
import {ObjectUtil} from '@app/shared/utils/object.util'; import {ObjectUtil} from "@app/shared/utils/object.util";
import _ from "lodash"; import _ from "lodash";
import * as moment from "moment"; import * as moment from "moment";
import {LazyLoadEvent} from "primeng/api";
@Component({ @Component({
selector: "dlcm-data-table", selector: "dlcm-data-table",
...@@ -43,18 +45,13 @@ export class DataTableComponent implements OnChanges { ...@@ -43,18 +45,13 @@ export class DataTableComponent implements OnChanges {
@Output() @Output()
queryParametersEvent: EventEmitter<QueryParametersModel>; queryParametersEvent: EventEmitter<QueryParametersModel>;
@ViewChild('paginator') @ViewChild("paginator")
paginator: PaginatorComponent; paginator: PaginatorComponent;
isDatasPresent: boolean; isDatasPresent: boolean;
disableSort: boolean = false;
fieldTypeString: FieldTypeEnum = FieldTypeEnum.string; fieldTypeString: FieldTypeEnum = FieldTypeEnum.string;
private isSortedEventRaised: boolean = false;
private isClickSortedEvent: boolean = false;
private readonly SEPARATOR = "."; private readonly SEPARATOR = ".";
private readonly FORMAT_TIME_ONLY = "LTS"; private readonly FORMAT_TIME_ONLY = "LTS";
private readonly FORMAT_DATE_ONLY = "L"; private readonly FORMAT_DATE_ONLY = "L";
...@@ -66,20 +63,12 @@ export class DataTableComponent implements OnChanges { ...@@ -66,20 +63,12 @@ export class DataTableComponent implements OnChanges {
ngOnChanges(changes: SimpleChanges): void { ngOnChanges(changes: SimpleChanges): void {
this.computeIsDatasPresent(); this.computeIsDatasPresent();
this.resetSortFeatureAfterNewDatasLoading();
} }
private computeIsDatasPresent() { private computeIsDatasPresent() {
this.isDatasPresent = this.datas.length > 0; this.isDatasPresent = this.datas.length > 0;
} }
private resetSortFeatureAfterNewDatasLoading() {
// TO FIX Find a best way to avoid infinity sort loop
setTimeout(() => {
this.disableSort = false;
}, 600);
}
showDetail(row: any) { showDetail(row: any) {
this.selectEvent.emit(row); this.selectEvent.emit(row);
} }
...@@ -112,11 +101,21 @@ export class DataTableComponent implements OnChanges { ...@@ -112,11 +101,21 @@ export class DataTableComponent implements OnChanges {
return data; return data;
} }
backendSort($event: SortModel) { backendSort($event: LazyLoadEvent): void {
if ($event.sortField === undefined) {
return;
}
const sort = this.adaptLazyLoadEventToSortModel($event);
const queryParameters = ObjectUtil.clone(this.queryParameters); const queryParameters = ObjectUtil.clone(this.queryParameters);
queryParameters.sort = $event; queryParameters.sort = sort;
this.queryParametersEvent.emit(queryParameters); this.queryParametersEvent.emit(queryParameters);
this.disableSort = true; }
private adaptLazyLoadEventToSortModel($event: LazyLoadEvent): SortModel {
return {
field: $event.sortField,
order: $event.sortOrder === -1 ? OrderEnum.descending : OrderEnum.ascending,
} as SortModel;
} }
pageEvent($event: PagingModel) { pageEvent($event: PagingModel) {
...@@ -127,7 +126,7 @@ export class DataTableComponent implements OnChanges { ...@@ -127,7 +126,7 @@ export class DataTableComponent implements OnChanges {
onValueChange(col: DataTableColumnsModel, value: string) { onValueChange(col: DataTableColumnsModel, value: string) {
const queryParameters = ObjectUtil.clone(this.queryParameters); const queryParameters = ObjectUtil.clone(this.queryParameters);
if (value === '') { if (value === "") {
queryParameters.search.searchItems.delete(col.field); queryParameters.search.searchItems.delete(col.field);
} else { } else {
MapUtil.addOrUpdate(queryParameters.search.searchItems, col.field, value); MapUtil.addOrUpdate(queryParameters.search.searchItems, col.field, value);
...@@ -137,7 +136,7 @@ export class DataTableComponent implements OnChanges { ...@@ -137,7 +136,7 @@ export class DataTableComponent implements OnChanges {
getValue(field: string) { getValue(field: string) {
const value = this.queryParameters.search.searchItems.get(field); const value = this.queryParameters.search.searchItems.get(field);
if (value === null || value === undefined || value === '') { if (value === null || value === undefined || value === "") {
return null; return null;
} }
return value; return value;
......
import {OrderEnum} from '@app/shared/enums/order.enum'; import {OrderEnum} from '@app/shared/enums/order.enum';
export interface SortModel { export interface SortModel {
mode: string;
field: string; field: string;
order: OrderEnum; order: OrderEnum;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment