@bootkit/ng0 0.0.0-alpha.2 → 0.0.0-alpha.21
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/common/index.d.ts +118 -6
- package/components/accordion/index.d.ts +1 -1
- package/components/backdrop/index.d.ts +12 -0
- package/components/button/index.d.ts +48 -0
- package/components/card/index.d.ts +27 -0
- package/components/code/index.d.ts +35 -0
- package/components/confirmation/index.d.ts +66 -0
- package/components/dropdown/index.d.ts +78 -0
- package/components/form-field/index.d.ts +72 -0
- package/components/list/index.d.ts +127 -0
- package/components/modal/index.d.ts +22 -4
- package/components/nav/index.d.ts +23 -19
- package/components/pagination/index.d.ts +35 -9
- package/components/popover/index.d.ts +1 -1
- package/components/select/index.d.ts +116 -0
- package/components/sidenav/index.d.ts +59 -0
- package/components/stepper/index.d.ts +26 -0
- package/components/table/index.d.ts +273 -0
- package/components/toast/index.d.ts +1 -1
- package/components/tooltip/index.d.ts +1 -1
- package/components/vertical-menu/index.d.ts +61 -0
- package/data/index.d.ts +258 -46
- package/date/index.d.ts +34 -0
- package/fesm2022/bootkit-ng0-common.mjs +89 -11
- package/fesm2022/bootkit-ng0-common.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-accordion.mjs +13 -13
- package/fesm2022/bootkit-ng0-components-accordion.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-backdrop.mjs +46 -0
- package/fesm2022/bootkit-ng0-components-backdrop.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-button.mjs +119 -0
- package/fesm2022/bootkit-ng0-components-button.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-card.mjs +62 -0
- package/fesm2022/bootkit-ng0-components-card.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-code.mjs +70 -0
- package/fesm2022/bootkit-ng0-components-code.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-collapse.mjs +14 -14
- package/fesm2022/bootkit-ng0-components-collapse.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-confirmation.mjs +167 -0
- package/fesm2022/bootkit-ng0-components-confirmation.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-dropdown.mjs +189 -0
- package/fesm2022/bootkit-ng0-components-dropdown.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-form-field.mjs +147 -0
- package/fesm2022/bootkit-ng0-components-form-field.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-list.mjs +331 -0
- package/fesm2022/bootkit-ng0-components-list.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-modal.mjs +40 -23
- package/fesm2022/bootkit-ng0-components-modal.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-nav.mjs +58 -59
- package/fesm2022/bootkit-ng0-components-nav.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-offcanvas.mjs +9 -9
- package/fesm2022/bootkit-ng0-components-offcanvas.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-overlay.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-pagination.mjs +58 -23
- package/fesm2022/bootkit-ng0-components-pagination.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-popover.mjs +10 -10
- package/fesm2022/bootkit-ng0-components-popover.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-select.mjs +427 -0
- package/fesm2022/bootkit-ng0-components-select.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-sidenav.mjs +153 -0
- package/fesm2022/bootkit-ng0-components-sidenav.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-stepper.mjs +91 -0
- package/fesm2022/bootkit-ng0-components-stepper.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-table.mjs +461 -0
- package/fesm2022/bootkit-ng0-components-table.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-components-toast.mjs +7 -7
- package/fesm2022/bootkit-ng0-components-toast.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-tooltip.mjs +8 -8
- package/fesm2022/bootkit-ng0-components-tooltip.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-components-vertical-menu.mjs +161 -0
- package/fesm2022/bootkit-ng0-components-vertical-menu.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-data.mjs +291 -90
- package/fesm2022/bootkit-ng0-data.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-date.mjs +50 -0
- package/fesm2022/bootkit-ng0-date.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-file.mjs +50 -0
- package/fesm2022/bootkit-ng0-file.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-form.mjs +514 -0
- package/fesm2022/bootkit-ng0-form.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-http.mjs +225 -179
- package/fesm2022/bootkit-ng0-http.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-localization-locales.mjs +115 -0
- package/fesm2022/bootkit-ng0-localization-locales.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-localization.mjs +481 -0
- package/fesm2022/bootkit-ng0-localization.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-platform-browser.mjs +51 -0
- package/fesm2022/bootkit-ng0-platform-browser.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-script.mjs +59 -0
- package/fesm2022/bootkit-ng0-script.mjs.map +1 -0
- package/fesm2022/bootkit-ng0-security.mjs +17 -15
- package/fesm2022/bootkit-ng0-security.mjs.map +1 -1
- package/file/index.d.ts +22 -0
- package/form/index.d.ts +127 -0
- package/http/index.d.ts +141 -40
- package/localization/index.d.ts +305 -0
- package/localization/locales/index.d.ts +7 -0
- package/package.json +90 -10
- package/platform/browser/index.d.ts +22 -0
- package/script/index.d.ts +27 -0
- package/security/index.d.ts +3 -9
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, booleanAttribute, model, signal, TemplateRef, ContentChild, Directive, Input, HostBinding, ContentChildren, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
|
|
3
|
+
import * as i2 from '@angular/common';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import * as i3 from '@angular/forms';
|
|
6
|
+
import { FormsModule } from '@angular/forms';
|
|
7
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
+
import { formatString } from '@bootkit/ng0/common';
|
|
9
|
+
import * as i1 from '@bootkit/ng0/localization';
|
|
10
|
+
import { LocalizationModule } from '@bootkit/ng0/localization';
|
|
11
|
+
import { dataSourceAttribute, DataRequest } from '@bootkit/ng0/data';
|
|
12
|
+
import { PaginationComponent } from '@bootkit/ng0/components/pagination';
|
|
13
|
+
import * as i4 from '@angular/cdk/overlay';
|
|
14
|
+
import { OverlayModule } from '@angular/cdk/overlay';
|
|
15
|
+
import { NumberDirective } from '@bootkit/ng0/form';
|
|
16
|
+
|
|
17
|
+
class TableColumnDirective {
|
|
18
|
+
/**
|
|
19
|
+
* The field in the data source to bind to. If not set, the column will not display any data.
|
|
20
|
+
*/
|
|
21
|
+
field = input(...(ngDevMode ? [undefined, { debugName: "field" }] : []));
|
|
22
|
+
/**
|
|
23
|
+
* The title of the column. This will be displayed in the header row.
|
|
24
|
+
*/
|
|
25
|
+
title = input(...(ngDevMode ? [undefined, { debugName: "title" }] : []));
|
|
26
|
+
/**
|
|
27
|
+
* Text to display in the cell if the value is null or undefined.
|
|
28
|
+
*/
|
|
29
|
+
emptyCellText = input(...(ngDevMode ? [undefined, { debugName: "emptyCellText" }] : []));
|
|
30
|
+
/**
|
|
31
|
+
* Type of the table cell.
|
|
32
|
+
*/
|
|
33
|
+
type = input('text', ...(ngDevMode ? [{ debugName: "type" }] : []));
|
|
34
|
+
/**
|
|
35
|
+
* CSS class(es) to apply to the table cell.
|
|
36
|
+
*/
|
|
37
|
+
cellClass = input(...(ngDevMode ? [undefined, { debugName: "cellClass" }] : []));
|
|
38
|
+
/**
|
|
39
|
+
* @deprecated Use `cellClass` instead.
|
|
40
|
+
*/
|
|
41
|
+
bold = input(false, ...(ngDevMode ? [{ debugName: "bold", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
42
|
+
/**
|
|
43
|
+
* @deprecated Use `cellClass` instead.
|
|
44
|
+
*/
|
|
45
|
+
shrink = input(false, ...(ngDevMode ? [{ debugName: "shrink", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
46
|
+
/**
|
|
47
|
+
* If true, the column will support filtering.
|
|
48
|
+
*/
|
|
49
|
+
filterable = input(false, ...(ngDevMode ? [{ debugName: "filterable", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
50
|
+
/**
|
|
51
|
+
* The current filter value of the column.
|
|
52
|
+
*/
|
|
53
|
+
filterValue = model(...(ngDevMode ? [undefined, { debugName: "filterValue" }] : []));
|
|
54
|
+
/**
|
|
55
|
+
* The field to use for filtering. If not set, the `field` property will be used.
|
|
56
|
+
* @deprecated Use `fieldName` instead.
|
|
57
|
+
*/
|
|
58
|
+
filterField = input(...(ngDevMode ? [undefined, { debugName: "filterField" }] : []));
|
|
59
|
+
/**
|
|
60
|
+
* The current filter operator of the column.
|
|
61
|
+
*/
|
|
62
|
+
filterOperator = model(...(ngDevMode ? [undefined, { debugName: "filterOperator" }] : []));
|
|
63
|
+
/**
|
|
64
|
+
* The list of filter operators to show in the filter dropdown. If not set, a default list will be used based on the column type.
|
|
65
|
+
*/
|
|
66
|
+
filterOperators = input(...(ngDevMode ? [undefined, { debugName: "filterOperators" }] : []));
|
|
67
|
+
/**
|
|
68
|
+
* If true, the filter operators dropdown will be shown.
|
|
69
|
+
*/
|
|
70
|
+
showFilterOperators = signal(false, ...(ngDevMode ? [{ debugName: "showFilterOperators" }] : []));
|
|
71
|
+
/**
|
|
72
|
+
* The name of the field in the data source. If not set, the `field` property will be used.
|
|
73
|
+
*/
|
|
74
|
+
fieldName = input(...(ngDevMode ? [undefined, { debugName: "fieldName" }] : []));
|
|
75
|
+
/**
|
|
76
|
+
* If true, the column will support sorting.
|
|
77
|
+
*/
|
|
78
|
+
sortable = input(false, ...(ngDevMode ? [{ debugName: "sortable", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
79
|
+
/**
|
|
80
|
+
* The current sort direction of the column.
|
|
81
|
+
*/
|
|
82
|
+
sortDirection = model('none', ...(ngDevMode ? [{ debugName: "sortDirection" }] : []));
|
|
83
|
+
template;
|
|
84
|
+
constructor() {
|
|
85
|
+
}
|
|
86
|
+
ngOnInit() {
|
|
87
|
+
if (this.filterOperator() == undefined) {
|
|
88
|
+
this.filterOperator.set(this.type() == 'text' ? 'contains' : 'eq');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get the list of filter operators to show in the filter dropdown.
|
|
93
|
+
*/
|
|
94
|
+
getFilterOperators() {
|
|
95
|
+
let op = this.filterOperators();
|
|
96
|
+
if (op && op.length > 0)
|
|
97
|
+
return op;
|
|
98
|
+
let type = this.type();
|
|
99
|
+
if (type == 'number' || type == 'currency' || type == 'date' || type == 'time') {
|
|
100
|
+
return ['eq', 'ne', 'gt', 'gte', 'lt', 'lte',];
|
|
101
|
+
}
|
|
102
|
+
else if (type == 'text') {
|
|
103
|
+
return ['contains', 'startsWith', 'endsWith', 'eq', 'ne'];
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Toggle the sort direction of the column.
|
|
111
|
+
* @returns void
|
|
112
|
+
*/
|
|
113
|
+
toggleSortDirection() {
|
|
114
|
+
if (!this.sortable()) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
let dir = this.sortDirection();
|
|
118
|
+
if (dir === 'none') {
|
|
119
|
+
this.sortDirection.set('asc');
|
|
120
|
+
}
|
|
121
|
+
else if (dir === 'asc') {
|
|
122
|
+
this.sortDirection.set('desc');
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this.sortDirection.set('none');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: TableColumnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
129
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.1", type: TableColumnDirective, isStandalone: true, selector: "ng0-table-col", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, emptyCellText: { classPropertyName: "emptyCellText", publicName: "emptyCellText", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, cellClass: { classPropertyName: "cellClass", publicName: "cellClass", isSignal: true, isRequired: false, transformFunction: null }, bold: { classPropertyName: "bold", publicName: "bold", isSignal: true, isRequired: false, transformFunction: null }, shrink: { classPropertyName: "shrink", publicName: "shrink", isSignal: true, isRequired: false, transformFunction: null }, filterable: { classPropertyName: "filterable", publicName: "filterable", isSignal: true, isRequired: false, transformFunction: null }, filterValue: { classPropertyName: "filterValue", publicName: "filterValue", isSignal: true, isRequired: false, transformFunction: null }, filterField: { classPropertyName: "filterField", publicName: "filterField", isSignal: true, isRequired: false, transformFunction: null }, filterOperator: { classPropertyName: "filterOperator", publicName: "filterOperator", isSignal: true, isRequired: false, transformFunction: null }, filterOperators: { classPropertyName: "filterOperators", publicName: "filterOperators", isSignal: true, isRequired: false, transformFunction: null }, fieldName: { classPropertyName: "fieldName", publicName: "fieldName", isSignal: true, isRequired: false, transformFunction: null }, sortable: { classPropertyName: "sortable", publicName: "sortable", isSignal: true, isRequired: false, transformFunction: null }, sortDirection: { classPropertyName: "sortDirection", publicName: "sortDirection", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filterValue: "filterValueChange", filterOperator: "filterOperatorChange", sortDirection: "sortDirectionChange" }, queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0 });
|
|
130
|
+
}
|
|
131
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: TableColumnDirective, decorators: [{
|
|
132
|
+
type: Directive,
|
|
133
|
+
args: [{
|
|
134
|
+
selector: 'ng0-table-col',
|
|
135
|
+
standalone: true,
|
|
136
|
+
}]
|
|
137
|
+
}], ctorParameters: () => [], propDecorators: { template: [{
|
|
138
|
+
type: ContentChild,
|
|
139
|
+
args: [TemplateRef]
|
|
140
|
+
}] } });
|
|
141
|
+
|
|
142
|
+
class TableDetailRowDirective {
|
|
143
|
+
templateRef;
|
|
144
|
+
showCallback;
|
|
145
|
+
constructor(templateRef) {
|
|
146
|
+
this.templateRef = templateRef;
|
|
147
|
+
}
|
|
148
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: TableDetailRowDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
149
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.1", type: TableDetailRowDirective, isStandalone: true, selector: "[ng0-table-detail-row]", inputs: { showCallback: "showCallback" }, ngImport: i0 });
|
|
150
|
+
}
|
|
151
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: TableDetailRowDirective, decorators: [{
|
|
152
|
+
type: Directive,
|
|
153
|
+
args: [{
|
|
154
|
+
selector: '[ng0-table-detail-row]',
|
|
155
|
+
standalone: true,
|
|
156
|
+
}]
|
|
157
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { showCallback: [{
|
|
158
|
+
type: Input
|
|
159
|
+
}] } });
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* A generic table component that can display data in a tabular format.
|
|
163
|
+
* It supports features like pagination, sorting, filtering, and row details.
|
|
164
|
+
* It can be used with any data source that implements the DataSource interface.
|
|
165
|
+
*/
|
|
166
|
+
class TableComponent {
|
|
167
|
+
_ls;
|
|
168
|
+
_destroyRef;
|
|
169
|
+
/**
|
|
170
|
+
* The data source for the table.
|
|
171
|
+
* This can be an array of data, a function that returns an observable of data,
|
|
172
|
+
* or an instance of DataSource.
|
|
173
|
+
*/
|
|
174
|
+
source = input.required(...(ngDevMode ? [{ debugName: "source" }] : []));
|
|
175
|
+
/**
|
|
176
|
+
* If true, the table will automatically load data when initialized.
|
|
177
|
+
* This is useful for tables that need to display data immediately without user interaction.
|
|
178
|
+
*/
|
|
179
|
+
autoLoad = input(true, ...(ngDevMode ? [{ debugName: "autoLoad", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
180
|
+
/**
|
|
181
|
+
* If true, the table will show row numbers.
|
|
182
|
+
* This will add a column to the left of the table with the row numbers.
|
|
183
|
+
*/
|
|
184
|
+
showRowNumbers = input(false, ...(ngDevMode ? [{ debugName: "showRowNumbers", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
185
|
+
/**
|
|
186
|
+
* If true, the table will show the header row.
|
|
187
|
+
*/
|
|
188
|
+
showHeader = input(true, ...(ngDevMode ? [{ debugName: "showHeader", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
189
|
+
/**
|
|
190
|
+
* If true, the table will support pagination.
|
|
191
|
+
* If false, the table will load all records at once.
|
|
192
|
+
*/
|
|
193
|
+
pageable = input(undefined, ...(ngDevMode ? [{ debugName: "pageable", transform: v => {
|
|
194
|
+
if (v === undefined || v === null || v === false) {
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
if (v === true) {
|
|
198
|
+
v = {};
|
|
199
|
+
}
|
|
200
|
+
v.pageIndex = v.pageIndex ?? 1;
|
|
201
|
+
v.pageSize = v.pageSize ?? 10;
|
|
202
|
+
v.maxVisiblePages = v.maxVisiblePages ?? 10;
|
|
203
|
+
v.showPagingControls = v.showPagingControls ?? true;
|
|
204
|
+
return v;
|
|
205
|
+
} }] : [{
|
|
206
|
+
transform: v => {
|
|
207
|
+
if (v === undefined || v === null || v === false) {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
if (v === true) {
|
|
211
|
+
v = {};
|
|
212
|
+
}
|
|
213
|
+
v.pageIndex = v.pageIndex ?? 1;
|
|
214
|
+
v.pageSize = v.pageSize ?? 10;
|
|
215
|
+
v.maxVisiblePages = v.maxVisiblePages ?? 10;
|
|
216
|
+
v.showPagingControls = v.showPagingControls ?? true;
|
|
217
|
+
return v;
|
|
218
|
+
}
|
|
219
|
+
}]));
|
|
220
|
+
/**
|
|
221
|
+
* If true, the table will support sorting.
|
|
222
|
+
* This will add a sort icon to each column header.
|
|
223
|
+
*/
|
|
224
|
+
sortable = input(true, ...(ngDevMode ? [{ debugName: "sortable", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
225
|
+
/**
|
|
226
|
+
* The CSS class to apply to the table element.
|
|
227
|
+
* This can be used to apply custom styles to the table.
|
|
228
|
+
*/
|
|
229
|
+
tableClass = input(...(ngDevMode ? [undefined, { debugName: "tableClass" }] : []));
|
|
230
|
+
/**
|
|
231
|
+
* The CSS class to apply to the header element.
|
|
232
|
+
*/
|
|
233
|
+
headerClass = input(...(ngDevMode ? [undefined, { debugName: "headerClass" }] : []));
|
|
234
|
+
/**
|
|
235
|
+
* The caption of the table.
|
|
236
|
+
*/
|
|
237
|
+
caption = input(...(ngDevMode ? [undefined, { debugName: "caption" }] : []));
|
|
238
|
+
/**
|
|
239
|
+
* The height of the table in pixels.
|
|
240
|
+
* This can be used to set a fixed height for the table.
|
|
241
|
+
*/
|
|
242
|
+
height = input(...(ngDevMode ? [undefined, { debugName: "height" }] : []));
|
|
243
|
+
/**
|
|
244
|
+
* If true, the table will support filtering.
|
|
245
|
+
* This will add a filter input to each column header.
|
|
246
|
+
*/
|
|
247
|
+
filterable = input(false, ...(ngDevMode ? [{ debugName: "filterable", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
248
|
+
/**
|
|
249
|
+
* The indicator to show while the table is loading data for the first time.
|
|
250
|
+
*/
|
|
251
|
+
loadingIndicator = input('spinner', ...(ngDevMode ? [{ debugName: "loadingIndicator", transform: v => {
|
|
252
|
+
if (typeof v === 'boolean') {
|
|
253
|
+
return v ? 'spinner' : 'none';
|
|
254
|
+
}
|
|
255
|
+
return v;
|
|
256
|
+
} }] : [{
|
|
257
|
+
transform: v => {
|
|
258
|
+
if (typeof v === 'boolean') {
|
|
259
|
+
return v ? 'spinner' : 'none';
|
|
260
|
+
}
|
|
261
|
+
return v;
|
|
262
|
+
}
|
|
263
|
+
}]));
|
|
264
|
+
/** If true, the table will show a loading cover while data is being loaded.
|
|
265
|
+
* This can be used to prevent user interaction with the table while loading.
|
|
266
|
+
* This cover is not displayed when the table is loading for the first time.
|
|
267
|
+
* Instead, the table will show a loading based on loadingIndicator settings.
|
|
268
|
+
*/
|
|
269
|
+
loadingCover = input('spinner', ...(ngDevMode ? [{ debugName: "loadingCover", transform: v => {
|
|
270
|
+
if (typeof v === 'boolean') {
|
|
271
|
+
return v ? 'spinner' : 'none';
|
|
272
|
+
}
|
|
273
|
+
return v;
|
|
274
|
+
} }] : [{
|
|
275
|
+
transform: v => {
|
|
276
|
+
if (typeof v === 'boolean') {
|
|
277
|
+
return v ? 'spinner' : 'none';
|
|
278
|
+
}
|
|
279
|
+
return v;
|
|
280
|
+
}
|
|
281
|
+
}]));
|
|
282
|
+
// @Input() rowColor?: (row: any) => BootstrapColor;
|
|
283
|
+
_columns;
|
|
284
|
+
_detailRow;
|
|
285
|
+
_dataResult = signal(undefined, ...(ngDevMode ? [{ debugName: "_dataResult" }] : []));
|
|
286
|
+
_lastRequest; // The last data request made to the data source
|
|
287
|
+
_loadingRequest; // The current data request being processed
|
|
288
|
+
_rowStates = new Map();
|
|
289
|
+
_formatString = formatString;
|
|
290
|
+
_changeSubscription;
|
|
291
|
+
_dataSource;
|
|
292
|
+
_pagingFormatter;
|
|
293
|
+
_lastError;
|
|
294
|
+
constructor(_ls, _destroyRef) {
|
|
295
|
+
this._ls = _ls;
|
|
296
|
+
this._destroyRef = _destroyRef;
|
|
297
|
+
}
|
|
298
|
+
ngOnInit() {
|
|
299
|
+
}
|
|
300
|
+
ngAfterContentInit() {
|
|
301
|
+
this._dataSource = dataSourceAttribute(this.source());
|
|
302
|
+
const locale = this._ls.get();
|
|
303
|
+
this._pagingFormatter = locale?.definition.components?.table?.pagingInfo ??
|
|
304
|
+
((o) => `Showing ${o.firstRecord}-${o.lastRecord} of ${o.totalRecords} records`);
|
|
305
|
+
// this._changeSubscription = this.dataSource().change.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(result => {
|
|
306
|
+
// this.reload();
|
|
307
|
+
// });
|
|
308
|
+
if (this.autoLoad()) {
|
|
309
|
+
this.load(this.pageable()?.pageIndex);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Load data for the specified page index (optional).
|
|
314
|
+
* @param pageIndex The page index to load.
|
|
315
|
+
*/
|
|
316
|
+
load(pageIndex) {
|
|
317
|
+
let page;
|
|
318
|
+
let filters = [];
|
|
319
|
+
let sort;
|
|
320
|
+
if (this.filterable()) {
|
|
321
|
+
this._columns.forEach(col => {
|
|
322
|
+
if (col.filterable() && col.filterValue() != '' && col.filterValue() != undefined) {
|
|
323
|
+
filters.push({ field: col.fieldName() ?? col.filterField() ?? col.field(), value: col.filterValue(), operator: col.filterOperator() });
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
if (this.pageable()) {
|
|
328
|
+
page = {
|
|
329
|
+
index: pageIndex || this._lastRequest?.page?.index || 1,
|
|
330
|
+
size: this._lastRequest?.page?.size || 10,
|
|
331
|
+
zeroBased: false
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
if (this.sortable()) {
|
|
335
|
+
let col = this._columns.find(c => c.sortable() && c.sortDirection() != 'none' && (c.field() != '' || c.fieldName() != ''));
|
|
336
|
+
if (col) {
|
|
337
|
+
sort = {
|
|
338
|
+
field: col.fieldName() ?? col.field(),
|
|
339
|
+
asc: col.sortDirection() === 'asc'
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
this._loadingRequest = new DataRequest({ page, filters, sort, select: [], computeTotal: true });
|
|
344
|
+
this._dataSource.load(this._loadingRequest)
|
|
345
|
+
.pipe(takeUntilDestroyed(this._destroyRef)).subscribe({
|
|
346
|
+
next: result => {
|
|
347
|
+
this._dataResult.set(result);
|
|
348
|
+
this._lastRequest = this._loadingRequest;
|
|
349
|
+
this._loadingRequest = undefined;
|
|
350
|
+
this._lastError = undefined;
|
|
351
|
+
}, error: err => {
|
|
352
|
+
this._lastError = err;
|
|
353
|
+
this._lastRequest = this._loadingRequest;
|
|
354
|
+
this._loadingRequest = undefined;
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Determines if the table is currently loading data.
|
|
360
|
+
*/
|
|
361
|
+
get isLoading() {
|
|
362
|
+
return this._dataSource.isLoading;
|
|
363
|
+
}
|
|
364
|
+
_getCellValue(row, col) {
|
|
365
|
+
var subFields = col.field().split('.');
|
|
366
|
+
let value = row[subFields[0]];
|
|
367
|
+
for (let i = 1; i < subFields.length; i++) {
|
|
368
|
+
if (value == null)
|
|
369
|
+
break;
|
|
370
|
+
value = value[subFields[i]];
|
|
371
|
+
}
|
|
372
|
+
return value;
|
|
373
|
+
}
|
|
374
|
+
_onPageChange(pageIndex) {
|
|
375
|
+
this.load(pageIndex);
|
|
376
|
+
}
|
|
377
|
+
_onToggleRowDetailClick(row) {
|
|
378
|
+
var state = this._rowStates.get(row);
|
|
379
|
+
if (!state) {
|
|
380
|
+
this._rowStates.set(row, { expanded: true });
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
state.expanded = !state.expanded;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
isRowExpanded(row) {
|
|
387
|
+
var state = this._rowStates.get(row);
|
|
388
|
+
return state == undefined ? false : state.expanded;
|
|
389
|
+
}
|
|
390
|
+
_onToggleFilterOperator(col) {
|
|
391
|
+
if (col.showFilterOperators()) {
|
|
392
|
+
col.showFilterOperators.set(false);
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
this._columns.forEach(x => x.showFilterOperators.set(false));
|
|
396
|
+
col.showFilterOperators.set(true);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
_onSelectFilterOperator(col, filterOperator) {
|
|
400
|
+
col.filterOperator.set(filterOperator);
|
|
401
|
+
this._columns.forEach(x => x.showFilterOperators.set(false));
|
|
402
|
+
this.load(0);
|
|
403
|
+
}
|
|
404
|
+
ngOnDestroy() {
|
|
405
|
+
this._changeSubscription?.unsubscribe();
|
|
406
|
+
}
|
|
407
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: TableComponent, deps: [{ token: i1.LocalizationService }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
408
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.1", type: TableComponent, isStandalone: true, selector: "ng0-table", inputs: { source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: true, transformFunction: null }, autoLoad: { classPropertyName: "autoLoad", publicName: "autoLoad", isSignal: true, isRequired: false, transformFunction: null }, showRowNumbers: { classPropertyName: "showRowNumbers", publicName: "showRowNumbers", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, pageable: { classPropertyName: "pageable", publicName: "pageable", isSignal: true, isRequired: false, transformFunction: null }, sortable: { classPropertyName: "sortable", publicName: "sortable", isSignal: true, isRequired: false, transformFunction: null }, tableClass: { classPropertyName: "tableClass", publicName: "tableClass", isSignal: true, isRequired: false, transformFunction: null }, headerClass: { classPropertyName: "headerClass", publicName: "headerClass", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, filterable: { classPropertyName: "filterable", publicName: "filterable", isSignal: true, isRequired: false, transformFunction: null }, loadingIndicator: { classPropertyName: "loadingIndicator", publicName: "loadingIndicator", isSignal: true, isRequired: false, transformFunction: null }, loadingCover: { classPropertyName: "loadingCover", publicName: "loadingCover", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.ng0-loading": "this.isLoading" } }, queries: [{ propertyName: "_detailRow", first: true, predicate: TableDetailRowDirective, descendants: true }, { propertyName: "_columns", predicate: TableColumnDirective }], exportAs: ["ng0Table"], ngImport: i0, template: "@let $dataResult = _dataResult();\r\n@let $pageable = pageable();\r\n@let $pageIndex = _lastRequest?.page?.index ?? 1;\r\n@let $data = $dataResult?.data;\r\n@let $anyRecords = $data && $data.length > 0;\r\n@let $totalRecordsCount = $dataResult?.total;\r\n@let $firstRecord = $pageable ? ($pageable.pageSize! * ($pageIndex - 1) + 1) : 1;\r\n@let $lastRecord = $data ? $firstRecord + $data.length - 1 : 1;\r\n@let $isLoading = _dataSource.isLoading();\r\n@let $isFirstLoad = $dataResult == undefined;\r\n@let $columnsCount = _columns.length + (showRowNumbers() ? 1 : 0);\r\n@let $tableLocale = _ls.get()?.definition?.components?.table;\r\n\r\n<div class=\"table-responsive\" [style.height]=\"height()\" [class.table-scrollable]=\"height()! > 0\">\r\n <table class=\"table\" [ngClass]=\"tableClass()\">\r\n @if (caption()) {\r\n <caption>{{caption()}}</caption>\r\n }\r\n\r\n @if (showHeader()) {\r\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n }\r\n\r\n @if (filterable()) {\r\n <ng-container *ngTemplateOutlet=\"filtersTemplate\"></ng-container>\r\n }\r\n\r\n <tbody>\r\n @if ($isLoading && $isFirstLoad && loadingIndicator()) {\r\n <tr class=\"ng0-table-loading-row\">\r\n <td [attr.colspan]=\"$columnsCount\">\r\n @switch (loadingIndicator()) {\r\n @case ('spinner') {\r\n <div class=\"text-center\">\r\n <div class=\"spinner-border\" role=\"status\"></div>\r\n </div>\r\n }\r\n }\r\n </td>\r\n </tr>\r\n } @else {\r\n @if ($data) {\r\n @if ($data.length > 0) {\r\n <ng-container *ngTemplateOutlet=\"dataRowsTemplate\"></ng-container>\r\n } @else {\r\n <tr class=\"ng0-table-no-records-row\">\r\n <td [attr.colSpan]=\"$columnsCount\" class=\"text-center p-2\">\r\n {{ $tableLocale?.noRecords ?? 'No Records.' }}\r\n </td>\r\n </tr>\r\n }\r\n } @else if (_lastError) {\r\n <ng-container *ngTemplateOutlet=\"nowDataTemplate\"></ng-container>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n<div class=\"ng0-table-footer d-flex align-items-baseline\">\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n</div>\r\n\r\n@if ($isLoading && !$isFirstLoad && loadingCover()) {\r\n<div class=\"ng0-table-loading-cover text-center\">\r\n @if (loadingCover() == 'spinner') {\r\n <div class=\"spinner-border\" role=\"status\"></div>\r\n }\r\n</div>\r\n}\r\n\r\n<ng-template #filtersTemplate>\r\n <thead>\r\n <tr>\r\n @if (_detailRow) {\r\n <th></th>\r\n }\r\n\r\n @if (showRowNumbers()) {\r\n <th></th>\r\n }\r\n\r\n @for (col of _columns; track $index) {\r\n <th>\r\n @if(col.filterable() && (col.field() || col.filterValue())) {\r\n\r\n <div class=\"input-group\">\r\n @switch (col.type()) {\r\n @case ('text') {\r\n <input [name]=\"'filter-' + col.field\"\r\n type=\"search\"\r\n [maxlength]=\"50\"\r\n class=\"form-control form-control-sm\"\r\n [(ngModel)]=\"col.filterValue\"\r\n (keydown.enter)=\"load(0)\">\r\n }\r\n @case ('number') {\r\n <input [name]=\"'datatablecol-' + col.field\"\r\n type=\"search\"\r\n ng0Number\r\n class=\"form-control form-control-sm\"\r\n [(ngModel)]=\"col.filterValue\"\r\n (keydown.enter)=\"load(0)\">\r\n }\r\n }\r\n\r\n <button class=\"btn btn-outline-light\"\r\n style=\"border-color: var(--bs-border-color);\"\r\n cdkOverlayOrigin\r\n #trigger=\"cdkOverlayOrigin\"\r\n (click)=\"_onToggleFilterOperator(col)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M19 3H5C3.58579 3 2.87868 3 2.43934 3.4122C2 3.8244 2 4.48782 2 5.81466V6.50448C2 7.54232 2 8.06124 2.2596 8.49142C2.5192 8.9216 2.99347 9.18858 3.94202 9.72255L6.85504 11.3624C7.49146 11.7206 7.80967 11.8998 8.03751 12.0976C8.51199 12.5095 8.80408 12.9935 8.93644 13.5872C9 13.8722 9 14.2058 9 14.8729L9 17.5424C9 18.452 9 18.9067 9.25192 19.2613C9.50385 19.6158 9.95128 19.7907 10.8462 20.1406C12.7248 20.875 13.6641 21.2422 14.3321 20.8244C15 20.4066 15 19.4519 15 17.5424V14.8729C15 14.2058 15 13.8722 15.0636 13.5872C15.1959 12.9935 15.488 12.5095 15.9625 12.0976C16.1903 11.8998 16.5085 11.7206 17.145 11.3624L20.058 9.72255C21.0065 9.18858 21.4808 8.9216 21.7404 8.49142C22 8.06124 22 7.54232 22 6.50448V5.81466C22 4.48782 22 3.8244 21.5607 3.4122C21.1213 3 20.4142 3 19 3Z\"\r\n stroke=\"#1C274C\" stroke-width=\"1.5\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"trigger\"\r\n [cdkConnectedOverlayOpen]=\"col.showFilterOperators()\"\r\n (overlayOutsideClick)=\"col.showFilterOperators.set(false)\"\r\n (detach)=\"col.showFilterOperators.set(false)\">\r\n <ul class=\"dropdown-menu show\" animate.enter=\"fade-in\">\r\n @for (item of col.getFilterOperators(); track $index) {\r\n <li>\r\n <button class=\"dropdown-item\" [class.active]=\"item == col.filterOperator()\"\r\n (click)=\"_onSelectFilterOperator(col, item)\">\r\n {{_ls.get()?.definition?.data?.logicalOperators?.[item] ?? item }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </ng-template>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n</ng-template>\r\n\r\n<ng-template #headerTemplate>\r\n <thead [ngClass]=\"headerClass()\">\r\n <tr>\r\n @if (_detailRow) {\r\n <th></th>\r\n }\r\n\r\n @if (showRowNumbers()) {\r\n <th class=\"row-number text-muted\">#</th>\r\n }\r\n\r\n @for (col of _columns; track $index) {\r\n <th\r\n (click)=\"col.toggleSortDirection(); load()\"\r\n [class.sortable]=\"sortable() && col.sortable()\"\r\n [ngClass]=\"{ \r\n 'sort-asc': col.sortDirection() == 'asc', \r\n 'sort-desc': col.sortDirection() == 'desc',\r\n 'sort-none': col.sortDirection() == 'none'\r\n }\">\r\n {{ col.title() }}\r\n\r\n @if(sortable() && col.sortable()) {\r\n <svg class=\"ng0-table-sort-icon\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M12 7L12 16\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M8 13L12 17L16 13\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n</ng-template>\r\n\r\n<ng-template #dataRowsTemplate>\r\n @for (row of $data; track $index) {\r\n <tr [class.table-active]=\"isRowExpanded(row)\">\r\n @if (_detailRow) {\r\n <td class=\"detail-row-expander\">\r\n @if (_detailRow.showCallback == null || _detailRow.showCallback(row)) {\r\n <button class=\"btn\" (click)=\"_onToggleRowDetailClick(row)\">\r\n @if (isRowExpanded(row)) {\r\n <i class=\"far fa-minus\"></i>\r\n } @else {\r\n <i class=\"far fa-plus\"></i>\r\n }\r\n </button>\r\n }\r\n </td>\r\n }\r\n\r\n @if (showRowNumbers()) {\r\n <td class=\"ng0-table-row-number\">\r\n {{ $firstRecord + $index }}\r\n </td>\r\n }\r\n\r\n @for (col of _columns; track $index) {\r\n <td\r\n [ngClass]=\"col.cellClass()\"\r\n [class.shrinked]=\"col.shrink()\"\r\n [class.fw-bold]=\"col.bold()\">\r\n @if (col.template) {\r\n <ng-container *ngTemplateOutlet=\"col.template; context: { $implicit: row }\">\r\n </ng-container>\r\n } @else if (col.field()) {\r\n @let cellValue = _getCellValue(row, col);\r\n\r\n @if ((cellValue === null || cellValue === undefined) && col.emptyCellText()) {\r\n {{ col.emptyCellText() }}\r\n } @else {\r\n @if (col.type()) {\r\n @let type = $any(col.type());\r\n\r\n @if (type == \"date\") {\r\n {{ cellValue | ng0Date }}\r\n } @else if (type == \"number\") {\r\n {{ cellValue | number }}\r\n } @else if (type == \"currency\") {\r\n {{ cellValue | currency }}\r\n } @else if (type.enum) {\r\n {{ cellValue | ng0TranslateEnum: type.enum.name : type.enum.fallback }}\r\n } @else if (type.boolean || type == \"boolean\") {\r\n {{ cellValue | ng0LocalizeBool: type.boolean.false ?? \"false\" : type.boolean.false ?? \"true\" }}\r\n }@else {\r\n {{ cellValue }}\r\n }\r\n }\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n\r\n @if (_detailRow && isRowExpanded(row)) {\r\n <tr class=\"detail-row\">\r\n <td\r\n [attr.colspan]=\"_columns.length + (showRowNumbers() ? 1 : 0) + 1\"\r\n class=\"ps-2 pb-4\">\r\n <ng-container\r\n *ngTemplateOutlet=\"_detailRow.templateRef; context: { $implicit: row }\"></ng-container>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n</ng-template>\r\n\r\n<ng-template #footerTemplate>\r\n @if ($pageable && $pageable.showPagingControls && $anyRecords && $totalRecordsCount! > 0) {\r\n <div class=\"ng0-table-pagination me-2\">\r\n <ng0-pagination\r\n class=\"mb-0 d-inline-block\"\r\n [showFirstLastButtons]=\"$pageable.showFirstLastButtons == true\"\r\n [showNextPreviousButtons]=\"$pageable.showNextPreviousButtons == true\"\r\n [totalRecords]=\"$totalRecordsCount!\"\r\n [pageSize]=\"$pageable.pageSize!\"\r\n [selectedPage]=\"$pageIndex\"\r\n (itemClick)=\"_onPageChange($event)\"\r\n [maxVisiblePages]=\"$pageable.maxVisiblePages!\">\r\n <ng-container ngProjectAs=\"first\">\r\n <ng-content select=\"paging-first\">\r\n {{ \"first\" | ng0Translate }}\r\n </ng-content>\r\n </ng-container>\r\n\r\n <ng-container ngProjectAs=\"last\">\r\n <ng-content select=\"paging-last\">\r\n {{ \"last\" | ng0Translate }}\r\n </ng-content>\r\n </ng-container>\r\n\r\n <ng-container ngProjectAs=\"next\">\r\n <ng-content select=\"paging-next\">\r\n {{ \"next\" | ng0Translate }}\r\n </ng-content>\r\n </ng-container>\r\n\r\n <ng-container ngProjectAs=\"previous\">\r\n <ng-content select=\"paging-previous\">\r\n {{ \"previous\" | ng0Translate }}\r\n </ng-content>\r\n </ng-container>\r\n </ng0-pagination>\r\n </div>\r\n\r\n @if ($pageable.showPageSizeOptions || $pageable.showPageSizeOptions == undefined) {\r\n <div class=\"ng0-table-paging-options\">\r\n <select name=\"pageSizeOptions\" class=\"form-select w-auto d-inline-block\">\r\n <option [ngValue]=\"10\" selected>10</option>\r\n </select>\r\n </div>\r\n }\r\n\r\n @if ($pageable.showPagingInfo == undefined || $pageable.showPagingInfo) {\r\n <div class=\"ng0-table-paging-info ms-auto\">\r\n <ng-content select=\"paging-info\">\r\n {{\r\n _pagingFormatter({firstRecord: $firstRecord, lastRecord: $lastRecord, totalRecords: $totalRecordsCount!,\r\n currentPage: $pageIndex!})\r\n }}\r\n </ng-content>\r\n </div>\r\n }\r\n }\r\n</ng-template>\r\n\r\n<ng-template #nowDataTemplate>\r\n <tr class=\"ng0-table-error-row\">\r\n <td [attr.colSpan]=\"$columnsCount\" class=\"p-2\">\r\n <div class=\"d-flex align-items-baseline\">\r\n <span>{{ $tableLocale?.loadError ?? 'Error loading data.' }} </span>\r\n <button (click)=\"load()\" class=\"btn btn-warning ms-auto\">\r\n {{ \"retry\" | ng0Translate }}\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n</ng-template>", styles: [":host{display:flex;flex-direction:column;position:relative}@starting-style{.ng0-table-loading-cover{background-color:#0000}}table{margin-bottom:0}th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}th.sortable .ng0-table-sort-icon{transition:transform .2s;opacity:0}th.sortable.sort-none:hover .ng0-table-sort-icon{opacity:.4}th.sortable.sort-asc .ng0-table-sort-icon{transform:rotate(0);opacity:1;color:var(--bs-danger)}th.sortable.sort-desc .ng0-table-sort-icon{transform:rotate(180deg);opacity:1;color:var(--bs-primary)}tbody{position:relative}td.row-number{width:0}td.shrinked{width:0;white-space:nowrap}.ng0-table-loading-cover{position:absolute;inset:0;background-color:#0000000d;transition:background-color .2s;z-index:1000;display:flex;align-items:center;justify-content:center}.table-scrollable{overflow-y:auto;direction:ltr;scroll-padding:20px}.table-scrollable::-webkit-scrollbar{width:8px}.table-scrollable::-webkit-scrollbar-track{background-color:#00000008}.table-scrollable::-webkit-scrollbar-thumb{background-color:var(--bs-secondary)}.table-scrollable thead th{position:sticky;top:0}.ng0-table-footer{margin-top:.5rem}.fade-in{animation:fade-in .5s}@keyframes fade-in{0%{opacity:0}to{opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: LocalizationModule }, { kind: "component", type: PaginationComponent, selector: "ng0-pagination", inputs: ["totalRecords", "pageSize", "selectedPage", "maxVisiblePages", "showNextPreviousButtons", "showFirstLastButtons"], outputs: ["itemClick"], exportAs: ["ng0Pagination"] }, { kind: "directive", type: NumberDirective, selector: "[ng0Number]", inputs: ["minFractionDigits", "maxFractionDigits", "useGrouping", "numberType"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i1.TranslatePipe, name: "ng0Translate" }, { kind: "pipe", type: i1.TranslateEnumPipe, name: "ng0TranslateEnum" }, { kind: "pipe", type: i1.DatePipe, name: "ng0Date" }, { kind: "pipe", type: i1.LocalizeBooleanPipe, name: "ng0LocalizeBool" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
409
|
+
}
|
|
410
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: TableComponent, decorators: [{
|
|
411
|
+
type: Component,
|
|
412
|
+
args: [{ selector: 'ng0-table', exportAs: 'ng0Table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
413
|
+
CommonModule,
|
|
414
|
+
FormsModule,
|
|
415
|
+
LocalizationModule,
|
|
416
|
+
PaginationComponent,
|
|
417
|
+
NumberDirective,
|
|
418
|
+
OverlayModule
|
|
419
|
+
], template: "@let $dataResult = _dataResult();\r\n@let $pageable = pageable();\r\n@let $pageIndex = _lastRequest?.page?.index ?? 1;\r\n@let $data = $dataResult?.data;\r\n@let $anyRecords = $data && $data.length > 0;\r\n@let $totalRecordsCount = $dataResult?.total;\r\n@let $firstRecord = $pageable ? ($pageable.pageSize! * ($pageIndex - 1) + 1) : 1;\r\n@let $lastRecord = $data ? $firstRecord + $data.length - 1 : 1;\r\n@let $isLoading = _dataSource.isLoading();\r\n@let $isFirstLoad = $dataResult == undefined;\r\n@let $columnsCount = _columns.length + (showRowNumbers() ? 1 : 0);\r\n@let $tableLocale = _ls.get()?.definition?.components?.table;\r\n\r\n<div class=\"table-responsive\" [style.height]=\"height()\" [class.table-scrollable]=\"height()! > 0\">\r\n <table class=\"table\" [ngClass]=\"tableClass()\">\r\n @if (caption()) {\r\n <caption>{{caption()}}</caption>\r\n }\r\n\r\n @if (showHeader()) {\r\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n }\r\n\r\n @if (filterable()) {\r\n <ng-container *ngTemplateOutlet=\"filtersTemplate\"></ng-container>\r\n }\r\n\r\n <tbody>\r\n @if ($isLoading && $isFirstLoad && loadingIndicator()) {\r\n <tr class=\"ng0-table-loading-row\">\r\n <td [attr.colspan]=\"$columnsCount\">\r\n @switch (loadingIndicator()) {\r\n @case ('spinner') {\r\n <div class=\"text-center\">\r\n <div class=\"spinner-border\" role=\"status\"></div>\r\n </div>\r\n }\r\n }\r\n </td>\r\n </tr>\r\n } @else {\r\n @if ($data) {\r\n @if ($data.length > 0) {\r\n <ng-container *ngTemplateOutlet=\"dataRowsTemplate\"></ng-container>\r\n } @else {\r\n <tr class=\"ng0-table-no-records-row\">\r\n <td [attr.colSpan]=\"$columnsCount\" class=\"text-center p-2\">\r\n {{ $tableLocale?.noRecords ?? 'No Records.' }}\r\n </td>\r\n </tr>\r\n }\r\n } @else if (_lastError) {\r\n <ng-container *ngTemplateOutlet=\"nowDataTemplate\"></ng-container>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n<div class=\"ng0-table-footer d-flex align-items-baseline\">\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n</div>\r\n\r\n@if ($isLoading && !$isFirstLoad && loadingCover()) {\r\n<div class=\"ng0-table-loading-cover text-center\">\r\n @if (loadingCover() == 'spinner') {\r\n <div class=\"spinner-border\" role=\"status\"></div>\r\n }\r\n</div>\r\n}\r\n\r\n<ng-template #filtersTemplate>\r\n <thead>\r\n <tr>\r\n @if (_detailRow) {\r\n <th></th>\r\n }\r\n\r\n @if (showRowNumbers()) {\r\n <th></th>\r\n }\r\n\r\n @for (col of _columns; track $index) {\r\n <th>\r\n @if(col.filterable() && (col.field() || col.filterValue())) {\r\n\r\n <div class=\"input-group\">\r\n @switch (col.type()) {\r\n @case ('text') {\r\n <input [name]=\"'filter-' + col.field\"\r\n type=\"search\"\r\n [maxlength]=\"50\"\r\n class=\"form-control form-control-sm\"\r\n [(ngModel)]=\"col.filterValue\"\r\n (keydown.enter)=\"load(0)\">\r\n }\r\n @case ('number') {\r\n <input [name]=\"'datatablecol-' + col.field\"\r\n type=\"search\"\r\n ng0Number\r\n class=\"form-control form-control-sm\"\r\n [(ngModel)]=\"col.filterValue\"\r\n (keydown.enter)=\"load(0)\">\r\n }\r\n }\r\n\r\n <button class=\"btn btn-outline-light\"\r\n style=\"border-color: var(--bs-border-color);\"\r\n cdkOverlayOrigin\r\n #trigger=\"cdkOverlayOrigin\"\r\n (click)=\"_onToggleFilterOperator(col)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M19 3H5C3.58579 3 2.87868 3 2.43934 3.4122C2 3.8244 2 4.48782 2 5.81466V6.50448C2 7.54232 2 8.06124 2.2596 8.49142C2.5192 8.9216 2.99347 9.18858 3.94202 9.72255L6.85504 11.3624C7.49146 11.7206 7.80967 11.8998 8.03751 12.0976C8.51199 12.5095 8.80408 12.9935 8.93644 13.5872C9 13.8722 9 14.2058 9 14.8729L9 17.5424C9 18.452 9 18.9067 9.25192 19.2613C9.50385 19.6158 9.95128 19.7907 10.8462 20.1406C12.7248 20.875 13.6641 21.2422 14.3321 20.8244C15 20.4066 15 19.4519 15 17.5424V14.8729C15 14.2058 15 13.8722 15.0636 13.5872C15.1959 12.9935 15.488 12.5095 15.9625 12.0976C16.1903 11.8998 16.5085 11.7206 17.145 11.3624L20.058 9.72255C21.0065 9.18858 21.4808 8.9216 21.7404 8.49142C22 8.06124 22 7.54232 22 6.50448V5.81466C22 4.48782 22 3.8244 21.5607 3.4122C21.1213 3 20.4142 3 19 3Z\"\r\n stroke=\"#1C274C\" stroke-width=\"1.5\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"trigger\"\r\n [cdkConnectedOverlayOpen]=\"col.showFilterOperators()\"\r\n (overlayOutsideClick)=\"col.showFilterOperators.set(false)\"\r\n (detach)=\"col.showFilterOperators.set(false)\">\r\n <ul class=\"dropdown-menu show\" animate.enter=\"fade-in\">\r\n @for (item of col.getFilterOperators(); track $index) {\r\n <li>\r\n <button class=\"dropdown-item\" [class.active]=\"item == col.filterOperator()\"\r\n (click)=\"_onSelectFilterOperator(col, item)\">\r\n {{_ls.get()?.definition?.data?.logicalOperators?.[item] ?? item }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </ng-template>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n</ng-template>\r\n\r\n<ng-template #headerTemplate>\r\n <thead [ngClass]=\"headerClass()\">\r\n <tr>\r\n @if (_detailRow) {\r\n <th></th>\r\n }\r\n\r\n @if (showRowNumbers()) {\r\n <th class=\"row-number text-muted\">#</th>\r\n }\r\n\r\n @for (col of _columns; track $index) {\r\n <th\r\n (click)=\"col.toggleSortDirection(); load()\"\r\n [class.sortable]=\"sortable() && col.sortable()\"\r\n [ngClass]=\"{ \r\n 'sort-asc': col.sortDirection() == 'asc', \r\n 'sort-desc': col.sortDirection() == 'desc',\r\n 'sort-none': col.sortDirection() == 'none'\r\n }\">\r\n {{ col.title() }}\r\n\r\n @if(sortable() && col.sortable()) {\r\n <svg class=\"ng0-table-sort-icon\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M12 7L12 16\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M8 13L12 17L16 13\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n</ng-template>\r\n\r\n<ng-template #dataRowsTemplate>\r\n @for (row of $data; track $index) {\r\n <tr [class.table-active]=\"isRowExpanded(row)\">\r\n @if (_detailRow) {\r\n <td class=\"detail-row-expander\">\r\n @if (_detailRow.showCallback == null || _detailRow.showCallback(row)) {\r\n <button class=\"btn\" (click)=\"_onToggleRowDetailClick(row)\">\r\n @if (isRowExpanded(row)) {\r\n <i class=\"far fa-minus\"></i>\r\n } @else {\r\n <i class=\"far fa-plus\"></i>\r\n }\r\n </button>\r\n }\r\n </td>\r\n }\r\n\r\n @if (showRowNumbers()) {\r\n <td class=\"ng0-table-row-number\">\r\n {{ $firstRecord + $index }}\r\n </td>\r\n }\r\n\r\n @for (col of _columns; track $index) {\r\n <td\r\n [ngClass]=\"col.cellClass()\"\r\n [class.shrinked]=\"col.shrink()\"\r\n [class.fw-bold]=\"col.bold()\">\r\n @if (col.template) {\r\n <ng-container *ngTemplateOutlet=\"col.template; context: { $implicit: row }\">\r\n </ng-container>\r\n } @else if (col.field()) {\r\n @let cellValue = _getCellValue(row, col);\r\n\r\n @if ((cellValue === null || cellValue === undefined) && col.emptyCellText()) {\r\n {{ col.emptyCellText() }}\r\n } @else {\r\n @if (col.type()) {\r\n @let type = $any(col.type());\r\n\r\n @if (type == \"date\") {\r\n {{ cellValue | ng0Date }}\r\n } @else if (type == \"number\") {\r\n {{ cellValue | number }}\r\n } @else if (type == \"currency\") {\r\n {{ cellValue | currency }}\r\n } @else if (type.enum) {\r\n {{ cellValue | ng0TranslateEnum: type.enum.name : type.enum.fallback }}\r\n } @else if (type.boolean || type == \"boolean\") {\r\n {{ cellValue | ng0LocalizeBool: type.boolean.false ?? \"false\" : type.boolean.false ?? \"true\" }}\r\n }@else {\r\n {{ cellValue }}\r\n }\r\n }\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n\r\n @if (_detailRow && isRowExpanded(row)) {\r\n <tr class=\"detail-row\">\r\n <td\r\n [attr.colspan]=\"_columns.length + (showRowNumbers() ? 1 : 0) + 1\"\r\n class=\"ps-2 pb-4\">\r\n <ng-container\r\n *ngTemplateOutlet=\"_detailRow.templateRef; context: { $implicit: row }\"></ng-container>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n</ng-template>\r\n\r\n<ng-template #footerTemplate>\r\n @if ($pageable && $pageable.showPagingControls && $anyRecords && $totalRecordsCount! > 0) {\r\n <div class=\"ng0-table-pagination me-2\">\r\n <ng0-pagination\r\n class=\"mb-0 d-inline-block\"\r\n [showFirstLastButtons]=\"$pageable.showFirstLastButtons == true\"\r\n [showNextPreviousButtons]=\"$pageable.showNextPreviousButtons == true\"\r\n [totalRecords]=\"$totalRecordsCount!\"\r\n [pageSize]=\"$pageable.pageSize!\"\r\n [selectedPage]=\"$pageIndex\"\r\n (itemClick)=\"_onPageChange($event)\"\r\n [maxVisiblePages]=\"$pageable.maxVisiblePages!\">\r\n <ng-container ngProjectAs=\"first\">\r\n <ng-content select=\"paging-first\">\r\n {{ \"first\" | ng0Translate }}\r\n </ng-content>\r\n </ng-container>\r\n\r\n <ng-container ngProjectAs=\"last\">\r\n <ng-content select=\"paging-last\">\r\n {{ \"last\" | ng0Translate }}\r\n </ng-content>\r\n </ng-container>\r\n\r\n <ng-container ngProjectAs=\"next\">\r\n <ng-content select=\"paging-next\">\r\n {{ \"next\" | ng0Translate }}\r\n </ng-content>\r\n </ng-container>\r\n\r\n <ng-container ngProjectAs=\"previous\">\r\n <ng-content select=\"paging-previous\">\r\n {{ \"previous\" | ng0Translate }}\r\n </ng-content>\r\n </ng-container>\r\n </ng0-pagination>\r\n </div>\r\n\r\n @if ($pageable.showPageSizeOptions || $pageable.showPageSizeOptions == undefined) {\r\n <div class=\"ng0-table-paging-options\">\r\n <select name=\"pageSizeOptions\" class=\"form-select w-auto d-inline-block\">\r\n <option [ngValue]=\"10\" selected>10</option>\r\n </select>\r\n </div>\r\n }\r\n\r\n @if ($pageable.showPagingInfo == undefined || $pageable.showPagingInfo) {\r\n <div class=\"ng0-table-paging-info ms-auto\">\r\n <ng-content select=\"paging-info\">\r\n {{\r\n _pagingFormatter({firstRecord: $firstRecord, lastRecord: $lastRecord, totalRecords: $totalRecordsCount!,\r\n currentPage: $pageIndex!})\r\n }}\r\n </ng-content>\r\n </div>\r\n }\r\n }\r\n</ng-template>\r\n\r\n<ng-template #nowDataTemplate>\r\n <tr class=\"ng0-table-error-row\">\r\n <td [attr.colSpan]=\"$columnsCount\" class=\"p-2\">\r\n <div class=\"d-flex align-items-baseline\">\r\n <span>{{ $tableLocale?.loadError ?? 'Error loading data.' }} </span>\r\n <button (click)=\"load()\" class=\"btn btn-warning ms-auto\">\r\n {{ \"retry\" | ng0Translate }}\r\n </button>\r\n </div>\r\n </td>\r\n </tr>\r\n</ng-template>", styles: [":host{display:flex;flex-direction:column;position:relative}@starting-style{.ng0-table-loading-cover{background-color:#0000}}table{margin-bottom:0}th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}th.sortable .ng0-table-sort-icon{transition:transform .2s;opacity:0}th.sortable.sort-none:hover .ng0-table-sort-icon{opacity:.4}th.sortable.sort-asc .ng0-table-sort-icon{transform:rotate(0);opacity:1;color:var(--bs-danger)}th.sortable.sort-desc .ng0-table-sort-icon{transform:rotate(180deg);opacity:1;color:var(--bs-primary)}tbody{position:relative}td.row-number{width:0}td.shrinked{width:0;white-space:nowrap}.ng0-table-loading-cover{position:absolute;inset:0;background-color:#0000000d;transition:background-color .2s;z-index:1000;display:flex;align-items:center;justify-content:center}.table-scrollable{overflow-y:auto;direction:ltr;scroll-padding:20px}.table-scrollable::-webkit-scrollbar{width:8px}.table-scrollable::-webkit-scrollbar-track{background-color:#00000008}.table-scrollable::-webkit-scrollbar-thumb{background-color:var(--bs-secondary)}.table-scrollable thead th{position:sticky;top:0}.ng0-table-footer{margin-top:.5rem}.fade-in{animation:fade-in .5s}@keyframes fade-in{0%{opacity:0}to{opacity:1}}\n"] }]
|
|
420
|
+
}], ctorParameters: () => [{ type: i1.LocalizationService }, { type: i0.DestroyRef }], propDecorators: { _columns: [{
|
|
421
|
+
type: ContentChildren,
|
|
422
|
+
args: [TableColumnDirective]
|
|
423
|
+
}], _detailRow: [{
|
|
424
|
+
type: ContentChild,
|
|
425
|
+
args: [TableDetailRowDirective]
|
|
426
|
+
}], isLoading: [{
|
|
427
|
+
type: HostBinding,
|
|
428
|
+
args: ['class.ng0-loading']
|
|
429
|
+
}] } });
|
|
430
|
+
|
|
431
|
+
class TableModule {
|
|
432
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: TableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
433
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.2.1", ngImport: i0, type: TableModule, imports: [TableComponent,
|
|
434
|
+
TableColumnDirective,
|
|
435
|
+
TableDetailRowDirective], exports: [TableComponent,
|
|
436
|
+
TableColumnDirective,
|
|
437
|
+
TableDetailRowDirective] });
|
|
438
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: TableModule, imports: [TableComponent] });
|
|
439
|
+
}
|
|
440
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: TableModule, decorators: [{
|
|
441
|
+
type: NgModule,
|
|
442
|
+
args: [{
|
|
443
|
+
imports: [
|
|
444
|
+
TableComponent,
|
|
445
|
+
TableColumnDirective,
|
|
446
|
+
TableDetailRowDirective,
|
|
447
|
+
],
|
|
448
|
+
exports: [
|
|
449
|
+
TableComponent,
|
|
450
|
+
TableColumnDirective,
|
|
451
|
+
TableDetailRowDirective
|
|
452
|
+
],
|
|
453
|
+
}]
|
|
454
|
+
}] });
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* Generated bundle index. Do not edit.
|
|
458
|
+
*/
|
|
459
|
+
|
|
460
|
+
export { TableColumnDirective, TableComponent, TableDetailRowDirective, TableModule };
|
|
461
|
+
//# sourceMappingURL=bootkit-ng0-components-table.mjs.map
|