@angular-generic-table/core 5.0.0-rc.2 → 5.0.0-rc.6

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.
Files changed (65) hide show
  1. package/angular-generic-table-core.d.ts +1 -3
  2. package/esm2020/angular-generic-table-core.mjs +5 -0
  3. package/esm2020/lib/core.component.mjs +118 -0
  4. package/esm2020/lib/core.module.mjs +23 -0
  5. package/esm2020/lib/core.service.mjs +14 -0
  6. package/esm2020/lib/enums/order.enum.mjs +6 -0
  7. package/esm2020/lib/models/table-column.interface.mjs +2 -0
  8. package/esm2020/lib/models/table-config.interface.mjs +2 -0
  9. package/esm2020/lib/models/table-info.interface.mjs +2 -0
  10. package/esm2020/lib/models/table-meta.interface.mjs +2 -0
  11. package/esm2020/lib/models/table-row.interface.mjs +2 -0
  12. package/esm2020/lib/models/table-sort.interface.mjs +2 -0
  13. package/esm2020/lib/pagination/pagination.component.mjs +63 -0
  14. package/esm2020/lib/pagination/pagination.module.mjs +18 -0
  15. package/esm2020/lib/pipes/capital-case.pipe.mjs +17 -0
  16. package/esm2020/lib/pipes/dash-case.pipe.mjs +17 -0
  17. package/esm2020/lib/pipes/dynamic.pipe.mjs +25 -0
  18. package/esm2020/lib/pipes/highlight.pipe.mjs +48 -0
  19. package/esm2020/lib/pipes/sort-class.pipe.mjs +16 -0
  20. package/esm2020/lib/utilities/utilities.mjs +38 -0
  21. package/esm2020/public-api.mjs +15 -0
  22. package/fesm2015/angular-generic-table-core.mjs +378 -0
  23. package/fesm2015/angular-generic-table-core.mjs.map +1 -0
  24. package/fesm2020/angular-generic-table-core.mjs +376 -0
  25. package/fesm2020/angular-generic-table-core.mjs.map +1 -0
  26. package/lib/core.component.d.ts +17 -16
  27. package/lib/core.module.d.ts +11 -0
  28. package/lib/core.service.d.ts +3 -0
  29. package/lib/models/table-column.interface.d.ts +7 -1
  30. package/lib/models/table-config.interface.d.ts +3 -2
  31. package/lib/models/table-meta.interface.d.ts +8 -0
  32. package/lib/models/table-row.interface.d.ts +2 -1
  33. package/lib/pagination/pagination.component.d.ts +14 -0
  34. package/lib/pagination/pagination.module.d.ts +8 -0
  35. package/lib/pipes/capital-case.pipe.d.ts +7 -0
  36. package/lib/pipes/dash-case.pipe.d.ts +3 -0
  37. package/lib/pipes/dynamic.pipe.d.ts +9 -0
  38. package/lib/pipes/highlight.pipe.d.ts +3 -0
  39. package/lib/pipes/sort-class.pipe.d.ts +3 -0
  40. package/lib/utilities/utilities.d.ts +1 -0
  41. package/package.json +19 -7
  42. package/public-api.d.ts +3 -0
  43. package/scss/index.scss +97 -0
  44. package/angular-generic-table-core.metadata.json +0 -1
  45. package/bundles/angular-generic-table-core.umd.js +0 -594
  46. package/bundles/angular-generic-table-core.umd.js.map +0 -1
  47. package/bundles/angular-generic-table-core.umd.min.js +0 -2
  48. package/bundles/angular-generic-table-core.umd.min.js.map +0 -1
  49. package/esm2015/angular-generic-table-core.js +0 -8
  50. package/esm2015/lib/core.component.js +0 -107
  51. package/esm2015/lib/core.module.js +0 -16
  52. package/esm2015/lib/core.service.js +0 -13
  53. package/esm2015/lib/enums/order.enum.js +0 -6
  54. package/esm2015/lib/models/table-column.interface.js +0 -2
  55. package/esm2015/lib/models/table-config.interface.js +0 -2
  56. package/esm2015/lib/models/table-info.interface.js +0 -2
  57. package/esm2015/lib/models/table-row.interface.js +0 -2
  58. package/esm2015/lib/models/table-sort.interface.js +0 -2
  59. package/esm2015/lib/pipes/dash-case.pipe.js +0 -13
  60. package/esm2015/lib/pipes/highlight.pipe.js +0 -44
  61. package/esm2015/lib/pipes/sort-class.pipe.js +0 -12
  62. package/esm2015/lib/utilities/utilities.js +0 -25
  63. package/esm2015/public-api.js +0 -12
  64. package/fesm2015/angular-generic-table-core.js +0 -234
  65. package/fesm2015/angular-generic-table-core.js.map +0 -1
