-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdata-den-client-data-loader-strategy-client.ts
More file actions
104 lines (79 loc) · 3.09 KB
/
data-den-client-data-loader-strategy-client.ts
File metadata and controls
104 lines (79 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import { DataDenDataLoaderStrategy } from './data-den-data-loader-strategy';
import {
DataDenFetchOptions,
DataDenFiltersOptions,
DataDenGroupedOptions,
DataDenPaginationOptions,
DataDenQuickFilterOptions,
DataDenSortOptions,
} from '../data-den-fetch-options.interface';
import { deepCopy, groupRows } from '../../../utils';
export class DataDenClientDataLoaderStrategy extends DataDenDataLoaderStrategy {
#data: any[];
constructor(data: any[]) {
super();
this.#data = data;
}
getData(options: DataDenFetchOptions): Promise<any[]> {
return this.filterData(deepCopy(this.#data), options.filtersOptions)
.then((filtered) => this.quickFilterData(filtered, options.quickFilterOptions))
.then((quickFiltered) => this.sortData(quickFiltered, options.sortingOptions))
.then((sorted) => this.groupData(sorted, options.groupedOptions))
.then((grouped) => this.paginateData(grouped, options.paginationOptions, options.groupedOptions))
}
groupData(rows: any[], groupedOptions: DataDenGroupedOptions | undefined): Promise<any[]> {
if (!groupedOptions) {
return Promise.resolve(rows);
}
const groups = groupedOptions.groupedColumns.map((column) => column.group);
const grouped = groupRows(rows, groups);
return Promise.resolve(grouped);
}
filterData(rows: any[], filtersOptions: DataDenFiltersOptions | undefined): Promise<any[]> {
if (!filtersOptions) {
return Promise.resolve(rows);
}
const headers = Object.keys(filtersOptions.filters);
const filtered = headers.reduce((res, header) => {
return res.filter((row: any) => {
const filterFn = filtersOptions.filters[header].filterFn;
const state = filtersOptions.filters[header].state;
const value = row[header];
return filterFn(state, value);
});
}, rows);
return Promise.resolve(filtered);
}
paginateData(rows: any[], paginationOptions: DataDenPaginationOptions | undefined, groupedOptions: DataDenGroupedOptions | undefined): Promise<any> {
if (!paginationOptions) {
return Promise.resolve(rows);
}
const { firstRowIndex, lastRowIndex } = paginationOptions;
const paginated = (groupedOptions ? Object.fromEntries(
Object.entries(rows).slice(firstRowIndex, lastRowIndex)
) : rows.slice(firstRowIndex, lastRowIndex));
return Promise.resolve(paginated);
}
sortData(rows: any[], sortOptions: DataDenSortOptions | undefined): Promise<any[]> {
if (!sortOptions) {
return Promise.resolve(rows);
}
const { sortFn, activeSorters } = sortOptions;
const sorted = sortFn(rows, activeSorters);
return Promise.resolve(sorted);
}
quickFilterData(rows: any[], quickFilterOptions: DataDenQuickFilterOptions | undefined): Promise<any[]> {
if (!quickFilterOptions) {
return Promise.resolve(rows);
}
const { searchTerm, filterFn, columns } = quickFilterOptions;
const filtered = rows.filter((row) => {
return filterFn({
searchTerm,
value: Object.values(row),
columns,
});
});
return Promise.resolve(filtered);
}
}