AAE-22900: update ObjectDataTableAdapter to support server and client… (#10423)

* AAE-22900: update ObjectDataTableAdapter to support server and client sorting modes
---------

Co-authored-by: Eugenio Romano <eromano@users.noreply.github.com>
This commit is contained in:
Alex Molodyh
2024-12-12 12:55:05 -08:00
committed by GitHub
parent 0278544af1
commit 3a8ad1a596
6 changed files with 80 additions and 42 deletions

View File

@@ -23,7 +23,6 @@ import { ObjectDataRow } from './object-datarow.model';
import { ObjectDataColumn } from './object-datacolumn.model';
describe('ObjectDataTableAdapter', () => {
it('should init with empty row collection', () => {
const adapter = new ObjectDataTableAdapter(null, []);
expect(adapter.getRows()).toBeDefined();
@@ -46,10 +45,7 @@ describe('ObjectDataTableAdapter', () => {
});
it('should map columns without rows', () => {
const adapter = new ObjectDataTableAdapter(null, [
{} as DataColumn,
{} as DataColumn
]);
const adapter = new ObjectDataTableAdapter(null, [{} as DataColumn, {} as DataColumn]);
const columns = adapter.getColumns();
expect(columns.length).toBe(2);
@@ -99,7 +95,7 @@ describe('ObjectDataTableAdapter', () => {
it('should apply new columns array', () => {
const adapter = new ObjectDataTableAdapter([], []);
const columns = [{},{}] as DataColumn[];
const columns = [{}, {}] as DataColumn[];
adapter.setColumns(columns);
expect(adapter.getColumns()).toBe(columns);
@@ -116,10 +112,7 @@ describe('ObjectDataTableAdapter', () => {
});
it('should reset columns by null value', () => {
const adapter = new ObjectDataTableAdapter([], [
{} as DataColumn,
{} as DataColumn
]);
const adapter = new ObjectDataTableAdapter([], [{} as DataColumn, {} as DataColumn]);
expect(adapter.getColumns()).toBeDefined();
expect(adapter.getColumns().length).toBe(2);
@@ -188,9 +181,7 @@ describe('ObjectDataTableAdapter', () => {
{ id: 2, name: 'abs' },
{ id: 1, name: 'xyz' }
],
[
new ObjectDataColumn({ key: 'id', sortable: true })
]
[new ObjectDataColumn({ key: 'id', sortable: true })]
);
const rows = adapter.getRows();
@@ -199,10 +190,7 @@ describe('ObjectDataTableAdapter', () => {
});
it('should take first sortable column by default', () => {
const adapter = new ObjectDataTableAdapter([], [
{ key: 'icon' } as DataColumn,
new ObjectDataColumn({ key: 'id', sortable: true })
]);
const adapter = new ObjectDataTableAdapter([], [{ key: 'icon' } as DataColumn, new ObjectDataColumn({ key: 'id', sortable: true })]);
expect(adapter.getSorting()).toEqual(
jasmine.objectContaining({
@@ -221,10 +209,7 @@ describe('ObjectDataTableAdapter', () => {
{ id: 1, created: new Date(2016, 7, 6, 15, 7, 2) },
{ id: 2, created: new Date(2016, 7, 6, 15, 7, 1) }
],
[
{ key: 'id' } as DataColumn,
{ key: 'created' } as DataColumn
]
[{ key: 'id' } as DataColumn, { key: 'created' } as DataColumn]
);
adapter.setSorting(new DataSorting('created', 'asc', { numeric: true }));
@@ -235,11 +220,7 @@ describe('ObjectDataTableAdapter', () => {
});
it('should sort by numbers', () => {
const adapter = new ObjectDataTableAdapter([
{ id: 123 },
{ id: 38 },
{ id: 50 }
],[{key: 'id'} as DataColumn]);
const adapter = new ObjectDataTableAdapter([{ id: 123 }, { id: 38 }, { id: 50 }], [{ key: 'id' } as DataColumn]);
adapter.setSorting(new DataSorting('id', 'asc', { numeric: true }));
@@ -255,10 +236,7 @@ describe('ObjectDataTableAdapter', () => {
{ id: 2, name: 'abs' },
{ id: 1, name: 'xyz' }
],
[
new ObjectDataColumn({ key: 'id' }),
new ObjectDataColumn({ key: 'name' })
]
[new ObjectDataColumn({ key: 'id' }), new ObjectDataColumn({ key: 'name' })]
);
expect(adapter.getSorting()).toBeUndefined();
@@ -270,9 +248,7 @@ describe('ObjectDataTableAdapter', () => {
{ id: 2, name: 'abs' },
{ id: 1, name: 'xyz' }
],
[
new ObjectDataColumn({ key: 'id', sortable: true })
]
[new ObjectDataColumn({ key: 'id', sortable: true })]
);
adapter.setSorting(new DataSorting('id', 'asc', { numeric: true }));
@@ -313,10 +289,43 @@ describe('ObjectDataTableAdapter', () => {
})
);
});
it('should not sort rows ascending when in server sorting mode', () => {
const adapter = new ObjectDataTableAdapter(
[
{ id: 2, name: 'abs' },
{ id: 1, name: 'xyz' }
],
[new ObjectDataColumn({ key: 'id', sortable: true })],
'server'
);
adapter.setSorting(new DataSorting('id', 'asc', { numeric: true }));
const rows = adapter.getRows();
expect(rows[0].getValue('id')).toBe(2);
expect(rows[1].getValue('id')).toBe(1);
});
it('should not sort rows descending when in server sorting mode', () => {
const adapter = new ObjectDataTableAdapter(
[
{ id: 1, name: 'xyz' },
{ id: 2, name: 'abs' }
],
[new ObjectDataColumn({ key: 'id', sortable: true })],
'server'
);
adapter.setSorting(new DataSorting('id ', 'desc', { numeric: true }));
const rows = adapter.getRows();
expect(rows[0].getValue('id')).toBe(1);
expect(rows[1].getValue('id')).toBe(2);
});
});
describe('ObjectDataRow', () => {
it('should require object source', () => {
expect(() => new ObjectDataRow(null)).toThrowError('Object source not found');
});

View File

@@ -23,11 +23,14 @@ import { DataSorting } from './data-sorting.model';
import { DataTableAdapter } from './datatable-adapter';
import { Subject } from 'rxjs';
export type SortingMode = 'client' | 'server';
// Simple implementation of the DataTableAdapter interface.
export class ObjectDataTableAdapter implements DataTableAdapter {
private _sorting: DataSorting;
private _rows: DataRow[];
private _columns: DataColumn[];
private _sortingMode: SortingMode;
selectedRow: DataRow;
rowsChanged: Subject<Array<DataRow>>;
@@ -54,9 +57,21 @@ export class ObjectDataTableAdapter implements DataTableAdapter {
return schema;
}
constructor(data: any[] = [], schema: DataColumn[] = []) {
get sortingMode(): SortingMode {
return this._sortingMode;
}
set sortingMode(sortingMode: SortingMode) {
if (!sortingMode) {
sortingMode = 'client';
}
this._sortingMode = sortingMode;
}
constructor(data: any[] = [], schema: DataColumn[] = [], sortingMode: SortingMode = 'client') {
this._rows = [];
this._columns = [];
this.sortingMode = sortingMode;
if (data && data.length > 0) {
this._rows = data.map((item) => new ObjectDataRow(item));
@@ -119,6 +134,10 @@ export class ObjectDataTableAdapter implements DataTableAdapter {
setSorting(sorting: DataSorting): void {
this._sorting = sorting;
if (this._sortingMode === 'server') {
return;
}
if (sorting?.key) {
this._rows.sort((a: DataRow, b: DataRow) => {
let left = a.getValue(sorting.key) ?? '';

View File

@@ -50,4 +50,9 @@ describe('ProcessListDatatableAdapter', () => {
expect(adapter.getColumnType(row, column)).toBe('number');
});
it('should initialize constructor with server sortingMode', () => {
const adapter = new ProcessListDatatableAdapter([], []);
expect(adapter.sortingMode).toBe('server');
});
});

View File

@@ -21,7 +21,7 @@ import { ProcessInstanceCloudListViewModel } from '../models/perocess-instance-c
export class ProcessListDatatableAdapter extends ObjectDataTableAdapter {
constructor(data: ProcessInstanceCloudListViewModel[], schema: DataColumn<ProcessListDataColumnCustomData>[]) {
super(data, schema);
super(data, schema, 'server');
}
getColumnType(row: DataRow, col: DataColumn<ProcessListDataColumnCustomData>): string {

View File

@@ -60,4 +60,9 @@ describe('TasksListDatatableAdapter', () => {
expect(adapter.getColumnType(row, column)).toBe('number');
});
it('should initialize constructor with server sortingMode', () => {
const adapter = new TasksListDatatableAdapter([], []);
expect(adapter.sortingMode).toBe('server');
});
});

View File

@@ -21,7 +21,7 @@ import { TaskInstanceCloudListViewModel } from '../models/task-cloud-view.model'
export class TasksListDatatableAdapter extends ObjectDataTableAdapter {
constructor(data: TaskInstanceCloudListViewModel[], schema: DataColumn<ProcessListDataColumnCustomData>[]) {
super(data, schema);
super(data, schema, 'server');
}
getColumnType(row: DataRow, col: DataColumn<ProcessListDataColumnCustomData>): string {