@@ -0,0 +1,376 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, Pipe, Injector, Component, ChangeDetectionStrategy, Input, NgModule } from '@angular/core';
3
+ import { ReplaySubject, Subject, isObservable, of, combineLatest, EMPTY, BehaviorSubject } from 'rxjs';
4
+ import { startWith, map, switchMap, shareReplay, withLatestFrom, pluck } from 'rxjs/operators';
5
+ import * as i1 from '@angular/common';
6
+ import { CommonModule } from '@angular/common';
7
+
8
+ class CoreService {
9
+ constructor() { }
10
+ }
11
+ CoreService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: CoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
12
+ CoreService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: CoreService, providedIn: 'root' });
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: CoreService, decorators: [{
14
+ type: Injectable,
15
+ args: [{
16
+ providedIn: 'root'
17
+ }]
18
+ }], ctorParameters: function () { return []; } });
19
+
20
+ var Order;
21
+ (function (Order) {
22
+ Order["ASC"] = "asc";
23
+ Order["DESC"] = "desc";
24
+ })(Order || (Order = {}));
25
+
26
+ let dashed;
27
+ dashed = (s) => s.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());
28
+ let capitalize;
29
+ capitalize = (s) => s
30
+ .replace(/_/g, ' ')
31
+ .replace(/([A-Z])/g, (match) => ` ${match}`)
32
+ .replace(/^./, (match) => match.toUpperCase())
33
+ .trim();
34
+ let chunk;
35
+ chunk = (array, chunkSize) => {
36
+ if (chunkSize < 0) {
37
+ throw new Error('Invalid chunk size');
38
+ }
39
+ if (chunkSize === 0 && !chunkSize) {
40
+ return [array];
41
+ }
42
+ const CHUNK = [];
43
+ for (let i = 0, len = array.length; i < len; i += chunkSize) {
44
+ CHUNK.push(array.slice(i, i + chunkSize));
45
+ }
46
+ return CHUNK;
47
+ };
48
+ let search;
49
+ search = (text, caseSensitive, data, config) => {
50
+ if (config.columns) {
51
+ const searchColumns = Object.keys(config.columns).filter(
52
+ // @ts-ignore
53
+ (key) => !config.columns[key].hidden && config.columns[key].search !== false);
54
+ return data.filter((row) => Object.entries(row)
55
+ .filter(([key, value]) => searchColumns.indexOf(key) !== -1)
56
+ .reduce((prev, [key, value]) => prev + (prev === '' ? '' : ' & ') + (caseSensitive ? value + '' : (value + '').toLowerCase()), '')
57
+ .indexOf(text) !== -1);
58
+ }
59
+ else {
60
+ return data;
61
+ }
62
+ };
63
+
64
+ class SortClassPipe {
65
+ transform(selection, property) {
66
+ return selection?.sortBy === property ? 'sort-' + selection.sortByOrder : '';
67
+ }
68
+ }
69
+ SortClassPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: SortClassPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
70
+ SortClassPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: SortClassPipe, name: "sortClass" });
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: SortClassPipe, decorators: [{
72
+ type: Pipe,
73
+ args: [{
74
+ name: 'sortClass',
75
+ }]
76
+ }] });
77
+
78
+ class DashCasePipe {
79
+ transform(s) {
80
+ return dashed(s);
81
+ }
82
+ }
83
+ DashCasePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DashCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
84
+ DashCasePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DashCasePipe, name: "dashCase" });
85
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DashCasePipe, decorators: [{
86
+ type: Pipe,
87
+ args: [{
88
+ name: 'dashCase'
89
+ }]
90
+ }] });
91
+
92
+ class CapitalCasePipe {
93
+ transform(s) {
94
+ return capitalize(s);
95
+ }
96
+ }
97
+ CapitalCasePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: CapitalCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
98
+ CapitalCasePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: CapitalCasePipe, name: "capitalCase" });
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: CapitalCasePipe, decorators: [{
100
+ type: Pipe,
101
+ args: [{
102
+ name: 'capitalCase',
103
+ }]
104
+ }] });
105
+
106
+ class HighlightPipe {
107
+ transform(text, searchTerm) {
108
+ if (!searchTerm) {
109
+ return text;
110
+ }
111
+ const haystackAlwaysString = text + '';
112
+ let highlightedText = haystackAlwaysString; // fallback
113
+ let searchPattern;
114
+ try {
115
+ searchPattern = new RegExp('(' +
116
+ // @ts-ignore
117
+ searchTerm
118
+ .toLowerCase()
119
+ .match(/".*?"|[^ ]+/g) // extract words
120
+ .map(needle => needle.replace(/"(.*?)"/, '$1') // strip away '"'
121
+ )
122
+ .join('|') + // combine words
123
+ ')', 'ig');
124
+ }
125
+ catch (error) {
126
+ return highlightedText;
127
+ }
128
+ const containsTagPattern = /(<.*?>)(.*)(<\/.*?>)/gi;
129
+ const containsTagMatches = containsTagPattern.exec(haystackAlwaysString);
130
+ if (containsTagMatches) {
131
+ // tag exists in haystack
132
+ highlightedText =
133
+ containsTagMatches[1] +
134
+ containsTagMatches[2].replace(searchPattern, '<span class="gt-highlight-search">$1</span>') +
135
+ containsTagMatches[3];
136
+ }
137
+ else {
138
+ highlightedText = haystackAlwaysString.replace(searchPattern, '<span class="gt-highlight-search">$1</span>');
139
+ }
140
+ return highlightedText;
141
+ }
142
+ }
143
+ HighlightPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HighlightPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
144
+ HighlightPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HighlightPipe, name: "highlight" });
145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HighlightPipe, decorators: [{
146
+ type: Pipe,
147
+ args: [{
148
+ name: 'highlight'
149
+ }]
150
+ }] });
151
+
152
+ class DynamicPipe {
153
+ constructor(injector) {
154
+ this.injector = injector;
155
+ }
156
+ transform(value, requiredPipe, pipeArgs) {
157
+ const injector = Injector.create({
158
+ name: 'DynamicPipe',
159
+ parent: this.injector,
160
+ providers: [{ provide: requiredPipe }],
161
+ });
162
+ const pipe = injector.get(requiredPipe);
163
+ return pipe.transform(value, ...pipeArgs);
164
+ }
165
+ }
166
+ DynamicPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DynamicPipe, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Pipe });
167
+ DynamicPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DynamicPipe, name: "dynamicPipe" });
168
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DynamicPipe, decorators: [{
169
+ type: Pipe,
170
+ args: [{
171
+ name: 'dynamicPipe',
172
+ }]
173
+ }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
174
+
175
+ class CoreComponent {
176
+ constructor() {
177
+ this._loading$ = new ReplaySubject(1);
178
+ this.sortBy$ = new Subject();
179
+ // tslint:disable-next-line:variable-name
180
+ this._searchBy$ = new ReplaySubject(1);
181
+ this.searchBy$ = this._searchBy$.pipe(startWith(''), map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
182
+ // tslint:disable-next-line:variable-name
183
+ this._tableConfig$ = new ReplaySubject(1);
184
+ this.tableConfig$ = this._tableConfig$.pipe(map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
185
+ // tslint:disable-next-line:variable-name
186
+ this._data$ = new ReplaySubject(1);
187
+ 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]) => {
188
+ return !sortBy
189
+ ? searchBy
190
+ ? search(searchBy, false, data, config)
191
+ : data
192
+ : (searchBy ? search(searchBy, false, data, config) : data).sort((a, b) => {
193
+ // TODO: improve logic
194
+ const typed = sortBy;
195
+ return a[typed.sortBy] > b[typed.sortBy]
196
+ ? typed.sortByOrder === Order.ASC
197
+ ? 1
198
+ : -1
199
+ : b[typed.sortBy] > a[typed.sortBy]
200
+ ? typed.sortByOrder === Order.ASC
201
+ ? -1
202
+ : 1
203
+ : 0;
204
+ });
205
+ }));
206
+ this.table$ = combineLatest([this.data$, this.tableConfig$]).pipe(map(([sorted, config]) => {
207
+ // if pagination is disabled...
208
+ if (!config.pagination || config.pagination.length === 0) {
209
+ // ...return unaltered array
210
+ return { data: [sorted], config, info: { records: sorted.length, pageTotal: 1 } };
211
+ }
212
+ // return record set
213
+ return {
214
+ data: chunk(sorted, +(config.pagination.length || 0)),
215
+ config,
216
+ info: {
217
+ records: sorted.length,
218
+ pageTotal: Math.ceil(sorted.length / +(config.pagination.length || 0)),
219
+ },
220
+ };
221
+ }));
222
+ this._currentPage$ = new BehaviorSubject(0);
223
+ this.currentPage$ = combineLatest([this._currentPage$, this.table$]).pipe(map(([page, table]) => {
224
+ // determine last page
225
+ const lastPage = Math.ceil(table.info.records / (table.config?.pagination?.length || table.info.records)) - 1;
226
+ // determine max/min position
227
+ return +page < 0 ? 0 : +page > lastPage ? lastPage : +page;
228
+ }), shareReplay(1));
229
+ this.colspan$ = this.tableConfig$.pipe(map((config) => Object.values(config.columns).filter((value) => value.hidden !== true).length));
230
+ this.columnOrder = (a, b) => {
231
+ return (a.value.order || 0) - (b.value.order || 0);
232
+ };
233
+ }
234
+ set loading(value) {
235
+ this._loading$.next(value);
236
+ }
237
+ set page(value) {
238
+ this._currentPage$.next(value);
239
+ }
240
+ set search(value) {
241
+ this._searchBy$.next(value);
242
+ }
243
+ set config(value) {
244
+ this._tableConfig$.next(value);
245
+ }
246
+ set data(value) {
247
+ this._data$.next(value);
248
+ }
249
+ get loading$() {
250
+ return this._loading$.pipe(startWith(false), map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
251
+ }
252
+ sort(property) {
253
+ const newSortOrder = this._sortBy?.sortBy !== property || this._sortBy?.sortByOrder === Order.DESC || !this._sortBy.sortByOrder
254
+ ? Order.ASC
255
+ : Order.DESC;
256
+ const newSortBy = {
257
+ sortBy: property,
258
+ sortByOrder: newSortOrder,
259
+ };
260
+ this.sortBy$.next(newSortBy);
261
+ this._sortBy = newSortBy;
262
+ }
263
+ }
264
+ CoreComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: CoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
265
+ CoreComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: CoreComponent, selector: "angular-generic-table", inputs: { loading: "loading", page: "page", search: "search", config: "config", data: "data" }, ngImport: i0, template: "<table id=\"agreementList_table\" [ngClass]=\"(tableConfig$ | async)?.class || '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 *ngIf=\"column.value?.header !== false\">{{ column.value?.header || column.key | capitalCase }}</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 <span *ngIf=\"column.value.mobileHeader\" class=\"mobile-header\">{{ column.value?.mobileHeader !== true ? column.value?.mobileHeader : column.value?.header || column.key | capitalCase }}</span>\n <ng-container [ngTemplateOutlet]=\"(searchBy$ | async) && !table.config.columns[column.key].templateRef ? highlighted:\n table.config.columns[column.key].templateRef ? templateRef : table.config.columns[column.key].transform ? transformData:\n rawData\" [ngTemplateOutletContext]=\"{row: row, column: column, search: (searchBy$ | async), transform: table.config.columns[column.key].transform, 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 #transformData let-row=\"row\" let-column=\"column\" let-transform=\"transform\">\n {{row[column.key] | dynamicPipe:transform.pipe:transform?.args}}\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", directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i1.AsyncPipe, "keyvalue": i1.KeyValuePipe, "sortClass": SortClassPipe, "dashCase": DashCasePipe, "capitalCase": CapitalCasePipe, "highlight": HighlightPipe, "dynamicPipe": DynamicPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: CoreComponent, decorators: [{
267
+ type: Component,
268
+ args: [{ selector: 'angular-generic-table', styles: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<table id=\"agreementList_table\" [ngClass]=\"(tableConfig$ | async)?.class || '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 *ngIf=\"column.value?.header !== false\">{{ column.value?.header || column.key | capitalCase }}</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 <span *ngIf=\"column.value.mobileHeader\" class=\"mobile-header\">{{ column.value?.mobileHeader !== true ? column.value?.mobileHeader : column.value?.header || column.key | capitalCase }}</span>\n <ng-container [ngTemplateOutlet]=\"(searchBy$ | async) && !table.config.columns[column.key].templateRef ? highlighted:\n table.config.columns[column.key].templateRef ? templateRef : table.config.columns[column.key].transform ? transformData:\n rawData\" [ngTemplateOutletContext]=\"{row: row, column: column, search: (searchBy$ | async), transform: table.config.columns[column.key].transform, 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 #transformData let-row=\"row\" let-column=\"column\" let-transform=\"transform\">\n {{row[column.key] | dynamicPipe:transform.pipe:transform?.args}}\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" }]
269
+ }], propDecorators: { loading: [{
270
+ type: Input
271
+ }], page: [{
272
+ type: Input
273
+ }], search: [{
274
+ type: Input
275
+ }], config: [{
276
+ type: Input
277
+ }], data: [{
278
+ type: Input
279
+ }] } });
280
+
281
+ class GenericTableCoreModule {
282
+ }
283
+ GenericTableCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: GenericTableCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
284
+ GenericTableCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: GenericTableCoreModule, declarations: [CoreComponent, SortClassPipe, DashCasePipe, HighlightPipe, CapitalCasePipe, CapitalCasePipe, DynamicPipe], imports: [CommonModule], exports: [CoreComponent] });
285
+ GenericTableCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: GenericTableCoreModule, imports: [[CommonModule]] });
286
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: GenericTableCoreModule, decorators: [{
287
+ type: NgModule,
288
+ args: [{
289
+ declarations: [CoreComponent, SortClassPipe, DashCasePipe, HighlightPipe, CapitalCasePipe, CapitalCasePipe, DynamicPipe],
290
+ imports: [CommonModule],
291
+ exports: [CoreComponent],
292
+ }]
293
+ }] });
294
+
295
+ class PaginationComponent {
296
+ constructor() {
297
+ this.table$ = new ReplaySubject(1);
298
+ this.pagination$ = this.table$.pipe(switchMap((core) => combineLatest([core?.table$.pipe(pluck('info')), core?.currentPage$])), map(([info, currentPage]) => this.generateList(info.pageTotal, currentPage)));
299
+ }
300
+ get table() {
301
+ return this._table;
302
+ }
303
+ set table(value) {
304
+ this._table = value;
305
+ this.table$.next(value);
306
+ }
307
+ generateList(pages, currentPosition) {
308
+ const paginationLength = 5;
309
+ const middle = Math.floor(paginationLength / 2);
310
+ const length = pages < paginationLength ? pages : paginationLength;
311
+ return Array.from({ length }, (_, i) => {
312
+ if (i === 0) {
313
+ return 1;
314
+ }
315
+ else if (pages < paginationLength) {
316
+ return i + 1;
317
+ }
318
+ else if (i + 1 === length) {
319
+ return pages;
320
+ }
321
+ else if (currentPosition > middle && currentPosition < pages - middle) {
322
+ return i + currentPosition - (middle - 1);
323
+ }
324
+ else if (currentPosition > middle && currentPosition < pages - (middle - 1)) {
325
+ return i + currentPosition - middle;
326
+ }
327
+ else if (currentPosition > middle && currentPosition === pages - (middle - 1)) {
328
+ return i + currentPosition - (middle + 1);
329
+ }
330
+ else if (currentPosition > middle && currentPosition === pages - 1) {
331
+ return i + currentPosition - (middle + 2);
332
+ }
333
+ else {
334
+ return i + 1;
335
+ }
336
+ });
337
+ }
338
+ goto(page) {
339
+ if (this.table) {
340
+ this.table.page = page - 1;
341
+ }
342
+ }
343
+ }
344
+ PaginationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
345
+ PaginationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: PaginationComponent, selector: "angular-generic-table-pagination", inputs: { table: "table" }, ngImport: i0, template: "<ng-container *ngIf=\"{\n links: pagination$ | async,\n currentPosition: table?.currentPage$ | async\n } as pagination\">\n <nav *ngIf=\"pagination.links && pagination.links.length > 1\" role=\"navigation\" aria-label=\"Table Pagination Navigation\" class=\"gt-pagination\">\n <ul>\n <li *ngFor=\"let position of pagination!.links; let i = index; let last = last\"\n [class.ellipsis]=\"position + 1 !== pagination!.links![i+1] && !last\"\n [class.active]=\"position === (pagination!.currentPosition || 0) + 1\"\n >\n <button class=\"btn btn-link\" [attr.aria-label]=\"'Goto Page ' + position\" (click)=\"goto(position)\">{{position}}</button>\n </li>\n </ul>\n</nav>\n</ng-container>\n", directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i1.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
346
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: PaginationComponent, decorators: [{
347
+ type: Component,
348
+ args: [{ selector: 'angular-generic-table-pagination', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"{\n links: pagination$ | async,\n currentPosition: table?.currentPage$ | async\n } as pagination\">\n <nav *ngIf=\"pagination.links && pagination.links.length > 1\" role=\"navigation\" aria-label=\"Table Pagination Navigation\" class=\"gt-pagination\">\n <ul>\n <li *ngFor=\"let position of pagination!.links; let i = index; let last = last\"\n [class.ellipsis]=\"position + 1 !== pagination!.links![i+1] && !last\"\n [class.active]=\"position === (pagination!.currentPosition || 0) + 1\"\n >\n <button class=\"btn btn-link\" [attr.aria-label]=\"'Goto Page ' + position\" (click)=\"goto(position)\">{{position}}</button>\n </li>\n </ul>\n</nav>\n</ng-container>\n" }]
349
+ }], propDecorators: { table: [{
350
+ type: Input
351
+ }] } });
352
+
353
+ class GenericTablePaginationModule {
354
+ }
355
+ GenericTablePaginationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: GenericTablePaginationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
356
+ GenericTablePaginationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: GenericTablePaginationModule, declarations: [PaginationComponent], imports: [CommonModule], exports: [PaginationComponent] });
357
+ GenericTablePaginationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: GenericTablePaginationModule, imports: [[CommonModule]] });
358
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: GenericTablePaginationModule, decorators: [{
359
+ type: NgModule,
360
+ args: [{
361
+ declarations: [PaginationComponent],
362
+ imports: [CommonModule],
363
+ exports: [PaginationComponent],
364
+ }]
365
+ }] });
366
+
367
+ /*
368
+ * Public API Surface of core
369
+ */
370
+
371
+ /**
372
+ * Generated bundle index. Do not edit.
373
+ */
374
+
375
+ export { CoreComponent, CoreService, GenericTableCoreModule, GenericTablePaginationModule, PaginationComponent };
376
+ //# sourceMappingURL=angular-generic-table-core.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-generic-table-core.mjs","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/pipes/sort-class.pipe.ts","../../../projects/core/src/lib/pipes/dash-case.pipe.ts","../../../projects/core/src/lib/pipes/capital-case.pipe.ts","../../../projects/core/src/lib/pipes/highlight.pipe.ts","../../../projects/core/src/lib/pipes/dynamic.pipe.ts","../../../projects/core/src/lib/core.component.ts","../../../projects/core/src/lib/core.component.html","../../../projects/core/src/lib/core.module.ts","../../../projects/core/src/lib/pagination/pagination.component.ts","../../../projects/core/src/lib/pagination/pagination.component.html","../../../projects/core/src/lib/pagination/pagination.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 capitalize: (s: string) => string;\ncapitalize = (s: string) =>\n s\n .replace(/_/g, ' ')\n .replace(/([A-Z])/g, (match) => ` ${match}`)\n .replace(/^./, (match) => match.toUpperCase())\n .trim();\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 if (config.columns) {\n const searchColumns = Object.keys(config.columns).filter(\n // @ts-ignore\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 } else {\n return data;\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';\nimport { capitalize } from '../utilities/utilities';\n\n@Pipe({\n name: 'capitalCase',\n})\nexport class CapitalCasePipe implements PipeTransform {\n transform(s: string): any {\n return capitalize(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 { Injector, Pipe, PipeTransform, Type } from '@angular/core';\n\n@Pipe({\n name: 'dynamicPipe',\n})\nexport class DynamicPipe implements PipeTransform {\n constructor(private injector: Injector) {}\n\n transform(value: any, requiredPipe: Type<any>, pipeArgs: any[]): any {\n const injector = Injector.create({\n name: 'DynamicPipe',\n parent: this.injector,\n providers: [{ provide: requiredPipe }],\n });\n const pipe = injector.get(requiredPipe);\n return pipe.transform(value, ...pipeArgs);\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 { TableMeta } from './models/table-meta.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: number) {\n this._currentPage$.next(value);\n }\n\n @Input()\n set search(value: Observable<string> | string | null) {\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 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 | null> = new ReplaySubject(1);\n searchBy$: Observable<string | null> = 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<TableMeta> = combineLatest([this.data$, this.tableConfig$]).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 || 0)),\n config,\n info: {\n records: sorted.length,\n pageTotal: Math.ceil(sorted.length / +(config.pagination.length || 0)),\n },\n };\n })\n );\n\n private _currentPage$: BehaviorSubject<number> = new BehaviorSubject(0);\n currentPage$ = combineLatest([this._currentPage$, this.table$]).pipe(\n map(([page, table]: any) => {\n // determine last page\n const lastPage = Math.ceil(table.info.records / (table.config?.pagination?.length || table.info.records)) - 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","<table id=\"agreementList_table\" [ngClass]=\"(tableConfig$ | async)?.class || '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 *ngIf=\"column.value?.header !== false\">{{ column.value?.header || column.key | capitalCase }}</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 <span *ngIf=\"column.value.mobileHeader\" class=\"mobile-header\">{{ column.value?.mobileHeader !== true ? column.value?.mobileHeader : column.value?.header || column.key | capitalCase }}</span>\n <ng-container [ngTemplateOutlet]=\"(searchBy$ | async) && !table.config.columns[column.key].templateRef ? highlighted:\n table.config.columns[column.key].templateRef ? templateRef : table.config.columns[column.key].transform ? transformData:\n rawData\" [ngTemplateOutletContext]=\"{row: row, column: column, search: (searchBy$ | async), transform: table.config.columns[column.key].transform, 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 #transformData let-row=\"row\" let-column=\"column\" let-transform=\"transform\">\n {{row[column.key] | dynamicPipe:transform.pipe:transform?.args}}\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","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';\nimport { CapitalCasePipe } from './pipes/capital-case.pipe';\nimport { DynamicPipe } from './pipes/dynamic.pipe';\n\n@NgModule({\n declarations: [CoreComponent, SortClassPipe, DashCasePipe, HighlightPipe, CapitalCasePipe, CapitalCasePipe, DynamicPipe],\n imports: [CommonModule],\n exports: [CoreComponent],\n})\nexport class GenericTableCoreModule {}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { combineLatest, ReplaySubject } from 'rxjs';\nimport { map, pluck, switchMap } from 'rxjs/operators';\nimport { CoreComponent } from '../core.component';\n\n@Component({\n selector: 'angular-generic-table-pagination',\n templateUrl: './pagination.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PaginationComponent {\n get table(): CoreComponent | undefined {\n return this._table;\n }\n @Input() set table(value: any) {\n this._table = value;\n this.table$.next(value);\n }\n\n table$: ReplaySubject<CoreComponent> = new ReplaySubject(1);\n private _table: CoreComponent | undefined;\n pagination$ = this.table$.pipe(\n switchMap((core) => combineLatest([core?.table$.pipe(pluck('info')), core?.currentPage$])),\n map(([info, currentPage]) => this.generateList(info.pageTotal, currentPage))\n );\n\n generateList(pages: number, currentPosition: number): Array<number> {\n const paginationLength: 5 | 7 = 5;\n const middle = Math.floor(paginationLength / 2);\n const length = pages < paginationLength ? pages : paginationLength;\n\n return Array.from({ length }, (_, i) => {\n if (i === 0) {\n return 1;\n } else if (pages < paginationLength) {\n return i + 1;\n } else if (i + 1 === length) {\n return pages;\n } else if (currentPosition > middle && currentPosition < pages - middle) {\n return i + currentPosition - (middle - 1);\n } else if (currentPosition > middle && currentPosition < pages - (middle - 1)) {\n return i + currentPosition - middle;\n } else if (currentPosition > middle && currentPosition === pages - (middle - 1)) {\n return i + currentPosition - (middle + 1);\n } else if (currentPosition > middle && currentPosition === pages - 1) {\n return i + currentPosition - (middle + 2);\n } else {\n return i + 1;\n }\n });\n }\n\n goto(page: number): void {\n if (this.table) {\n this.table.page = page - 1;\n }\n }\n}\n","<ng-container *ngIf=\"{\n links: pagination$ | async,\n currentPosition: table?.currentPage$ | async\n } as pagination\">\n <nav *ngIf=\"pagination.links && pagination.links.length > 1\" role=\"navigation\" aria-label=\"Table Pagination Navigation\" class=\"gt-pagination\">\n <ul>\n <li *ngFor=\"let position of pagination!.links; let i = index; let last = last\"\n [class.ellipsis]=\"position + 1 !== pagination!.links![i+1] && !last\"\n [class.active]=\"position === (pagination!.currentPosition || 0) + 1\"\n >\n <button class=\"btn btn-link\" [attr.aria-label]=\"'Goto Page ' + position\" (click)=\"goto(position)\">{{position}}</button>\n </li>\n </ul>\n</nav>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PaginationComponent } from './pagination.component';\n\n@NgModule({\n declarations: [PaginationComponent],\n imports: [CommonModule],\n exports: [PaginationComponent],\n})\nexport class GenericTablePaginationModule {}\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/pagination/pagination.component';\nexport * from './lib/pagination/pagination.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';\nexport * from './lib/models/table-meta.interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;MAKa,WAAW;IACtB,iBAAgB;;wGADL,WAAW;4GAAX,WAAW,cAFV,MAAM;2FAEP,WAAW;kBAHvB,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;ACJD,IAAY,KAGX;AAHD,WAAY,KAAK;IACf,oBAAW,CAAA;IACX,sBAAa,CAAA;AACf,CAAC,EAHW,KAAK,KAAL,KAAK;;ACGV,IAAI,MAA6B,CAAC;AACzC,MAAM,GAAG,CAAC,CAAS,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAEnE,IAAI,UAAiC,CAAC;AAC7C,UAAU,GAAG,CAAC,CAAS,KACrB,CAAC;KACE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;KAClB,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,EAAE,CAAC;KAC3C,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;KAC7C,IAAI,EAAE,CAAC;AAEL,IAAI,KAAuE,CAAC;AACnF,KAAK,GAAG,CAAC,KAAK,EAAE,SAAS;IACvB,IAAI,SAAS,GAAG,CAAC,EAAE;QACjB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;KACvC;IACD,IAAI,SAAS,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;QACjC,OAAO,CAAC,KAAK,CAAC,CAAC;KAChB;IACD,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,SAAS,EAAE;QAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;KAC3C;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEK,IAAI,MAAwG,CAAC;AACpH,MAAM,GAAG,CAAC,IAAY,EAAE,aAAsB,EAAE,IAAqB,EAAE,MAAmB;IACxF,IAAI,MAAM,CAAC,OAAO,EAAE;QAClB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM;;QAEtD,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,KAAK,CAC7E,CAAC;QACF,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,GAAG,KACF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;aAChB,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;aAC3D,MAAM,CACL,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,KACjB,IAAI,IAAI,IAAI,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,aAAa,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,EAC/F,EAAE,CACH;aACA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAC1B,CAAC;KACH;SAAM;QACL,OAAO,IAAI,CAAC;KACb;AACH,CAAC;;MC5CY,aAAa;IACxB,SAAS,CAAC,SAAuD,EAAE,QAAgB;QACjF,OAAO,SAAS,EAAE,MAAM,KAAK,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC,WAAW,GAAG,EAAE,CAAC;KAC9E;;0GAHU,aAAa;wGAAb,aAAa;2FAAb,aAAa;kBAHzB,IAAI;mBAAC;oBACJ,IAAI,EAAE,WAAW;iBAClB;;;MCCY,YAAY;IACvB,SAAS,CAAC,CAAS;QACjB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;KAClB;;yGAHU,YAAY;uGAAZ,YAAY;2FAAZ,YAAY;kBAHxB,IAAI;mBAAC;oBACJ,IAAI,EAAE,UAAU;iBACjB;;;MCCY,eAAe;IAC1B,SAAS,CAAC,CAAS;QACjB,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;KACtB;;4GAHU,eAAe;0GAAf,eAAe;2FAAf,eAAe;kBAH3B,IAAI;mBAAC;oBACJ,IAAI,EAAE,aAAa;iBACpB;;;MCAY,aAAa;IACxB,SAAS,CAAC,IAAS,EAAE,UAAyB;QAC5C,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,IAAI,CAAC;SACb;QACD,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAE,CAAC;QACvC,IAAI,eAAe,GAAG,oBAAoB,CAAC;QAE3C,IAAI,aAAa,CAAC;QAClB,IAAI;YACF,aAAa,GAAG,IAAI,MAAM,CACxB,GAAG;;gBAEH,UAAU;qBACP,WAAW,EAAE;qBACb,KAAK,CAAC,cAAc,CAAC;qBACrB,GAAG,CACF,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC;iBAC1C;qBACA,IAAI,CAAC,GAAG,CAAC;gBACV,GAAG,EACL,IAAI,CACL,CAAC;SACH;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,eAAe,CAAC;SACxB;QAED,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;QACpD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAEzE,IAAI,kBAAkB,EAAE;;YAEtB,eAAe;gBACb,kBAAkB,CAAC,CAAC,CAAC;oBACrB,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,6CAA6C,CAAC;oBAC3F,kBAAkB,CAAC,CAAC,CAAC,CAAC;SACzB;aAAM;YACL,eAAe,GAAG,oBAAoB,CAAC,OAAO,CAAC,aAAa,EAAE,6CAA6C,CAAC,CAAC;SAC9G;QAED,OAAO,eAAe,CAAC;KACxB;;0GAzCU,aAAa;wGAAb,aAAa;2FAAb,aAAa;kBAHzB,IAAI;mBAAC;oBACJ,IAAI,EAAE,WAAW;iBAClB;;;MCCY,WAAW;IACtB,YAAoB,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;KAAI;IAE1C,SAAS,CAAC,KAAU,EAAE,YAAuB,EAAE,QAAe;QAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,IAAI,CAAC,QAAQ;YACrB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;SACvC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;KAC3C;;wGAXU,WAAW;sGAAX,WAAW;2FAAX,WAAW;kBAHvB,IAAI;mBAAC;oBACJ,IAAI,EAAE,aAAa;iBACpB;;;MCcY,aAAa;IAN1B;QAuCU,cAAS,GAAiD,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;QACvF,YAAO,GAAuB,IAAI,OAAO,EAAE,CAAC;;QAKpC,eAAU,GAAsD,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7F,cAAS,GAA8B,IAAI,CAAC,UAAU,CAAC,IAAI,CACzD,SAAS,CAAC,EAAE,CAAC,EACb,GAAG,CAAC,CAAC,KAAK,MAAM,YAAY,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EACzD,SAAS,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EACvB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;;QAGM,kBAAa,GAAyD,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;QACnG,iBAAY,GAA4B,IAAI,CAAC,aAAa,CAAC,IAAI,CAC7D,GAAG,CAAC,CAAC,KAAK,MAAM,YAAY,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EACzD,SAAS,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EACvB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;;QAGM,WAAM,GAAiE,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;QACpG,UAAK,GAAgC,IAAI,CAAC,MAAM,CAAC,IAAI,CACnD,GAAG,CAAC,CAAC,KAAK,MAAM,YAAY,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EACzD,SAAS,CAAC,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAC7F,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,EACjC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;YACrC,OAAO,CAAC,MAAM;kBACV,QAAQ;sBACN,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC;sBACrC,IAAI;kBACN,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;;oBAElE,MAAM,KAAK,GAAG,MAAmB,CAAC;oBAClC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;0BACpC,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,GAAG;8BAC7B,CAAC;8BACD,CAAC,CAAC;0BACJ,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;8BACjC,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,GAAG;kCAC7B,CAAC,CAAC;kCACF,CAAC;8BACH,CAAC,CAAC;iBACP,CAAC,CAAC;SACR,CAAC,CACH,CAAC;QAEF,WAAM,GAA0B,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CACjF,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;;YAEnB,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;;gBAExD,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;aACnF;;YAED,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;gBACrD,MAAM;gBACN,IAAI,EAAE;oBACJ,OAAO,EAAE,MAAM,CAAC,MAAM;oBACtB,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;iBACvE;aACF,CAAC;SACH,CAAC,CACH,CAAC;QAEM,kBAAa,GAA4B,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;QACxE,iBAAY,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAClE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAM;;YAErB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;;YAE9G,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC;SAC5D,CAAC,EACF,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;QAEF,aAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAC/B,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,CAC/F,CAAC;QAeF,gBAAW,GAAG,CAAC,CAAgC,EAAE,CAAgC;YAC/E,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;SACpD,CAAC;KACH;IAnIC,IAAa,OAAO,CAAC,KAAoC;QACvD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC5B;IACD,IACI,IAAI,CAAC,KAAa;QACpB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAChC;IAED,IACI,MAAM,CAAC,KAAyC;QAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC7B;IAED,IACI,MAAM,CAAC,KAA4C;QACrD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAChC;IAED,IACI,IAAI,CAAC,KAAoD;QAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACzB;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CACxB,SAAS,CAAC,KAAK,CAAC,EAChB,GAAG,CAAC,CAAC,KAAK,MAAM,YAAY,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EACzD,SAAS,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EACvB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;KACH;IAqFD,IAAI,CAAC,QAAgB;QACnB,MAAM,YAAY,GAChB,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW;cACtG,KAAK,CAAC,GAAG;cACT,KAAK,CAAC,IAAI,CAAC;QACjB,MAAM,SAAS,GAAG;YAChB,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,YAAY;SAC1B,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;KAC1B;;0GA/HU,aAAa;8FAAb,aAAa,6JClB1B,2zGAkEA;2FDhDa,aAAa;kBANzB,SAAS;+BACE,uBAAuB,UAEzB,EAAE,mBACO,uBAAuB,CAAC,MAAM;8BAGlC,OAAO;sBAAnB,KAAK;gBAIF,IAAI;sBADP,KAAK;gBAMF,MAAM;sBADT,KAAK;gBAMF,MAAM;sBADT,KAAK;gBAMF,IAAI;sBADP,KAAK;;;MEvBK,sBAAsB;;mHAAtB,sBAAsB;oHAAtB,sBAAsB,iBAJlB,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,aAC7G,YAAY,aACZ,aAAa;oHAEZ,sBAAsB,YAHxB,CAAC,YAAY,CAAC;2FAGZ,sBAAsB;kBALlC,QAAQ;mBAAC;oBACR,YAAY,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,CAAC;oBACxH,OAAO,EAAE,CAAC,YAAY,CAAC;oBACvB,OAAO,EAAE,CAAC,aAAa,CAAC;iBACzB;;;MCHY,mBAAmB;IALhC;QAcE,WAAM,GAAiC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;QAE5D,gBAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAC5B,SAAS,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAC1F,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAC7E,CAAC;KAiCH;IA9CC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;KACpB;IACD,IAAa,KAAK,CAAC,KAAU;QAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACzB;IASD,YAAY,CAAC,KAAa,EAAE,eAAuB;QACjD,MAAM,gBAAgB,GAAU,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,KAAK,GAAG,gBAAgB,GAAG,KAAK,GAAG,gBAAgB,CAAC;QAEnE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACX,OAAO,CAAC,CAAC;aACV;iBAAM,IAAI,KAAK,GAAG,gBAAgB,EAAE;gBACnC,OAAO,CAAC,GAAG,CAAC,CAAC;aACd;iBAAM,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE;gBAC3B,OAAO,KAAK,CAAC;aACd;iBAAM,IAAI,eAAe,GAAG,MAAM,IAAI,eAAe,GAAG,KAAK,GAAG,MAAM,EAAE;gBACvE,OAAO,CAAC,GAAG,eAAe,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;aAC3C;iBAAM,IAAI,eAAe,GAAG,MAAM,IAAI,eAAe,GAAG,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE;gBAC7E,OAAO,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC;aACrC;iBAAM,IAAI,eAAe,GAAG,MAAM,IAAI,eAAe,KAAK,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE;gBAC/E,OAAO,CAAC,GAAG,eAAe,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;aAC3C;iBAAM,IAAI,eAAe,GAAG,MAAM,IAAI,eAAe,KAAK,KAAK,GAAG,CAAC,EAAE;gBACpE,OAAO,CAAC,GAAG,eAAe,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;aAC3C;iBAAM;gBACL,OAAO,CAAC,GAAG,CAAC,CAAC;aACd;SACF,CAAC,CAAC;KACJ;IAED,IAAI,CAAC,IAAY;QACf,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;SAC5B;KACF;;gHA9CU,mBAAmB;oGAAnB,mBAAmB,oGCVhC,ysBAeA;2FDLa,mBAAmB;kBAL/B,SAAS;+BACE,kCAAkC,mBAE3B,uBAAuB,CAAC,MAAM;8BAMlC,KAAK;sBAAjB,KAAK;;;MELK,4BAA4B;;yHAA5B,4BAA4B;0HAA5B,4BAA4B,iBAJxB,mBAAmB,aACxB,YAAY,aACZ,mBAAmB;0HAElB,4BAA4B,YAH9B,CAAC,YAAY,CAAC;2FAGZ,4BAA4B;kBALxC,QAAQ;mBAAC;oBACR,YAAY,EAAE,CAAC,mBAAmB,CAAC;oBACnC,OAAO,EAAE,CAAC,YAAY,CAAC;oBACvB,OAAO,EAAE,CAAC,mBAAmB,CAAC;iBAC/B;;;ACRD;;;;ACAA;;;;;;"}
@@ -1,32 +1,33 @@
1
- import { OnInit } from '@angular/core';
2
- import { BehaviorSubject, Observable } from 'rxjs';
1
+ import { Observable, Subject } from 'rxjs';
3
2
  import { TableConfig } from './models/table-config.interface';
