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';
|
import { ObjectDataColumn } from './object-datacolumn.model';
|
||||||
|
|
||||||
describe('ObjectDataTableAdapter', () => {
|
describe('ObjectDataTableAdapter', () => {
|
||||||
|
|
||||||
it('should init with empty row collection', () => {
|
it('should init with empty row collection', () => {
|
||||||
const adapter = new ObjectDataTableAdapter(null, []);
|
const adapter = new ObjectDataTableAdapter(null, []);
|
||||||
expect(adapter.getRows()).toBeDefined();
|
expect(adapter.getRows()).toBeDefined();
|
||||||
@@ -46,10 +45,7 @@ describe('ObjectDataTableAdapter', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should map columns without rows', () => {
|
it('should map columns without rows', () => {
|
||||||
const adapter = new ObjectDataTableAdapter(null, [
|
const adapter = new ObjectDataTableAdapter(null, [{} as DataColumn, {} as DataColumn]);
|
||||||
{} as DataColumn,
|
|
||||||
{} as DataColumn
|
|
||||||
]);
|
|
||||||
const columns = adapter.getColumns();
|
const columns = adapter.getColumns();
|
||||||
|
|
||||||
expect(columns.length).toBe(2);
|
expect(columns.length).toBe(2);
|
||||||
@@ -116,10 +112,7 @@ describe('ObjectDataTableAdapter', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should reset columns by null value', () => {
|
it('should reset columns by null value', () => {
|
||||||
const adapter = new ObjectDataTableAdapter([], [
|
const adapter = new ObjectDataTableAdapter([], [{} as DataColumn, {} as DataColumn]);
|
||||||
{} as DataColumn,
|
|
||||||
{} as DataColumn
|
|
||||||
]);
|
|
||||||
expect(adapter.getColumns()).toBeDefined();
|
expect(adapter.getColumns()).toBeDefined();
|
||||||
expect(adapter.getColumns().length).toBe(2);
|
expect(adapter.getColumns().length).toBe(2);
|
||||||
|
|
||||||
@@ -188,9 +181,7 @@ describe('ObjectDataTableAdapter', () => {
|
|||||||
{ id: 2, name: 'abs' },
|
{ id: 2, name: 'abs' },
|
||||||
{ id: 1, name: 'xyz' }
|
{ id: 1, name: 'xyz' }
|
||||||
],
|
],
|
||||||
[
|
[new ObjectDataColumn({ key: 'id', sortable: true })]
|
||||||
new ObjectDataColumn({ key: 'id', sortable: true })
|
|
||||||
]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const rows = adapter.getRows();
|
const rows = adapter.getRows();
|
||||||
@@ -199,10 +190,7 @@ describe('ObjectDataTableAdapter', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should take first sortable column by default', () => {
|
it('should take first sortable column by default', () => {
|
||||||
const adapter = new ObjectDataTableAdapter([], [
|
const adapter = new ObjectDataTableAdapter([], [{ key: 'icon' } as DataColumn, new ObjectDataColumn({ key: 'id', sortable: true })]);
|
||||||
{ key: 'icon' } as DataColumn,
|
|
||||||
new ObjectDataColumn({ key: 'id', sortable: true })
|
|
||||||
]);
|
|
||||||
|
|
||||||
expect(adapter.getSorting()).toEqual(
|
expect(adapter.getSorting()).toEqual(
|
||||||
jasmine.objectContaining({
|
jasmine.objectContaining({
|
||||||
@@ -221,10 +209,7 @@ describe('ObjectDataTableAdapter', () => {
|
|||||||
{ id: 1, created: new Date(2016, 7, 6, 15, 7, 2) },
|
{ id: 1, created: new Date(2016, 7, 6, 15, 7, 2) },
|
||||||
{ id: 2, created: new Date(2016, 7, 6, 15, 7, 1) }
|
{ 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 }));
|
adapter.setSorting(new DataSorting('created', 'asc', { numeric: true }));
|
||||||
@@ -235,11 +220,7 @@ describe('ObjectDataTableAdapter', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should sort by numbers', () => {
|
it('should sort by numbers', () => {
|
||||||
const adapter = new ObjectDataTableAdapter([
|
const adapter = new ObjectDataTableAdapter([{ id: 123 }, { id: 38 }, { id: 50 }], [{ key: 'id' } as DataColumn]);
|
||||||
{ id: 123 },
|
|
||||||
{ id: 38 },
|
|
||||||
{ id: 50 }
|
|
||||||
],[{key: 'id'} as DataColumn]);
|
|
||||||
|
|
||||||
adapter.setSorting(new DataSorting('id', 'asc', { numeric: true }));
|
adapter.setSorting(new DataSorting('id', 'asc', { numeric: true }));
|
||||||
|
|
||||||
@@ -255,10 +236,7 @@ describe('ObjectDataTableAdapter', () => {
|
|||||||
{ id: 2, name: 'abs' },
|
{ id: 2, name: 'abs' },
|
||||||
{ id: 1, name: 'xyz' }
|
{ id: 1, name: 'xyz' }
|
||||||
],
|
],
|
||||||
[
|
[new ObjectDataColumn({ key: 'id' }), new ObjectDataColumn({ key: 'name' })]
|
||||||
new ObjectDataColumn({ key: 'id' }),
|
|
||||||
new ObjectDataColumn({ key: 'name' })
|
|
||||||
]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(adapter.getSorting()).toBeUndefined();
|
expect(adapter.getSorting()).toBeUndefined();
|
||||||
@@ -270,9 +248,7 @@ describe('ObjectDataTableAdapter', () => {
|
|||||||
{ id: 2, name: 'abs' },
|
{ id: 2, name: 'abs' },
|
||||||
{ id: 1, name: 'xyz' }
|
{ id: 1, name: 'xyz' }
|
||||||
],
|
],
|
||||||
[
|
[new ObjectDataColumn({ key: 'id', sortable: true })]
|
||||||
new ObjectDataColumn({ key: 'id', sortable: true })
|
|
||||||
]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
adapter.setSorting(new DataSorting('id', 'asc', { numeric: 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', () => {
|
describe('ObjectDataRow', () => {
|
||||||
|
|
||||||
it('should require object source', () => {
|
it('should require object source', () => {
|
||||||
expect(() => new ObjectDataRow(null)).toThrowError('Object source not found');
|
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 { DataTableAdapter } from './datatable-adapter';
|
||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
|
|
||||||
|
export type SortingMode = 'client' | 'server';
|
||||||
|
|
||||||
// Simple implementation of the DataTableAdapter interface.
|
// Simple implementation of the DataTableAdapter interface.
|
||||||
export class ObjectDataTableAdapter implements DataTableAdapter {
|
export class ObjectDataTableAdapter implements DataTableAdapter {
|
||||||
private _sorting: DataSorting;
|
private _sorting: DataSorting;
|
||||||
private _rows: DataRow[];
|
private _rows: DataRow[];
|
||||||
private _columns: DataColumn[];
|
private _columns: DataColumn[];
|
||||||
|
private _sortingMode: SortingMode;
|
||||||
|
|
||||||
selectedRow: DataRow;
|
selectedRow: DataRow;
|
||||||
rowsChanged: Subject<Array<DataRow>>;
|
rowsChanged: Subject<Array<DataRow>>;
|
||||||
@@ -54,9 +57,21 @@ export class ObjectDataTableAdapter implements DataTableAdapter {
|
|||||||
return schema;
|
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._rows = [];
|
||||||
this._columns = [];
|
this._columns = [];
|
||||||
|
this.sortingMode = sortingMode;
|
||||||
|
|
||||||
if (data && data.length > 0) {
|
if (data && data.length > 0) {
|
||||||
this._rows = data.map((item) => new ObjectDataRow(item));
|
this._rows = data.map((item) => new ObjectDataRow(item));
|
||||||
@@ -119,6 +134,10 @@ export class ObjectDataTableAdapter implements DataTableAdapter {
|
|||||||
setSorting(sorting: DataSorting): void {
|
setSorting(sorting: DataSorting): void {
|
||||||
this._sorting = sorting;
|
this._sorting = sorting;
|
||||||
|
|
||||||
|
if (this._sortingMode === 'server') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (sorting?.key) {
|
if (sorting?.key) {
|
||||||
this._rows.sort((a: DataRow, b: DataRow) => {
|
this._rows.sort((a: DataRow, b: DataRow) => {
|
||||||
let left = a.getValue(sorting.key) ?? '';
|
let left = a.getValue(sorting.key) ?? '';
|
||||||
|
@@ -50,4 +50,9 @@ describe('ProcessListDatatableAdapter', () => {
|
|||||||
|
|
||||||
expect(adapter.getColumnType(row, column)).toBe('number');
|
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 {
|
export class ProcessListDatatableAdapter extends ObjectDataTableAdapter {
|
||||||
constructor(data: ProcessInstanceCloudListViewModel[], schema: DataColumn<ProcessListDataColumnCustomData>[]) {
|
constructor(data: ProcessInstanceCloudListViewModel[], schema: DataColumn<ProcessListDataColumnCustomData>[]) {
|
||||||
super(data, schema);
|
super(data, schema, 'server');
|
||||||
}
|
}
|
||||||
|
|
||||||
getColumnType(row: DataRow, col: DataColumn<ProcessListDataColumnCustomData>): string {
|
getColumnType(row: DataRow, col: DataColumn<ProcessListDataColumnCustomData>): string {
|
||||||
|
@@ -60,4 +60,9 @@ describe('TasksListDatatableAdapter', () => {
|
|||||||
|
|
||||||
expect(adapter.getColumnType(row, column)).toBe('number');
|
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 {
|
export class TasksListDatatableAdapter extends ObjectDataTableAdapter {
|
||||||
constructor(data: TaskInstanceCloudListViewModel[], schema: DataColumn<ProcessListDataColumnCustomData>[]) {
|
constructor(data: TaskInstanceCloudListViewModel[], schema: DataColumn<ProcessListDataColumnCustomData>[]) {
|
||||||
super(data, schema);
|
super(data, schema, 'server');
|
||||||
}
|
}
|
||||||
|
|
||||||
getColumnType(row: DataRow, col: DataColumn<ProcessListDataColumnCustomData>): string {
|
getColumnType(row: DataRow, col: DataColumn<ProcessListDataColumnCustomData>): string {
|
||||||
|
Reference in New Issue
Block a user