mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-07-24 17:32:15 +00:00
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:
@@ -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);
|
||||
@@ -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');
|
||||
});
|
||||
|
@@ -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) ?? '';
|
||||
|
@@ -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');
|
||||
});
|
||||
});
|
||||
|
@@ -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 {
|
||||
|
@@ -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');
|
||||
});
|
||||
});
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user