@angular-generic-table/core 5.0.0-rc.15 → 5.0.0-rc.17
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/esm2020/lib/core.component.mjs +167 -57
- package/esm2020/lib/core.module.mjs +4 -4
- package/esm2020/lib/core.service.mjs +3 -3
- package/esm2020/lib/gt-delta/gt-delta.component.mjs +13 -13
- package/esm2020/lib/models/gt-pagination.mjs +1 -1
- package/esm2020/lib/models/table-config.interface.mjs +1 -1
- package/esm2020/lib/models/table-events.interface.mjs +1 -1
- package/esm2020/lib/models/table-info.interface.mjs +1 -1
- package/esm2020/lib/models/table-sort.interface.mjs +1 -1
- package/esm2020/lib/pagination/pagination.component.mjs +88 -29
- package/esm2020/lib/pagination/pagination.module.mjs +4 -4
- package/esm2020/lib/pipes/capital-case.pipe.mjs +3 -3
- package/esm2020/lib/pipes/dash-case.pipe.mjs +3 -3
- package/esm2020/lib/pipes/dynamic.pipe.mjs +3 -3
- package/esm2020/lib/pipes/highlight.pipe.mjs +3 -3
- package/esm2020/lib/pipes/sort-class.pipe.mjs +29 -12
- package/esm2020/lib/utilities/utilities.mjs +58 -1
- package/esm2020/public-api.mjs +8 -1
- package/fesm2015/angular-generic-table-core.mjs +371 -137
- package/fesm2015/angular-generic-table-core.mjs.map +1 -1
- package/fesm2020/angular-generic-table-core.mjs +372 -134
- package/fesm2020/angular-generic-table-core.mjs.map +1 -1
- package/lib/core.component.d.ts +31 -11
- package/lib/gt-delta/gt-delta.component.d.ts +1 -1
- package/lib/models/gt-pagination.d.ts +8 -0
- package/lib/models/table-column.interface.d.ts +1 -1
- package/lib/models/table-config.interface.d.ts +6 -2
- package/lib/models/table-events.interface.d.ts +11 -0
- package/lib/models/table-info.interface.d.ts +3 -1
- package/lib/models/table-sort.interface.d.ts +6 -4
- package/lib/pagination/pagination.component.d.ts +49 -11
- package/lib/pipes/sort-class.pipe.d.ts +2 -5
- package/lib/utilities/utilities.d.ts +26 -0
- package/package.json +3 -3
- package/public-api.d.ts +7 -0
- package/scss/index.scss +26 -4
- package/esm2020/lib/enums/order.enum.mjs +0 -6
- package/lib/enums/order.enum.d.ts +0 -4
|
@@ -1,27 +1,22 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Injectable, Pipe, Injector, EventEmitter, Component, ChangeDetectionStrategy, Input, Output, NgModule } from '@angular/core';
|
|
3
|
-
import { ReplaySubject,
|
|
3
|
+
import { ReplaySubject, BehaviorSubject, isObservable, of, combineLatest } from 'rxjs';
|
|
4
|
+
import * as i1 from '@angular/common';
|
|
4
5
|
import { KeyValuePipe, AsyncPipe, NgTemplateOutlet, SlicePipe, NgClass, NgIf, NgForOf, PercentPipe, CommonModule } from '@angular/common';
|
|
5
|
-
import { debounceTime, distinctUntilChanged, tap, shareReplay, startWith, map, switchMap, withLatestFrom, take, pluck } from 'rxjs/operators';
|
|
6
|
+
import { debounceTime, distinctUntilChanged, tap, shareReplay, startWith, map, switchMap, withLatestFrom, take, filter, pluck } from 'rxjs/operators';
|
|
6
7
|
|
|
7
8
|
class CoreService {
|
|
8
9
|
constructor() { }
|
|
9
10
|
}
|
|
10
|
-
CoreService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
11
|
-
CoreService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
12
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
11
|
+
CoreService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
12
|
+
CoreService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CoreService, providedIn: 'root' });
|
|
13
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CoreService, decorators: [{
|
|
13
14
|
type: Injectable,
|
|
14
15
|
args: [{
|
|
15
16
|
providedIn: 'root',
|
|
16
17
|
}]
|
|
17
18
|
}], ctorParameters: function () { return []; } });
|
|
18
19
|
|
|
19
|
-
var Order;
|
|
20
|
-
(function (Order) {
|
|
21
|
-
Order["ASC"] = "asc";
|
|
22
|
-
Order["DESC"] = "desc";
|
|
23
|
-
})(Order || (Order = {}));
|
|
24
|
-
|
|
25
20
|
let dashed;
|
|
26
21
|
dashed = (s) => s.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());
|
|
27
22
|
let capitalize;
|
|
@@ -137,6 +132,11 @@ let calculate = (data, config) => {
|
|
|
137
132
|
var _a;
|
|
138
133
|
if (calculations.indexOf('avg') !== -1) {
|
|
139
134
|
CALCULATED[column].avg = ((_a = CALCULATED[column]) === null || _a === void 0 ? void 0 : _a.sum) / data.length;
|
|
135
|
+
// if sum is not part of calculations config...
|
|
136
|
+
if (calculations.indexOf('sum') === -1 && CALCULATED[column].sum) {
|
|
137
|
+
// ...remove it
|
|
138
|
+
delete CALCULATED[column].sum;
|
|
139
|
+
}
|
|
140
140
|
}
|
|
141
141
|
if (calculations.indexOf('count') !== -1) {
|
|
142
142
|
CALCULATED[column].count = data.length;
|
|
@@ -153,15 +153,67 @@ let calculate = (data, config) => {
|
|
|
153
153
|
calculatedColumnsCount: Object.keys(CALCULATED).length || 0,
|
|
154
154
|
};
|
|
155
155
|
};
|
|
156
|
+
/** sortOnMultipleKeys
|
|
157
|
+
* @description Sort data on multiple keys
|
|
158
|
+
* @param {GtSortOrder} keys - array with sort config objects to sort on, data will be sorted according to array order
|
|
159
|
+
* @returns sort function
|
|
160
|
+
*/
|
|
161
|
+
const sortOnMultipleKeys = (keys) => {
|
|
162
|
+
const order = keys.map((key) => (key.order === 'desc' ? -1 : 1));
|
|
163
|
+
return (a, b) => {
|
|
164
|
+
for (let i = 0; i < keys.length; i++) {
|
|
165
|
+
const o = keys[i].key;
|
|
166
|
+
if (a[o] > b[o])
|
|
167
|
+
return order[i];
|
|
168
|
+
if (a[o] < b[o])
|
|
169
|
+
return -order[i];
|
|
170
|
+
}
|
|
171
|
+
return 0;
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
/** parseSortOrderParams
|
|
175
|
+
* @description Convert sort order query param to array with sort config objects
|
|
176
|
+
* @param sortParams - Query param string where each sort config object is separated by comma and order is indicated by + (ascending) or - (descending), e.g. _'name,-age'_
|
|
177
|
+
* @returns GtSortOrder - Array with sort config objects
|
|
178
|
+
*/
|
|
179
|
+
const parseSortOrderParams = (sortParams) => {
|
|
180
|
+
const sortParamsArray = sortParams.split(',');
|
|
181
|
+
return sortParamsArray.map((sortParam) => {
|
|
182
|
+
const [key, order] = sortParam.split(':');
|
|
183
|
+
return {
|
|
184
|
+
key: key.replace(/^[+-]/, ''),
|
|
185
|
+
order: order === 'desc' ? 'desc' : 'asc',
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
/** sortOrderConfigToParam
|
|
190
|
+
* @description Convert sort config object to string that can be used as query param when sorting is implemented server side
|
|
191
|
+
* @param sortConfig - Sort config object
|
|
192
|
+
* @returns string - Query param string where order is indicated by + (ascending) or - (descending), e.g. _'-name'_
|
|
193
|
+
*/
|
|
194
|
+
const sortOrderConfigToParam = (sortConfig) => {
|
|
195
|
+
const order = sortConfig.order === 'desc' ? '-' : '+';
|
|
196
|
+
return `${order}${sortConfig.key}`;
|
|
197
|
+
};
|
|
198
|
+
/** sortOrderToParams
|
|
199
|
+
* @description Convert sort order array to string that can be used as query param when sorting is implemented server side
|
|
200
|
+
* @param sortOrder - Array with sort config objects
|
|
201
|
+
* @returns string - Query param string where each sort config object is separated by comma and order is indicated by + (ascending) or - (descending), e.g. _'name,-age'_
|
|
202
|
+
*/
|
|
203
|
+
const sortOrderToParams = (sortOrder) => {
|
|
204
|
+
return sortOrder
|
|
205
|
+
.map((sortConfig) => sortOrderConfigToParam(sortConfig))
|
|
206
|
+
.join(',');
|
|
207
|
+
};
|
|
156
208
|
|
|
157
209
|
class CapitalCasePipe {
|
|
158
210
|
transform(s) {
|
|
159
211
|
return capitalize(s);
|
|
160
212
|
}
|
|
161
213
|
}
|
|
162
|
-
CapitalCasePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
163
|
-
CapitalCasePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
164
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
214
|
+
CapitalCasePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CapitalCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
215
|
+
CapitalCasePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.1.1", ngImport: i0, type: CapitalCasePipe, isStandalone: true, name: "capitalCase" });
|
|
216
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CapitalCasePipe, decorators: [{
|
|
165
217
|
type: Pipe,
|
|
166
218
|
args: [{
|
|
167
219
|
name: 'capitalCase',
|
|
@@ -170,19 +222,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
|
|
|
170
222
|
}] });
|
|
171
223
|
|
|
172
224
|
class SortClassPipe {
|
|
173
|
-
transform(
|
|
174
|
-
|
|
175
|
-
?
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
225
|
+
transform(sortOrder, key, context = 'class') {
|
|
226
|
+
const sortIndex = sortOrder
|
|
227
|
+
? sortOrder.findIndex((s) => s.key === key)
|
|
228
|
+
: -1;
|
|
229
|
+
if (context === 'aria') {
|
|
230
|
+
if (sortIndex === -1 || !sortOrder) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
return `${sortOrder[sortIndex].order}ending`;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else if (context === 'class') {
|
|
238
|
+
if (sortIndex === -1 || !sortOrder) {
|
|
239
|
+
return '';
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
return `gt-sort-${sortOrder[sortIndex].order}`;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
return (sortOrder && (sortOrder === null || sortOrder === void 0 ? void 0 : sortOrder.length) === 1) || sortIndex < 0
|
|
247
|
+
? null
|
|
248
|
+
: sortIndex + 1 + '';
|
|
249
|
+
}
|
|
181
250
|
}
|
|
182
251
|
}
|
|
183
|
-
SortClassPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
184
|
-
SortClassPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
185
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
252
|
+
SortClassPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: SortClassPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
253
|
+
SortClassPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.1.1", ngImport: i0, type: SortClassPipe, isStandalone: true, name: "sortClass" });
|
|
254
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: SortClassPipe, decorators: [{
|
|
186
255
|
type: Pipe,
|
|
187
256
|
args: [{
|
|
188
257
|
name: 'sortClass',
|
|
@@ -195,9 +264,9 @@ class DashCasePipe {
|
|
|
195
264
|
return dashed(s);
|
|
196
265
|
}
|
|
197
266
|
}
|
|
198
|
-
DashCasePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
199
|
-
DashCasePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
200
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
267
|
+
DashCasePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: DashCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
268
|
+
DashCasePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.1.1", ngImport: i0, type: DashCasePipe, isStandalone: true, name: "dashCase" });
|
|
269
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: DashCasePipe, decorators: [{
|
|
201
270
|
type: Pipe,
|
|
202
271
|
args: [{
|
|
203
272
|
name: 'dashCase',
|
|
@@ -219,9 +288,9 @@ class DynamicPipe {
|
|
|
219
288
|
return pipe.transform(value, ...(pipeArgs || []));
|
|
220
289
|
}
|
|
221
290
|
}
|
|
222
|
-
DynamicPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
223
|
-
DynamicPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
224
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
291
|
+
DynamicPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: DynamicPipe, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
292
|
+
DynamicPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.1.1", ngImport: i0, type: DynamicPipe, isStandalone: true, name: "dynamicPipe" });
|
|
293
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: DynamicPipe, decorators: [{
|
|
225
294
|
type: Pipe,
|
|
226
295
|
args: [{
|
|
227
296
|
name: 'dynamicPipe',
|
|
@@ -266,9 +335,9 @@ class HighlightPipe {
|
|
|
266
335
|
return highlightedText;
|
|
267
336
|
}
|
|
268
337
|
}
|
|
269
|
-
HighlightPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
270
|
-
HighlightPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
271
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
338
|
+
HighlightPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: HighlightPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
339
|
+
HighlightPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.1.1", ngImport: i0, type: HighlightPipe, isStandalone: true, name: "highlight" });
|
|
340
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: HighlightPipe, decorators: [{
|
|
272
341
|
type: Pipe,
|
|
273
342
|
args: [{
|
|
274
343
|
name: 'highlight',
|
|
@@ -279,16 +348,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
|
|
|
279
348
|
class CoreComponent {
|
|
280
349
|
constructor() {
|
|
281
350
|
this.rowClick = new EventEmitter();
|
|
351
|
+
this.sortOrderChange = new EventEmitter();
|
|
282
352
|
this._rowHover$ = new ReplaySubject(1);
|
|
283
353
|
this.rowHover = new EventEmitter();
|
|
354
|
+
this.columnSort = new EventEmitter();
|
|
355
|
+
/** page change event - emitted when current page/index changes for pagination */
|
|
356
|
+
this.pageChange = new EventEmitter();
|
|
284
357
|
this.rowHover$ = this._rowHover$.asObservable().pipe(debounceTime(50), distinctUntilChanged((p, q) => p.index === q.index), tap((event) => this.rowHover.emit(event)), shareReplay(1));
|
|
285
358
|
this._loading$ = new ReplaySubject(1);
|
|
286
|
-
this.
|
|
287
|
-
// tslint:disable-next-line:variable-name
|
|
359
|
+
this._sortOrder$ = new BehaviorSubject([]);
|
|
288
360
|
this._searchBy$ = new ReplaySubject(1);
|
|
289
361
|
this.searchBy$ = this._searchBy$.pipe(startWith(''), map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
|
|
362
|
+
this._pagingInfo$ = new BehaviorSubject({
|
|
363
|
+
pageCurrent: null,
|
|
364
|
+
pageNext: null,
|
|
365
|
+
pagePrevious: null,
|
|
366
|
+
pageSize: null,
|
|
367
|
+
numberOfRecords: null,
|
|
368
|
+
//recordsAfterFilter: null,
|
|
369
|
+
//recordsAfterSearch: null,
|
|
370
|
+
//recordsAll: null,
|
|
371
|
+
});
|
|
290
372
|
// tslint:disable-next-line:variable-name
|
|
291
|
-
this._tableConfig$ = new
|
|
373
|
+
this._tableConfig$ = new BehaviorSubject({});
|
|
292
374
|
this.tableConfig$ = this._tableConfig$.pipe(map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
|
|
293
375
|
this._data$ = new ReplaySubject(1);
|
|
294
376
|
this.data$ = this._data$.pipe(map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => combineLatest([obs])), withLatestFrom(this.tableConfig$), map(([[data], config]) => {
|
|
@@ -312,46 +394,46 @@ class CoreComponent {
|
|
|
312
394
|
data = newData;
|
|
313
395
|
}
|
|
314
396
|
return { data, config };
|
|
315
|
-
}), switchMap((obs) => combineLatest([
|
|
316
|
-
|
|
317
|
-
this.sortBy$.pipe(startWith(EMPTY)),
|
|
318
|
-
this.searchBy$,
|
|
319
|
-
])), map(([table, sortBy, searchBy]) => {
|
|
320
|
-
var _a;
|
|
397
|
+
}), switchMap((obs) => combineLatest([of(obs), this.sortOrder$, this.searchBy$])), map(([table, sortBy, searchBy]) => {
|
|
398
|
+
var _a, _b, _c, _d, _e;
|
|
321
399
|
// create a new array reference and sort new array (prevent mutating existing state)
|
|
322
400
|
table.data = [...table.data];
|
|
323
|
-
return !sortBy
|
|
324
|
-
? searchBy
|
|
401
|
+
return !(sortBy === null || sortBy === void 0 ? void 0 : sortBy.length) || ((_a = table.config) === null || _a === void 0 ? void 0 : _a.disableTableSort)
|
|
402
|
+
? searchBy && !((_b = this.tableInfo) === null || _b === void 0 ? void 0 : _b.lazyLoaded)
|
|
325
403
|
? search(searchBy, false, table.data, table.config)
|
|
326
404
|
: table.data
|
|
327
|
-
: (
|
|
328
|
-
? search(searchBy, false, table.data, table.config)
|
|
329
|
-
: table.data)
|
|
330
|
-
// TODO: improve logic
|
|
331
|
-
const typed = sortBy;
|
|
332
|
-
return a[typed.sortBy] > b[typed.sortBy]
|
|
333
|
-
? typed.sortByOrder === Order.ASC
|
|
334
|
-
? 1
|
|
335
|
-
: -1
|
|
336
|
-
: b[typed.sortBy] > a[typed.sortBy]
|
|
337
|
-
? typed.sortByOrder === Order.ASC
|
|
338
|
-
? -1
|
|
339
|
-
: 1
|
|
340
|
-
: 0;
|
|
341
|
-
});
|
|
405
|
+
: searchBy && !((_c = this.tableInfo) === null || _c === void 0 ? void 0 : _c.lazyLoaded)
|
|
406
|
+
? (_d = search(searchBy, false, table.data, table.config)) === null || _d === void 0 ? void 0 : _d.sort(sortOnMultipleKeys(sortBy))
|
|
407
|
+
: (_e = table.data) === null || _e === void 0 ? void 0 : _e.sort(sortOnMultipleKeys(sortBy));
|
|
342
408
|
}), shareReplay(1));
|
|
343
409
|
this.calculations$ = combineLatest([this.data$, this.tableConfig$]).pipe(map(([data, config]) => calculate(data, config)), shareReplay(1));
|
|
344
410
|
this.table$ = combineLatest([
|
|
345
411
|
this.data$,
|
|
346
412
|
this.tableConfig$,
|
|
347
|
-
|
|
413
|
+
this._pagingInfo$,
|
|
414
|
+
]).pipe(map(([sorted, config, pagingInfo]) => {
|
|
415
|
+
var _a;
|
|
416
|
+
if (pagingInfo.pageCurrent !== null &&
|
|
417
|
+
pagingInfo.numberOfRecords !== null &&
|
|
418
|
+
pagingInfo.pageSize !== null) {
|
|
419
|
+
return {
|
|
420
|
+
data: [sorted],
|
|
421
|
+
config,
|
|
422
|
+
info: {
|
|
423
|
+
lazyLoaded: true,
|
|
424
|
+
numberOfRecords: pagingInfo.numberOfRecords,
|
|
425
|
+
pageSize: pagingInfo.pageSize,
|
|
426
|
+
pageTotal: (_a = pagingInfo.pageTotal) !== null && _a !== void 0 ? _a : Math.ceil(pagingInfo.numberOfRecords / pagingInfo.pageSize),
|
|
427
|
+
},
|
|
428
|
+
};
|
|
429
|
+
}
|
|
348
430
|
// if pagination is disabled...
|
|
349
431
|
if (!config.pagination || config.pagination.length === 0) {
|
|
350
432
|
// ...return unaltered array
|
|
351
433
|
return {
|
|
352
434
|
data: [sorted],
|
|
353
435
|
config,
|
|
354
|
-
info: {
|
|
436
|
+
info: { numberOfRecords: sorted.length, pageTotal: 1 },
|
|
355
437
|
};
|
|
356
438
|
}
|
|
357
439
|
// return record set
|
|
@@ -359,20 +441,24 @@ class CoreComponent {
|
|
|
359
441
|
data: chunk(sorted, +(config.pagination.length || 0)),
|
|
360
442
|
config,
|
|
361
443
|
info: {
|
|
362
|
-
|
|
444
|
+
numberOfRecords: sorted.length,
|
|
363
445
|
pageTotal: Math.ceil(sorted.length / +(config.pagination.length || 0)),
|
|
364
446
|
},
|
|
365
447
|
};
|
|
366
|
-
}), shareReplay(1));
|
|
367
|
-
this.
|
|
368
|
-
this.
|
|
369
|
-
|
|
448
|
+
}), tap((meta) => this._tableInfo$.next(meta.info)), shareReplay(1));
|
|
449
|
+
this._tableInfo$ = new BehaviorSubject(undefined);
|
|
450
|
+
this._currentPaginationIndex$ = new BehaviorSubject(0);
|
|
451
|
+
this.currentPaginationIndex$ = combineLatest([
|
|
452
|
+
this._currentPaginationIndex$,
|
|
453
|
+
this.table$,
|
|
454
|
+
]).pipe(map(([page, table]) => {
|
|
455
|
+
var _a, _b, _c;
|
|
370
456
|
// determine last page
|
|
371
457
|
const lastPage = Math.ceil(table.info.records /
|
|
372
|
-
(((
|
|
373
|
-
// determine max
|
|
458
|
+
((_a = table.info.recordLength) !== null && _a !== void 0 ? _a : (((_c = (_b = table.config) === null || _b === void 0 ? void 0 : _b.pagination) === null || _c === void 0 ? void 0 : _c.length) || table.info.records))) - 1;
|
|
459
|
+
// determine min/max position
|
|
374
460
|
return +page < 0 ? 0 : +page > lastPage ? lastPage : +page;
|
|
375
|
-
}), shareReplay(1));
|
|
461
|
+
}), distinctUntilChanged(), tap((index) => this.pageChange.emit({ index })), shareReplay(1));
|
|
376
462
|
this.colspan$ = this.tableConfig$.pipe(switchMap((config) => config.columns
|
|
377
463
|
? of(Object.values(config.columns || config.rows || {}).filter((value) => value.hidden !== true).length)
|
|
378
464
|
: this.data$.pipe(map((data) => data.length + 1))), shareReplay(1));
|
|
@@ -391,11 +477,23 @@ class CoreComponent {
|
|
|
391
477
|
return (a.value.order || 0) - (b.value.order || 0);
|
|
392
478
|
};
|
|
393
479
|
}
|
|
480
|
+
get sortOrder$() {
|
|
481
|
+
return this._sortOrder$.asObservable();
|
|
482
|
+
}
|
|
394
483
|
set loading(isLoading) {
|
|
395
484
|
this._loading$.next(isLoading);
|
|
396
485
|
}
|
|
397
|
-
set
|
|
398
|
-
this.
|
|
486
|
+
set paginationIndex(pageIndex) {
|
|
487
|
+
this._currentPaginationIndex$.next(pageIndex);
|
|
488
|
+
}
|
|
489
|
+
set pagingInfo(value) {
|
|
490
|
+
if (value) {
|
|
491
|
+
this._pagingInfo$.next(value);
|
|
492
|
+
if (value.pageCurrent !== this._currentPaginationIndex$.getValue() + 1 &&
|
|
493
|
+
value.pageCurrent !== null) {
|
|
494
|
+
this.paginationIndex = value.pageCurrent - 1;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
399
497
|
}
|
|
400
498
|
set search(string) {
|
|
401
499
|
this._searchBy$.next(string);
|
|
@@ -406,6 +504,12 @@ class CoreComponent {
|
|
|
406
504
|
set data(data) {
|
|
407
505
|
this._data$.next(data);
|
|
408
506
|
}
|
|
507
|
+
set sortOrder(sortConfig) {
|
|
508
|
+
if (JSON.stringify(sortConfig) !== JSON.stringify(this._sortOrder$.value)) {
|
|
509
|
+
this.sortOrderChange.emit(sortConfig);
|
|
510
|
+
this._sortOrder$.next(sortConfig);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
409
513
|
_rowClick(row, index, event) {
|
|
410
514
|
this.rowClick.emit({ row, index, event });
|
|
411
515
|
}
|
|
@@ -428,19 +532,81 @@ class CoreComponent {
|
|
|
428
532
|
get loading$() {
|
|
429
533
|
return this._loading$.pipe(startWith(false), map((value) => (isObservable(value) ? value : of(value))), switchMap((obs) => obs), shareReplay(1));
|
|
430
534
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
535
|
+
/** tableInfo$ - returns observable for table info
|
|
536
|
+
* @return Observable<TableInfo> */
|
|
537
|
+
get tableInfo$() {
|
|
538
|
+
return this._tableInfo$.asObservable().pipe(filter((info) => !!info), shareReplay(1));
|
|
539
|
+
}
|
|
540
|
+
/** tableInfo - returns the current table info
|
|
541
|
+
* @return TableInfo */
|
|
542
|
+
get tableInfo() {
|
|
543
|
+
return this._tableInfo$.getValue();
|
|
544
|
+
}
|
|
545
|
+
/** sortByKey - Sort by key in table row
|
|
546
|
+
* @param key - key to sort by
|
|
547
|
+
* @param { MouseEvent } [$event] - Mouse event triggering sort, if shift key is pressed sort key will be added to already present sort keys
|
|
548
|
+
*/
|
|
549
|
+
sortByKey(key, $event) {
|
|
550
|
+
var _a;
|
|
551
|
+
const shiftKey = ($event === null || $event === void 0 ? void 0 : $event.shiftKey) === true;
|
|
552
|
+
const currentOrder = this._sortOrder$.value;
|
|
553
|
+
let sortOrder = 'asc';
|
|
554
|
+
let newOrder = [];
|
|
555
|
+
// if shift key is pressed while sorting...
|
|
556
|
+
if (shiftKey) {
|
|
557
|
+
// ...check if key is already sorted
|
|
558
|
+
const existingSortPosition = currentOrder.findIndex((value) => value.key === key);
|
|
559
|
+
if (existingSortPosition === -1) {
|
|
560
|
+
// ...if key is not sorted, add it to the end of the sort order
|
|
561
|
+
newOrder = [...currentOrder, { key, order: 'asc' }];
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
// ...if key is already sorted, toggle sort order
|
|
565
|
+
sortOrder = currentOrder[existingSortPosition].order;
|
|
566
|
+
const newSortOrder = sortOrder === 'asc' ? 'desc' : 'asc';
|
|
567
|
+
newOrder = [...currentOrder];
|
|
568
|
+
newOrder[existingSortPosition] = Object.assign(Object.assign({}, newOrder[existingSortPosition]), { order: newSortOrder });
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
// ...else if shift key is not pressed...
|
|
573
|
+
if (currentOrder.length > 0) {
|
|
574
|
+
// ...check if key is already sorted
|
|
575
|
+
const existingSortPosition = currentOrder.findIndex((value) => value.key === key);
|
|
576
|
+
// ...if key is already sorted, toggle sort order
|
|
577
|
+
if (existingSortPosition === -1) {
|
|
578
|
+
newOrder = [{ key, order: 'asc' }];
|
|
579
|
+
}
|
|
580
|
+
else {
|
|
581
|
+
sortOrder = currentOrder[existingSortPosition].order;
|
|
582
|
+
const newSortOrder = sortOrder === 'asc' ? 'desc' : 'asc';
|
|
583
|
+
newOrder = [{ key, order: newSortOrder }];
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
// ...if key is not sorted set sort order for key to ascending
|
|
588
|
+
newOrder = [{ key, order: sortOrder }];
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
// create sort event
|
|
592
|
+
const sortEvent = {
|
|
593
|
+
key,
|
|
594
|
+
order: sortOrder,
|
|
595
|
+
currentSortOrder: newOrder,
|
|
596
|
+
addSortKey: shiftKey,
|
|
441
597
|
};
|
|
442
|
-
|
|
443
|
-
|
|
598
|
+
// if event is passed to sort function...
|
|
599
|
+
if ($event) {
|
|
600
|
+
// ...emit it as well
|
|
601
|
+
sortEvent.event = $event;
|
|
602
|
+
}
|
|
603
|
+
// emit sort event
|
|
604
|
+
this.columnSort.emit(sortEvent);
|
|
605
|
+
// if table is not lazy loaded (sorting is then handled server-side)...
|
|
606
|
+
if (!((_a = this.tableInfo) === null || _a === void 0 ? void 0 : _a.lazyLoaded)) {
|
|
607
|
+
// ...update sort order
|
|
608
|
+
this.sortOrder = newOrder;
|
|
609
|
+
}
|
|
444
610
|
}
|
|
445
611
|
nestedValue(object, mapTo, missingValue = null) {
|
|
446
612
|
const levels = mapTo.split('.');
|
|
@@ -448,9 +614,9 @@ class CoreComponent {
|
|
|
448
614
|
(index === levels.length - 1 ? missingValue : {}), object);
|
|
449
615
|
}
|
|
450
616
|
}
|
|
451
|
-
CoreComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
452
|
-
CoreComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: CoreComponent, isStandalone: true, selector: "angular-generic-table", inputs: { loading: "loading", page: "page", search: "search", config: "config", data: "data" }, outputs: { rowClick: "rowClick", rowHover: "rowHover" }, ngImport: i0, template: "<table\n [ngClass]=\"(tableConfig$ | async)?.class || 'table'\"\n [class.table-mobile]=\"(tableConfig$ | async)?.mobileLayout\"\n [class.table-horizontal]=\"(tableConfig$ | async)?.rows\"\n [class.table-loading]=\"loading$ | async\"\n [class.gt-sticky-row-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.row && (tableConfig$ | async)?.rows\n \"\n [class.gt-sticky-column-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.column\n \"\n [attr.aria-busy]=\"(loading$ | async) === true ? true : null\"\n>\n <thead>\n <tr\n *ngIf=\"{\n config: (tableConfig$ | async)!,\n isLoading: loading$ | async\n } as table\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <th\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [class.disabled]=\"table.isLoading\"\n [attr.aria-sort]=\"sortBy$ | async | sortClass: column.key:true\"\n [class.gt-sortable]=\"true\"\n scope=\"col\"\n >\n <button\n *ngIf=\"column.value?.sortable\"\n class=\"gt-sort\"\n (click)=\"\n table.isLoading || !column.value.sortable || sort(column.key)\n \"\n >\n <span *ngIf=\"column.value?.header !== false\">{{\n column.value.header || column.key | capitalCase\n }}</span>\n </button>\n <span\n *ngIf=\"!column.value?.sortable && column.value?.header !== false\"\n >{{ column.value.header || column.key | capitalCase }}</span\n >\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"\n ((table?.config?.rows | keyvalue: columnOrder) || [])[0] as headerRow\n \"\n >\n <th\n class=\"row-header\"\n [attr.aria-sort]=\"sortBy$ | async | sortClass: headerRow.key:true\"\n ngClass=\"{{ headerRow.value.sortable ? 'sort ' : '' }} {{\n sortBy$ | async | sortClass: headerRow.key\n }} {{ (headerRow.key | dashCase) + '-column' }}\"\n (click)=\"\n table.isLoading || !headerRow.value.sortable || sort(headerRow.key)\n \"\n scope=\"col\"\n >\n <ng-container *ngIf=\"headerRow?.value?.header !== false\">{{\n headerRow?.value?.header || headerRow.key | capitalCase\n }}</ng-container>\n </th>\n <th\n *ngFor=\"let column of ((table$ | async)?.data || [])[0]\"\n ngClass=\"{{ headerRow.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[headerRow.key].templateRef\n ? templateRef\n : (table.config.rows || {})[headerRow.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: headerRow,\n transform: (table.config.rows || {})[headerRow.key].transform,\n templateRef: (table.config.rows || {})[headerRow.key].templateRef,\n index: 0\n }\"\n >\n </ng-container>\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 <tfoot *ngIf=\"(table$ | async)! as table\">\n <ng-container *ngIf=\"table.data.length > 0 && !(loading$ | async)\">\n <ng-container *ngIf=\"(calculations$ | async)! as calculations\">\n <tr\n *ngFor=\"let calculation of calculations.calculations; let i = index\"\n >\n <ng-container\n *ngIf=\"{\n showHeader: (colspan$ | async) !== (footerColspan$ | async)\n } as footerRow\"\n >\n <th\n *ngIf=\"footerRow.showHeader\"\n [colSpan]=\"\n ((colspan$ | async) || 0) - ((footerColspan$ | async) || 0)\n \"\n scope=\"row\"\n >\n <ng-container\n *ngIf=\"table.config?.footer?.headers?.[calculation] as showHeader\"\n >{{showHeader === true ? (calculation | capitalCase): table.config.footer?.headers?.[calculation]}}\n </ng-container>\n </th>\n <ng-container\n *ngFor=\"\n let column of table.config?.columns | keyvalue: columnOrder\n \"\n >\n <td\n *ngIf=\"\n !column.value?.hidden && calculations.calculated[column.key]\n \"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-header]=\"\n !footerRow.showHeader && table.config.footer?.headers?.[calculation]\n ? table.config.footer?.headers?.[calculation] === true ? (calculation | capitalCase) : table.config.footer?.headers?.[calculation]\n : null\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.columns || {})[column.key].transform\n ? transformFooter\n : rawFooter\n \"\n [ngTemplateOutletContext]=\"{\n value: calculations.calculated[column.key][calculation],\n transform: (table.config.columns || {})[column.key]\n .transform\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n </tfoot>\n</table>\n<ng-template #tableContent>\n <ng-container *ngIf=\"(table$ | async)! as table\">\n <tbody *ngIf=\"(table!.data![0] || table!.data!).length > 0; else noData\">\n <ng-container *ngIf=\"table.config.columns\">\n <tr\n *ngFor=\"\n let row of table!.data![(currentPage$ | async) || 0];\n let i = index\n \"\n [attr.id]=\"'tableRow_' + i\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"table?.config?.rowHover && _hoverRow(null, null, $event)\"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <td\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (searchBy$ | async) &&\n !(table.config.columns || {})[column.key].templateRef\n ? highlighted\n : (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: row,\n column: column,\n search: (searchBy$ | async),\n transform: (table.config.columns || {})[column.key].transform,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n index: i,\n data: table.data[(currentPage$ | async) || 0]\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n <ng-container *ngIf=\"table.config.rows\">\n <ng-container\n *ngFor=\"\n let row of table?.config?.rows | keyvalue: columnOrder | slice: 1;\n let i = index\n \"\n >\n <tr\n *ngIf=\"!row.value?.hidden\"\n [attr.id]=\"'tableRow_' + i\"\n ngClass=\"{{ (row.key | dashCase) + '-row' }}\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"\n table?.config?.rowHover && _hoverRow(null, null, $event)\n \"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <th class=\"row-header\" scope=\"row\">\n {{ row.value.header || row.key | capitalCase }}\n </th>\n <td\n *ngFor=\"let column of (table?.data || [])[0]; let y = index\"\n ngClass=\"{{ row.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[row.key].templateRef\n ? templateRef\n : (table.config.rows || {})[row.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: row,\n transform: (table.config.rows || {})[row.key].transform,\n templateRef: (table.config.rows || {})[row.key].templateRef,\n index: table.config.rows ? y : i,\n data: table.data[(currentPage$ | async) || 0]\n }\"\n >\n </ng-container>\n </td>\n </tr>\n </ng-container>\n </ng-container>\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\n #highlighted\n let-row=\"row\"\n let-column=\"column\"\n let-search=\"search\"\n let-transform=\"transform\"\n>\n <div\n *ngIf=\"!transform\"\n [innerHTML]=\"row[column.key] | highlight: search\"\n ></div>\n <div\n *ngIf=\"transform\"\n [innerHTML]=\"\n row[column.key]\n | dynamicPipe: transform.pipe:transform?.args\n | highlight: search\n \"\n ></div>\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{ row[column.key] }}\n</ng-template>\n<ng-template\n #transformData\n let-row=\"row\"\n let-column=\"column\"\n let-transform=\"transform\"\n let-data=\"data\"\n>\n {{ row[column.key] | dynamicPipe: transform.pipe:transform?.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n {{\n (value | dynamicPipe: transform.pipe:transform?.args) ||\n (tableConfig$ | async)?.footer?.emptyContent\n }}\n</ng-template>\n<ng-template #rawFooter let-value=\"value\">\n {{ value || (tableConfig$ | async)?.footer?.emptyContent }}\n</ng-template>\n<ng-template\n #templateRef\n let-row=\"row\"\n let-column=\"column\"\n let-index=\"index\"\n let-templateRef=\"templateRef\"\n let-data=\"data\"\n>\n <ng-container\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{\n row: row,\n col: column,\n index: index,\n data: data\n }\"\n ></ng-container>\n</ng-template>\n", dependencies: [{ kind: "pipe", type: CapitalCasePipe, name: "capitalCase" }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: SortClassPipe, name: "sortClass" }, { kind: "pipe", type: DashCasePipe, name: "dashCase" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: SlicePipe, name: "slice" }, { kind: "pipe", type: DynamicPipe, name: "dynamicPipe" }, { kind: "pipe", type: HighlightPipe, name: "highlight" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
453
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
617
|
+
CoreComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
618
|
+
CoreComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: CoreComponent, isStandalone: true, selector: "angular-generic-table", inputs: { loading: "loading", paginationIndex: "paginationIndex", pagingInfo: "pagingInfo", search: "search", config: "config", data: "data", sortOrder: "sortOrder" }, outputs: { rowClick: "rowClick", sortOrderChange: "sortOrderChange", rowHover: "rowHover", columnSort: "columnSort", pageChange: "pageChange" }, ngImport: i0, template: "<table\n [ngClass]=\"(tableConfig$ | async)?.class || 'table'\"\n [class.table-mobile]=\"(tableConfig$ | async)?.mobileLayout\"\n [class.table-horizontal]=\"(tableConfig$ | async)?.rows\"\n [class.table-loading]=\"loading$ | async\"\n [class.gt-sticky-row-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.row && (tableConfig$ | async)?.rows\n \"\n [class.gt-sticky-column-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.column\n \"\n [attr.aria-busy]=\"(loading$ | async) === true ? true : null\"\n>\n <thead>\n <tr\n *ngIf=\"{\n config: (tableConfig$ | async)!,\n isLoading: loading$ | async\n } as table\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <th\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [class.disabled]=\"table.isLoading\"\n [attr.aria-sort]=\"sortOrder$ | async | sortClass: column.key:'aria'\"\n [class.gt-sortable]=\"true\"\n scope=\"col\"\n >\n <button\n *ngIf=\"column.value?.sortable\"\n [attr.data-sort-order]=\"\n sortOrder$ | async | sortClass: column.key:'order'\n \"\n class=\"gt-sort\"\n (click)=\"\n table.isLoading ||\n !column.value.sortable ||\n sortByKey(column.key, $event)\n \"\n >\n <span *ngIf=\"column.value?.header !== false\">{{\n column.value.header || column.key | capitalCase\n }}</span>\n </button>\n <span\n *ngIf=\"!column.value?.sortable && column.value?.header !== false\"\n >{{ column.value.header || column.key | capitalCase }}</span\n >\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"\n ((table?.config?.rows | keyvalue: columnOrder) || [])[0] as headerRow\n \"\n >\n <th\n class=\"row-header\"\n [attr.aria-sort]=\"\n sortOrder$ | async | sortClass: headerRow.key:'aria'\n \"\n ngClass=\"{{ headerRow.value.sortable ? 'sort ' : '' }} {{\n sortOrder$ | async | sortClass: headerRow.key\n }} {{ (headerRow.key | dashCase) + '-column' }}\"\n (click)=\"\n table.isLoading ||\n !headerRow.value.sortable ||\n sortByKey(headerRow.key, $event)\n \"\n scope=\"col\"\n >\n <ng-container *ngIf=\"headerRow?.value?.header !== false\">{{\n headerRow?.value?.header || headerRow.key | capitalCase\n }}</ng-container>\n </th>\n <th\n *ngFor=\"let column of ((table$ | async)?.data || [])[0]\"\n ngClass=\"{{ headerRow.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[headerRow.key].templateRef\n ? templateRef\n : (table.config.rows || {})[headerRow.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: headerRow,\n transform: (table.config.rows || {})[headerRow.key].transform,\n templateRef: (table.config.rows || {})[headerRow.key].templateRef,\n index: 0\n }\"\n >\n </ng-container>\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 <tfoot *ngIf=\"(table$ | async)! as table\">\n <ng-container *ngIf=\"table.data.length > 0 && !(loading$ | async)\">\n <ng-container *ngIf=\"(calculations$ | async)! as calculations\">\n <tr\n *ngFor=\"let calculation of calculations.calculations; let i = index\"\n >\n <ng-container\n *ngIf=\"{\n showHeader: (colspan$ | async) !== (footerColspan$ | async)\n } as footerRow\"\n >\n <th\n *ngIf=\"footerRow.showHeader\"\n [colSpan]=\"\n ((colspan$ | async) || 0) - ((footerColspan$ | async) || 0)\n \"\n scope=\"row\"\n >\n <ng-container\n *ngIf=\"table.config?.footer?.headers?.[calculation] as showHeader\"\n >{{showHeader === true ? (calculation | capitalCase): table.config.footer?.headers?.[calculation]}}\n </ng-container>\n </th>\n <ng-container\n *ngFor=\"\n let column of table.config?.columns | keyvalue: columnOrder\n \"\n >\n <td\n *ngIf=\"\n !column.value?.hidden && calculations.calculated[column.key]\n \"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-header]=\"\n !footerRow.showHeader && table.config.footer?.headers?.[calculation]\n ? table.config.footer?.headers?.[calculation] === true ? (calculation | capitalCase) : table.config.footer?.headers?.[calculation]\n : null\n \"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n [class.gt-no-content]=\"\n !calculations.calculated[column.key][calculation]\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformFooter\n : rawFooter\n \"\n [ngTemplateOutletContext]=\"{\n value: calculations.calculated[column.key][calculation],\n row: calculations.calculated[column.key],\n column: calculation,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n transform: (table.config.columns || {})[column.key]\n .transform\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n </tfoot>\n</table>\n<ng-template #tableContent>\n <ng-container *ngIf=\"(table$ | async)! as table\">\n <tbody *ngIf=\"(table!.data![0] || table!.data!).length > 0; else noData\">\n <ng-container *ngIf=\"table.config.columns\">\n <tr\n *ngFor=\"\n let row of table!.data![\n table.info.lazyLoaded ? 0 : (currentPaginationIndex$ | async) || 0\n ];\n let i = index\n \"\n [attr.id]=\"'tableRow_' + i\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"table?.config?.rowHover && _hoverRow(null, null, $event)\"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <td\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (searchBy$ | async) &&\n !(table.config.columns || {})[column.key].templateRef\n ? highlighted\n : (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: row,\n column: column,\n search: (searchBy$ | async),\n transform: (table.config.columns || {})[column.key].transform,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n index: i,\n data: table.data[\n table.info.lazyLoaded\n ? 0\n : (currentPaginationIndex$ | async) || 0\n ]\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n <ng-container *ngIf=\"table.config.rows\">\n <ng-container\n *ngFor=\"\n let row of table?.config?.rows | keyvalue: columnOrder | slice: 1;\n let i = index\n \"\n >\n <tr\n *ngIf=\"!row.value?.hidden\"\n [attr.id]=\"'tableRow_' + i\"\n ngClass=\"{{ (row.key | dashCase) + '-row' }}\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"\n table?.config?.rowHover && _hoverRow(null, null, $event)\n \"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <th class=\"row-header\" scope=\"row\">\n {{ row.value.header || row.key | capitalCase }}\n </th>\n <td\n *ngFor=\"let column of (table?.data || [])[0]; let y = index\"\n ngClass=\"{{ row.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[row.key].templateRef\n ? templateRef\n : (table.config.rows || {})[row.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: row,\n transform: (table.config.rows || {})[row.key].transform,\n templateRef: (table.config.rows || {})[row.key].templateRef,\n index: table.config.rows ? y : i,\n data: table.data[\n table.info.lazyLoaded\n ? 0\n : (currentPaginationIndex$ | async) || 0\n ]\n }\"\n >\n </ng-container>\n </td>\n </tr>\n </ng-container>\n </ng-container>\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\n #highlighted\n let-row=\"row\"\n let-column=\"column\"\n let-search=\"search\"\n let-transform=\"transform\"\n>\n <div\n *ngIf=\"!transform\"\n [innerHTML]=\"row[column.key] | highlight: search\"\n ></div>\n <div\n *ngIf=\"transform\"\n [innerHTML]=\"\n row[column.key]\n | dynamicPipe: transform.pipe:transform?.args\n | highlight: search\n \"\n ></div>\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{ row[column.key] }}\n</ng-template>\n<ng-template\n #transformData\n let-row=\"row\"\n let-column=\"column\"\n let-transform=\"transform\"\n let-data=\"data\"\n>\n {{ row[column.key] | dynamicPipe: transform.pipe:transform?.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n {{\n (value | dynamicPipe: transform.pipe:transform?.args) ||\n (tableConfig$ | async)?.footer?.emptyContent\n }}\n</ng-template>\n<ng-template #rawFooter let-value=\"value\">\n {{ value || (tableConfig$ | async)?.footer?.emptyContent }}\n</ng-template>\n<ng-template\n #templateRef\n let-row=\"row\"\n let-column=\"column\"\n let-index=\"index\"\n let-templateRef=\"templateRef\"\n let-data=\"data\"\n>\n <ng-container\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{\n row: row,\n col: column,\n index: index,\n data: data\n }\"\n ></ng-container>\n</ng-template>\n", dependencies: [{ kind: "pipe", type: CapitalCasePipe, name: "capitalCase" }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: SortClassPipe, name: "sortClass" }, { kind: "pipe", type: DashCasePipe, name: "dashCase" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: SlicePipe, name: "slice" }, { kind: "pipe", type: DynamicPipe, name: "dynamicPipe" }, { kind: "pipe", type: HighlightPipe, name: "highlight" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
619
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: CoreComponent, decorators: [{
|
|
454
620
|
type: Component,
|
|
455
621
|
args: [{ selector: 'angular-generic-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
456
622
|
CapitalCasePipe,
|
|
@@ -465,10 +631,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
|
|
|
465
631
|
NgClass,
|
|
466
632
|
NgIf,
|
|
467
633
|
NgForOf,
|
|
468
|
-
], template: "<table\n [ngClass]=\"(tableConfig$ | async)?.class || 'table'\"\n [class.table-mobile]=\"(tableConfig$ | async)?.mobileLayout\"\n [class.table-horizontal]=\"(tableConfig$ | async)?.rows\"\n [class.table-loading]=\"loading$ | async\"\n [class.gt-sticky-row-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.row && (tableConfig$ | async)?.rows\n \"\n [class.gt-sticky-column-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.column\n \"\n [attr.aria-busy]=\"(loading$ | async) === true ? true : null\"\n>\n <thead>\n <tr\n *ngIf=\"{\n config: (tableConfig$ | async)!,\n isLoading: loading$ | async\n } as table\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <th\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [class.disabled]=\"table.isLoading\"\n [attr.aria-sort]=\"sortBy$ | async | sortClass: column.key:true\"\n [class.gt-sortable]=\"true\"\n scope=\"col\"\n >\n <button\n *ngIf=\"column.value?.sortable\"\n class=\"gt-sort\"\n (click)=\"\n table.isLoading || !column.value.sortable || sort(column.key)\n \"\n >\n <span *ngIf=\"column.value?.header !== false\">{{\n column.value.header || column.key | capitalCase\n }}</span>\n </button>\n <span\n *ngIf=\"!column.value?.sortable && column.value?.header !== false\"\n >{{ column.value.header || column.key | capitalCase }}</span\n >\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"\n ((table?.config?.rows | keyvalue: columnOrder) || [])[0] as headerRow\n \"\n >\n <th\n class=\"row-header\"\n [attr.aria-sort]=\"sortBy$ | async | sortClass: headerRow.key:true\"\n ngClass=\"{{ headerRow.value.sortable ? 'sort ' : '' }} {{\n sortBy$ | async | sortClass: headerRow.key\n }} {{ (headerRow.key | dashCase) + '-column' }}\"\n (click)=\"\n table.isLoading || !headerRow.value.sortable || sort(headerRow.key)\n \"\n scope=\"col\"\n >\n <ng-container *ngIf=\"headerRow?.value?.header !== false\">{{\n headerRow?.value?.header || headerRow.key | capitalCase\n }}</ng-container>\n </th>\n <th\n *ngFor=\"let column of ((table$ | async)?.data || [])[0]\"\n ngClass=\"{{ headerRow.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[headerRow.key].templateRef\n ? templateRef\n : (table.config.rows || {})[headerRow.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: headerRow,\n transform: (table.config.rows || {})[headerRow.key].transform,\n templateRef: (table.config.rows || {})[headerRow.key].templateRef,\n index: 0\n }\"\n >\n </ng-container>\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 <tfoot *ngIf=\"(table$ | async)! as table\">\n <ng-container *ngIf=\"table.data.length > 0 && !(loading$ | async)\">\n <ng-container *ngIf=\"(calculations$ | async)! as calculations\">\n <tr\n *ngFor=\"let calculation of calculations.calculations; let i = index\"\n >\n <ng-container\n *ngIf=\"{\n showHeader: (colspan$ | async) !== (footerColspan$ | async)\n } as footerRow\"\n >\n <th\n *ngIf=\"footerRow.showHeader\"\n [colSpan]=\"\n ((colspan$ | async) || 0) - ((footerColspan$ | async) || 0)\n \"\n scope=\"row\"\n >\n <ng-container\n *ngIf=\"table.config?.footer?.headers?.[calculation] as showHeader\"\n >{{showHeader === true ? (calculation | capitalCase): table.config.footer?.headers?.[calculation]}}\n </ng-container>\n </th>\n <ng-container\n *ngFor=\"\n let column of table.config?.columns | keyvalue: columnOrder\n \"\n >\n <td\n *ngIf=\"\n !column.value?.hidden && calculations.calculated[column.key]\n \"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-header]=\"\n !footerRow.showHeader && table.config.footer?.headers?.[calculation]\n ? table.config.footer?.headers?.[calculation] === true ? (calculation | capitalCase) : table.config.footer?.headers?.[calculation]\n : null\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.columns || {})[column.key].transform\n ? transformFooter\n : rawFooter\n \"\n [ngTemplateOutletContext]=\"{\n value: calculations.calculated[column.key][calculation],\n transform: (table.config.columns || {})[column.key]\n .transform\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n </tfoot>\n</table>\n<ng-template #tableContent>\n <ng-container *ngIf=\"(table$ | async)! as table\">\n <tbody *ngIf=\"(table!.data![0] || table!.data!).length > 0; else noData\">\n <ng-container *ngIf=\"table.config.columns\">\n <tr\n *ngFor=\"\n let row of table!.data![(currentPage$ | async) || 0];\n let i = index\n \"\n [attr.id]=\"'tableRow_' + i\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"table?.config?.rowHover && _hoverRow(null, null, $event)\"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <td\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (searchBy$ | async) &&\n !(table.config.columns || {})[column.key].templateRef\n ? highlighted\n : (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: row,\n column: column,\n search: (searchBy$ | async),\n transform: (table.config.columns || {})[column.key].transform,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n index: i,\n data: table.data[(currentPage$ | async) || 0]\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n <ng-container *ngIf=\"table.config.rows\">\n <ng-container\n *ngFor=\"\n let row of table?.config?.rows | keyvalue: columnOrder | slice: 1;\n let i = index\n \"\n >\n <tr\n *ngIf=\"!row.value?.hidden\"\n [attr.id]=\"'tableRow_' + i\"\n ngClass=\"{{ (row.key | dashCase) + '-row' }}\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"\n table?.config?.rowHover && _hoverRow(null, null, $event)\n \"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <th class=\"row-header\" scope=\"row\">\n {{ row.value.header || row.key | capitalCase }}\n </th>\n <td\n *ngFor=\"let column of (table?.data || [])[0]; let y = index\"\n ngClass=\"{{ row.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[row.key].templateRef\n ? templateRef\n : (table.config.rows || {})[row.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: row,\n transform: (table.config.rows || {})[row.key].transform,\n templateRef: (table.config.rows || {})[row.key].templateRef,\n index: table.config.rows ? y : i,\n data: table.data[(currentPage$ | async) || 0]\n }\"\n >\n </ng-container>\n </td>\n </tr>\n </ng-container>\n </ng-container>\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\n #highlighted\n let-row=\"row\"\n let-column=\"column\"\n let-search=\"search\"\n let-transform=\"transform\"\n>\n <div\n *ngIf=\"!transform\"\n [innerHTML]=\"row[column.key] | highlight: search\"\n ></div>\n <div\n *ngIf=\"transform\"\n [innerHTML]=\"\n row[column.key]\n | dynamicPipe: transform.pipe:transform?.args\n | highlight: search\n \"\n ></div>\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{ row[column.key] }}\n</ng-template>\n<ng-template\n #transformData\n let-row=\"row\"\n let-column=\"column\"\n let-transform=\"transform\"\n let-data=\"data\"\n>\n {{ row[column.key] | dynamicPipe: transform.pipe:transform?.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n {{\n (value | dynamicPipe: transform.pipe:transform?.args) ||\n (tableConfig$ | async)?.footer?.emptyContent\n }}\n</ng-template>\n<ng-template #rawFooter let-value=\"value\">\n {{ value || (tableConfig$ | async)?.footer?.emptyContent }}\n</ng-template>\n<ng-template\n #templateRef\n let-row=\"row\"\n let-column=\"column\"\n let-index=\"index\"\n let-templateRef=\"templateRef\"\n let-data=\"data\"\n>\n <ng-container\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{\n row: row,\n col: column,\n index: index,\n data: data\n }\"\n ></ng-container>\n</ng-template>\n" }]
|
|
634
|
+
], template: "<table\n [ngClass]=\"(tableConfig$ | async)?.class || 'table'\"\n [class.table-mobile]=\"(tableConfig$ | async)?.mobileLayout\"\n [class.table-horizontal]=\"(tableConfig$ | async)?.rows\"\n [class.table-loading]=\"loading$ | async\"\n [class.gt-sticky-row-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.row && (tableConfig$ | async)?.rows\n \"\n [class.gt-sticky-column-header]=\"\n (tableConfig$ | async)?.stickyHeaders?.column\n \"\n [attr.aria-busy]=\"(loading$ | async) === true ? true : null\"\n>\n <thead>\n <tr\n *ngIf=\"{\n config: (tableConfig$ | async)!,\n isLoading: loading$ | async\n } as table\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <th\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [class.disabled]=\"table.isLoading\"\n [attr.aria-sort]=\"sortOrder$ | async | sortClass: column.key:'aria'\"\n [class.gt-sortable]=\"true\"\n scope=\"col\"\n >\n <button\n *ngIf=\"column.value?.sortable\"\n [attr.data-sort-order]=\"\n sortOrder$ | async | sortClass: column.key:'order'\n \"\n class=\"gt-sort\"\n (click)=\"\n table.isLoading ||\n !column.value.sortable ||\n sortByKey(column.key, $event)\n \"\n >\n <span *ngIf=\"column.value?.header !== false\">{{\n column.value.header || column.key | capitalCase\n }}</span>\n </button>\n <span\n *ngIf=\"!column.value?.sortable && column.value?.header !== false\"\n >{{ column.value.header || column.key | capitalCase }}</span\n >\n </th>\n </ng-container>\n <ng-container\n *ngIf=\"\n ((table?.config?.rows | keyvalue: columnOrder) || [])[0] as headerRow\n \"\n >\n <th\n class=\"row-header\"\n [attr.aria-sort]=\"\n sortOrder$ | async | sortClass: headerRow.key:'aria'\n \"\n ngClass=\"{{ headerRow.value.sortable ? 'sort ' : '' }} {{\n sortOrder$ | async | sortClass: headerRow.key\n }} {{ (headerRow.key | dashCase) + '-column' }}\"\n (click)=\"\n table.isLoading ||\n !headerRow.value.sortable ||\n sortByKey(headerRow.key, $event)\n \"\n scope=\"col\"\n >\n <ng-container *ngIf=\"headerRow?.value?.header !== false\">{{\n headerRow?.value?.header || headerRow.key | capitalCase\n }}</ng-container>\n </th>\n <th\n *ngFor=\"let column of ((table$ | async)?.data || [])[0]\"\n ngClass=\"{{ headerRow.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[headerRow.key].templateRef\n ? templateRef\n : (table.config.rows || {})[headerRow.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: headerRow,\n transform: (table.config.rows || {})[headerRow.key].transform,\n templateRef: (table.config.rows || {})[headerRow.key].templateRef,\n index: 0\n }\"\n >\n </ng-container>\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 <tfoot *ngIf=\"(table$ | async)! as table\">\n <ng-container *ngIf=\"table.data.length > 0 && !(loading$ | async)\">\n <ng-container *ngIf=\"(calculations$ | async)! as calculations\">\n <tr\n *ngFor=\"let calculation of calculations.calculations; let i = index\"\n >\n <ng-container\n *ngIf=\"{\n showHeader: (colspan$ | async) !== (footerColspan$ | async)\n } as footerRow\"\n >\n <th\n *ngIf=\"footerRow.showHeader\"\n [colSpan]=\"\n ((colspan$ | async) || 0) - ((footerColspan$ | async) || 0)\n \"\n scope=\"row\"\n >\n <ng-container\n *ngIf=\"table.config?.footer?.headers?.[calculation] as showHeader\"\n >{{showHeader === true ? (calculation | capitalCase): table.config.footer?.headers?.[calculation]}}\n </ng-container>\n </th>\n <ng-container\n *ngFor=\"\n let column of table.config?.columns | keyvalue: columnOrder\n \"\n >\n <td\n *ngIf=\"\n !column.value?.hidden && calculations.calculated[column.key]\n \"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-header]=\"\n !footerRow.showHeader && table.config.footer?.headers?.[calculation]\n ? table.config.footer?.headers?.[calculation] === true ? (calculation | capitalCase) : table.config.footer?.headers?.[calculation]\n : null\n \"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n [class.gt-no-content]=\"\n !calculations.calculated[column.key][calculation]\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformFooter\n : rawFooter\n \"\n [ngTemplateOutletContext]=\"{\n value: calculations.calculated[column.key][calculation],\n row: calculations.calculated[column.key],\n column: calculation,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n transform: (table.config.columns || {})[column.key]\n .transform\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n </tfoot>\n</table>\n<ng-template #tableContent>\n <ng-container *ngIf=\"(table$ | async)! as table\">\n <tbody *ngIf=\"(table!.data![0] || table!.data!).length > 0; else noData\">\n <ng-container *ngIf=\"table.config.columns\">\n <tr\n *ngFor=\"\n let row of table!.data![\n table.info.lazyLoaded ? 0 : (currentPaginationIndex$ | async) || 0\n ];\n let i = index\n \"\n [attr.id]=\"'tableRow_' + i\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"table?.config?.rowHover && _hoverRow(null, null, $event)\"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <ng-container\n *ngFor=\"let column of table.config?.columns | keyvalue: columnOrder\"\n >\n <td\n *ngIf=\"!column.value?.hidden\"\n ngClass=\"{{ (column.key | dashCase) + '-column' }} {{\n column.value.class\n }}\"\n [attr.data-label]=\"\n table.config.mobileLayout && column.value.mobileHeader\n ? column.value.mobileHeader !== true\n ? column.value.mobileHeader\n : (column.value.header || column.key | capitalCase)\n : null\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (searchBy$ | async) &&\n !(table.config.columns || {})[column.key].templateRef\n ? highlighted\n : (table.config.columns || {})[column.key].templateRef\n ? templateRef\n : (table.config.columns || {})[column.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: row,\n column: column,\n search: (searchBy$ | async),\n transform: (table.config.columns || {})[column.key].transform,\n templateRef: (table.config.columns || {})[column.key]\n .templateRef,\n index: i,\n data: table.data[\n table.info.lazyLoaded\n ? 0\n : (currentPaginationIndex$ | async) || 0\n ]\n }\"\n ></ng-container>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n <ng-container *ngIf=\"table.config.rows\">\n <ng-container\n *ngFor=\"\n let row of table?.config?.rows | keyvalue: columnOrder | slice: 1;\n let i = index\n \"\n >\n <tr\n *ngIf=\"!row.value?.hidden\"\n [attr.id]=\"'tableRow_' + i\"\n ngClass=\"{{ (row.key | dashCase) + '-row' }}\"\n (click)=\"table?.config?.rowClick && _rowClick(row, i, $event)\"\n (mouseover)=\"table?.config?.rowHover && _hoverRow(row, i, $event)\"\n (mouseout)=\"\n table?.config?.rowHover && _hoverRow(null, null, $event)\n \"\n [class.gt-hover]=\"(rowHover$ | async)?.index === i\"\n >\n <th class=\"row-header\" scope=\"row\">\n {{ row.value.header || row.key | capitalCase }}\n </th>\n <td\n *ngFor=\"let column of (table?.data || [])[0]; let y = index\"\n ngClass=\"{{ row.value.class }}\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n (table.config.rows || {})[row.key].templateRef\n ? templateRef\n : (table.config.rows || {})[row.key].transform\n ? transformData\n : rawData\n \"\n [ngTemplateOutletContext]=\"{\n row: column,\n column: row,\n transform: (table.config.rows || {})[row.key].transform,\n templateRef: (table.config.rows || {})[row.key].templateRef,\n index: table.config.rows ? y : i,\n data: table.data[\n table.info.lazyLoaded\n ? 0\n : (currentPaginationIndex$ | async) || 0\n ]\n }\"\n >\n </ng-container>\n </td>\n </tr>\n </ng-container>\n </ng-container>\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\n #highlighted\n let-row=\"row\"\n let-column=\"column\"\n let-search=\"search\"\n let-transform=\"transform\"\n>\n <div\n *ngIf=\"!transform\"\n [innerHTML]=\"row[column.key] | highlight: search\"\n ></div>\n <div\n *ngIf=\"transform\"\n [innerHTML]=\"\n row[column.key]\n | dynamicPipe: transform.pipe:transform?.args\n | highlight: search\n \"\n ></div>\n</ng-template>\n<ng-template #rawData let-row=\"row\" let-column=\"column\">\n {{ row[column.key] }}\n</ng-template>\n<ng-template\n #transformData\n let-row=\"row\"\n let-column=\"column\"\n let-transform=\"transform\"\n let-data=\"data\"\n>\n {{ row[column.key] | dynamicPipe: transform.pipe:transform?.args }}\n</ng-template>\n<ng-template #transformFooter let-value=\"value\" let-transform=\"transform\">\n {{\n (value | dynamicPipe: transform.pipe:transform?.args) ||\n (tableConfig$ | async)?.footer?.emptyContent\n }}\n</ng-template>\n<ng-template #rawFooter let-value=\"value\">\n {{ value || (tableConfig$ | async)?.footer?.emptyContent }}\n</ng-template>\n<ng-template\n #templateRef\n let-row=\"row\"\n let-column=\"column\"\n let-index=\"index\"\n let-templateRef=\"templateRef\"\n let-data=\"data\"\n>\n <ng-container\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{\n row: row,\n col: column,\n index: index,\n data: data\n }\"\n ></ng-container>\n</ng-template>\n" }]
|
|
469
635
|
}], propDecorators: { loading: [{
|
|
470
636
|
type: Input
|
|
471
|
-
}],
|
|
637
|
+
}], paginationIndex: [{
|
|
638
|
+
type: Input
|
|
639
|
+
}], pagingInfo: [{
|
|
472
640
|
type: Input
|
|
473
641
|
}], search: [{
|
|
474
642
|
type: Input
|
|
@@ -476,13 +644,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
|
|
|
476
644
|
type: Input
|
|
477
645
|
}], data: [{
|
|
478
646
|
type: Input
|
|
647
|
+
}], sortOrder: [{
|
|
648
|
+
type: Input
|
|
479
649
|
}], rowClick: [{
|
|
480
650
|
type: Output
|
|
651
|
+
}], sortOrderChange: [{
|
|
652
|
+
type: Output
|
|
481
653
|
}], rowHover: [{
|
|
482
654
|
type: Output
|
|
655
|
+
}], columnSort: [{
|
|
656
|
+
type: Output
|
|
657
|
+
}], pageChange: [{
|
|
658
|
+
type: Output
|
|
483
659
|
}] } });
|
|
484
660
|
|
|
485
661
|
class GtDeltaComponent {
|
|
662
|
+
get value() {
|
|
663
|
+
return this._value;
|
|
664
|
+
}
|
|
665
|
+
set value(value) {
|
|
666
|
+
this._value = value;
|
|
667
|
+
}
|
|
668
|
+
get deltaTemplate() {
|
|
669
|
+
return this._deltaTemplate;
|
|
670
|
+
}
|
|
486
671
|
constructor() {
|
|
487
672
|
this.Math = Math;
|
|
488
673
|
this.Number = Number;
|
|
@@ -497,15 +682,6 @@ class GtDeltaComponent {
|
|
|
497
682
|
this.notApplicableValue = null;
|
|
498
683
|
this.initialValue = null;
|
|
499
684
|
}
|
|
500
|
-
get value() {
|
|
501
|
-
return this._value;
|
|
502
|
-
}
|
|
503
|
-
set value(value) {
|
|
504
|
-
this._value = value;
|
|
505
|
-
}
|
|
506
|
-
get deltaTemplate() {
|
|
507
|
-
return this._deltaTemplate;
|
|
508
|
-
}
|
|
509
685
|
set deltaTemplate(deltaTemplate) {
|
|
510
686
|
this._deltaTemplate = deltaTemplate;
|
|
511
687
|
}
|
|
@@ -543,8 +719,8 @@ class GtDeltaComponent {
|
|
|
543
719
|
};
|
|
544
720
|
}
|
|
545
721
|
}
|
|
546
|
-
GtDeltaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
547
|
-
GtDeltaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
722
|
+
GtDeltaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: GtDeltaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
723
|
+
GtDeltaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: GtDeltaComponent, isStandalone: true, selector: "gt-delta", inputs: { deltaTemplate: "deltaTemplate", data: "data", index: "index", baseIndex: "baseIndex", classes: "classes", key: "key", notApplicableValue: "notApplicableValue", initialValue: "initialValue" }, usesOnChanges: true, ngImport: i0, template: `<span
|
|
548
724
|
*ngIf="value as delta"
|
|
549
725
|
[class]="[
|
|
550
726
|
classes.span,
|
|
@@ -565,7 +741,7 @@ GtDeltaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", versi
|
|
|
565
741
|
delta.relative | percent: '1.0-2'
|
|
566
742
|
}}</span>
|
|
567
743
|
</ng-template>`, isInline: true, styles: [":host{display:inline-block}\n"], dependencies: [{ kind: "pipe", type: PercentPipe, name: "percent" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
568
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
744
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: GtDeltaComponent, decorators: [{
|
|
569
745
|
type: Component,
|
|
570
746
|
args: [{ selector: 'gt-delta', template: `<span
|
|
571
747
|
*ngIf="value as delta"
|
|
@@ -608,8 +784,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
|
|
|
608
784
|
|
|
609
785
|
class GenericTableCoreModule {
|
|
610
786
|
}
|
|
611
|
-
GenericTableCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
612
|
-
GenericTableCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
787
|
+
GenericTableCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: GenericTableCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
788
|
+
GenericTableCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.1", ngImport: i0, type: GenericTableCoreModule, imports: [CommonModule,
|
|
613
789
|
CoreComponent,
|
|
614
790
|
SortClassPipe,
|
|
615
791
|
DashCasePipe,
|
|
@@ -618,10 +794,10 @@ GenericTableCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0",
|
|
|
618
794
|
CapitalCasePipe,
|
|
619
795
|
DynamicPipe,
|
|
620
796
|
GtDeltaComponent], exports: [CoreComponent, GtDeltaComponent] });
|
|
621
|
-
GenericTableCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
797
|
+
GenericTableCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: GenericTableCoreModule, imports: [CommonModule,
|
|
622
798
|
CoreComponent,
|
|
623
799
|
GtDeltaComponent] });
|
|
624
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
800
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: GenericTableCoreModule, decorators: [{
|
|
625
801
|
type: NgModule,
|
|
626
802
|
args: [{
|
|
627
803
|
imports: [
|
|
@@ -641,7 +817,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
|
|
|
641
817
|
|
|
642
818
|
class PaginationComponent {
|
|
643
819
|
constructor() {
|
|
644
|
-
this.
|
|
820
|
+
this._table$ = new ReplaySubject(1);
|
|
645
821
|
this._ariaLabels = {
|
|
646
822
|
nav: 'Table pagination',
|
|
647
823
|
button: 'Go to page ',
|
|
@@ -652,58 +828,111 @@ class PaginationComponent {
|
|
|
652
828
|
button: 'page-link',
|
|
653
829
|
};
|
|
654
830
|
this._paginationLength = 5;
|
|
655
|
-
|
|
831
|
+
/** paginationListItems$ - observable for page numbers to show based on number of pages and current position */
|
|
832
|
+
this.paginationListItems$ = this._table$.pipe(switchMap((core) => combineLatest([
|
|
833
|
+
core === null || core === void 0 ? void 0 : core.table$.pipe(pluck('info')),
|
|
834
|
+
core === null || core === void 0 ? void 0 : core.currentPaginationIndex$,
|
|
835
|
+
])), map(([info, currentPage]) => this._generateList(info.pageTotal, currentPage)), shareReplay(1));
|
|
836
|
+
}
|
|
837
|
+
get pagingInfo() {
|
|
838
|
+
return (this._pagingInfo || {
|
|
839
|
+
pageNext: null,
|
|
840
|
+
pageCurrent: null,
|
|
841
|
+
pagePrevious: null,
|
|
842
|
+
pageSize: null,
|
|
843
|
+
numberOfRecords: null,
|
|
844
|
+
pageTotal: null,
|
|
845
|
+
});
|
|
846
|
+
}
|
|
847
|
+
/** pagingInfo
|
|
848
|
+
* @description when provided, pagination component will use this information to render pagination instead of data from table. Use this option when pagination is handled by backend (server side).
|
|
849
|
+
* @type info - metadata for pagination component
|
|
850
|
+
*/
|
|
851
|
+
set pagingInfo(info) {
|
|
852
|
+
this._pagingInfo = info;
|
|
656
853
|
}
|
|
657
854
|
get paginationLength() {
|
|
658
855
|
return this._paginationLength;
|
|
659
856
|
}
|
|
660
|
-
|
|
661
|
-
|
|
857
|
+
/** paginationLength
|
|
858
|
+
* @description number of buttons to show in pagination
|
|
859
|
+
* @type length - number of buttons to show. Defaults to: `5`
|
|
860
|
+
*/
|
|
861
|
+
set paginationLength(length) {
|
|
862
|
+
this._paginationLength = +length;
|
|
662
863
|
}
|
|
663
864
|
get classes() {
|
|
664
865
|
return this._classes;
|
|
665
866
|
}
|
|
666
|
-
|
|
667
|
-
|
|
867
|
+
/** classes
|
|
868
|
+
* @description classes that should be used within pagination component for different elements
|
|
869
|
+
* @type classes - classes to be used. Defaults to: `{
|
|
870
|
+
* ul: 'pagination',
|
|
871
|
+
* li: 'page-item',
|
|
872
|
+
* button: 'page-link',
|
|
873
|
+
* }`
|
|
874
|
+
*/
|
|
875
|
+
set classes(classes) {
|
|
876
|
+
this._classes = classes;
|
|
668
877
|
}
|
|
669
878
|
get ariaLabels() {
|
|
670
879
|
return this._ariaLabels;
|
|
671
880
|
}
|
|
672
|
-
|
|
673
|
-
|
|
881
|
+
/** ariaLabels
|
|
882
|
+
* @description aria labels that describe pagination component
|
|
883
|
+
* @type labels - aria labels for pagination. Defaults to: `{
|
|
884
|
+
* nav: 'Table pagination',
|
|
885
|
+
* button: 'Go to page ',
|
|
886
|
+
* }`
|
|
887
|
+
*/
|
|
888
|
+
set ariaLabels(labels) {
|
|
889
|
+
this._ariaLabels = labels;
|
|
674
890
|
}
|
|
675
891
|
get table() {
|
|
676
892
|
return this._table;
|
|
677
893
|
}
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
894
|
+
/** table
|
|
895
|
+
* @description table component to which pagination is attached
|
|
896
|
+
* @type tableRef - table component
|
|
897
|
+
*/
|
|
898
|
+
set table(tableRef) {
|
|
899
|
+
this._table = tableRef;
|
|
900
|
+
this._table$.next(tableRef);
|
|
901
|
+
}
|
|
902
|
+
/** generate list - generate an array with page numbers to show based on number of pages and current position
|
|
903
|
+
* @param numberOfPages number of pages to show
|
|
904
|
+
* @param currentPosition current position (page index) being shown in table
|
|
905
|
+
* @returns Array<number> array of page numbers to show
|
|
906
|
+
*/
|
|
907
|
+
_generateList(numberOfPages, currentPosition) {
|
|
683
908
|
const middle = Math.floor(this.paginationLength / 2);
|
|
684
|
-
const length =
|
|
909
|
+
const length = numberOfPages < this.paginationLength
|
|
910
|
+
? numberOfPages
|
|
911
|
+
: this.paginationLength;
|
|
685
912
|
return Array.from({ length }, (_, i) => {
|
|
686
913
|
if (i === 0) {
|
|
687
914
|
return 1;
|
|
688
915
|
}
|
|
689
|
-
else if (
|
|
916
|
+
else if (numberOfPages < this.paginationLength) {
|
|
690
917
|
return i + 1;
|
|
691
918
|
}
|
|
692
919
|
else if (i + 1 === length) {
|
|
693
|
-
return
|
|
920
|
+
return numberOfPages;
|
|
694
921
|
}
|
|
695
|
-
else if (currentPosition > middle &&
|
|
922
|
+
else if (currentPosition > middle &&
|
|
923
|
+
currentPosition < numberOfPages - middle) {
|
|
696
924
|
return i + currentPosition - (middle - 1);
|
|
697
925
|
}
|
|
698
926
|
else if (currentPosition > middle &&
|
|
699
|
-
currentPosition <
|
|
927
|
+
currentPosition < numberOfPages - (middle - 1)) {
|
|
700
928
|
return i + currentPosition - middle;
|
|
701
929
|
}
|
|
702
930
|
else if (currentPosition > middle &&
|
|
703
|
-
currentPosition ===
|
|
931
|
+
currentPosition === numberOfPages - (middle - 1)) {
|
|
704
932
|
return i + currentPosition - (middle + 1);
|
|
705
933
|
}
|
|
706
|
-
else if (currentPosition > middle &&
|
|
934
|
+
else if (currentPosition > middle &&
|
|
935
|
+
currentPosition === numberOfPages - 1) {
|
|
707
936
|
return i + currentPosition - (middle + 2);
|
|
708
937
|
}
|
|
709
938
|
else {
|
|
@@ -711,18 +940,23 @@ class PaginationComponent {
|
|
|
711
940
|
}
|
|
712
941
|
});
|
|
713
942
|
}
|
|
714
|
-
|
|
943
|
+
/** go to page
|
|
944
|
+
* @param index - page index to go to
|
|
945
|
+
*/
|
|
946
|
+
goToPage(index) {
|
|
715
947
|
if (this.table) {
|
|
716
|
-
this.table.
|
|
948
|
+
this.table.paginationIndex = index - 1;
|
|
717
949
|
}
|
|
718
950
|
}
|
|
719
951
|
}
|
|
720
|
-
PaginationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
721
|
-
PaginationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
722
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
952
|
+
PaginationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
953
|
+
PaginationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: PaginationComponent, isStandalone: true, selector: "angular-generic-table-pagination", inputs: { pagingInfo: "pagingInfo", paginationLength: "paginationLength", classes: "classes", ariaLabels: "ariaLabels", table: "table" }, ngImport: i0, template: "<ng-container\n *ngIf=\"{\n links: paginationListItems$ | async,\n currentPosition: table?.currentPaginationIndex$ | async\n } as pagination\"\n>\n <nav\n *ngIf=\"pagination.links && pagination.links.length > 1\"\n role=\"navigation\"\n [attr.aria-label]=\"ariaLabels.nav\"\n class=\"gt-pagination\"\n [class]=\"classes.nav\"\n >\n <ul [class]=\"classes.ul\">\n <ng-container\n *ngFor=\"\n let position of pagination!.links;\n let i = index;\n let last = last\n \"\n >\n <li\n [class]=\"classes.li\"\n [class.active]=\"position === (pagination!.currentPosition || 0) + 1\"\n >\n <button\n [class]=\"classes.button\"\n [attr.aria-label]=\"ariaLabels.button + position\"\n (click)=\"goToPage(position)\"\n >\n {{ position }}\n </button>\n </li>\n <li\n [class]=\"classes.li\"\n class=\"gt-ellipsis\"\n *ngIf=\"position + 1 !== pagination!.links![i + 1] && !last\"\n >\n <button [class]=\"classes.button\" disabled tabindex=\"-1\"></button>\n </li>\n </ng-container>\n </ul>\n </nav>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
954
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: PaginationComponent, decorators: [{
|
|
723
955
|
type: Component,
|
|
724
|
-
args: [{ selector: 'angular-generic-table-pagination', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
725
|
-
}], propDecorators: {
|
|
956
|
+
args: [{ selector: 'angular-generic-table-pagination', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], template: "<ng-container\n *ngIf=\"{\n links: paginationListItems$ | async,\n currentPosition: table?.currentPaginationIndex$ | async\n } as pagination\"\n>\n <nav\n *ngIf=\"pagination.links && pagination.links.length > 1\"\n role=\"navigation\"\n [attr.aria-label]=\"ariaLabels.nav\"\n class=\"gt-pagination\"\n [class]=\"classes.nav\"\n >\n <ul [class]=\"classes.ul\">\n <ng-container\n *ngFor=\"\n let position of pagination!.links;\n let i = index;\n let last = last\n \"\n >\n <li\n [class]=\"classes.li\"\n [class.active]=\"position === (pagination!.currentPosition || 0) + 1\"\n >\n <button\n [class]=\"classes.button\"\n [attr.aria-label]=\"ariaLabels.button + position\"\n (click)=\"goToPage(position)\"\n >\n {{ position }}\n </button>\n </li>\n <li\n [class]=\"classes.li\"\n class=\"gt-ellipsis\"\n *ngIf=\"position + 1 !== pagination!.links![i + 1] && !last\"\n >\n <button [class]=\"classes.button\" disabled tabindex=\"-1\"></button>\n </li>\n </ng-container>\n </ul>\n </nav>\n</ng-container>\n" }]
|
|
957
|
+
}], propDecorators: { pagingInfo: [{
|
|
958
|
+
type: Input
|
|
959
|
+
}], paginationLength: [{
|
|
726
960
|
type: Input
|
|
727
961
|
}], classes: [{
|
|
728
962
|
type: Input
|
|
@@ -734,10 +968,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
|
|
|
734
968
|
|
|
735
969
|
class GenericTablePaginationModule {
|
|
736
970
|
}
|
|
737
|
-
GenericTablePaginationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
738
|
-
GenericTablePaginationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
739
|
-
GenericTablePaginationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
740
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
971
|
+
GenericTablePaginationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: GenericTablePaginationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
972
|
+
GenericTablePaginationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.1", ngImport: i0, type: GenericTablePaginationModule, imports: [CommonModule, PaginationComponent], exports: [PaginationComponent] });
|
|
973
|
+
GenericTablePaginationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: GenericTablePaginationModule, imports: [CommonModule, PaginationComponent] });
|
|
974
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: GenericTablePaginationModule, decorators: [{
|
|
741
975
|
type: NgModule,
|
|
742
976
|
args: [{
|
|
743
977
|
imports: [CommonModule, PaginationComponent],
|
|
@@ -753,5 +987,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
|
|
|
753
987
|
* Generated bundle index. Do not edit.
|
|
754
988
|
*/
|
|
755
989
|
|
|
756
|
-
export { CoreComponent, CoreService, GenericTableCoreModule, GenericTablePaginationModule, GtDeltaComponent, PaginationComponent };
|
|
990
|
+
export { CapitalCasePipe, CoreComponent, CoreService, DashCasePipe, DynamicPipe, GenericTableCoreModule, GenericTablePaginationModule, GtDeltaComponent, HighlightPipe, PaginationComponent, SortClassPipe, calculate, capitalize, chunk, dashed, parseSortOrderParams, search, sortOnMultipleKeys, sortOrderConfigToParam, sortOrderToParams };
|
|
757
991
|
//# sourceMappingURL=angular-generic-table-core.mjs.map
|