4
3
  import { KeyValue } from '@angular/common';
5
4
  import { TableColumn } from './models/table-column.interface';
6
5
  import { TableRow } from './models/table-row.interface';
7
- import { TableInfo } from './models/table-info.interface';
8
- export declare class CoreComponent implements OnInit {
9
- set page(value: Observable<number> | number);
10
- set search(value: Observable<string> | string);
6
+ import { TableSort } from './models/table-sort.interface';
7
+ import { TableMeta } from './models/table-meta.interface';
8
+ import * as i0 from "@angular/core";
9
+ export declare class CoreComponent {
10
+ set loading(value: Observable<boolean> | boolean);
11
+ set page(value: number);
12
+ set search(value: Observable<string> | string | null);
11
13
  set config(value: Observable<TableConfig> | TableConfig);
12
14
  set data(value: Observable<Array<TableRow>> | Array<TableRow>);
13
- constructor();
14
- loading$: Observable<boolean>;
15
- sortBy$: BehaviorSubject<any>;
15
+ get loading$(): Observable<boolean>;
16
+ private _loading$;
17
+ sortBy$: Subject<TableSort>;
18
+ private _sortBy;
16
19
  private _searchBy$;
17
- searchBy$: Observable<string>;
20
+ searchBy$: Observable<string | null>;
18
21
  private _tableConfig$;
19
22
  tableConfig$: Observable<TableConfig>;
20
23
  private _data$;
21
24
  data$: Observable<Array<TableRow>>;
22
- table$: Observable<{
23
- data: Array<Array<TableRow>>;
24
- config: TableConfig;
25
- info: TableInfo;
26
- }>;
25
+ table$: Observable<TableMeta>;
27
26
  private _currentPage$;
28
27
  currentPage$: Observable<number>;
28
+ colspan$: Observable<number>;
29
29
  sort(property: string): void;
30
- ngOnInit(): void;
31
30
  columnOrder: (a: KeyValue<string, TableColumn>, b: KeyValue<string, TableColumn>) => number;
31
+ static ɵfac: i0.ɵɵFactoryDeclaration<CoreComponent, never>;
32
+ static ɵcmp: i0.ɵɵComponentDeclaration<CoreComponent, "angular-generic-table", never, { "loading": "loading"; "page": "page"; "search": "search"; "config": "config"; "data": "data"; }, {}, never, [".table-loading", ".table-no-data"]>;
32
33
  }
@@ -1,2 +1,13 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./core.component";
3
+ import * as i2 from "./pipes/sort-class.pipe";
4
+ import * as i3 from "./pipes/dash-case.pipe";
5
+ import * as i4 from "./pipes/highlight.pipe";
6
+ import * as i5 from "./pipes/capital-case.pipe";
7
+ import * as i6 from "./pipes/dynamic.pipe";
8
+ import * as i7 from "@angular/common";
1
9
  export declare class GenericTableCoreModule {
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<GenericTableCoreModule, never>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<GenericTableCoreModule, [typeof i1.CoreComponent, typeof i2.SortClassPipe, typeof i3.DashCasePipe, typeof i4.HighlightPipe, typeof i5.CapitalCasePipe, typeof i5.CapitalCasePipe, typeof i6.DynamicPipe], [typeof i7.CommonModule], [typeof i1.CoreComponent]>;
12
+ static ɵinj: i0.ɵɵInjectorDeclaration<GenericTableCoreModule>;
2
13
  }
@@ -1,3 +1,6 @@
1
+ import * as i0 from "@angular/core";
1
2
  export declare class CoreService {
2
3
  constructor();
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<CoreService, never>;
5
+ static ɵprov: i0.ɵɵInjectableDeclaration<CoreService>;
3
6
  }
@@ -1,9 +1,15 @@
1
1
  import { TemplateRef } from '@angular/core';
2
2
  export interface TableColumn {
3
- header?: string;
3
+ header?: string | false;
4
+ mobileHeader?: string | boolean;
4
5
  hidden?: boolean;
5
6
  sortable?: boolean;
6
7
  order?: number;
7
8
  search?: boolean;
8
9
  templateRef?: TemplateRef<any>;
10
+ transform?: {
11
+ pipe: any;
12
+ args?: Array<any>;
13
+ };
14
+ class?: string;
9
15
  }
@@ -1,10 +1,11 @@
1
1
  import { TableColumn } from './table-column.interface';
2
2
  export interface TableConfig {
3
3
  hidden?: boolean;
4
+ class?: string;
4
5
  columns: {
5
6
  [key: string]: TableColumn;
6
7
  };
7
- pagination: {
8
- length: number;
8
+ pagination?: {
9
+ length?: number;
9
10
  };
10
11
  }
@@ -0,0 +1,8 @@
1
+ import { TableRow } from './table-row.interface';
2
+ import { TableConfig } from './table-config.interface';
3
+ import { TableInfo } from './table-info.interface';
4
+ export interface TableMeta {
5
+ data: Array<Array<TableRow>>;
6
+ config: TableConfig;
7
+ info: TableInfo;
8
+ }
@@ -1,3 +1,4 @@
1
+ export declare type TableRows = Array<TableRow>;
1
2
  export interface TableRow {
2
- [key: string]: number | string | boolean;
3
+ [key: string]: number | string | boolean | any;
3
4
  }
@@ -0,0 +1,14 @@
1
+ import { ReplaySubject } from 'rxjs';
2
+ import { CoreComponent } from '../core.component';
3
+ import * as i0 from "@angular/core";
4
+ export declare class PaginationComponent {
5
+ get table(): CoreComponent | undefined;
6
+ set table(value: any);
7
+ table$: ReplaySubject<CoreComponent>;
8
+ private _table;
9
+ pagination$: import("rxjs").Observable<number[]>;
10
+ generateList(pages: number, currentPosition: number): Array<number>;
11
+ goto(page: number): void;
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<PaginationComponent, never>;
13
+ static ɵcmp: i0.ɵɵComponentDeclaration<PaginationComponent, "angular-generic-table-pagination", never, { "table": "table"; }, {}, never, never>;
14
+ }
@@ -0,0 +1,8 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./pagination.component";
3
+ import * as i2 from "@angular/common";
4
+ export declare class GenericTablePaginationModule {
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<GenericTablePaginationModule, never>;
6
+ static ɵmod: i0.ɵɵNgModuleDeclaration<GenericTablePaginationModule, [typeof i1.PaginationComponent], [typeof i2.CommonModule], [typeof i1.PaginationComponent]>;
7
+ static ɵinj: i0.ɵɵInjectorDeclaration<GenericTablePaginationModule>;
8
+ }
@@ -0,0 +1,7 @@
1
+ import { PipeTransform } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class CapitalCasePipe implements PipeTransform {
4
+ transform(s: string): any;
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<CapitalCasePipe, never>;
6
+ static ɵpipe: i0.ɵɵPipeDeclaration<CapitalCasePipe, "capitalCase">;
7
+ }
@@ -1,4 +1,7 @@
1
1
  import { PipeTransform } from '@angular/core';
2
+ import * as i0 from "@angular/core";
2
3
  export declare class DashCasePipe implements PipeTransform {
3
4
  transform(s: string): any;
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<DashCasePipe, never>;
6
+ static ɵpipe: i0.ɵɵPipeDeclaration<DashCasePipe, "dashCase">;
4
7
  }