@yoozsoft/yoozsoft-ng 5.3.5 → 7.1.1
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/README.md +143 -24
- package/assets/js/UTIF.js-master/LICENSE +21 -21
- package/assets/js/UTIF.js-master/README.md +72 -72
- package/assets/js/UTIF.js-master/UTIF.js +1762 -1762
- package/assets/js/UTIF.js-master/package-lock.json +13 -13
- package/assets/js/UTIF.js-master/package.json +24 -0
- package/assets/styles/components/_ys-navbar.scss +22 -0
- package/assets/styles/components/_ys-pagination.scss +10 -0
- package/assets/styles/{ys-layout.scss → utilities/ys-layout.scss} +1 -1
- package/assets/styles/ys-styles.scss +2 -0
- package/autocomplete/package.json +4 -0
- package/date/package.json +4 -0
- package/datepicker/package.json +4 -0
- package/dropdown/package.json +4 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs +257 -197
- package/fesm2022/yoozsoft-yoozsoft-ng-autocomplete.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-date.mjs +562 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-date.mjs.map +1 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs +600 -837
- package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs +161 -151
- package/fesm2022/yoozsoft-yoozsoft-ng-dropdown.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs +93 -103
- package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs +16 -21
- package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs +20 -24
- package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs +60 -76
- package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs +11 -15
- package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs +61 -55
- package/fesm2022/yoozsoft-yoozsoft-ng-pagination.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs +142 -130
- package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs +44 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-pipes.mjs.map +1 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs +51 -34
- package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs +155 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-rating.mjs.map +1 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs +78 -80
- package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs +99 -99
- package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs +316 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-table.mjs.map +1 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs +128 -114
- package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs +112 -62
- package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs.map +1 -1
- package/fesm2022/yoozsoft-yoozsoft-ng-validators.mjs +37 -0
- package/fesm2022/yoozsoft-yoozsoft-ng-validators.mjs.map +1 -0
- package/fesm2022/yoozsoft-yoozsoft-ng.mjs.map +1 -1
- package/file-upload/package.json +4 -0
- package/footer/package.json +4 -0
- package/loading/package.json +4 -0
- package/navbar/package.json +4 -0
- package/overlay/package.json +4 -0
- package/package.json +61 -38
- package/pagination/package.json +4 -0
- package/password-strength/package.json +4 -0
- package/pipes/package.json +4 -0
- package/progress/package.json +4 -0
- package/rating/package.json +4 -0
- package/select/package.json +4 -0
- package/sidebar/package.json +4 -0
- package/table/package.json +4 -0
- package/tiff-viewer/package.json +4 -0
- package/toast/package.json +4 -0
- package/types/yoozsoft-yoozsoft-ng-autocomplete.d.ts +79 -0
- package/types/yoozsoft-yoozsoft-ng-date.d.ts +118 -0
- package/types/yoozsoft-yoozsoft-ng-datepicker.d.ts +120 -0
- package/types/yoozsoft-yoozsoft-ng-dropdown.d.ts +76 -0
- package/types/yoozsoft-yoozsoft-ng-file-upload.d.ts +75 -0
- package/types/yoozsoft-yoozsoft-ng-footer.d.ts +26 -0
- package/types/yoozsoft-yoozsoft-ng-loading.d.ts +14 -0
- package/types/yoozsoft-yoozsoft-ng-navbar.d.ts +60 -0
- package/types/yoozsoft-yoozsoft-ng-overlay.d.ts +10 -0
- package/types/yoozsoft-yoozsoft-ng-pagination.d.ts +31 -0
- package/types/yoozsoft-yoozsoft-ng-password-strength.d.ts +73 -0
- package/types/yoozsoft-yoozsoft-ng-pipes.d.ts +11 -0
- package/types/yoozsoft-yoozsoft-ng-progress.d.ts +31 -0
- package/types/yoozsoft-yoozsoft-ng-rating.d.ts +56 -0
- package/types/yoozsoft-yoozsoft-ng-select.d.ts +43 -0
- package/types/yoozsoft-yoozsoft-ng-sidebar.d.ts +69 -0
- package/types/yoozsoft-yoozsoft-ng-table.d.ts +137 -0
- package/types/yoozsoft-yoozsoft-ng-tiff-viewer.d.ts +53 -0
- package/types/yoozsoft-yoozsoft-ng-toast.d.ts +66 -0
- package/types/yoozsoft-yoozsoft-ng-validators.d.ts +5 -0
- package/validators/package.json +4 -0
- package/autocomplete/index.d.ts +0 -71
- package/datepicker/index.d.ts +0 -291
- package/directives/index.d.ts +0 -17
- package/dropdown/index.d.ts +0 -62
- package/fesm2022/yoozsoft-yoozsoft-ng-directives.mjs +0 -57
- package/fesm2022/yoozsoft-yoozsoft-ng-directives.mjs.map +0 -1
- package/file-upload/index.d.ts +0 -72
- package/footer/index.d.ts +0 -25
- package/loading/index.d.ts +0 -13
- package/navbar/index.d.ts +0 -56
- package/overlay/index.d.ts +0 -11
- package/pagination/index.d.ts +0 -29
- package/password-strength/index.d.ts +0 -84
- package/progress/index.d.ts +0 -28
- package/select/index.d.ts +0 -39
- package/sidebar/index.d.ts +0 -94
- package/tiff-viewer/index.d.ts +0 -52
- package/toast/index.d.ts +0 -53
- /package/assets/styles/{ys-preloader-9.scss → preloaders/ys-preloader-9.scss} +0 -0
- /package/assets/styles/{ys-preloader.scss → preloaders/ys-preloader.scss} +0 -0
- /package/{index.d.ts → types/yoozsoft-yoozsoft-ng.d.ts} +0 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { NgClass, NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { input, model, output, signal, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
import * as i1 from '@angular/forms';
|
|
5
|
+
import { FormsModule } from '@angular/forms';
|
|
6
|
+
import { NgbDropdownModule, NgbPagination, NgbTooltip } from '@ng-bootstrap/ng-bootstrap';
|
|
7
|
+
|
|
8
|
+
class YsTable {
|
|
9
|
+
items = input([], /* @ts-ignore */
|
|
10
|
+
...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
11
|
+
columns = input([], /* @ts-ignore */
|
|
12
|
+
...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
|
|
13
|
+
actionButtons = input([], /* @ts-ignore */
|
|
14
|
+
...(ngDevMode ? [{ debugName: "actionButtons" }] : /* istanbul ignore next */ []));
|
|
15
|
+
toolbarButtons = input([], /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "toolbarButtons" }] : /* istanbul ignore next */ []));
|
|
17
|
+
rowStyleClass = input(/* @ts-ignore */
|
|
18
|
+
...(ngDevMode ? [undefined, { debugName: "rowStyleClass" }] : /* istanbul ignore next */ []));
|
|
19
|
+
rowIndicators = input([], /* @ts-ignore */
|
|
20
|
+
...(ngDevMode ? [{ debugName: "rowIndicators" }] : /* istanbul ignore next */ []));
|
|
21
|
+
serverSide = input(false, /* @ts-ignore */
|
|
22
|
+
...(ngDevMode ? [{ debugName: "serverSide" }] : /* istanbul ignore next */ [])); // <--- حالت سروری
|
|
23
|
+
isPagination = input(true, /* @ts-ignore */
|
|
24
|
+
...(ngDevMode ? [{ debugName: "isPagination" }] : /* istanbul ignore next */ []));
|
|
25
|
+
rowsPerPage = input([10, 25, 50], /* @ts-ignore */
|
|
26
|
+
...(ngDevMode ? [{ debugName: "rowsPerPage" }] : /* istanbul ignore next */ []));
|
|
27
|
+
pageReportTemplate = input('Showing {first} to {last} of {totalRecords} items', /* @ts-ignore */
|
|
28
|
+
...(ngDevMode ? [{ debugName: "pageReportTemplate" }] : /* istanbul ignore next */ []));
|
|
29
|
+
page = model(1, /* @ts-ignore */
|
|
30
|
+
...(ngDevMode ? [{ debugName: "page" }] : /* istanbul ignore next */ []));
|
|
31
|
+
pageSize = model(this.rowsPerPage()[0] || 10, /* @ts-ignore */
|
|
32
|
+
...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
|
|
33
|
+
collectionSize = model(0, /* @ts-ignore */
|
|
34
|
+
...(ngDevMode ? [{ debugName: "collectionSize" }] : /* istanbul ignore next */ [])); // <--- از سرور میگیریم
|
|
35
|
+
hasSearch = input(false, /* @ts-ignore */
|
|
36
|
+
...(ngDevMode ? [{ debugName: "hasSearch" }] : /* istanbul ignore next */ []));
|
|
37
|
+
searchPlaceholder = input('search...', /* @ts-ignore */
|
|
38
|
+
...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : /* istanbul ignore next */ []));
|
|
39
|
+
searchStyleClass = input(/* @ts-ignore */
|
|
40
|
+
...(ngDevMode ? [undefined, { debugName: "searchStyleClass" }] : /* istanbul ignore next */ []));
|
|
41
|
+
styleClass = input(/* @ts-ignore */
|
|
42
|
+
...(ngDevMode ? [undefined, { debugName: "styleClass" }] : /* istanbul ignore next */ []));
|
|
43
|
+
toolbarStyleClass = input(/* @ts-ignore */
|
|
44
|
+
...(ngDevMode ? [undefined, { debugName: "toolbarStyleClass" }] : /* istanbul ignore next */ []));
|
|
45
|
+
tableStyleClass = input(/* @ts-ignore */
|
|
46
|
+
...(ngDevMode ? [undefined, { debugName: "tableStyleClass" }] : /* istanbul ignore next */ []));
|
|
47
|
+
/** Selectable rows checkbox */
|
|
48
|
+
selectableRows = input(false, /* @ts-ignore */
|
|
49
|
+
...(ngDevMode ? [{ debugName: "selectableRows" }] : /* istanbul ignore next */ []));
|
|
50
|
+
/** Condition for each row's checkbox to be active */
|
|
51
|
+
isRowSelectable = input(/* @ts-ignore */
|
|
52
|
+
...(ngDevMode ? [undefined, { debugName: "isRowSelectable" }] : /* istanbul ignore next */ []));
|
|
53
|
+
rowKey = input('id', /* @ts-ignore */
|
|
54
|
+
...(ngDevMode ? [{ debugName: "rowKey" }] : /* istanbul ignore next */ []));
|
|
55
|
+
pageChanged = output();
|
|
56
|
+
search = output();
|
|
57
|
+
/** checkbox */
|
|
58
|
+
selectedItemsChange = output();
|
|
59
|
+
searchTerm = signal('', /* @ts-ignore */
|
|
60
|
+
...(ngDevMode ? [{ debugName: "searchTerm" }] : /* istanbul ignore next */ []));
|
|
61
|
+
sortedColumn = signal(null, /* @ts-ignore */
|
|
62
|
+
...(ngDevMode ? [{ debugName: "sortedColumn" }] : /* istanbul ignore next */ []));
|
|
63
|
+
sortDirection = signal('asc', /* @ts-ignore */
|
|
64
|
+
...(ngDevMode ? [{ debugName: "sortDirection" }] : /* istanbul ignore next */ []));
|
|
65
|
+
filteredItems = computed(() => {
|
|
66
|
+
let items = [...this.items()];
|
|
67
|
+
const search = this.searchTerm().trim().toLowerCase();
|
|
68
|
+
if (search) {
|
|
69
|
+
items = items.filter((item) => this.columns().some((col) => {
|
|
70
|
+
let value = '';
|
|
71
|
+
if (col.template) {
|
|
72
|
+
value = this.applyTemplate(col.template, item);
|
|
73
|
+
}
|
|
74
|
+
else if (col.field) {
|
|
75
|
+
value = this.resolveFieldPath(item, col.field);
|
|
76
|
+
}
|
|
77
|
+
return value?.toString().toLowerCase().includes(search);
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
const sortField = this.sortedColumn();
|
|
81
|
+
if (sortField) {
|
|
82
|
+
items.sort((a, b) => {
|
|
83
|
+
const aVal = this.resolveFieldPath(a, sortField);
|
|
84
|
+
const bVal = this.resolveFieldPath(b, sortField);
|
|
85
|
+
if (aVal == null)
|
|
86
|
+
return this.sortDirection() === 'asc' ? -1 : 1;
|
|
87
|
+
if (bVal == null)
|
|
88
|
+
return this.sortDirection() === 'asc' ? 1 : -1;
|
|
89
|
+
return this.sortDirection() === 'asc'
|
|
90
|
+
? String(aVal).localeCompare(String(bVal))
|
|
91
|
+
: String(bVal).localeCompare(String(aVal));
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return items;
|
|
95
|
+
}, /* @ts-ignore */
|
|
96
|
+
...(ngDevMode ? [{ debugName: "filteredItems" }] : /* istanbul ignore next */ []));
|
|
97
|
+
paginatedItems = computed(() => {
|
|
98
|
+
if (this.serverSide()) {
|
|
99
|
+
return this.items();
|
|
100
|
+
}
|
|
101
|
+
if (!this.isPagination()) {
|
|
102
|
+
return this.filteredItems();
|
|
103
|
+
}
|
|
104
|
+
const start = (this.page() - 1) * this.pageSize();
|
|
105
|
+
return this.filteredItems().slice(start, start + this.pageSize());
|
|
106
|
+
}, /* @ts-ignore */
|
|
107
|
+
...(ngDevMode ? [{ debugName: "paginatedItems" }] : /* istanbul ignore next */ []));
|
|
108
|
+
selectedItems = signal([], /* @ts-ignore */
|
|
109
|
+
...(ngDevMode ? [{ debugName: "selectedItems" }] : /* istanbul ignore next */ []));
|
|
110
|
+
totalPages = computed(() => {
|
|
111
|
+
return Math.ceil(this.collectionSize() / this.pageSize()) || 1;
|
|
112
|
+
}, /* @ts-ignore */
|
|
113
|
+
...(ngDevMode ? [{ debugName: "totalPages" }] : /* istanbul ignore next */ []));
|
|
114
|
+
firstIndex = computed(() => {
|
|
115
|
+
return (this.page() - 1) * this.pageSize();
|
|
116
|
+
}, /* @ts-ignore */
|
|
117
|
+
...(ngDevMode ? [{ debugName: "firstIndex" }] : /* istanbul ignore next */ []));
|
|
118
|
+
lastIndex = computed(() => {
|
|
119
|
+
return Math.min(this.firstIndex() + this.pageSize(), this.collectionSize());
|
|
120
|
+
}, /* @ts-ignore */
|
|
121
|
+
...(ngDevMode ? [{ debugName: "lastIndex" }] : /* istanbul ignore next */ []));
|
|
122
|
+
constructor() {
|
|
123
|
+
effect(() => {
|
|
124
|
+
this.columns();
|
|
125
|
+
this.checkUniqueColumnKeys();
|
|
126
|
+
});
|
|
127
|
+
effect(() => {
|
|
128
|
+
if (!this.serverSide()) {
|
|
129
|
+
this.collectionSize.set(this.filteredItems().length);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
onSort(field) {
|
|
134
|
+
if (this.sortedColumn() === field) {
|
|
135
|
+
this.sortDirection.update((v) => (v === 'asc' ? 'desc' : 'asc'));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
this.sortedColumn.set(field);
|
|
139
|
+
this.sortDirection.set('asc');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
changePage(page) {
|
|
143
|
+
if (page < 1 || page > this.totalPages()) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
this.page.set(page);
|
|
147
|
+
if (this.serverSide()) {
|
|
148
|
+
this.pageChanged.emit({
|
|
149
|
+
page,
|
|
150
|
+
pageSize: this.pageSize(),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
changePageSize(size) {
|
|
155
|
+
this.pageSize.set(+size);
|
|
156
|
+
this.page.set(1);
|
|
157
|
+
if (this.serverSide()) {
|
|
158
|
+
this.pageChanged.emit({
|
|
159
|
+
page: 1,
|
|
160
|
+
pageSize: +size,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
onSearch(target) {
|
|
165
|
+
this.searchTerm.set(target.value);
|
|
166
|
+
this.page.set(1);
|
|
167
|
+
if (this.serverSide()) {
|
|
168
|
+
this.search.emit(this.searchTerm());
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
applyPipe(pipe, value, args = []) {
|
|
172
|
+
return pipe?.transform(value, ...args);
|
|
173
|
+
}
|
|
174
|
+
resolveFieldPath(obj, path) {
|
|
175
|
+
return path.split('.').reduce((acc, part) => acc?.[part], obj);
|
|
176
|
+
}
|
|
177
|
+
applyTemplate(template, item) {
|
|
178
|
+
return template.replace(/\{([^}]+)\}/g, (_, path) => {
|
|
179
|
+
const val = this.resolveFieldPath(item, path.trim());
|
|
180
|
+
return val !== undefined && val !== null ? val : '';
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
checkUniqueColumnKeys() {
|
|
184
|
+
const seen = new Set();
|
|
185
|
+
const duplicates = [];
|
|
186
|
+
this.columns().forEach((col) => {
|
|
187
|
+
if (!col.key) {
|
|
188
|
+
throw new Error(`Column with header "${col.header}" is missing a unique "key"`);
|
|
189
|
+
}
|
|
190
|
+
if (seen.has(col.key)) {
|
|
191
|
+
duplicates.push(col.key);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
seen.add(col.key);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
if (duplicates.length > 0) {
|
|
198
|
+
throw new Error(`Duplicate column keys found: ${duplicates.join(', ')}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
getLabel(action, item) {
|
|
202
|
+
return typeof action.label === 'function' ? action.label(item) : (action.label ?? 'Label');
|
|
203
|
+
}
|
|
204
|
+
getIconClass(action, item) {
|
|
205
|
+
return typeof action.iconClass === 'function'
|
|
206
|
+
? action.iconClass(item)
|
|
207
|
+
: (action.iconClass ?? '');
|
|
208
|
+
}
|
|
209
|
+
getTooltipText(tooltip) {
|
|
210
|
+
if (!tooltip)
|
|
211
|
+
return '';
|
|
212
|
+
return typeof tooltip === 'function' ? tooltip() : tooltip;
|
|
213
|
+
}
|
|
214
|
+
getLabelText(label) {
|
|
215
|
+
if (!label)
|
|
216
|
+
return '';
|
|
217
|
+
return typeof label === 'function' ? label() : label;
|
|
218
|
+
}
|
|
219
|
+
itemKey(item) {
|
|
220
|
+
return String(item[this.rowKey()]);
|
|
221
|
+
}
|
|
222
|
+
onSelectionChange(item, checked) {
|
|
223
|
+
if (checked) {
|
|
224
|
+
this.selectedItems.update((items) => [...items, item]);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
this.selectedItems.update((items) => items.filter((x) => this.itemKey(x) !== this.itemKey(item)));
|
|
228
|
+
}
|
|
229
|
+
this.selectedItemsChange.emit(this.selectedItems());
|
|
230
|
+
}
|
|
231
|
+
isSelected(item) {
|
|
232
|
+
return this.selectedItems().some((x) => this.itemKey(x) === this.itemKey(item));
|
|
233
|
+
}
|
|
234
|
+
toggleSelection(item, event) {
|
|
235
|
+
const checked = event.target.checked;
|
|
236
|
+
if (checked) {
|
|
237
|
+
this.selectedItems.update((items) => [...items, item]);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
this.selectedItems.update((items) => items.filter((x) => this.itemKey(x) !== this.itemKey(item)));
|
|
241
|
+
}
|
|
242
|
+
this.selectedItemsChange.emit(this.selectedItems());
|
|
243
|
+
}
|
|
244
|
+
allSelected() {
|
|
245
|
+
const selectable = this.paginatedItems().filter((i) => this.isSelectable(i));
|
|
246
|
+
return selectable.length > 0 && selectable.every((i) => this.isSelected(i));
|
|
247
|
+
}
|
|
248
|
+
toggleSelectAll(event) {
|
|
249
|
+
const checked = event.target.checked;
|
|
250
|
+
if (checked) {
|
|
251
|
+
const itemsToAdd = this.paginatedItems().filter((item) => this.isSelectable(item) &&
|
|
252
|
+
!this.selectedItems().some((x) => this.itemKey(x) === this.itemKey(item)));
|
|
253
|
+
this.selectedItems.update((items) => [...items, ...itemsToAdd]);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
this.selectedItems.update((items) => items.filter((item) => !this.paginatedItems().some((p) => this.itemKey(p) === this.itemKey(item))));
|
|
257
|
+
}
|
|
258
|
+
this.selectedItemsChange.emit(this.selectedItems());
|
|
259
|
+
}
|
|
260
|
+
getRowClass(row) {
|
|
261
|
+
const styleClass = this.rowStyleClass();
|
|
262
|
+
if (!styleClass) {
|
|
263
|
+
return '';
|
|
264
|
+
}
|
|
265
|
+
return typeof styleClass === 'function' ? styleClass(row) : styleClass;
|
|
266
|
+
}
|
|
267
|
+
getColumnClass(col, row) {
|
|
268
|
+
if (!col.styleClass)
|
|
269
|
+
return '';
|
|
270
|
+
return typeof col.styleClass === 'function' ? col.styleClass(row) : col.styleClass;
|
|
271
|
+
}
|
|
272
|
+
isSortable(col) {
|
|
273
|
+
return !!col.sortable && !!col.field;
|
|
274
|
+
}
|
|
275
|
+
isSelectable(row) {
|
|
276
|
+
if (!this.selectableRows()) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
const predicate = this.isRowSelectable();
|
|
280
|
+
return predicate ? predicate(row) : true;
|
|
281
|
+
}
|
|
282
|
+
resolveValue(value, row) {
|
|
283
|
+
return typeof value === 'function' ? value(row) : value;
|
|
284
|
+
}
|
|
285
|
+
getVisibleIndicators(row) {
|
|
286
|
+
return this.rowIndicators().filter((ind) => {
|
|
287
|
+
if (ind.visible === undefined)
|
|
288
|
+
return true;
|
|
289
|
+
return this.resolveValue(ind.visible, row);
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
firstRecord = computed(() => (this.collectionSize() === 0 ? 0 : this.firstIndex() + 1), /* @ts-ignore */
|
|
293
|
+
...(ngDevMode ? [{ debugName: "firstRecord" }] : /* istanbul ignore next */ []));
|
|
294
|
+
pageReportText = computed(() => this.pageReportTemplate()
|
|
295
|
+
.replace('{first}', this.firstRecord() + '')
|
|
296
|
+
.replace('{last}', this.lastIndex() + '')
|
|
297
|
+
.replace('{totalRecords}', this.collectionSize() + ''), /* @ts-ignore */
|
|
298
|
+
...(ngDevMode ? [{ debugName: "pageReportText" }] : /* istanbul ignore next */ []));
|
|
299
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
300
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: YsTable, isStandalone: true, selector: "ys-table", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, actionButtons: { classPropertyName: "actionButtons", publicName: "actionButtons", isSignal: true, isRequired: false, transformFunction: null }, toolbarButtons: { classPropertyName: "toolbarButtons", publicName: "toolbarButtons", isSignal: true, isRequired: false, transformFunction: null }, rowStyleClass: { classPropertyName: "rowStyleClass", publicName: "rowStyleClass", isSignal: true, isRequired: false, transformFunction: null }, rowIndicators: { classPropertyName: "rowIndicators", publicName: "rowIndicators", isSignal: true, isRequired: false, transformFunction: null }, serverSide: { classPropertyName: "serverSide", publicName: "serverSide", isSignal: true, isRequired: false, transformFunction: null }, isPagination: { classPropertyName: "isPagination", publicName: "isPagination", isSignal: true, isRequired: false, transformFunction: null }, rowsPerPage: { classPropertyName: "rowsPerPage", publicName: "rowsPerPage", isSignal: true, isRequired: false, transformFunction: null }, pageReportTemplate: { classPropertyName: "pageReportTemplate", publicName: "pageReportTemplate", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, collectionSize: { classPropertyName: "collectionSize", publicName: "collectionSize", isSignal: true, isRequired: false, transformFunction: null }, hasSearch: { classPropertyName: "hasSearch", publicName: "hasSearch", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, searchStyleClass: { classPropertyName: "searchStyleClass", publicName: "searchStyleClass", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, toolbarStyleClass: { classPropertyName: "toolbarStyleClass", publicName: "toolbarStyleClass", isSignal: true, isRequired: false, transformFunction: null }, tableStyleClass: { classPropertyName: "tableStyleClass", publicName: "tableStyleClass", isSignal: true, isRequired: false, transformFunction: null }, selectableRows: { classPropertyName: "selectableRows", publicName: "selectableRows", isSignal: true, isRequired: false, transformFunction: null }, isRowSelectable: { classPropertyName: "isRowSelectable", publicName: "isRowSelectable", isSignal: true, isRequired: false, transformFunction: null }, rowKey: { classPropertyName: "rowKey", publicName: "rowKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { page: "pageChange", pageSize: "pageSizeChange", collectionSize: "collectionSizeChange", pageChanged: "pageChanged", search: "search", selectedItemsChange: "selectedItemsChange" }, ngImport: i0, template: "<div class=\"ys-table-container card shadow-sm\" [class]=\"styleClass()\">\r\n <div class=\"card-body\">\r\n <div class=\"table-responsive\">\r\n <div class=\"ys-table-toolbar d-flex justify-content-between\" [class]=\"toolbarStyleClass()\">\r\n @if (toolbarButtons() && toolbarButtons().length) {\r\n <div class=\"mb-2 d-flex gap-2 w-100\">\r\n @for (btn of toolbarButtons(); track $index) {\r\n @if (!btn.visible || btn.visible()) {\r\n <button class=\"btn btn-primary btn-sm\" [class]=\"btn.styleClass\" (click)=\"btn.onClick?.()\"\r\n [disabled]=\"btn.disabled?.()\" [ngbTooltip]=\"getTooltipText(btn.tooltip)\">\r\n @if (btn.iconClass) {\r\n <i [class]=\"btn.iconClass\"></i>\r\n }\r\n\r\n {{ getLabelText(btn.label) }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n @if (hasSearch()) {\r\n <input type=\"text\" class=\"form-control w-auto mb-2 ms-auto\" [class]=\"searchStyleClass()\"\r\n [placeholder]=\"searchPlaceholder()\" (input)=\"onSearch($event.target)\" />\r\n }\r\n </div>\r\n\r\n <table class=\"ys-table table table-striped table-hover align-middle\" [class]=\"tableStyleClass()\">\r\n <thead class=\"table-light\">\r\n <tr>\r\n <th class=\"number-col\">#</th>\r\n\r\n @if (selectableRows()) {\r\n <th class=\"select-col\">\r\n <input type=\"checkbox\" [checked]=\"allSelected()\" (change)=\"toggleSelectAll($event)\" id=\"allSelect\" />\r\n </th>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <th class=\"indicator-col\"></th>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <th></th>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <th [class.cursor-pointer]=\"isSortable(col)\" (click)=\"isSortable(col) && onSort(col.field)\"\r\n [class]=\"col.headerStyleClass\">\r\n {{ col.header }}\r\n\r\n @if (isSortable(col)) {\r\n <i class=\"fa\" [ngClass]=\"{\r\n 'fa-sort': sortedColumn() !== col.field,\r\n 'fa-sort-up': sortedColumn() === col.field && sortDirection() === 'asc',\r\n 'fa-sort-down': sortedColumn() === col.field && sortDirection() === 'desc',\r\n }\"></i>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n @for (item of paginatedItems(); track $index; let i = $index) {\r\n <tr [class]=\"getRowClass(item)\">\r\n <td class=\"number-col\">{{ (page() - 1) * pageSize() + i + 1 }}</td>\r\n\r\n @if (selectableRows()) {\r\n <td class=\"select-col\">\r\n <input #checkbox type=\"checkbox\" [checked]=\"isSelected(item)\" (change)=\"toggleSelection(item, $event)\"\r\n [disabled]=\"!isSelectable(item)\" [class.opacity-50]=\"!isSelectable(item)\"\r\n id=\"{{ 'select' + $index }}\" />\r\n </td>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <td class=\"indicator-col text-center\">\r\n <div class=\"d-flex justify-content-center align-items-center gap-1\">\r\n @for (ind of getVisibleIndicators(item); track $index) {\r\n @if ((ind.type || 'icon') === 'icon') {\r\n <i [class.cursor-pointer]=\"ind.onClick\" [class]=\"\r\n resolveValue(ind.iconClass, item) +\r\n ' ' +\r\n (resolveValue(ind.styleClass, item) || '')\r\n \" [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n </i>\r\n } @else if (ind.type === 'badge') {\r\n <span class=\"badge rounded-pill position-relative\" [class]=\"resolveValue(ind.styleClass, item)\"\r\n [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n @if (resolveValue(ind.iconClass, item)) {\r\n <i [class]=\"resolveValue(ind.iconClass, item)\"></i>\r\n }\r\n\r\n @if (resolveValue(ind.badgeLabel, item)) {\r\n {{ resolveValue(ind.badgeLabel, item) }}\r\n }\r\n\r\n @if (resolveValue(ind.badgeValue, item)) {\r\n <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill\"\r\n [class]=\"resolveValue(ind.badgeValueClass, item)\">\r\n {{ resolveValue(ind.badgeValue, item) }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <td>\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm btn-menu\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <i class=\"fa fa-bars\"></i>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n @for (action of actionButtons(); track $index) {\r\n @if (!action.visible || action.visible(item)) {\r\n @if (action.isDivider) {\r\n <li>\r\n <hr class=\"dropdown-divider\" />\r\n </li>\r\n } @else {\r\n <li>\r\n <button class=\"dropdown-item d-flex align-items-center gap-2\" type=\"button\"\r\n [class]=\"action.styleClass\" (click)=\"action.onClick?.(item)\" [disabled]=\"action.disabled?.(item)\">\r\n @if (action.iconClass) {\r\n <i [class]=\"getIconClass(action, item)\"></i>\r\n }\r\n {{ getLabel(action, item) }}\r\n </button>\r\n </li>\r\n }\r\n }\r\n }\r\n </ul>\r\n </div>\r\n </td>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <td [class]=\"getColumnClass(col, item)\">\r\n @if (!col.visible || col.visible(item)) {\r\n @if (col.cellTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"col.cellTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\">\r\n </ng-container>\r\n } @else if (col.template) {\r\n {{ applyTemplate(col.template, item) }}\r\n } @else if (col.field && col.pipe) {\r\n {{\r\n applyPipe(col.pipe, resolveFieldPath(item, col.field), col.pipeArgs || [])\r\n }}\r\n } @else if (col.field) {\r\n {{ resolveFieldPath(item, col.field) }}\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n\r\n <caption>\r\n @if (isPagination()) {\r\n <div class=\"ys-table-pagination d-flex flex-wrap justify-content-between align-items-center gap-2\">\r\n <!-- \u0635\u0641\u062D\u0647\u200C\u0628\u0646\u062F\u06CC -->\r\n <ngb-pagination [collectionSize]=\"collectionSize()\" [page]=\"page()\" [pageSize]=\"pageSize()\" [maxSize]=\"5\"\r\n [rotate]=\"true\" [ellipses]=\"false\" [boundaryLinks]=\"true\" (pageChange)=\"changePage($event)\" />\r\n\r\n <!-- \u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0639\u062F\u0627\u062F \u062F\u0631 \u0647\u0631 \u0635\u0641\u062D\u0647 -->\r\n <select class=\"pagination-select form-select form-select-sm w-auto\" [(ngModel)]=\"pageSize\"\r\n (change)=\"changePageSize(pageSize())\" id=\"pagination\">\r\n @for (opt of rowsPerPage(); track opt) {\r\n <option [value]=\"opt\">{{ opt }}</option>\r\n }\r\n </select>\r\n\r\n <!-- \u06AF\u0632\u0627\u0631\u0634 -->\r\n <small class=\"pagination-report text-muted ms-auto\">\r\n {{ pageReportText() }}\r\n </small>\r\n </div>\r\n }\r\n </caption>\r\n </table>\r\n </div>\r\n </div>\r\n</div>", styles: [".ys-table .number-col,.ys-table .select-col{width:3em;min-width:3em;max-width:3em;word-break:break-all;text-align:center}.ys-table .indicator-col{width:32px;white-space:nowrap}.ys-table .indicator-col i{font-size:.9rem;cursor:default}.btn-menu{width:32px}.cursor-pointer{cursor:pointer!important}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NgbDropdownModule }, { kind: "component", type: NgbPagination, selector: "ngb-pagination", inputs: ["disabled", "boundaryLinks", "directionLinks", "ellipses", "rotate", "collectionSize", "maxSize", "page", "pageSize", "size"], outputs: ["pageChange"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.Eager });
|
|
301
|
+
}
|
|
302
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: YsTable, decorators: [{
|
|
303
|
+
type: Component,
|
|
304
|
+
args: [{ selector: 'ys-table', imports: [NgClass, FormsModule, NgTemplateOutlet, NgbDropdownModule, NgbPagination, NgbTooltip], changeDetection: ChangeDetectionStrategy.Eager, template: "<div class=\"ys-table-container card shadow-sm\" [class]=\"styleClass()\">\r\n <div class=\"card-body\">\r\n <div class=\"table-responsive\">\r\n <div class=\"ys-table-toolbar d-flex justify-content-between\" [class]=\"toolbarStyleClass()\">\r\n @if (toolbarButtons() && toolbarButtons().length) {\r\n <div class=\"mb-2 d-flex gap-2 w-100\">\r\n @for (btn of toolbarButtons(); track $index) {\r\n @if (!btn.visible || btn.visible()) {\r\n <button class=\"btn btn-primary btn-sm\" [class]=\"btn.styleClass\" (click)=\"btn.onClick?.()\"\r\n [disabled]=\"btn.disabled?.()\" [ngbTooltip]=\"getTooltipText(btn.tooltip)\">\r\n @if (btn.iconClass) {\r\n <i [class]=\"btn.iconClass\"></i>\r\n }\r\n\r\n {{ getLabelText(btn.label) }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n @if (hasSearch()) {\r\n <input type=\"text\" class=\"form-control w-auto mb-2 ms-auto\" [class]=\"searchStyleClass()\"\r\n [placeholder]=\"searchPlaceholder()\" (input)=\"onSearch($event.target)\" />\r\n }\r\n </div>\r\n\r\n <table class=\"ys-table table table-striped table-hover align-middle\" [class]=\"tableStyleClass()\">\r\n <thead class=\"table-light\">\r\n <tr>\r\n <th class=\"number-col\">#</th>\r\n\r\n @if (selectableRows()) {\r\n <th class=\"select-col\">\r\n <input type=\"checkbox\" [checked]=\"allSelected()\" (change)=\"toggleSelectAll($event)\" id=\"allSelect\" />\r\n </th>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <th class=\"indicator-col\"></th>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <th></th>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <th [class.cursor-pointer]=\"isSortable(col)\" (click)=\"isSortable(col) && onSort(col.field)\"\r\n [class]=\"col.headerStyleClass\">\r\n {{ col.header }}\r\n\r\n @if (isSortable(col)) {\r\n <i class=\"fa\" [ngClass]=\"{\r\n 'fa-sort': sortedColumn() !== col.field,\r\n 'fa-sort-up': sortedColumn() === col.field && sortDirection() === 'asc',\r\n 'fa-sort-down': sortedColumn() === col.field && sortDirection() === 'desc',\r\n }\"></i>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n @for (item of paginatedItems(); track $index; let i = $index) {\r\n <tr [class]=\"getRowClass(item)\">\r\n <td class=\"number-col\">{{ (page() - 1) * pageSize() + i + 1 }}</td>\r\n\r\n @if (selectableRows()) {\r\n <td class=\"select-col\">\r\n <input #checkbox type=\"checkbox\" [checked]=\"isSelected(item)\" (change)=\"toggleSelection(item, $event)\"\r\n [disabled]=\"!isSelectable(item)\" [class.opacity-50]=\"!isSelectable(item)\"\r\n id=\"{{ 'select' + $index }}\" />\r\n </td>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <td class=\"indicator-col text-center\">\r\n <div class=\"d-flex justify-content-center align-items-center gap-1\">\r\n @for (ind of getVisibleIndicators(item); track $index) {\r\n @if ((ind.type || 'icon') === 'icon') {\r\n <i [class.cursor-pointer]=\"ind.onClick\" [class]=\"\r\n resolveValue(ind.iconClass, item) +\r\n ' ' +\r\n (resolveValue(ind.styleClass, item) || '')\r\n \" [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n </i>\r\n } @else if (ind.type === 'badge') {\r\n <span class=\"badge rounded-pill position-relative\" [class]=\"resolveValue(ind.styleClass, item)\"\r\n [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n @if (resolveValue(ind.iconClass, item)) {\r\n <i [class]=\"resolveValue(ind.iconClass, item)\"></i>\r\n }\r\n\r\n @if (resolveValue(ind.badgeLabel, item)) {\r\n {{ resolveValue(ind.badgeLabel, item) }}\r\n }\r\n\r\n @if (resolveValue(ind.badgeValue, item)) {\r\n <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill\"\r\n [class]=\"resolveValue(ind.badgeValueClass, item)\">\r\n {{ resolveValue(ind.badgeValue, item) }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <td>\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm btn-menu\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <i class=\"fa fa-bars\"></i>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n @for (action of actionButtons(); track $index) {\r\n @if (!action.visible || action.visible(item)) {\r\n @if (action.isDivider) {\r\n <li>\r\n <hr class=\"dropdown-divider\" />\r\n </li>\r\n } @else {\r\n <li>\r\n <button class=\"dropdown-item d-flex align-items-center gap-2\" type=\"button\"\r\n [class]=\"action.styleClass\" (click)=\"action.onClick?.(item)\" [disabled]=\"action.disabled?.(item)\">\r\n @if (action.iconClass) {\r\n <i [class]=\"getIconClass(action, item)\"></i>\r\n }\r\n {{ getLabel(action, item) }}\r\n </button>\r\n </li>\r\n }\r\n }\r\n }\r\n </ul>\r\n </div>\r\n </td>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <td [class]=\"getColumnClass(col, item)\">\r\n @if (!col.visible || col.visible(item)) {\r\n @if (col.cellTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"col.cellTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\">\r\n </ng-container>\r\n } @else if (col.template) {\r\n {{ applyTemplate(col.template, item) }}\r\n } @else if (col.field && col.pipe) {\r\n {{\r\n applyPipe(col.pipe, resolveFieldPath(item, col.field), col.pipeArgs || [])\r\n }}\r\n } @else if (col.field) {\r\n {{ resolveFieldPath(item, col.field) }}\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n\r\n <caption>\r\n @if (isPagination()) {\r\n <div class=\"ys-table-pagination d-flex flex-wrap justify-content-between align-items-center gap-2\">\r\n <!-- \u0635\u0641\u062D\u0647\u200C\u0628\u0646\u062F\u06CC -->\r\n <ngb-pagination [collectionSize]=\"collectionSize()\" [page]=\"page()\" [pageSize]=\"pageSize()\" [maxSize]=\"5\"\r\n [rotate]=\"true\" [ellipses]=\"false\" [boundaryLinks]=\"true\" (pageChange)=\"changePage($event)\" />\r\n\r\n <!-- \u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0639\u062F\u0627\u062F \u062F\u0631 \u0647\u0631 \u0635\u0641\u062D\u0647 -->\r\n <select class=\"pagination-select form-select form-select-sm w-auto\" [(ngModel)]=\"pageSize\"\r\n (change)=\"changePageSize(pageSize())\" id=\"pagination\">\r\n @for (opt of rowsPerPage(); track opt) {\r\n <option [value]=\"opt\">{{ opt }}</option>\r\n }\r\n </select>\r\n\r\n <!-- \u06AF\u0632\u0627\u0631\u0634 -->\r\n <small class=\"pagination-report text-muted ms-auto\">\r\n {{ pageReportText() }}\r\n </small>\r\n </div>\r\n }\r\n </caption>\r\n </table>\r\n </div>\r\n </div>\r\n</div>", styles: [".ys-table .number-col,.ys-table .select-col{width:3em;min-width:3em;max-width:3em;word-break:break-all;text-align:center}.ys-table .indicator-col{width:32px;white-space:nowrap}.ys-table .indicator-col i{font-size:.9rem;cursor:default}.btn-menu{width:32px}.cursor-pointer{cursor:pointer!important}\n"] }]
|
|
305
|
+
}], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], actionButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionButtons", required: false }] }], toolbarButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarButtons", required: false }] }], rowStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowStyleClass", required: false }] }], rowIndicators: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowIndicators", required: false }] }], serverSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "serverSide", required: false }] }], isPagination: [{ type: i0.Input, args: [{ isSignal: true, alias: "isPagination", required: false }] }], rowsPerPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowsPerPage", required: false }] }], pageReportTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageReportTemplate", required: false }] }], page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }, { type: i0.Output, args: ["pageChange"] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }, { type: i0.Output, args: ["pageSizeChange"] }], collectionSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "collectionSize", required: false }] }, { type: i0.Output, args: ["collectionSizeChange"] }], hasSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasSearch", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], searchStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchStyleClass", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }], toolbarStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarStyleClass", required: false }] }], tableStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableStyleClass", required: false }] }], selectableRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectableRows", required: false }] }], isRowSelectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isRowSelectable", required: false }] }], rowKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowKey", required: false }] }], pageChanged: [{ type: i0.Output, args: ["pageChanged"] }], search: [{ type: i0.Output, args: ["search"] }], selectedItemsChange: [{ type: i0.Output, args: ["selectedItemsChange"] }] } });
|
|
306
|
+
|
|
307
|
+
/*
|
|
308
|
+
* Public API Surface of ys-tiff-viewer
|
|
309
|
+
*/
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Generated bundle index. Do not edit.
|
|
313
|
+
*/
|
|
314
|
+
|
|
315
|
+
export { YsTable };
|
|
316
|
+
//# sourceMappingURL=yoozsoft-yoozsoft-ng-table.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yoozsoft-yoozsoft-ng-table.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/table/src/ys-table/ys-table.ts","../../../../projects/yoozsoft/yoozsoft-ng/table/src/ys-table/ys-table.html","../../../../projects/yoozsoft/yoozsoft-ng/table/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/table/yoozsoft-yoozsoft-ng-table.ts"],"sourcesContent":["import { NgClass, NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n PipeTransform,\r\n signal,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NgbDropdownModule, NgbPagination, NgbTooltip } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ActionButton, RowIndicator, TableColumn, ToolbarButton, ValueOrFn } from '../models';\r\n\r\n@Component({\r\n selector: 'ys-table',\r\n imports: [NgClass, FormsModule, NgTemplateOutlet, NgbDropdownModule, NgbPagination, NgbTooltip],\r\n templateUrl: './ys-table.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n styleUrl: './ys-table.scss',\r\n})\r\nexport class YsTable {\r\n items = input<any[]>([]);\r\n columns = input<TableColumn[]>([]);\r\n actionButtons = input<ActionButton[]>([]);\r\n\r\n toolbarButtons = input<ToolbarButton[]>([]);\r\n\r\n rowStyleClass = input<string | ((row: any) => string)>();\r\n\r\n rowIndicators = input<RowIndicator[]>([]);\r\n\r\n serverSide = input<boolean>(false); // <--- حالت سروری\r\n isPagination = input<boolean>(true);\r\n rowsPerPage = input<number[]>([10, 25, 50]);\r\n pageReportTemplate = input<string>('Showing {first} to {last} of {totalRecords} items');\r\n\r\n page = model<number>(1);\r\n pageSize = model<number>(this.rowsPerPage()[0] || 10);\r\n collectionSize = model<number>(0); // <--- از سرور میگیریم\r\n\r\n hasSearch = input<boolean>(false);\r\n searchPlaceholder = input<string>('search...');\r\n searchStyleClass = input<string>();\r\n\r\n styleClass = input<string>();\r\n toolbarStyleClass = input<string>();\r\n tableStyleClass = input<string>();\r\n\r\n /** Selectable rows checkbox */\r\n selectableRows = input<boolean>(false);\r\n /** Condition for each row's checkbox to be active */\r\n isRowSelectable = input<(row: any) => boolean>();\r\n\r\n rowKey = input<string>('id');\r\n\r\n pageChanged = output<{ page: number; pageSize: number }>();\r\n search = output<string>();\r\n\r\n /** checkbox */\r\n selectedItemsChange = output<any[]>();\r\n\r\n searchTerm = signal<string>('');\r\n sortedColumn = signal<string | null>(null);\r\n sortDirection = signal<'asc' | 'desc'>('asc');\r\n\r\n readonly filteredItems = computed(() => {\r\n let items = [...this.items()];\r\n\r\n const search = this.searchTerm().trim().toLowerCase();\r\n\r\n if (search) {\r\n items = items.filter((item) =>\r\n this.columns().some((col) => {\r\n let value = '';\r\n\r\n if (col.template) {\r\n value = this.applyTemplate(col.template, item);\r\n } else if (col.field) {\r\n value = this.resolveFieldPath(item, col.field);\r\n }\r\n\r\n return value?.toString().toLowerCase().includes(search);\r\n }),\r\n );\r\n }\r\n\r\n const sortField = this.sortedColumn();\r\n\r\n if (sortField) {\r\n items.sort((a, b) => {\r\n const aVal = this.resolveFieldPath(a, sortField);\r\n const bVal = this.resolveFieldPath(b, sortField);\r\n\r\n if (aVal == null) return this.sortDirection() === 'asc' ? -1 : 1;\r\n if (bVal == null) return this.sortDirection() === 'asc' ? 1 : -1;\r\n\r\n return this.sortDirection() === 'asc'\r\n ? String(aVal).localeCompare(String(bVal))\r\n : String(bVal).localeCompare(String(aVal));\r\n });\r\n }\r\n\r\n return items;\r\n });\r\n\r\n readonly paginatedItems = computed(() => {\r\n if (this.serverSide()) {\r\n return this.items();\r\n }\r\n\r\n if (!this.isPagination()) {\r\n return this.filteredItems();\r\n }\r\n\r\n const start = (this.page() - 1) * this.pageSize();\r\n\r\n return this.filteredItems().slice(start, start + this.pageSize());\r\n });\r\n\r\n selectedItems = signal<any[]>([]);\r\n\r\n totalPages = computed<number>(() => {\r\n return Math.ceil(this.collectionSize() / this.pageSize()) || 1;\r\n });\r\n\r\n firstIndex = computed<number>(() => {\r\n return (this.page() - 1) * this.pageSize();\r\n });\r\n\r\n lastIndex = computed<number>(() => {\r\n return Math.min(this.firstIndex() + this.pageSize(), this.collectionSize());\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n this.columns();\r\n this.checkUniqueColumnKeys();\r\n });\r\n\r\n effect(() => {\r\n if (!this.serverSide()) {\r\n this.collectionSize.set(this.filteredItems().length);\r\n }\r\n });\r\n }\r\n\r\n onSort(field: string): void {\r\n if (this.sortedColumn() === field) {\r\n this.sortDirection.update((v) => (v === 'asc' ? 'desc' : 'asc'));\r\n } else {\r\n this.sortedColumn.set(field);\r\n this.sortDirection.set('asc');\r\n }\r\n }\r\n\r\n changePage(page: number): void {\r\n if (page < 1 || page > this.totalPages()) {\r\n return;\r\n }\r\n\r\n this.page.set(page);\r\n\r\n if (this.serverSide()) {\r\n this.pageChanged.emit({\r\n page,\r\n pageSize: this.pageSize(),\r\n });\r\n }\r\n }\r\n\r\n changePageSize(size: number): void {\r\n this.pageSize.set(+size);\r\n this.page.set(1);\r\n\r\n if (this.serverSide()) {\r\n this.pageChanged.emit({\r\n page: 1,\r\n pageSize: +size,\r\n });\r\n }\r\n }\r\n\r\n onSearch(target: EventTarget | null): void {\r\n this.searchTerm.set((target as HTMLInputElement).value);\r\n\r\n this.page.set(1);\r\n\r\n if (this.serverSide()) {\r\n this.search.emit(this.searchTerm());\r\n }\r\n }\r\n\r\n applyPipe(pipe: PipeTransform, value: unknown, args: unknown[] = []): any {\r\n return pipe?.transform(value, ...args);\r\n }\r\n\r\n resolveFieldPath(obj: any, path: string): any {\r\n return path.split('.').reduce((acc, part) => acc?.[part], obj);\r\n }\r\n\r\n applyTemplate(template: string, item: any): string {\r\n return template.replace(/\\{([^}]+)\\}/g, (_, path) => {\r\n const val = this.resolveFieldPath(item, path.trim());\r\n return val !== undefined && val !== null ? val : '';\r\n });\r\n }\r\n\r\n private checkUniqueColumnKeys(): void {\r\n const seen = new Set<number>();\r\n const duplicates: number[] = [];\r\n\r\n this.columns().forEach((col) => {\r\n if (!col.key) {\r\n throw new Error(`Column with header \"${col.header}\" is missing a unique \"key\"`);\r\n }\r\n if (seen.has(col.key)) {\r\n duplicates.push(col.key);\r\n } else {\r\n seen.add(col.key);\r\n }\r\n });\r\n\r\n if (duplicates.length > 0) {\r\n throw new Error(`Duplicate column keys found: ${duplicates.join(', ')}`);\r\n }\r\n }\r\n\r\n getLabel(action: ActionButton, item: any): string {\r\n return typeof action.label === 'function' ? action.label(item) : (action.label ?? 'Label');\r\n }\r\n\r\n getIconClass(action: ActionButton, item: any): string {\r\n return typeof action.iconClass === 'function'\r\n ? action.iconClass(item)\r\n : (action.iconClass ?? '');\r\n }\r\n\r\n getTooltipText(tooltip?: string | (() => string)): string {\r\n if (!tooltip) return '';\r\n\r\n return typeof tooltip === 'function' ? tooltip() : tooltip;\r\n }\r\n\r\n getLabelText(label?: string | (() => string)): string {\r\n if (!label) return '';\r\n\r\n return typeof label === 'function' ? label() : label;\r\n }\r\n\r\n itemKey(item: any): string {\r\n return String(item[this.rowKey()]);\r\n }\r\n\r\n onSelectionChange(item: any, checked: boolean) {\r\n if (checked) {\r\n this.selectedItems.update((items) => [...items, item]);\r\n } else {\r\n this.selectedItems.update((items) =>\r\n items.filter((x) => this.itemKey(x) !== this.itemKey(item)),\r\n );\r\n }\r\n\r\n this.selectedItemsChange.emit(this.selectedItems());\r\n }\r\n\r\n isSelected(item: any): boolean {\r\n return this.selectedItems().some((x) => this.itemKey(x) === this.itemKey(item));\r\n }\r\n\r\n toggleSelection(item: any, event: Event): void {\r\n const checked = (event.target as HTMLInputElement).checked;\r\n\r\n if (checked) {\r\n this.selectedItems.update((items) => [...items, item]);\r\n } else {\r\n this.selectedItems.update((items) =>\r\n items.filter((x) => this.itemKey(x) !== this.itemKey(item)),\r\n );\r\n }\r\n\r\n this.selectedItemsChange.emit(this.selectedItems());\r\n }\r\n\r\n allSelected(): boolean {\r\n const selectable = this.paginatedItems().filter((i) => this.isSelectable(i));\r\n\r\n return selectable.length > 0 && selectable.every((i) => this.isSelected(i));\r\n }\r\n\r\n toggleSelectAll(event: Event): void {\r\n const checked = (event.target as HTMLInputElement).checked;\r\n\r\n if (checked) {\r\n const itemsToAdd = this.paginatedItems().filter(\r\n (item) =>\r\n this.isSelectable(item) &&\r\n !this.selectedItems().some((x) => this.itemKey(x) === this.itemKey(item)),\r\n );\r\n\r\n this.selectedItems.update((items) => [...items, ...itemsToAdd]);\r\n } else {\r\n this.selectedItems.update((items) =>\r\n items.filter(\r\n (item) => !this.paginatedItems().some((p) => this.itemKey(p) === this.itemKey(item)),\r\n ),\r\n );\r\n }\r\n\r\n this.selectedItemsChange.emit(this.selectedItems());\r\n }\r\n\r\n getRowClass(row: any): string {\r\n const styleClass = this.rowStyleClass();\r\n\r\n if (!styleClass) {\r\n return '';\r\n }\r\n\r\n return typeof styleClass === 'function' ? styleClass(row) : styleClass;\r\n }\r\n\r\n getColumnClass(col: TableColumn, row: any): string {\r\n if (!col.styleClass) return '';\r\n return typeof col.styleClass === 'function' ? col.styleClass(row) : col.styleClass;\r\n }\r\n\r\n isSortable(col: TableColumn): col is TableColumn & { field: string } {\r\n return !!col.sortable && !!col.field;\r\n }\r\n\r\n isSelectable(row: any): boolean {\r\n if (!this.selectableRows()) {\r\n return false;\r\n }\r\n\r\n const predicate = this.isRowSelectable();\r\n\r\n return predicate ? predicate(row) : true;\r\n }\r\n\r\n resolveValue<T>(value: ValueOrFn<T> | undefined, row: any): T | undefined {\r\n return typeof value === 'function' ? (value as (row: any) => T)(row) : value;\r\n }\r\n\r\n getVisibleIndicators(row: any): RowIndicator[] {\r\n return this.rowIndicators().filter((ind) => {\r\n if (ind.visible === undefined) return true;\r\n return this.resolveValue(ind.visible, row);\r\n });\r\n }\r\n\r\n readonly firstRecord = computed(() => (this.collectionSize() === 0 ? 0 : this.firstIndex() + 1));\r\n\r\n readonly pageReportText = computed(() =>\r\n this.pageReportTemplate()\r\n .replace('{first}', this.firstRecord() + '')\r\n .replace('{last}', this.lastIndex() + '')\r\n .replace('{totalRecords}', this.collectionSize() + ''),\r\n );\r\n}\r\n","<div class=\"ys-table-container card shadow-sm\" [class]=\"styleClass()\">\r\n <div class=\"card-body\">\r\n <div class=\"table-responsive\">\r\n <div class=\"ys-table-toolbar d-flex justify-content-between\" [class]=\"toolbarStyleClass()\">\r\n @if (toolbarButtons() && toolbarButtons().length) {\r\n <div class=\"mb-2 d-flex gap-2 w-100\">\r\n @for (btn of toolbarButtons(); track $index) {\r\n @if (!btn.visible || btn.visible()) {\r\n <button class=\"btn btn-primary btn-sm\" [class]=\"btn.styleClass\" (click)=\"btn.onClick?.()\"\r\n [disabled]=\"btn.disabled?.()\" [ngbTooltip]=\"getTooltipText(btn.tooltip)\">\r\n @if (btn.iconClass) {\r\n <i [class]=\"btn.iconClass\"></i>\r\n }\r\n\r\n {{ getLabelText(btn.label) }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n @if (hasSearch()) {\r\n <input type=\"text\" class=\"form-control w-auto mb-2 ms-auto\" [class]=\"searchStyleClass()\"\r\n [placeholder]=\"searchPlaceholder()\" (input)=\"onSearch($event.target)\" />\r\n }\r\n </div>\r\n\r\n <table class=\"ys-table table table-striped table-hover align-middle\" [class]=\"tableStyleClass()\">\r\n <thead class=\"table-light\">\r\n <tr>\r\n <th class=\"number-col\">#</th>\r\n\r\n @if (selectableRows()) {\r\n <th class=\"select-col\">\r\n <input type=\"checkbox\" [checked]=\"allSelected()\" (change)=\"toggleSelectAll($event)\" id=\"allSelect\" />\r\n </th>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <th class=\"indicator-col\"></th>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <th></th>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <th [class.cursor-pointer]=\"isSortable(col)\" (click)=\"isSortable(col) && onSort(col.field)\"\r\n [class]=\"col.headerStyleClass\">\r\n {{ col.header }}\r\n\r\n @if (isSortable(col)) {\r\n <i class=\"fa\" [ngClass]=\"{\r\n 'fa-sort': sortedColumn() !== col.field,\r\n 'fa-sort-up': sortedColumn() === col.field && sortDirection() === 'asc',\r\n 'fa-sort-down': sortedColumn() === col.field && sortDirection() === 'desc',\r\n }\"></i>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n @for (item of paginatedItems(); track $index; let i = $index) {\r\n <tr [class]=\"getRowClass(item)\">\r\n <td class=\"number-col\">{{ (page() - 1) * pageSize() + i + 1 }}</td>\r\n\r\n @if (selectableRows()) {\r\n <td class=\"select-col\">\r\n <input #checkbox type=\"checkbox\" [checked]=\"isSelected(item)\" (change)=\"toggleSelection(item, $event)\"\r\n [disabled]=\"!isSelectable(item)\" [class.opacity-50]=\"!isSelectable(item)\"\r\n id=\"{{ 'select' + $index }}\" />\r\n </td>\r\n }\r\n\r\n @if (rowIndicators().length) {\r\n <td class=\"indicator-col text-center\">\r\n <div class=\"d-flex justify-content-center align-items-center gap-1\">\r\n @for (ind of getVisibleIndicators(item); track $index) {\r\n @if ((ind.type || 'icon') === 'icon') {\r\n <i [class.cursor-pointer]=\"ind.onClick\" [class]=\"\r\n resolveValue(ind.iconClass, item) +\r\n ' ' +\r\n (resolveValue(ind.styleClass, item) || '')\r\n \" [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n </i>\r\n } @else if (ind.type === 'badge') {\r\n <span class=\"badge rounded-pill position-relative\" [class]=\"resolveValue(ind.styleClass, item)\"\r\n [ngbTooltip]=\"resolveValue(ind.tooltip, item)\" (click)=\"ind.onClick?.(item)\">\r\n @if (resolveValue(ind.iconClass, item)) {\r\n <i [class]=\"resolveValue(ind.iconClass, item)\"></i>\r\n }\r\n\r\n @if (resolveValue(ind.badgeLabel, item)) {\r\n {{ resolveValue(ind.badgeLabel, item) }}\r\n }\r\n\r\n @if (resolveValue(ind.badgeValue, item)) {\r\n <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill\"\r\n [class]=\"resolveValue(ind.badgeValueClass, item)\">\r\n {{ resolveValue(ind.badgeValue, item) }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n\r\n @if (actionButtons().length) {\r\n <td>\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm btn-menu\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <i class=\"fa fa-bars\"></i>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n @for (action of actionButtons(); track $index) {\r\n @if (!action.visible || action.visible(item)) {\r\n @if (action.isDivider) {\r\n <li>\r\n <hr class=\"dropdown-divider\" />\r\n </li>\r\n } @else {\r\n <li>\r\n <button class=\"dropdown-item d-flex align-items-center gap-2\" type=\"button\"\r\n [class]=\"action.styleClass\" (click)=\"action.onClick?.(item)\" [disabled]=\"action.disabled?.(item)\">\r\n @if (action.iconClass) {\r\n <i [class]=\"getIconClass(action, item)\"></i>\r\n }\r\n {{ getLabel(action, item) }}\r\n </button>\r\n </li>\r\n }\r\n }\r\n }\r\n </ul>\r\n </div>\r\n </td>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <td [class]=\"getColumnClass(col, item)\">\r\n @if (!col.visible || col.visible(item)) {\r\n @if (col.cellTemplate) {\r\n <ng-container [ngTemplateOutlet]=\"col.cellTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\">\r\n </ng-container>\r\n } @else if (col.template) {\r\n {{ applyTemplate(col.template, item) }}\r\n } @else if (col.field && col.pipe) {\r\n {{\r\n applyPipe(col.pipe, resolveFieldPath(item, col.field), col.pipeArgs || [])\r\n }}\r\n } @else if (col.field) {\r\n {{ resolveFieldPath(item, col.field) }}\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n\r\n <caption>\r\n @if (isPagination()) {\r\n <div class=\"ys-table-pagination d-flex flex-wrap justify-content-between align-items-center gap-2\">\r\n <!-- صفحهبندی -->\r\n <ngb-pagination [collectionSize]=\"collectionSize()\" [page]=\"page()\" [pageSize]=\"pageSize()\" [maxSize]=\"5\"\r\n [rotate]=\"true\" [ellipses]=\"false\" [boundaryLinks]=\"true\" (pageChange)=\"changePage($event)\" />\r\n\r\n <!-- انتخاب تعداد در هر صفحه -->\r\n <select class=\"pagination-select form-select form-select-sm w-auto\" [(ngModel)]=\"pageSize\"\r\n (change)=\"changePageSize(pageSize())\" id=\"pagination\">\r\n @for (opt of rowsPerPage(); track opt) {\r\n <option [value]=\"opt\">{{ opt }}</option>\r\n }\r\n </select>\r\n\r\n <!-- گزارش -->\r\n <small class=\"pagination-report text-muted ms-auto\">\r\n {{ pageReportText() }}\r\n </small>\r\n </div>\r\n }\r\n </caption>\r\n </table>\r\n </div>\r\n </div>\r\n</div>","/*\r\n * Public API Surface of ys-tiff-viewer\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-table/ys-table';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|