@angular-generic-table/core 5.0.0-rc.4 → 5.0.0-rc.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular-generic-table-core.d.ts +1 -3
- package/esm2020/angular-generic-table-core.mjs +5 -0
- package/esm2020/lib/core.component.mjs +118 -0
- package/esm2020/lib/core.module.mjs +23 -0
- package/esm2020/lib/core.service.mjs +14 -0
- package/esm2020/lib/enums/order.enum.mjs +6 -0
- package/esm2020/lib/models/table-column.interface.mjs +2 -0
- package/esm2020/lib/models/table-config.interface.mjs +2 -0
- package/esm2020/lib/models/table-info.interface.mjs +2 -0
- package/esm2020/lib/models/table-meta.interface.mjs +2 -0
- package/esm2020/lib/models/table-row.interface.mjs +2 -0
- package/esm2020/lib/models/table-sort.interface.mjs +2 -0
- package/esm2020/lib/pagination/pagination.component.mjs +63 -0
- package/esm2020/lib/pagination/pagination.module.mjs +18 -0
- package/esm2020/lib/pipes/capital-case.pipe.mjs +17 -0
- package/esm2020/lib/pipes/dash-case.pipe.mjs +17 -0
- package/esm2020/lib/pipes/dynamic.pipe.mjs +26 -0
- package/esm2020/lib/pipes/highlight.pipe.mjs +48 -0
- package/esm2020/lib/pipes/sort-class.pipe.mjs +16 -0
- package/esm2020/lib/utilities/utilities.mjs +38 -0
- package/esm2020/public-api.mjs +15 -0
- package/fesm2015/angular-generic-table-core.mjs +379 -0
- package/fesm2015/angular-generic-table-core.mjs.map +1 -0
- package/fesm2020/angular-generic-table-core.mjs +377 -0
- package/fesm2020/angular-generic-table-core.mjs.map +1 -0
- package/lib/core.component.d.ts +8 -10
- package/lib/core.module.d.ts +11 -0
- package/lib/core.service.d.ts +3 -0
- package/lib/models/table-column.interface.d.ts +5 -0
- package/lib/models/table-config.interface.d.ts +3 -2
- package/lib/models/table-meta.interface.d.ts +8 -0
- package/lib/models/table-row.interface.d.ts +1 -0
- package/lib/pagination/pagination.component.d.ts +14 -0
- package/lib/pagination/pagination.module.d.ts +8 -0
- package/lib/pipes/capital-case.pipe.d.ts +7 -0
- package/lib/pipes/dash-case.pipe.d.ts +3 -0
- package/lib/pipes/dynamic.pipe.d.ts +9 -0
- package/lib/pipes/highlight.pipe.d.ts +3 -0
- package/lib/pipes/sort-class.pipe.d.ts +3 -0
- package/lib/utilities/utilities.d.ts +1 -0
- package/package.json +19 -7
- package/public-api.d.ts +3 -0
- package/scss/index.scss +4 -0
- package/scss/mixins.scss +79 -0
- package/scss/tokens.scss +12 -0
- package/angular-generic-table-core.metadata.json +0 -1
- package/bundles/angular-generic-table-core.umd.js +0 -610
- package/bundles/angular-generic-table-core.umd.js.map +0 -1
- package/bundles/angular-generic-table-core.umd.min.js +0 -2
- package/bundles/angular-generic-table-core.umd.min.js.map +0 -1
- package/esm2015/angular-generic-table-core.js +0 -8
- package/esm2015/lib/core.component.js +0 -115
- package/esm2015/lib/core.module.js +0 -16
- package/esm2015/lib/core.service.js +0 -13
- package/esm2015/lib/enums/order.enum.js +0 -6
- package/esm2015/lib/models/table-column.interface.js +0 -2
- package/esm2015/lib/models/table-config.interface.js +0 -2
- package/esm2015/lib/models/table-info.interface.js +0 -2
- package/esm2015/lib/models/table-row.interface.js +0 -2
- package/esm2015/lib/models/table-sort.interface.js +0 -2
- package/esm2015/lib/pipes/dash-case.pipe.js +0 -13
- package/esm2015/lib/pipes/highlight.pipe.js +0 -44
- package/esm2015/lib/pipes/sort-class.pipe.js +0 -12
- package/esm2015/lib/utilities/utilities.js +0 -25
- package/esm2015/public-api.js +0 -12
- package/fesm2015/angular-generic-table-core.js +0 -242
- package/fesm2015/angular-generic-table-core.js.map +0 -1
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import { ɵɵdefineInjectable, Injectable, Component, ChangeDetectionStrategy, Input, Pipe, NgModule } from '@angular/core';
|
|
2
|
-
import { ReplaySubject, Subject, isObservable, of, combineLatest, EMPTY, BehaviorSubject } from 'rxjs';
|
|
3
|
-
import { startWith, map, switchMap, shareReplay, withLatestFrom } from 'rxjs/operators';
|
|
4
|
-
import { CommonModule } from '@angular/common';
|
|
5
|
-
|
|
6
|
-
class CoreService {
|
|
7
|
-
constructor() { }
|
|
8
|
-
}
|
|
9
|
-
CoreService.ɵprov = ɵɵdefineInjectable({ factory: function CoreService_Factory() { return new CoreService(); }, token: CoreService, providedIn: "root" });
|
|
10
|
-
CoreService.decorators = [
|
|
11
|
-
{ type: Injectable, args: [{
|
|
12
|
-
providedIn: 'root'
|
|
13
|
-
},] }
|
|
14
|
-
];
|
|
15
|
-
CoreService.ctorParameters = () => [];
|
|
16
|
-
|
|
17
|
-
var Order;
|
|
18
|
-
(function (Order) {
|
|
19
|
-
Order["ASC"] = "asc";
|
|
20
|
-
Order["DESC"] = "desc";
|
|
21
|
-
})(Order || (Order = {}));
|
|
22
|
-
|
|
23
|
-
let dashed;
|
|
24
|
-
dashed = (s) => s.replace(/[A-Z]/g, m => '-' + m.toLowerCase());
|
|
25
|
-
let chunk;
|
|
26
|
-
chunk = (array, chunkSize) => {
|
|
27
|
-
if (chunkSize < 0) {
|
|
28
|
-
throw new Error('Invalid chunk size');
|
|
29
|
-
}
|
|
30
|
-
if (chunkSize === 0 && !chunkSize) {
|
|
31
|
-
return [array];
|
|
32
|
-
}
|
|
33
|
-
const CHUNK = [];
|
|
34
|
-
for (let i = 0, len = array.length; i < len; i += chunkSize) {
|
|
35
|
-
CHUNK.push(array.slice(i, i + chunkSize));
|
|
36
|
-
}
|
|
37
|
-
return CHUNK;
|
|
38
|
-
};
|
|
39
|
-
let search;
|
|
40
|
-
search = (text, caseSensitive, data, config) => {
|
|
41
|
-
const searchColumns = Object.keys(config.columns).filter(key => !config.columns[key].hidden && config.columns[key].search !== false);
|
|
42
|
-
return data.filter(row => Object.entries(row)
|
|
43
|
-
.filter(([key, value]) => searchColumns.indexOf(key) !== -1)
|
|
44
|
-
.reduce((prev, [key, value]) => prev + (prev === '' ? '' : ' & ') + (caseSensitive ? value + '' : (value + '').toLowerCase()), '')
|
|
45
|
-
.indexOf(text) !== -1);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
class CoreComponent {
|
|
49
|
-
constructor() {
|
|
50
|
-
this._loading$ = new ReplaySubject(1);
|
|
51
|
-
this.sortBy$ = new Subject();
|
|
52
|
-
// tslint:disable-next-line:variable-name
|
|
53
|
-
this._searchBy$ = new ReplaySubject(1);
|
|
54
|
-
this.searchBy$ = this._searchBy$.pipe(startWith(''), map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
|
|
55
|
-
// tslint:disable-next-line:variable-name
|
|
56
|
-
this._tableConfig$ = new ReplaySubject(1);
|
|
57
|
-
this.tableConfig$ = this._tableConfig$.pipe(map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
|
|
58
|
-
// tslint:disable-next-line:variable-name
|
|
59
|
-
this._data$ = new ReplaySubject(1);
|
|
60
|
-
this.data$ = this._data$.pipe(map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => combineLatest([obs, this.sortBy$.pipe(startWith(EMPTY)), this.searchBy$])), withLatestFrom(this.tableConfig$), map(([[data, sortBy, searchBy], config]) => {
|
|
61
|
-
return !sortBy
|
|
62
|
-
? searchBy
|
|
63
|
-
? search(searchBy, false, data, config)
|
|
64
|
-
: data
|
|
65
|
-
: (searchBy ? search(searchBy, false, data, config) : data).sort((a, b) => {
|
|
66
|
-
// TODO: improve logic
|
|
67
|
-
const typed = sortBy;
|
|
68
|
-
return a[typed.sortBy] > b[typed.sortBy]
|
|
69
|
-
? typed.sortByOrder === Order.ASC
|
|
70
|
-
? 1
|
|
71
|
-
: -1
|
|
72
|
-
: b[typed.sortBy] > a[typed.sortBy]
|
|
73
|
-
? typed.sortByOrder === Order.ASC
|
|
74
|
-
? -1
|
|
75
|
-
: 1
|
|
76
|
-
: 0;
|
|
77
|
-
});
|
|
78
|
-
}));
|
|
79
|
-
this.table$ = combineLatest([
|
|
80
|
-
this.data$,
|
|
81
|
-
this.tableConfig$,
|
|
82
|
-
]).pipe(map(([sorted, config]) => {
|
|
83
|
-
// if pagination is disabled...
|
|
84
|
-
if (!config.pagination || config.pagination.length === 0) {
|
|
85
|
-
// ...return unaltered array
|
|
86
|
-
return { data: [sorted], config, info: { records: sorted.length, pageTotal: 1 } };
|
|
87
|
-
}
|
|
88
|
-
// return record set
|
|
89
|
-
return {
|
|
90
|
-
data: chunk(sorted, +config.pagination.length),
|
|
91
|
-
config,
|
|
92
|
-
info: {
|
|
93
|
-
records: sorted.length,
|
|
94
|
-
pageTotal: Math.ceil(sorted.length / +config.pagination.length),
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
}));
|
|
98
|
-
// tslint:disable-next-line:variable-name
|
|
99
|
-
this._currentPage$ = new BehaviorSubject(0);
|
|
100
|
-
this.currentPage$ = this._currentPage$.pipe(map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), withLatestFrom(this.table$), map(([page, table]) => {
|
|
101
|
-
// determine last page
|
|
102
|
-
const lastPage = Math.ceil(table.info.records / table.config.pagination.length) - 1;
|
|
103
|
-
// determine max/min position
|
|
104
|
-
return +page < 0 ? 0 : +page > lastPage ? lastPage : +page;
|
|
105
|
-
}), shareReplay(1));
|
|
106
|
-
this.colspan$ = this.tableConfig$.pipe(map((config) => Object.values(config.columns).filter((value) => value.hidden !== true).length));
|
|
107
|
-
this.columnOrder = (a, b) => {
|
|
108
|
-
return (a.value.order || 0) - (b.value.order || 0);
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
set loading(value) {
|
|
112
|
-
this._loading$.next(value);
|
|
113
|
-
}
|
|
114
|
-
set page(value) {
|
|
115
|
-
this._currentPage$.next(value);
|
|
116
|
-
}
|
|
117
|
-
set search(value) {
|
|
118
|
-
this._searchBy$.next(value);
|
|
119
|
-
}
|
|
120
|
-
set config(value) {
|
|
121
|
-
this._tableConfig$.next(value);
|
|
122
|
-
}
|
|
123
|
-
set data(value) {
|
|
124
|
-
this._data$.next(value);
|
|
125
|
-
}
|
|
126
|
-
get loading$() {
|
|
127
|
-
return this._loading$.pipe(startWith(false), map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
|
|
128
|
-
}
|
|
129
|
-
sort(property) {
|
|
130
|
-
var _a, _b;
|
|
131
|
-
const newSortOrder = ((_a = this._sortBy) === null || _a === void 0 ? void 0 : _a.sortBy) !== property || ((_b = this._sortBy) === null || _b === void 0 ? void 0 : _b.sortByOrder) === Order.DESC || !this._sortBy.sortByOrder
|
|
132
|
-
? Order.ASC
|
|
133
|
-
: Order.DESC;
|
|
134
|
-
const newSortBy = {
|
|
135
|
-
sortBy: property,
|
|
136
|
-
sortByOrder: newSortOrder,
|
|
137
|
-
};
|
|
138
|
-
this.sortBy$.next(newSortBy);
|
|
139
|
-
this._sortBy = newSortBy;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
CoreComponent.decorators = [
|
|
143
|
-
{ type: Component, args: [{
|
|
144
|
-
selector: 'angular-generic-table',
|
|
145
|
-
template: "<table class=\"table text-nowrap mb-0\" id=\"agreementList_table\">\n <thead>\n <tr *ngIf=\"{\n config:(tableConfig$ | async)!,\n loading: loading$ | async\n } as table\">\n <ng-container *ngFor=\"let column of table.config.columns | keyvalue: columnOrder\">\n <th\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ column.value?.sortable ? 'sort ' : '' }} {{ sortBy$ | async | sortClass: column.key }} {{\n (column.key | dashCase) + '-column'\n }} {{column.value.class}}\"\n [class.disabled]=\"table.loading\"\n (click)=\"table.loading || !column.value.sortable || sort(column.key)\"\n >\n <span>{{ column.value?.header || column.key }}</span>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody *ngIf=\"loading$ | async; else tableContent\">\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspan$ | async\">\n <ng-content select=\".table-loading\"></ng-content>\n </td>\n </tr>\n </tbody>\n</table>\n<ng-template #tableContent>\n <ng-container\n *ngIf=\"(table$ | async)! as table\"\n >\n <tbody id=\"agreementList_tableContent\" *ngIf=\"table!.data!.length > 0; else noData\">\n <tr *ngFor=\"let row of table!.data![(currentPage$ | async) || 0]; let i = index\" [attr.id]=\"'tableRow_' + i\">\n <ng-container *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\">\n <td *ngIf=\"!column.value?.hidden\" ngClass=\"{{(column.key | dashCase) + '-column'}} {{column.value.class}}\">\n <ng-container [ngTemplateOutlet]=\"(searchBy$ | async) && !table.config.columns[column.key].templateRef ? highlighted:\n table.config.columns[column.key].templateRef ? templateRef :\n rawData\" [ngTemplateOutletContext]=\"{row: row, column: column, search: (searchBy$ | async), templateRef: table.config.columns[column.key].templateRef, index: i}\"></ng-container></td>\n </ng-container>\n </tr>\n </tbody>\n </ng-container>\n</ng-template>\n<ng-template #noData>\n <tbody>\n <tr>\n <td class=\"p-0\" [colSpan]=\"colspan$ | async\">\n <ng-content select=\".table-no-data\"></ng-content>\n </td>\n </tr>\n </tbody>\n</ng-template>\n<ng-template #highlighted let-row=\"row\" let-column=\"column\" let-search=\"search\">\n <div [innerHTML]=\"(row[column.key] | highlight: search)\"></div>\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{row[column.key]}}\n</ng-template>\n<ng-template #templateRef let-row=\"row\" let-column=\"column\" let-index=\"index\" let-templateRef=\"templateRef\">\n <ng-container [ngTemplateOutlet]=\"templateRef\" [ngTemplateOutletContext]=\"{row: row, col: column, index: index}\"></ng-container>\n</ng-template>\n",
|
|
146
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
|
147
|
-
},] }
|
|
148
|
-
];
|
|
149
|
-
CoreComponent.ctorParameters = () => [];
|
|
150
|
-
CoreComponent.propDecorators = {
|
|
151
|
-
loading: [{ type: Input }],
|
|
152
|
-
page: [{ type: Input }],
|
|
153
|
-
search: [{ type: Input }],
|
|
154
|
-
config: [{ type: Input }],
|
|
155
|
-
data: [{ type: Input }]
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
class SortClassPipe {
|
|
159
|
-
transform(selection, property) {
|
|
160
|
-
return (selection === null || selection === void 0 ? void 0 : selection.sortBy) === property ? 'sort-' + selection.sortByOrder : '';
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
SortClassPipe.decorators = [
|
|
164
|
-
{ type: Pipe, args: [{
|
|
165
|
-
name: 'sortClass',
|
|
166
|
-
},] }
|
|
167
|
-
];
|
|
168
|
-
|
|
169
|
-
class DashCasePipe {
|
|
170
|
-
transform(s) {
|
|
171
|
-
return dashed(s);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
DashCasePipe.decorators = [
|
|
175
|
-
{ type: Pipe, args: [{
|
|
176
|
-
name: 'dashCase'
|
|
177
|
-
},] }
|
|
178
|
-
];
|
|
179
|
-
|
|
180
|
-
class HighlightPipe {
|
|
181
|
-
transform(text, searchTerm) {
|
|
182
|
-
if (!searchTerm) {
|
|
183
|
-
return text;
|
|
184
|
-
}
|
|
185
|
-
const haystackAlwaysString = text + '';
|
|
186
|
-
let highlightedText = haystackAlwaysString; // fallback
|
|
187
|
-
let searchPattern;
|
|
188
|
-
try {
|
|
189
|
-
searchPattern = new RegExp('(' +
|
|
190
|
-
// @ts-ignore
|
|
191
|
-
searchTerm
|
|
192
|
-
.toLowerCase()
|
|
193
|
-
.match(/".*?"|[^ ]+/g) // extract words
|
|
194
|
-
.map(needle => needle.replace(/"(.*?)"/, '$1') // strip away '"'
|
|
195
|
-
)
|
|
196
|
-
.join('|') + // combine words
|
|
197
|
-
')', 'ig');
|
|
198
|
-
}
|
|
199
|
-
catch (error) {
|
|
200
|
-
return highlightedText;
|
|
201
|
-
}
|
|
202
|
-
const containsTagPattern = /(<.*?>)(.*)(<\/.*?>)/gi;
|
|
203
|
-
const containsTagMatches = containsTagPattern.exec(haystackAlwaysString);
|
|
204
|
-
if (containsTagMatches) {
|
|
205
|
-
// tag exists in haystack
|
|
206
|
-
highlightedText =
|
|
207
|
-
containsTagMatches[1] +
|
|
208
|
-
containsTagMatches[2].replace(searchPattern, '<span class="gt-highlight-search">$1</span>') +
|
|
209
|
-
containsTagMatches[3];
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
highlightedText = haystackAlwaysString.replace(searchPattern, '<span class="gt-highlight-search">$1</span>');
|
|
213
|
-
}
|
|
214
|
-
return highlightedText;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
HighlightPipe.decorators = [
|
|
218
|
-
{ type: Pipe, args: [{
|
|
219
|
-
name: 'highlight'
|
|
220
|
-
},] }
|
|
221
|
-
];
|
|
222
|
-
|
|
223
|
-
class GenericTableCoreModule {
|
|
224
|
-
}
|
|
225
|
-
GenericTableCoreModule.decorators = [
|
|
226
|
-
{ type: NgModule, args: [{
|
|
227
|
-
declarations: [CoreComponent, SortClassPipe, DashCasePipe, HighlightPipe],
|
|
228
|
-
imports: [CommonModule],
|
|
229
|
-
exports: [CoreComponent]
|
|
230
|
-
},] }
|
|
231
|
-
];
|
|
232
|
-
|
|
233
|
-
/*
|
|
234
|
-
* Public API Surface of core
|
|
235
|
-
*/
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Generated bundle index. Do not edit.
|
|
239
|
-
*/
|
|
240
|
-
|
|
241
|
-
export { CoreComponent, CoreService, GenericTableCoreModule, SortClassPipe as ɵa, DashCasePipe as ɵb, HighlightPipe as ɵc };
|
|
242
|
-
//# sourceMappingURL=angular-generic-table-core.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"angular-generic-table-core.js","sources":["../../projects/core/src/lib/core.service.ts","../projects/core/src/lib/enums/order.enum.ts","../projects/core/src/lib/utilities/utilities.ts","../../projects/core/src/lib/core.component.ts","../projects/core/src/lib/pipes/sort-class.pipe.ts","../projects/core/src/lib/pipes/dash-case.pipe.ts","../projects/core/src/lib/pipes/highlight.pipe.ts","../../projects/core/src/lib/core.module.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/angular-generic-table-core.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CoreService {\n constructor() {}\n}\n","export enum Order {\n ASC = 'asc',\n DESC = 'desc'\n}\n","import { TableRow } from '../models/table-row.interface';\nimport { TableConfig } from '../models/table-config.interface';\n\nexport let dashed: (s: string) => string;\ndashed = (s: string) => s.replace(/[A-Z]/g, m => '-' + m.toLowerCase());\n\nexport let chunk: (array: Array<any>, chunkSize: number) => Array<Array<TableRow>>;\nchunk = (array, chunkSize) => {\n if (chunkSize < 0) {\n throw new Error('Invalid chunk size');\n }\n if (chunkSize === 0 && !chunkSize) {\n return [array];\n }\n const CHUNK = [];\n for (let i = 0, len = array.length; i < len; i += chunkSize) {\n CHUNK.push(array.slice(i, i + chunkSize));\n }\n return CHUNK;\n};\n\nexport let search: (text: string, caseSensitive: boolean, data: Array<TableRow>, config: TableConfig) => TableRow[];\nsearch = (text: string, caseSensitive: boolean, data: Array<TableRow>, config: TableConfig) => {\n const searchColumns = Object.keys(config.columns).filter(\n key => !config.columns[key].hidden && config.columns[key].search !== false\n );\n return data.filter(\n row =>\n Object.entries(row)\n .filter(([key, value]) => searchColumns.indexOf(key) !== -1)\n .reduce(\n (prev, [key, value]): string =>\n prev + (prev === '' ? '' : ' & ') + (caseSensitive ? value + '' : (value + '').toLowerCase()),\n ''\n )\n .indexOf(text) !== -1\n );\n};\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { BehaviorSubject, combineLatest, EMPTY, isObservable, Observable, of, ReplaySubject, Subject } from 'rxjs';\nimport { TableConfig } from './models/table-config.interface';\nimport { KeyValue } from '@angular/common';\nimport { map, shareReplay, startWith, switchMap, withLatestFrom } from 'rxjs/operators';\nimport { TableColumn } from './models/table-column.interface';\nimport { Order } from './enums/order.enum';\nimport { chunk, search } from './utilities/utilities';\nimport { TableRow } from './models/table-row.interface';\nimport { TableSort } from './models/table-sort.interface';\nimport { TableInfo } from './models/table-info.interface';\n\n@Component({\n selector: 'angular-generic-table',\n templateUrl: './core.component.html',\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CoreComponent {\n @Input() set loading(value: Observable<boolean> | boolean) {\n this._loading$.next(value);\n }\n @Input()\n set page(value: Observable<number> | number) {\n this._currentPage$.next(value);\n }\n\n @Input()\n set search(value: Observable<string> | string) {\n this._searchBy$.next(value);\n }\n\n @Input()\n set config(value: Observable<TableConfig> | TableConfig) {\n this._tableConfig$.next(value);\n }\n\n @Input()\n set data(value: Observable<Array<TableRow>> | Array<TableRow>) {\n this._data$.next(value);\n }\n\n constructor() {}\n get loading$(): Observable<boolean> {\n return this._loading$.pipe(\n startWith(false),\n map((value) => (isObservable(value) ? value : of(value))),\n switchMap((obs) => obs),\n shareReplay(1)\n );\n }\n\n private _loading$: ReplaySubject<Observable<boolean> | boolean> = new ReplaySubject(1);\n sortBy$: Subject<TableSort> = new Subject();\n // tslint:disable-next-line:variable-name\n private _sortBy: TableSort | undefined;\n\n // tslint:disable-next-line:variable-name\n private _searchBy$: ReplaySubject<Observable<string> | string> = new ReplaySubject(1);\n searchBy$: Observable<string> = this._searchBy$.pipe(\n startWith(''),\n map((value) => (isObservable(value) ? value : of(value))),\n switchMap((obs) => obs),\n shareReplay(1)\n );\n\n // tslint:disable-next-line:variable-name\n private _tableConfig$: ReplaySubject<TableConfig | Observable<TableConfig>> = new ReplaySubject(1);\n tableConfig$: Observable<TableConfig> = this._tableConfig$.pipe(\n map((value) => (isObservable(value) ? value : of(value))),\n switchMap((obs) => obs),\n shareReplay(1)\n );\n\n // tslint:disable-next-line:variable-name\n private _data$: ReplaySubject<Array<TableRow> | Observable<Array<TableRow>>> = new ReplaySubject(1);\n data$: Observable<Array<TableRow>> = this._data$.pipe(\n map((value) => (isObservable(value) ? value : of(value))),\n switchMap((obs) => combineLatest([obs, this.sortBy$.pipe(startWith(EMPTY)), this.searchBy$])),\n withLatestFrom(this.tableConfig$),\n map(([[data, sortBy, searchBy], config]) => {\n return !sortBy\n ? searchBy\n ? search(searchBy, false, data, config)\n : data\n : (searchBy ? search(searchBy, false, data, config) : data).sort((a, b) => {\n // TODO: improve logic\n const typed = sortBy as TableSort;\n return a[typed.sortBy] > b[typed.sortBy]\n ? typed.sortByOrder === Order.ASC\n ? 1\n : -1\n : b[typed.sortBy] > a[typed.sortBy]\n ? typed.sortByOrder === Order.ASC\n ? -1\n : 1\n : 0;\n });\n })\n );\n\n table$: Observable<{ data: Array<Array<TableRow>>; config: TableConfig; info: TableInfo }> = combineLatest([\n this.data$,\n this.tableConfig$,\n ]).pipe(\n map(([sorted, config]) => {\n // if pagination is disabled...\n if (!config.pagination || config.pagination.length === 0) {\n // ...return unaltered array\n return { data: [sorted], config, info: { records: sorted.length, pageTotal: 1 } };\n }\n // return record set\n return {\n data: chunk(sorted, +config.pagination.length),\n config,\n info: {\n records: sorted.length,\n pageTotal: Math.ceil(sorted.length / +config.pagination.length),\n },\n };\n })\n );\n\n // tslint:disable-next-line:variable-name\n private _currentPage$: BehaviorSubject<any> = new BehaviorSubject(0);\n currentPage$ = this._currentPage$.pipe(\n map((value) => (isObservable(value) ? (value as Observable<number>) : (of(value) as Observable<number>))),\n switchMap((obs) => obs),\n withLatestFrom(this.table$),\n map(([page, table]: any) => {\n // determine last page\n const lastPage = Math.ceil(table.info.records / table.config.pagination.length) - 1;\n // determine max/min position\n return +page < 0 ? 0 : +page > lastPage ? lastPage : +page;\n }),\n shareReplay(1)\n );\n\n colspan$ = this.tableConfig$.pipe(\n map((config) => Object.values(config.columns).filter((value) => value.hidden !== true).length)\n );\n\n sort(property: string): void {\n const newSortOrder =\n this._sortBy?.sortBy !== property || this._sortBy?.sortByOrder === Order.DESC || !this._sortBy.sortByOrder\n ? Order.ASC\n : Order.DESC;\n const newSortBy = {\n sortBy: property,\n sortByOrder: newSortOrder,\n };\n this.sortBy$.next(newSortBy);\n this._sortBy = newSortBy;\n }\n\n columnOrder = (a: KeyValue<string, TableColumn>, b: KeyValue<string, TableColumn>): number => {\n return (a.value.order || 0) - (b.value.order || 0);\n };\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Order } from '../enums/order.enum';\n\n@Pipe({\n name: 'sortClass',\n})\nexport class SortClassPipe implements PipeTransform {\n transform(selection: { sortBy: string; sortByOrder: Order } | any, property: string): string {\n return selection?.sortBy === property ? 'sort-' + selection.sortByOrder : '';\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { dashed } from '../utilities/utilities';\n\n@Pipe({\n name: 'dashCase'\n})\nexport class DashCasePipe implements PipeTransform {\n transform(s: string): any {\n return dashed(s);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'highlight'\n})\nexport class HighlightPipe implements PipeTransform {\n transform(text: any, searchTerm: string | null): string {\n if (!searchTerm) {\n return text;\n }\n const haystackAlwaysString = text + '';\n let highlightedText = haystackAlwaysString; // fallback\n\n let searchPattern;\n try {\n searchPattern = new RegExp(\n '(' +\n // @ts-ignore\n searchTerm\n .toLowerCase()\n .match(/\".*?\"|[^ ]+/g) // extract words\n .map(\n needle => needle.replace(/\"(.*?)\"/, '$1') // strip away '\"'\n )\n .join('|') + // combine words\n ')',\n 'ig'\n );\n } catch (error) {\n return highlightedText;\n }\n\n const containsTagPattern = /(<.*?>)(.*)(<\\/.*?>)/gi;\n const containsTagMatches = containsTagPattern.exec(haystackAlwaysString);\n\n if (containsTagMatches) {\n // tag exists in haystack\n highlightedText =\n containsTagMatches[1] +\n containsTagMatches[2].replace(searchPattern, '<span class=\"gt-highlight-search\">$1</span>') +\n containsTagMatches[3];\n } else {\n highlightedText = haystackAlwaysString.replace(searchPattern, '<span class=\"gt-highlight-search\">$1</span>');\n }\n\n return highlightedText;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CoreComponent } from './core.component';\nimport { CommonModule } from '@angular/common';\nimport { SortClassPipe } from './pipes/sort-class.pipe';\nimport { DashCasePipe } from './pipes/dash-case.pipe';\nimport { HighlightPipe } from './pipes/highlight.pipe';\n\n@NgModule({\n declarations: [CoreComponent, SortClassPipe, DashCasePipe, HighlightPipe],\n imports: [CommonModule],\n exports: [CoreComponent]\n})\nexport class GenericTableCoreModule {}\n","/*\n * Public API Surface of core\n */\n\nexport * from './lib/core.service';\nexport * from './lib/core.component';\nexport * from './lib/core.module';\nexport * from './lib/models/table-config.interface';\nexport * from './lib/models/table-column.interface';\nexport * from './lib/models/table-info.interface';\nexport * from './lib/models/table-row.interface';\nexport * from './lib/models/table-sort.interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {DashCasePipe as ɵb} from './lib/pipes/dash-case.pipe';\nexport {HighlightPipe as ɵc} from './lib/pipes/highlight.pipe';\nexport {SortClassPipe as ɵa} from './lib/pipes/sort-class.pipe';"],"names":[],"mappings":"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"}
|