ngx-kit 3.1.0 → 4.0.0
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/fesm2022/ngx-kit-data-table.mjs +371 -0
- package/fesm2022/ngx-kit-data-table.mjs.map +1 -0
- package/fesm2022/ngx-kit-message.mjs +34 -22
- package/fesm2022/ngx-kit-message.mjs.map +1 -1
- package/fesm2022/ngx-kit-shared.mjs +38 -1
- package/fesm2022/ngx-kit-shared.mjs.map +1 -1
- package/package.json +5 -1
- package/types/ngx-kit-data-table.d.ts +192 -0
- package/types/ngx-kit-message.d.ts +68 -57
- package/types/ngx-kit-shared.d.ts +3 -1
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, input, model, output, computed, effect, Component, TemplateRef, Directive, signal, viewChild, EventEmitter, ContentChildren, Output, makeEnvironmentProviders } from '@angular/core';
|
|
3
|
+
import * as i1 from '@angular/forms';
|
|
4
|
+
import { FormsModule } from '@angular/forms';
|
|
5
|
+
import * as i1$1 from '@angular/common';
|
|
6
|
+
import { CommonModule } from '@angular/common';
|
|
7
|
+
import { mergeConfig } from 'ngx-kit/shared';
|
|
8
|
+
|
|
9
|
+
const NGX_PAGINATION_CONFIG = new InjectionToken('ngx-pagination-config', {
|
|
10
|
+
factory: () => NGX_PAGINATION_CONFIG_DEFAULT,
|
|
11
|
+
});
|
|
12
|
+
const NGX_PAGINATION_CONFIG_DEFAULT = {
|
|
13
|
+
defaultPageSize: 10,
|
|
14
|
+
pageSizeOptions: [5, 10, 20, 30, 50, 100, 500, 1000],
|
|
15
|
+
labels: {
|
|
16
|
+
first: 'First',
|
|
17
|
+
last: 'Last',
|
|
18
|
+
next: 'Next',
|
|
19
|
+
previous: 'Previous',
|
|
20
|
+
showing: 'Showing',
|
|
21
|
+
to: 'to',
|
|
22
|
+
of: 'of',
|
|
23
|
+
results: 'results',
|
|
24
|
+
perPage: 'Per Page',
|
|
25
|
+
pageSize: 'Page Size',
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
class NgxPagination {
|
|
30
|
+
config = inject(NGX_PAGINATION_CONFIG);
|
|
31
|
+
total = input.required(/* @ts-ignore */
|
|
32
|
+
...(ngDevMode ? [{ debugName: "total" }] : /* istanbul ignore next */ []));
|
|
33
|
+
page = model(1, /* @ts-ignore */
|
|
34
|
+
...(ngDevMode ? [{ debugName: "page" }] : /* istanbul ignore next */ []));
|
|
35
|
+
pageSize = model(this.config.defaultPageSize, /* @ts-ignore */
|
|
36
|
+
...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
|
|
37
|
+
pageSizeOptions = input(this.config.pageSizeOptions, /* @ts-ignore */
|
|
38
|
+
...(ngDevMode ? [{ debugName: "pageSizeOptions" }] : /* istanbul ignore next */ []));
|
|
39
|
+
labels = input(this.config.labels, /* @ts-ignore */
|
|
40
|
+
...(ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []));
|
|
41
|
+
siblingCount = input(1, /* @ts-ignore */
|
|
42
|
+
...(ngDevMode ? [{ debugName: "siblingCount" }] : /* istanbul ignore next */ []));
|
|
43
|
+
boundaryCount = input(1, /* @ts-ignore */
|
|
44
|
+
...(ngDevMode ? [{ debugName: "boundaryCount" }] : /* istanbul ignore next */ []));
|
|
45
|
+
paginate = output();
|
|
46
|
+
totalPages = computed(() => {
|
|
47
|
+
return Math.max(1, Math.ceil(this.total() / this.pageSize()));
|
|
48
|
+
}, /* @ts-ignore */
|
|
49
|
+
...(ngDevMode ? [{ debugName: "totalPages" }] : /* istanbul ignore next */ []));
|
|
50
|
+
firstItem = computed(() => {
|
|
51
|
+
if (this.total() === 0)
|
|
52
|
+
return 0;
|
|
53
|
+
return (this.page() - 1) * this.pageSize() + 1;
|
|
54
|
+
}, /* @ts-ignore */
|
|
55
|
+
...(ngDevMode ? [{ debugName: "firstItem" }] : /* istanbul ignore next */ []));
|
|
56
|
+
lastItem = computed(() => {
|
|
57
|
+
return Math.min(this.firstItem() + this.pageSize() - 1, this.total());
|
|
58
|
+
}, /* @ts-ignore */
|
|
59
|
+
...(ngDevMode ? [{ debugName: "lastItem" }] : /* istanbul ignore next */ []));
|
|
60
|
+
pages = computed(() => this.buildPages(this.page(), this.totalPages(), this.siblingCount(), this.boundaryCount()), /* @ts-ignore */
|
|
61
|
+
...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
|
|
62
|
+
constructor() {
|
|
63
|
+
effect(() => {
|
|
64
|
+
const page = this.page();
|
|
65
|
+
const pageSize = +this.pageSize();
|
|
66
|
+
// this.pageChange.emit(page);
|
|
67
|
+
debugger;
|
|
68
|
+
this.paginate.emit({
|
|
69
|
+
page,
|
|
70
|
+
pageSize,
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
effect(() => {
|
|
74
|
+
const max = this.totalPages();
|
|
75
|
+
if (this.page() > max)
|
|
76
|
+
this.page.set(max);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
buildPages(current, total, sibling = 1, boundary = 1) {
|
|
80
|
+
const range = (start, end) => Array.from({ length: end - start + 1 }, (_, i) => start + i);
|
|
81
|
+
const totalNumbers = sibling * 2 + boundary * 2 + 3;
|
|
82
|
+
if (total <= totalNumbers)
|
|
83
|
+
return range(1, total);
|
|
84
|
+
const leftSibling = Math.max(current - sibling, boundary + 2);
|
|
85
|
+
const rightSibling = Math.min(current + sibling, total - boundary - 1);
|
|
86
|
+
const showLeftDots = leftSibling > boundary + 2;
|
|
87
|
+
const showRightDots = rightSibling < total - boundary - 1;
|
|
88
|
+
const pages = [];
|
|
89
|
+
pages.push(...range(1, boundary));
|
|
90
|
+
if (showLeftDots)
|
|
91
|
+
pages.push('...');
|
|
92
|
+
else
|
|
93
|
+
pages.push(...range(boundary + 1, leftSibling - 1));
|
|
94
|
+
pages.push(...range(leftSibling, rightSibling));
|
|
95
|
+
if (showRightDots)
|
|
96
|
+
pages.push('...');
|
|
97
|
+
else
|
|
98
|
+
pages.push(...range(rightSibling + 1, total - boundary));
|
|
99
|
+
pages.push(...range(total - boundary + 1, total));
|
|
100
|
+
return pages;
|
|
101
|
+
}
|
|
102
|
+
next() {
|
|
103
|
+
this.page.update((p) => Math.min(p + 1, this.totalPages()));
|
|
104
|
+
}
|
|
105
|
+
previous() {
|
|
106
|
+
this.page.update((p) => Math.max(1, p - 1));
|
|
107
|
+
}
|
|
108
|
+
first() {
|
|
109
|
+
this.page.set(1);
|
|
110
|
+
}
|
|
111
|
+
last() {
|
|
112
|
+
this.page.set(this.totalPages());
|
|
113
|
+
}
|
|
114
|
+
goto(page) {
|
|
115
|
+
if (typeof page !== 'number')
|
|
116
|
+
return;
|
|
117
|
+
this.page.set(page);
|
|
118
|
+
}
|
|
119
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxPagination, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
120
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxPagination, isStandalone: true, selector: "ngx-pagination", inputs: { total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: true, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, siblingCount: { classPropertyName: "siblingCount", publicName: "siblingCount", isSignal: true, isRequired: false, transformFunction: null }, boundaryCount: { classPropertyName: "boundaryCount", publicName: "boundaryCount", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { page: "pageChange", pageSize: "pageSizeChange", paginate: "paginate" }, ngImport: i0, template: "<nav class=\"ngx-pagination\">\r\n <div class=\"\">\r\n {{ labels().showing }}\r\n <span class=\"fw-semibold\">{{ firstItem() }}</span>\r\n {{ labels().to }}\r\n <span class=\"fw-semibold\">{{ lastItem() }}</span>\r\n {{ labels().of }}\r\n <span class=\"fw-semibold\">{{ total() }}</span>\r\n {{ labels().results }}\r\n </div>\r\n\r\n <div class=\"ngx-paination_page-numbers\">\r\n <ul>\r\n <!-- Previous Page Link -->\r\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().first\">\r\n <a (click)=\"first()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M235.8 453.1L53.8 256l181.1-197.1c2.844-3.078 4.25-6.969 4.25-10.86c0-4.312-1.719-8.609-5.156-11.75c-6.5-6-16.59-5.594-22.59 .8906l-192 208c-5.688 6.156-5.688 15.56 0 21.72l192 208c6 6.484 16.09 6.891 22.59 .8906C241.4 469.8 241.8 459.6 235.8 453.1zM212.2 245.1c-5.688 6.156-5.688 15.56 0 21.72l192 208c6 6.484 16.09 6.891 22.59 .8906c6.531-5.969 6.906-16.11 .9062-22.61l-181.1-197.1l181.1-197.1c2.844-3.078 4.25-6.969 4.25-10.86c0-4.312-1.719-8.609-5.156-11.75c-6.5-6-16.59-5.594-22.59 .8906L212.2 245.1z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().previous\">\r\n <a (click)=\"previous()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M234.8 36.25c3.438 3.141 5.156 7.438 5.156 11.75c0 3.891-1.406 7.781-4.25 10.86L53.77 256l181.1 197.1c6 6.5 5.625 16.64-.9062 22.61c-6.5 6-16.59 5.594-22.59-.8906l-192-208c-5.688-6.156-5.688-15.56 0-21.72l192-208C218.2 30.66 228.3 30.25 234.8 36.25z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n\r\n <!-- Pagination Elements -->\r\n @for (item of pages(); track $index) {\r\n <li class=\"page-num\" [class.active]=\"+item === page()\">\r\n @if (item !== page() && item != '...') {\r\n <a (click)=\"goto(+item)\">{{ item }}</a>\r\n }\r\n @if (item === page() || item == '...') {\r\n <span>{{ item }}</span>\r\n }\r\n </li>\r\n }\r\n\r\n <!-- Next Page Link -->\r\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().next\">\r\n <a (click)=\"next()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M85.14 475.8c-3.438-3.141-5.156-7.438-5.156-11.75c0-3.891 1.406-7.781 4.25-10.86l181.1-197.1L84.23 58.86c-6-6.5-5.625-16.64 .9062-22.61c6.5-6 16.59-5.594 22.59 .8906l192 208c5.688 6.156 5.688 15.56 0 21.72l-192 208C101.7 481.3 91.64 481.8 85.14 475.8z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().last\">\r\n <a (click)=\"last()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M212.2 58.86l181.1 197.1L212.2 453.1c-2.844 3.078-4.25 6.969-4.25 10.86c0 4.312 1.719 8.609 5.156 11.75c6.5 6 16.59 5.594 22.59-.8906l192-208c5.688-6.156 5.688-15.56 0-21.72l-192-208c-6-6.484-16.09-6.891-22.59-.8906C206.6 42.22 206.2 52.36 212.2 58.86zM235.8 266.9c5.688-6.156 5.688-15.56 0-21.72l-192-208c-6-6.484-16.09-6.891-22.59-.8906c-6.531 5.969-6.906 16.11-.9062 22.61l181.1 197.1L20.26 453.1c-2.844 3.078-4.25 6.969-4.25 10.86c0 4.312 1.719 8.609 5.156 11.75c6.5 6 16.59 5.594 22.59-.8906L235.8 266.9z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"ngx-paination_page-size\">\r\n <span>{{ labels().pageSize }}:</span>\r\n <select\r\n name=\"pageSize\"\r\n [ngModel]=\"pageSize()\"\r\n (ngModelChange)=\"pageSize.update((u) => (u = $event))\">\r\n @for (opt of pageSizeOptions(); track $index) {\r\n <option [value]=\"opt\" [selected]=\"opt === pageSize()\">\r\n {{ opt }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n</nav>\r\n", styles: [":host{--ngx-pagination-border: light-dark(#dbdbdb, #373737);--ngx-pagination-border-radius: 4px;--bs-pagination-active-bg: light-dark(#6485fa, #6485fa)}.ngx-pagination{display:flex;align-items:center;justify-content:space-between;padding:15px 0;-webkit-user-select:none;user-select:none}.ngx-paination_page-numbers{display:flex;gap:5px}.ngx-paination_page-numbers ul{display:flex;padding:0;margin:0;gap:2px;list-style:none}.ngx-paination_page-numbers ul li{padding:5px 10px;border:1px var(--ngx-pagination-border) solid;border-radius:var(--ngx-pagination-border-radius);cursor:pointer}.ngx-paination_page-numbers ul li.disabled{cursor:not-allowed;opacity:.4}.ngx-paination_page-numbers ul li.active:not(:disabled){background-color:var(--bs-pagination-active-bg)}.ngx-paination_page-numbers ul li a{display:block;color:inherit;text-decoration:none;width:100%;height:100%}.ngx-paination_page-numbers ul li a svg{width:100%;height:12px}.ngx-paination_page-size{display:flex;align-items:center;gap:5px}.ngx-paination_page-size span{white-space:nowrap}.ngx-paination_page-size select{border-radius:var(--ngx-pagination-border-radius);height:100%}::ng-deep [dir=rtl] .ngx-paination_page-numbers li svg{transform:rotate(180deg)}\n"], dependencies: [{ 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"] }] });
|
|
121
|
+
}
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxPagination, decorators: [{
|
|
123
|
+
type: Component,
|
|
124
|
+
args: [{ selector: 'ngx-pagination', imports: [FormsModule], template: "<nav class=\"ngx-pagination\">\r\n <div class=\"\">\r\n {{ labels().showing }}\r\n <span class=\"fw-semibold\">{{ firstItem() }}</span>\r\n {{ labels().to }}\r\n <span class=\"fw-semibold\">{{ lastItem() }}</span>\r\n {{ labels().of }}\r\n <span class=\"fw-semibold\">{{ total() }}</span>\r\n {{ labels().results }}\r\n </div>\r\n\r\n <div class=\"ngx-paination_page-numbers\">\r\n <ul>\r\n <!-- Previous Page Link -->\r\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().first\">\r\n <a (click)=\"first()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M235.8 453.1L53.8 256l181.1-197.1c2.844-3.078 4.25-6.969 4.25-10.86c0-4.312-1.719-8.609-5.156-11.75c-6.5-6-16.59-5.594-22.59 .8906l-192 208c-5.688 6.156-5.688 15.56 0 21.72l192 208c6 6.484 16.09 6.891 22.59 .8906C241.4 469.8 241.8 459.6 235.8 453.1zM212.2 245.1c-5.688 6.156-5.688 15.56 0 21.72l192 208c6 6.484 16.09 6.891 22.59 .8906c6.531-5.969 6.906-16.11 .9062-22.61l-181.1-197.1l181.1-197.1c2.844-3.078 4.25-6.969 4.25-10.86c0-4.312-1.719-8.609-5.156-11.75c-6.5-6-16.59-5.594-22.59 .8906L212.2 245.1z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().previous\">\r\n <a (click)=\"previous()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M234.8 36.25c3.438 3.141 5.156 7.438 5.156 11.75c0 3.891-1.406 7.781-4.25 10.86L53.77 256l181.1 197.1c6 6.5 5.625 16.64-.9062 22.61c-6.5 6-16.59 5.594-22.59-.8906l-192-208c-5.688-6.156-5.688-15.56 0-21.72l192-208C218.2 30.66 228.3 30.25 234.8 36.25z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n\r\n <!-- Pagination Elements -->\r\n @for (item of pages(); track $index) {\r\n <li class=\"page-num\" [class.active]=\"+item === page()\">\r\n @if (item !== page() && item != '...') {\r\n <a (click)=\"goto(+item)\">{{ item }}</a>\r\n }\r\n @if (item === page() || item == '...') {\r\n <span>{{ item }}</span>\r\n }\r\n </li>\r\n }\r\n\r\n <!-- Next Page Link -->\r\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().next\">\r\n <a (click)=\"next()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M85.14 475.8c-3.438-3.141-5.156-7.438-5.156-11.75c0-3.891 1.406-7.781 4.25-10.86l181.1-197.1L84.23 58.86c-6-6.5-5.625-16.64 .9062-22.61c6.5-6 16.59-5.594 22.59 .8906l192 208c5.688 6.156 5.688 15.56 0 21.72l-192 208C101.7 481.3 91.64 481.8 85.14 475.8z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().last\">\r\n <a (click)=\"last()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M212.2 58.86l181.1 197.1L212.2 453.1c-2.844 3.078-4.25 6.969-4.25 10.86c0 4.312 1.719 8.609 5.156 11.75c6.5 6 16.59 5.594 22.59-.8906l192-208c5.688-6.156 5.688-15.56 0-21.72l-192-208c-6-6.484-16.09-6.891-22.59-.8906C206.6 42.22 206.2 52.36 212.2 58.86zM235.8 266.9c5.688-6.156 5.688-15.56 0-21.72l-192-208c-6-6.484-16.09-6.891-22.59-.8906c-6.531 5.969-6.906 16.11-.9062 22.61l181.1 197.1L20.26 453.1c-2.844 3.078-4.25 6.969-4.25 10.86c0 4.312 1.719 8.609 5.156 11.75c6.5 6 16.59 5.594 22.59-.8906L235.8 266.9z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"ngx-paination_page-size\">\r\n <span>{{ labels().pageSize }}:</span>\r\n <select\r\n name=\"pageSize\"\r\n [ngModel]=\"pageSize()\"\r\n (ngModelChange)=\"pageSize.update((u) => (u = $event))\">\r\n @for (opt of pageSizeOptions(); track $index) {\r\n <option [value]=\"opt\" [selected]=\"opt === pageSize()\">\r\n {{ opt }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n</nav>\r\n", styles: [":host{--ngx-pagination-border: light-dark(#dbdbdb, #373737);--ngx-pagination-border-radius: 4px;--bs-pagination-active-bg: light-dark(#6485fa, #6485fa)}.ngx-pagination{display:flex;align-items:center;justify-content:space-between;padding:15px 0;-webkit-user-select:none;user-select:none}.ngx-paination_page-numbers{display:flex;gap:5px}.ngx-paination_page-numbers ul{display:flex;padding:0;margin:0;gap:2px;list-style:none}.ngx-paination_page-numbers ul li{padding:5px 10px;border:1px var(--ngx-pagination-border) solid;border-radius:var(--ngx-pagination-border-radius);cursor:pointer}.ngx-paination_page-numbers ul li.disabled{cursor:not-allowed;opacity:.4}.ngx-paination_page-numbers ul li.active:not(:disabled){background-color:var(--bs-pagination-active-bg)}.ngx-paination_page-numbers ul li a{display:block;color:inherit;text-decoration:none;width:100%;height:100%}.ngx-paination_page-numbers ul li a svg{width:100%;height:12px}.ngx-paination_page-size{display:flex;align-items:center;gap:5px}.ngx-paination_page-size span{white-space:nowrap}.ngx-paination_page-size select{border-radius:var(--ngx-pagination-border-radius);height:100%}::ng-deep [dir=rtl] .ngx-paination_page-numbers li svg{transform:rotate(180deg)}\n"] }]
|
|
125
|
+
}], ctorParameters: () => [], propDecorators: { total: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: true }] }], 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"] }], pageSizeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSizeOptions", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], siblingCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "siblingCount", required: false }] }], boundaryCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "boundaryCount", required: false }] }], paginate: [{ type: i0.Output, args: ["paginate"] }] } });
|
|
126
|
+
|
|
127
|
+
class TableCellDirective {
|
|
128
|
+
column = input.required({ ...(ngDevMode ? { debugName: "column" } : /* istanbul ignore next */ {}), alias: 'ngxTableCell' });
|
|
129
|
+
template = inject(TemplateRef);
|
|
130
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TableCellDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
131
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.4", type: TableCellDirective, isStandalone: true, selector: "ng-template[ngxTableCell]", inputs: { column: { classPropertyName: "column", publicName: "ngxTableCell", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
|
|
132
|
+
}
|
|
133
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TableCellDirective, decorators: [{
|
|
134
|
+
type: Directive,
|
|
135
|
+
args: [{
|
|
136
|
+
selector: 'ng-template[ngxTableCell]',
|
|
137
|
+
}]
|
|
138
|
+
}], propDecorators: { column: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngxTableCell", required: true }] }] } });
|
|
139
|
+
|
|
140
|
+
/** Injected into every ngx-table instance. Populate via provideTable(). */
|
|
141
|
+
const NGX_TABLE_CONFIG = new InjectionToken('NGX_TABLE_CONFIG', {
|
|
142
|
+
factory: () => NGX_TABLE_CONFIG_DEFAULT,
|
|
143
|
+
});
|
|
144
|
+
const NGX_TABLE_CONFIG_DEFAULT = {
|
|
145
|
+
showRecordNumber: true,
|
|
146
|
+
hoverable: true,
|
|
147
|
+
multiSort: true,
|
|
148
|
+
resizable: false,
|
|
149
|
+
stickyHeader: true,
|
|
150
|
+
stripedRows: true,
|
|
151
|
+
labels: {
|
|
152
|
+
noData: 'There is no data to display!',
|
|
153
|
+
loading: 'Loading...',
|
|
154
|
+
operation: 'Operation',
|
|
155
|
+
},
|
|
156
|
+
renderers: {},
|
|
157
|
+
formatters: {},
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
class NgxTable {
|
|
161
|
+
config = inject(NGX_TABLE_CONFIG);
|
|
162
|
+
paginationConfig = inject(NGX_PAGINATION_CONFIG);
|
|
163
|
+
fields = input.required(/* @ts-ignore */
|
|
164
|
+
...(ngDevMode ? [{ debugName: "fields" }] : /* istanbul ignore next */ []));
|
|
165
|
+
data = input.required(/* @ts-ignore */
|
|
166
|
+
...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
|
|
167
|
+
totalRecords = input.required(/* @ts-ignore */
|
|
168
|
+
...(ngDevMode ? [{ debugName: "totalRecords" }] : /* istanbul ignore next */ []));
|
|
169
|
+
showRecordNumber = input(this.config.showRecordNumber, /* @ts-ignore */
|
|
170
|
+
...(ngDevMode ? [{ debugName: "showRecordNumber" }] : /* istanbul ignore next */ []));
|
|
171
|
+
list = signal([], /* @ts-ignore */
|
|
172
|
+
...(ngDevMode ? [{ debugName: "list" }] : /* istanbul ignore next */ []));
|
|
173
|
+
operations = input(/* @ts-ignore */
|
|
174
|
+
...(ngDevMode ? [undefined, { debugName: "operations" }] : /* istanbul ignore next */ []));
|
|
175
|
+
operationWidth = input(60, /* @ts-ignore */
|
|
176
|
+
...(ngDevMode ? [{ debugName: "operationWidth" }] : /* istanbul ignore next */ []));
|
|
177
|
+
numWidth = input(60, /* @ts-ignore */
|
|
178
|
+
...(ngDevMode ? [{ debugName: "numWidth" }] : /* istanbul ignore next */ []));
|
|
179
|
+
pageSize = input(this.paginationConfig.defaultPageSize, /* @ts-ignore */
|
|
180
|
+
...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
|
|
181
|
+
loading = input(false, /* @ts-ignore */
|
|
182
|
+
...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
183
|
+
multiSort = input(this.config.multiSort, /* @ts-ignore */
|
|
184
|
+
...(ngDevMode ? [{ debugName: "multiSort" }] : /* istanbul ignore next */ []));
|
|
185
|
+
lazy = input(false, /* @ts-ignore */
|
|
186
|
+
...(ngDevMode ? [{ debugName: "lazy" }] : /* istanbul ignore next */ []));
|
|
187
|
+
lazyLoad = output();
|
|
188
|
+
sortField = '';
|
|
189
|
+
sortDirection = 'asc';
|
|
190
|
+
tableContainer = viewChild('tableContainer', /* @ts-ignore */
|
|
191
|
+
...(ngDevMode ? [{ debugName: "tableContainer" }] : /* istanbul ignore next */ []));
|
|
192
|
+
sortChange = new EventEmitter();
|
|
193
|
+
cellTemplates;
|
|
194
|
+
templateMap = new Map();
|
|
195
|
+
page = 1;
|
|
196
|
+
constructor() {
|
|
197
|
+
effect(() => {
|
|
198
|
+
const data = this.data();
|
|
199
|
+
data.map((r, index) => (r.ngxRecordNumber = this.pageSize() * (this.page - 1) + index + 1));
|
|
200
|
+
if (this.lazy()) {
|
|
201
|
+
this.list.set(data);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
this.loadClientPage(data);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
ngOnInit() {
|
|
208
|
+
if (this.lazy()) {
|
|
209
|
+
this.lazyLoad.emit({
|
|
210
|
+
first: 0,
|
|
211
|
+
pageIndex: 1,
|
|
212
|
+
pageSize: this.pageSize(),
|
|
213
|
+
sorts: [],
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
ngAfterContentInit() {
|
|
218
|
+
this.templateMap.clear();
|
|
219
|
+
this.cellTemplates.forEach((cell) => {
|
|
220
|
+
// console.log(cell.columnName, cell.template);
|
|
221
|
+
this.templateMap.set(cell.column.name, cell.template);
|
|
222
|
+
});
|
|
223
|
+
this.adjustScroll(this.tableContainer()?.nativeElement);
|
|
224
|
+
}
|
|
225
|
+
loadClientPage(data) {
|
|
226
|
+
const from = (this.page - 1) * this.pageSize();
|
|
227
|
+
const to = from + this.pageSize();
|
|
228
|
+
this.list.set(data.slice(from, to));
|
|
229
|
+
}
|
|
230
|
+
onSortChange(item) { }
|
|
231
|
+
getTemplate(column) {
|
|
232
|
+
return this.templateMap.get(column) ?? null;
|
|
233
|
+
}
|
|
234
|
+
sortList() {
|
|
235
|
+
// this._list = orderBy(this._list, [this.sortField], [this.sortDirection]);
|
|
236
|
+
}
|
|
237
|
+
getRecordNumber(item) {
|
|
238
|
+
debugger;
|
|
239
|
+
return item.ngxRecordNumber;
|
|
240
|
+
}
|
|
241
|
+
onPageChange(event) {
|
|
242
|
+
console.log('p', event);
|
|
243
|
+
this.page = event.page;
|
|
244
|
+
if (this.lazy()) {
|
|
245
|
+
this.lazyLoad.emit({
|
|
246
|
+
first: (event.page - 1) * event.pageSize,
|
|
247
|
+
pageIndex: event.page,
|
|
248
|
+
pageSize: event.pageSize,
|
|
249
|
+
sorts: this.sortField
|
|
250
|
+
? [
|
|
251
|
+
{
|
|
252
|
+
field: this.sortField,
|
|
253
|
+
direction: this.sortDirection,
|
|
254
|
+
},
|
|
255
|
+
]
|
|
256
|
+
: [],
|
|
257
|
+
});
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
this.loadClientPage(this.data());
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* اگر بدنه جدول اسکرول شد هدر جدول نیز منطبق شود
|
|
264
|
+
*/
|
|
265
|
+
adjustScroll(table) {
|
|
266
|
+
if (!table)
|
|
267
|
+
return;
|
|
268
|
+
const body = table.querySelector('.tbody-mrs');
|
|
269
|
+
const header = table.querySelector('.thead-mrs');
|
|
270
|
+
if (!body || !header)
|
|
271
|
+
return;
|
|
272
|
+
body.addEventListener('scroll', () => {
|
|
273
|
+
header.scrollLeft = body.scrollLeft;
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
getRenderer(field) {
|
|
277
|
+
const key = field.renderer ?? field.dataType;
|
|
278
|
+
if (!key) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
return this.config.renderers?.[key] ?? null;
|
|
282
|
+
}
|
|
283
|
+
getCellValue(row, field) {
|
|
284
|
+
return row[field.column];
|
|
285
|
+
}
|
|
286
|
+
formatCellValue(row, field) {
|
|
287
|
+
const value = this.getCellValue(row, field);
|
|
288
|
+
if (typeof field.formatter === 'function') {
|
|
289
|
+
return this.stringify(field.formatter(value, row, field));
|
|
290
|
+
}
|
|
291
|
+
if (typeof field.formatter === 'string') {
|
|
292
|
+
const formatter = this.config.formatters?.[field.formatter];
|
|
293
|
+
if (formatter) {
|
|
294
|
+
return this.stringify(formatter(value, row, field));
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return this.stringify(value);
|
|
298
|
+
}
|
|
299
|
+
stringify(value) {
|
|
300
|
+
return value == null ? '' : String(value);
|
|
301
|
+
}
|
|
302
|
+
getRendererInputs(row, field) {
|
|
303
|
+
return {
|
|
304
|
+
value: this.getCellValue(row, field),
|
|
305
|
+
row,
|
|
306
|
+
field,
|
|
307
|
+
...field.rendererInputs,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
311
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxTable, isStandalone: true, selector: "ngx-table", inputs: { fields: { classPropertyName: "fields", publicName: "fields", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: true, transformFunction: null }, showRecordNumber: { classPropertyName: "showRecordNumber", publicName: "showRecordNumber", isSignal: true, isRequired: false, transformFunction: null }, operations: { classPropertyName: "operations", publicName: "operations", isSignal: true, isRequired: false, transformFunction: null }, operationWidth: { classPropertyName: "operationWidth", publicName: "operationWidth", isSignal: true, isRequired: false, transformFunction: null }, numWidth: { classPropertyName: "numWidth", publicName: "numWidth", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, multiSort: { classPropertyName: "multiSort", publicName: "multiSort", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { lazyLoad: "lazyLoad", sortChange: "sortChange" }, providers: [], queries: [{ propertyName: "cellTemplates", predicate: TableCellDirective }], viewQueries: [{ propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"table-responsive\" #tableContainer>\r\n <div class=\"table-mrs\">\r\n <div class=\"thead-mrs\">\r\n <div class=\"tr-mrs\">\r\n @if (operations()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n [style.max-width.px]=\"operationWidth()\"\r\n [style.min-width.px]=\"operationWidth()\">\r\n {{ config.labels.operation }}\r\n </div>\r\n }\r\n @if (showRecordNumber()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n [style.max-width.px]=\"numWidth()\"\r\n [style.min-width.px]=\"numWidth()\">\r\n #\r\n </div>\r\n }\r\n @for (item of fields(); track $index) {\r\n <div class=\"th-mrs\" [style.max-width.px]=\"item.width\" [style.min-width.px]=\"item.width\">\r\n {{ item.title }}\r\n <span\r\n class=\"sort-icon\"\r\n [class.active]=\"sortField == item.column\"\r\n (click)=\"onSortChange(item)\">\r\n @if (sortField == item.column && sortDirection == 'asc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M368 432h-64c-8.844 0-15.1 7.156-15.1 16S295.2 464 304 464h64c8.844 0 16-7.156 16-16S376.8 432 368 432zM432 304h-128c-8.844 0-15.1 7.156-15.1 16S295.2 336 304 336h128c8.844 0 16-7.156 16-16S440.8 304 432 304zM496 176h-192c-8.844 0-15.1 7.156-15.1 16S295.2 208 304 208h192C504.8 208 512 200.8 512 192S504.8 176 496 176zM560 48h-256c-8.844 0-15.1 7.156-15.1 16S295.2 80 304 80h256C568.8 80 576 72.84 576 64S568.8 48 560 48zM224 352c-4.094 0-8.188 1.562-11.31 4.688L144 425.4V48C144 39.16 136.8 32 128 32S112 39.16 112 48v377.4l-68.69-68.69c-6.25-6.25-16.38-6.25-22.62 0s-6.25 16.38 0 22.62l96 96c6.25 6.25 16.38 6.25 22.62 0l96-96c6.25-6.25 6.25-16.38 0-22.62C232.2 353.6 228.1 352 224 352z\" />\r\n </svg>\r\n } @else if (sortField == item.column && sortDirection == 'desc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M304 208h128C440.8 208 448 200.8 448 192s-7.156-16-16-16h-128c-8.844 0-15.1 7.156-15.1 16S295.2 208 304 208zM304 336h192c8.844 0 16-7.156 16-16s-7.156-16-16-16h-192c-8.844 0-15.1 7.156-15.1 16S295.2 336 304 336zM304 80h64c8.844 0 16-7.156 16-16S376.8 48 368 48h-64c-8.844 0-15.1 7.156-15.1 16S295.2 80 304 80zM560 432h-256c-8.844 0-15.1 7.156-15.1 16S295.2 464 304 464h256c8.844 0 16-7.156 16-16S568.8 432 560 432zM224 352c-4.094 0-8.188 1.562-11.31 4.688L144 425.4V48C144 39.16 136.8 32 128 32S112 39.16 112 48v377.4l-68.69-68.69c-6.25-6.25-16.38-6.25-22.62 0s-6.25 16.38 0 22.62l96 96c6.25 6.25 16.38 6.25 22.62 0l96-96c6.25-6.25 6.25-16.38 0-22.62C232.2 353.6 228.1 352 224 352z\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M224 352c-4.094 0-8.188 1.562-11.31 4.688L144 425.4V48C144 39.16 136.8 32 128 32S112 39.16 112 48v377.4l-68.69-68.69c-6.25-6.25-16.38-6.25-22.62 0s-6.25 16.38 0 22.62l96 96c6.25 6.25 16.38 6.25 22.62 0l96-96c6.25-6.25 6.25-16.38 0-22.62C232.2 353.6 228.1 352 224 352zM427.3 132.7l-96-96c-6.25-6.25-16.38-6.25-22.62 0l-96 96c-6.25 6.25-6.25 16.38 0 22.62s16.38 6.25 22.62 0L304 86.63V464c0 8.844 7.156 16 16 16s16-7.156 16-16V86.63l68.69 68.69C407.8 158.4 411.9 160 416 160s8.188-1.562 11.31-4.688C433.6 149.1 433.6 138.9 427.3 132.7z\" />\r\n </svg>\r\n }\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"tbody-mrs\">\r\n @if (!loading() && list().length === 0) {\r\n <div class=\"no-data\">{{ config.labels.noData }}</div>\r\n }\r\n @for (item of list(); track $index) {\r\n @let num = getRecordNumber(item);\r\n <div class=\"tr-mrs\">\r\n @if (operations()) {\r\n <div\r\n class=\"td-mrs operations\"\r\n vAlign=\"middle\"\r\n [style.max-width.px]=\"operationWidth()\"\r\n [style.min-width.px]=\"operationWidth()\">\r\n <div class=\"cel\">\r\n <span class=\"cell-title\">{{ config.labels.operation }}:</span>\r\n <ng-container\r\n [ngTemplateOutlet]=\"operations()\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (showRecordNumber()) {\r\n <div\r\n class=\"td-mrs operations\"\r\n vAlign=\"middle\"\r\n [style.max-width.px]=\"numWidth()\"\r\n [style.min-width.px]=\"numWidth()\">\r\n <div class=\"cel\">\r\n <span class=\"cell-title\"></span>\r\n {{ num }}\r\n </div>\r\n </div>\r\n }\r\n\r\n @for (f of fields(); track f.column) {\r\n @let template = getTemplate(f.column);\r\n @let renderer = getRenderer(f);\r\n\r\n <div\r\n class=\"td-mrs\"\r\n vAlign=\"middle\"\r\n [style.max-width.px]=\"f.width\"\r\n [style.min-width.px]=\"f.width\">\r\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\r\n <span class=\"cell-title\">{{ f.title }}</span>\r\n @if (template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: item,\r\n row: item,\r\n value: getCellValue(item, f),\r\n field: f,\r\n }\"></ng-container>\r\n } @else if (renderer) {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n renderer;\r\n inputs: getRendererInputs(item, f)\r\n \"></ng-container>\r\n } @else {\r\n {{ formatCellValue(item, f) }}\r\n }\r\n @if (f.prefix) {\r\n <span>{{ f.prefix }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (loading()) {\r\n <div class=\"loading-container\">\r\n <div class=\"loading\">{{ config.labels.loading }}</div>\r\n </div>\r\n }\r\n</div>\r\n\r\n<ngx-pagination\r\n [(page)]=\"page\"\r\n [pageSize]=\"pageSize()\"\r\n [total]=\"totalRecords()\"\r\n (paginate)=\"onPageChange($event)\"></ngx-pagination>\r\n", styles: [":host{--border-color: light-dark(#70707030, #2a2a3e);--header-height: 50px;--header-padding-y: 8px;--bg-color: light-dark(#eeeeee, #111118);--fg-color: light-dark(#000000, #ffffff);--header-shadow-color: light-dark(#00000024, #00000066);--header-bg: light-dark(#e5e5e5, #1a1a26)}*{box-sizing:border-box}.table-responsive{position:relative}.table-mrs{border:1px var(--border-color) solid;border-radius:32px;corner-shape:squircle;overflow:hidden;background-color:var(--bg-color);color:var(--fg-color)}.thead-mrs{background:var(--header-bg);height:var(--header-height);padding:var(--header-padding-y) 0px;box-shadow:0 0 10px 5px var(--header-shadow-color);overflow:hidden}.tbody-mrs{border-top:1px var(--border-color) solid;overflow:auto;height:calc(var(--available-content-height, 100vh) - (var(--header-height) + var(--header-padding-y) * 2));min-height:200px}.tr-mrs{display:flex;border-bottom:1px var(--border-color) solid}.tbody-mrs .tr-mrs{animation:showrow .35s cubic-bezier(.4,-.32,.4,1.24)}.tbody-mrs .tr-mrs:hover{background:#6c63ff0a}.tr-mrs:last-child{border-bottom:none}.thead-mrs .th-mrs{padding:5px 10px;flex:1;border-right:1px var(--border-color) solid;align-items:center;justify-content:space-between;display:flex;gap:5px;overflow:hidden}.thead-mrs .th-mrs:hover .sort-icon{opacity:1}.th-mrs:last-child{border:none}.td-mrs{padding:8px 10px;flex:100;overflow:hidden;margin:auto 0}.td-mrs .cel{overflow:hidden;max-width:100%}.td-mrs .cel :not(.wrap){white-space:nowrap;text-overflow:ellipsis}.cel .cell-title{display:none}.text-wrap{white-space:normal}@media(max-width:768px){.thead-mrs{display:none}.tr-mrs{flex-direction:column}.tr-mrs .td-mrs{max-width:unset!important;width:unset!important}.tr-mrs .td-mrs .cel{display:flex;align-items:center;gap:10px}.cel .cell-title{color:#6bb6f3;display:inline-block;font-weight:600}}@keyframes showrow{0%{margin-top:-100px;opacity:0}to{margin-top:0;opacity:1}}.loading-container{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.loading-container .loading{background:#3b3b3ba3;color:#fff;border:10px rgba(57,57,57,.1803921569) solid;border-radius:10px;padding:18px 25px}.no-data{display:flex;align-items:center;justify-content:center;height:100%;font-size:2rem;opacity:.5}.sort-icon{cursor:pointer;opacity:0;transition:opacity .5s;width:16px;height:16px}.sort-icon svg{width:100%;height:100%}.sort-icon.active{opacity:1}.tag{color:#fff;padding:0 10px;border-radius:5px}.tag.tag-success{background:#008e44}.tag.tag-danger{background:#bb001b}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgxPagination, selector: "ngx-pagination", inputs: ["total", "page", "pageSize", "pageSizeOptions", "labels", "siblingCount", "boundaryCount"], outputs: ["pageChange", "pageSizeChange", "paginate"] }] });
|
|
312
|
+
}
|
|
313
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxTable, decorators: [{
|
|
314
|
+
type: Component,
|
|
315
|
+
args: [{ selector: 'ngx-table', imports: [CommonModule, NgxPagination], providers: [], template: "<div class=\"table-responsive\" #tableContainer>\r\n <div class=\"table-mrs\">\r\n <div class=\"thead-mrs\">\r\n <div class=\"tr-mrs\">\r\n @if (operations()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n [style.max-width.px]=\"operationWidth()\"\r\n [style.min-width.px]=\"operationWidth()\">\r\n {{ config.labels.operation }}\r\n </div>\r\n }\r\n @if (showRecordNumber()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n [style.max-width.px]=\"numWidth()\"\r\n [style.min-width.px]=\"numWidth()\">\r\n #\r\n </div>\r\n }\r\n @for (item of fields(); track $index) {\r\n <div class=\"th-mrs\" [style.max-width.px]=\"item.width\" [style.min-width.px]=\"item.width\">\r\n {{ item.title }}\r\n <span\r\n class=\"sort-icon\"\r\n [class.active]=\"sortField == item.column\"\r\n (click)=\"onSortChange(item)\">\r\n @if (sortField == item.column && sortDirection == 'asc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M368 432h-64c-8.844 0-15.1 7.156-15.1 16S295.2 464 304 464h64c8.844 0 16-7.156 16-16S376.8 432 368 432zM432 304h-128c-8.844 0-15.1 7.156-15.1 16S295.2 336 304 336h128c8.844 0 16-7.156 16-16S440.8 304 432 304zM496 176h-192c-8.844 0-15.1 7.156-15.1 16S295.2 208 304 208h192C504.8 208 512 200.8 512 192S504.8 176 496 176zM560 48h-256c-8.844 0-15.1 7.156-15.1 16S295.2 80 304 80h256C568.8 80 576 72.84 576 64S568.8 48 560 48zM224 352c-4.094 0-8.188 1.562-11.31 4.688L144 425.4V48C144 39.16 136.8 32 128 32S112 39.16 112 48v377.4l-68.69-68.69c-6.25-6.25-16.38-6.25-22.62 0s-6.25 16.38 0 22.62l96 96c6.25 6.25 16.38 6.25 22.62 0l96-96c6.25-6.25 6.25-16.38 0-22.62C232.2 353.6 228.1 352 224 352z\" />\r\n </svg>\r\n } @else if (sortField == item.column && sortDirection == 'desc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M304 208h128C440.8 208 448 200.8 448 192s-7.156-16-16-16h-128c-8.844 0-15.1 7.156-15.1 16S295.2 208 304 208zM304 336h192c8.844 0 16-7.156 16-16s-7.156-16-16-16h-192c-8.844 0-15.1 7.156-15.1 16S295.2 336 304 336zM304 80h64c8.844 0 16-7.156 16-16S376.8 48 368 48h-64c-8.844 0-15.1 7.156-15.1 16S295.2 80 304 80zM560 432h-256c-8.844 0-15.1 7.156-15.1 16S295.2 464 304 464h256c8.844 0 16-7.156 16-16S568.8 432 560 432zM224 352c-4.094 0-8.188 1.562-11.31 4.688L144 425.4V48C144 39.16 136.8 32 128 32S112 39.16 112 48v377.4l-68.69-68.69c-6.25-6.25-16.38-6.25-22.62 0s-6.25 16.38 0 22.62l96 96c6.25 6.25 16.38 6.25 22.62 0l96-96c6.25-6.25 6.25-16.38 0-22.62C232.2 353.6 228.1 352 224 352z\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M224 352c-4.094 0-8.188 1.562-11.31 4.688L144 425.4V48C144 39.16 136.8 32 128 32S112 39.16 112 48v377.4l-68.69-68.69c-6.25-6.25-16.38-6.25-22.62 0s-6.25 16.38 0 22.62l96 96c6.25 6.25 16.38 6.25 22.62 0l96-96c6.25-6.25 6.25-16.38 0-22.62C232.2 353.6 228.1 352 224 352zM427.3 132.7l-96-96c-6.25-6.25-16.38-6.25-22.62 0l-96 96c-6.25 6.25-6.25 16.38 0 22.62s16.38 6.25 22.62 0L304 86.63V464c0 8.844 7.156 16 16 16s16-7.156 16-16V86.63l68.69 68.69C407.8 158.4 411.9 160 416 160s8.188-1.562 11.31-4.688C433.6 149.1 433.6 138.9 427.3 132.7z\" />\r\n </svg>\r\n }\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"tbody-mrs\">\r\n @if (!loading() && list().length === 0) {\r\n <div class=\"no-data\">{{ config.labels.noData }}</div>\r\n }\r\n @for (item of list(); track $index) {\r\n @let num = getRecordNumber(item);\r\n <div class=\"tr-mrs\">\r\n @if (operations()) {\r\n <div\r\n class=\"td-mrs operations\"\r\n vAlign=\"middle\"\r\n [style.max-width.px]=\"operationWidth()\"\r\n [style.min-width.px]=\"operationWidth()\">\r\n <div class=\"cel\">\r\n <span class=\"cell-title\">{{ config.labels.operation }}:</span>\r\n <ng-container\r\n [ngTemplateOutlet]=\"operations()\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (showRecordNumber()) {\r\n <div\r\n class=\"td-mrs operations\"\r\n vAlign=\"middle\"\r\n [style.max-width.px]=\"numWidth()\"\r\n [style.min-width.px]=\"numWidth()\">\r\n <div class=\"cel\">\r\n <span class=\"cell-title\"></span>\r\n {{ num }}\r\n </div>\r\n </div>\r\n }\r\n\r\n @for (f of fields(); track f.column) {\r\n @let template = getTemplate(f.column);\r\n @let renderer = getRenderer(f);\r\n\r\n <div\r\n class=\"td-mrs\"\r\n vAlign=\"middle\"\r\n [style.max-width.px]=\"f.width\"\r\n [style.min-width.px]=\"f.width\">\r\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\r\n <span class=\"cell-title\">{{ f.title }}</span>\r\n @if (template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: item,\r\n row: item,\r\n value: getCellValue(item, f),\r\n field: f,\r\n }\"></ng-container>\r\n } @else if (renderer) {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n renderer;\r\n inputs: getRendererInputs(item, f)\r\n \"></ng-container>\r\n } @else {\r\n {{ formatCellValue(item, f) }}\r\n }\r\n @if (f.prefix) {\r\n <span>{{ f.prefix }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (loading()) {\r\n <div class=\"loading-container\">\r\n <div class=\"loading\">{{ config.labels.loading }}</div>\r\n </div>\r\n }\r\n</div>\r\n\r\n<ngx-pagination\r\n [(page)]=\"page\"\r\n [pageSize]=\"pageSize()\"\r\n [total]=\"totalRecords()\"\r\n (paginate)=\"onPageChange($event)\"></ngx-pagination>\r\n", styles: [":host{--border-color: light-dark(#70707030, #2a2a3e);--header-height: 50px;--header-padding-y: 8px;--bg-color: light-dark(#eeeeee, #111118);--fg-color: light-dark(#000000, #ffffff);--header-shadow-color: light-dark(#00000024, #00000066);--header-bg: light-dark(#e5e5e5, #1a1a26)}*{box-sizing:border-box}.table-responsive{position:relative}.table-mrs{border:1px var(--border-color) solid;border-radius:32px;corner-shape:squircle;overflow:hidden;background-color:var(--bg-color);color:var(--fg-color)}.thead-mrs{background:var(--header-bg);height:var(--header-height);padding:var(--header-padding-y) 0px;box-shadow:0 0 10px 5px var(--header-shadow-color);overflow:hidden}.tbody-mrs{border-top:1px var(--border-color) solid;overflow:auto;height:calc(var(--available-content-height, 100vh) - (var(--header-height) + var(--header-padding-y) * 2));min-height:200px}.tr-mrs{display:flex;border-bottom:1px var(--border-color) solid}.tbody-mrs .tr-mrs{animation:showrow .35s cubic-bezier(.4,-.32,.4,1.24)}.tbody-mrs .tr-mrs:hover{background:#6c63ff0a}.tr-mrs:last-child{border-bottom:none}.thead-mrs .th-mrs{padding:5px 10px;flex:1;border-right:1px var(--border-color) solid;align-items:center;justify-content:space-between;display:flex;gap:5px;overflow:hidden}.thead-mrs .th-mrs:hover .sort-icon{opacity:1}.th-mrs:last-child{border:none}.td-mrs{padding:8px 10px;flex:100;overflow:hidden;margin:auto 0}.td-mrs .cel{overflow:hidden;max-width:100%}.td-mrs .cel :not(.wrap){white-space:nowrap;text-overflow:ellipsis}.cel .cell-title{display:none}.text-wrap{white-space:normal}@media(max-width:768px){.thead-mrs{display:none}.tr-mrs{flex-direction:column}.tr-mrs .td-mrs{max-width:unset!important;width:unset!important}.tr-mrs .td-mrs .cel{display:flex;align-items:center;gap:10px}.cel .cell-title{color:#6bb6f3;display:inline-block;font-weight:600}}@keyframes showrow{0%{margin-top:-100px;opacity:0}to{margin-top:0;opacity:1}}.loading-container{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.loading-container .loading{background:#3b3b3ba3;color:#fff;border:10px rgba(57,57,57,.1803921569) solid;border-radius:10px;padding:18px 25px}.no-data{display:flex;align-items:center;justify-content:center;height:100%;font-size:2rem;opacity:.5}.sort-icon{cursor:pointer;opacity:0;transition:opacity .5s;width:16px;height:16px}.sort-icon svg{width:100%;height:100%}.sort-icon.active{opacity:1}.tag{color:#fff;padding:0 10px;border-radius:5px}.tag.tag-success{background:#008e44}.tag.tag-danger{background:#bb001b}\n"] }]
|
|
316
|
+
}], ctorParameters: () => [], propDecorators: { fields: [{ type: i0.Input, args: [{ isSignal: true, alias: "fields", required: true }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], totalRecords: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalRecords", required: true }] }], showRecordNumber: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRecordNumber", required: false }] }], operations: [{ type: i0.Input, args: [{ isSignal: true, alias: "operations", required: false }] }], operationWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "operationWidth", required: false }] }], numWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "numWidth", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], multiSort: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiSort", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], lazyLoad: [{ type: i0.Output, args: ["lazyLoad"] }], tableContainer: [{ type: i0.ViewChild, args: ['tableContainer', { isSignal: true }] }], sortChange: [{
|
|
317
|
+
type: Output
|
|
318
|
+
}], cellTemplates: [{
|
|
319
|
+
type: ContentChildren,
|
|
320
|
+
args: [TableCellDirective]
|
|
321
|
+
}] } });
|
|
322
|
+
|
|
323
|
+
function providePagination(options) {
|
|
324
|
+
return makeEnvironmentProviders([
|
|
325
|
+
{
|
|
326
|
+
provide: NGX_PAGINATION_CONFIG,
|
|
327
|
+
useValue: mergeConfig(NGX_PAGINATION_CONFIG_DEFAULT, options),
|
|
328
|
+
},
|
|
329
|
+
]);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function provideTable(options) {
|
|
333
|
+
return makeEnvironmentProviders([
|
|
334
|
+
{
|
|
335
|
+
provide: NGX_TABLE_CONFIG,
|
|
336
|
+
useValue: mergeConfig(NGX_TABLE_CONFIG_DEFAULT, options),
|
|
337
|
+
},
|
|
338
|
+
]);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
class FieldsType {
|
|
342
|
+
title;
|
|
343
|
+
column;
|
|
344
|
+
dataType;
|
|
345
|
+
width;
|
|
346
|
+
wrap;
|
|
347
|
+
prefix;
|
|
348
|
+
/**
|
|
349
|
+
* نام renderer ثبتشده در provideTable
|
|
350
|
+
*/
|
|
351
|
+
renderer;
|
|
352
|
+
/**
|
|
353
|
+
* ورودیهای اضافه برای renderer
|
|
354
|
+
*/
|
|
355
|
+
rendererInputs;
|
|
356
|
+
/**
|
|
357
|
+
* نام formatter سراسری یا تابع اختصاصی
|
|
358
|
+
*/
|
|
359
|
+
formatter;
|
|
360
|
+
}
|
|
361
|
+
class SortEvent {
|
|
362
|
+
field = '';
|
|
363
|
+
direction = 'asc';
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Generated bundle index. Do not edit.
|
|
368
|
+
*/
|
|
369
|
+
|
|
370
|
+
export { FieldsType, NGX_PAGINATION_CONFIG, NGX_PAGINATION_CONFIG_DEFAULT, NGX_TABLE_CONFIG, NGX_TABLE_CONFIG_DEFAULT, NgxPagination, NgxTable, SortEvent, providePagination, provideTable };
|
|
371
|
+
//# sourceMappingURL=ngx-kit-data-table.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-kit-data-table.mjs","sources":["../../../projects/libs/data-table/tokens/pagination-config.token.ts","../../../projects/libs/data-table/components/pagination/pagination.ts","../../../projects/libs/data-table/components/pagination/pagination.html","../../../projects/libs/data-table/directives/table-cell.directive.ts","../../../projects/libs/data-table/tokens/table-config.token.ts","../../../projects/libs/data-table/components/table/table.ts","../../../projects/libs/data-table/components/table/table.html","../../../projects/libs/data-table/providers/pagination-provider.ts","../../../projects/libs/data-table/providers/table-provider.ts","../../../projects/libs/data-table/types/FieldsType.ts","../../../projects/libs/data-table/ngx-kit-data-table.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { NgxPaginationOptions } from '../types/PaginationOptions';\r\n\r\nexport const NGX_PAGINATION_CONFIG = new InjectionToken<NgxPaginationOptions>(\r\n 'ngx-pagination-config',\r\n {\r\n factory: () => NGX_PAGINATION_CONFIG_DEFAULT,\r\n },\r\n);\r\nexport const NGX_PAGINATION_CONFIG_DEFAULT: NgxPaginationOptions = {\r\n defaultPageSize: 10,\r\n pageSizeOptions: [5, 10, 20, 30, 50, 100, 500, 1000],\r\n labels: {\r\n first: 'First',\r\n last: 'Last',\r\n next: 'Next',\r\n previous: 'Previous',\r\n showing: 'Showing',\r\n to: 'to',\r\n of: 'of',\r\n results: 'results',\r\n perPage: 'Per Page',\r\n pageSize: 'Page Size',\r\n },\r\n};\r\n","import { Component, computed, effect, inject, input, model, output, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NGX_PAGINATION_CONFIG } from '../../tokens/pagination-config.token';\r\nimport { PageEvent } from '../../types/PageEvent';\r\n\r\n@Component({\r\n selector: 'ngx-pagination',\r\n templateUrl: './pagination.html',\r\n styleUrls: ['./pagination.scss'],\r\n imports: [FormsModule],\r\n})\r\nexport class NgxPagination {\r\n protected readonly config = inject(NGX_PAGINATION_CONFIG);\r\n readonly total = input.required<number>();\r\n\r\n readonly page = model(1);\r\n\r\n readonly pageSize = model(this.config.defaultPageSize);\r\n\r\n readonly pageSizeOptions = input(this.config.pageSizeOptions);\r\n\r\n readonly labels = input(this.config.labels);\r\n\r\n readonly siblingCount = input(1);\r\n\r\n readonly boundaryCount = input(1);\r\n\r\n readonly paginate = output<PageEvent>();\r\n\r\n readonly totalPages = computed(() => {\r\n return Math.max(1, Math.ceil(this.total() / this.pageSize()));\r\n });\r\n readonly firstItem = computed(() => {\r\n if (this.total() === 0) return 0;\r\n\r\n return (this.page() - 1) * this.pageSize() + 1;\r\n });\r\n\r\n readonly lastItem = computed(() => {\r\n return Math.min(\r\n this.firstItem() + this.pageSize() - 1,\r\n\r\n this.total(),\r\n );\r\n });\r\n readonly pages = computed(() =>\r\n this.buildPages(this.page(), this.totalPages(), this.siblingCount(), this.boundaryCount()),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n const page = this.page();\r\n\r\n const pageSize = +this.pageSize();\r\n\r\n // this.pageChange.emit(page);\r\n debugger;\r\n this.paginate.emit({\r\n page,\r\n pageSize,\r\n });\r\n });\r\n\r\n effect(() => {\r\n const max = this.totalPages();\r\n if (this.page() > max) this.page.set(max);\r\n });\r\n }\r\n\r\n private buildPages(\r\n current: number,\r\n total: number,\r\n sibling = 1,\r\n boundary = 1,\r\n ): (number | string)[] {\r\n const range = (start: number, end: number) =>\r\n Array.from({ length: end - start + 1 }, (_, i) => start + i);\r\n\r\n const totalNumbers = sibling * 2 + boundary * 2 + 3;\r\n\r\n if (total <= totalNumbers) return range(1, total);\r\n\r\n const leftSibling = Math.max(current - sibling, boundary + 2);\r\n\r\n const rightSibling = Math.min(current + sibling, total - boundary - 1);\r\n\r\n const showLeftDots = leftSibling > boundary + 2;\r\n\r\n const showRightDots = rightSibling < total - boundary - 1;\r\n\r\n const pages: (number | string)[] = [];\r\n\r\n pages.push(...range(1, boundary));\r\n\r\n if (showLeftDots) pages.push('...');\r\n else pages.push(...range(boundary + 1, leftSibling - 1));\r\n\r\n pages.push(...range(leftSibling, rightSibling));\r\n\r\n if (showRightDots) pages.push('...');\r\n else pages.push(...range(rightSibling + 1, total - boundary));\r\n\r\n pages.push(...range(total - boundary + 1, total));\r\n\r\n return pages;\r\n }\r\n\r\n next() {\r\n this.page.update((p) => Math.min(p + 1, this.totalPages()));\r\n }\r\n\r\n previous() {\r\n this.page.update((p) => Math.max(1, p - 1));\r\n }\r\n\r\n first() {\r\n this.page.set(1);\r\n }\r\n last() {\r\n this.page.set(this.totalPages());\r\n }\r\n goto(page: number) {\r\n if (typeof page !== 'number') return;\r\n\r\n this.page.set(page);\r\n }\r\n}\r\n","<nav class=\"ngx-pagination\">\r\n <div class=\"\">\r\n {{ labels().showing }}\r\n <span class=\"fw-semibold\">{{ firstItem() }}</span>\r\n {{ labels().to }}\r\n <span class=\"fw-semibold\">{{ lastItem() }}</span>\r\n {{ labels().of }}\r\n <span class=\"fw-semibold\">{{ total() }}</span>\r\n {{ labels().results }}\r\n </div>\r\n\r\n <div class=\"ngx-paination_page-numbers\">\r\n <ul>\r\n <!-- Previous Page Link -->\r\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().first\">\r\n <a (click)=\"first()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M235.8 453.1L53.8 256l181.1-197.1c2.844-3.078 4.25-6.969 4.25-10.86c0-4.312-1.719-8.609-5.156-11.75c-6.5-6-16.59-5.594-22.59 .8906l-192 208c-5.688 6.156-5.688 15.56 0 21.72l192 208c6 6.484 16.09 6.891 22.59 .8906C241.4 469.8 241.8 459.6 235.8 453.1zM212.2 245.1c-5.688 6.156-5.688 15.56 0 21.72l192 208c6 6.484 16.09 6.891 22.59 .8906c6.531-5.969 6.906-16.11 .9062-22.61l-181.1-197.1l181.1-197.1c2.844-3.078 4.25-6.969 4.25-10.86c0-4.312-1.719-8.609-5.156-11.75c-6.5-6-16.59-5.594-22.59 .8906L212.2 245.1z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().previous\">\r\n <a (click)=\"previous()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M234.8 36.25c3.438 3.141 5.156 7.438 5.156 11.75c0 3.891-1.406 7.781-4.25 10.86L53.77 256l181.1 197.1c6 6.5 5.625 16.64-.9062 22.61c-6.5 6-16.59 5.594-22.59-.8906l-192-208c-5.688-6.156-5.688-15.56 0-21.72l192-208C218.2 30.66 228.3 30.25 234.8 36.25z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n\r\n <!-- Pagination Elements -->\r\n @for (item of pages(); track $index) {\r\n <li class=\"page-num\" [class.active]=\"+item === page()\">\r\n @if (item !== page() && item != '...') {\r\n <a (click)=\"goto(+item)\">{{ item }}</a>\r\n }\r\n @if (item === page() || item == '...') {\r\n <span>{{ item }}</span>\r\n }\r\n </li>\r\n }\r\n\r\n <!-- Next Page Link -->\r\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().next\">\r\n <a (click)=\"next()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M85.14 475.8c-3.438-3.141-5.156-7.438-5.156-11.75c0-3.891 1.406-7.781 4.25-10.86l181.1-197.1L84.23 58.86c-6-6.5-5.625-16.64 .9062-22.61c6.5-6 16.59-5.594 22.59 .8906l192 208c5.688 6.156 5.688 15.56 0 21.72l-192 208C101.7 481.3 91.64 481.8 85.14 475.8z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().last\">\r\n <a (click)=\"last()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M212.2 58.86l181.1 197.1L212.2 453.1c-2.844 3.078-4.25 6.969-4.25 10.86c0 4.312 1.719 8.609 5.156 11.75c6.5 6 16.59 5.594 22.59-.8906l192-208c5.688-6.156 5.688-15.56 0-21.72l-192-208c-6-6.484-16.09-6.891-22.59-.8906C206.6 42.22 206.2 52.36 212.2 58.86zM235.8 266.9c5.688-6.156 5.688-15.56 0-21.72l-192-208c-6-6.484-16.09-6.891-22.59-.8906c-6.531 5.969-6.906 16.11-.9062 22.61l181.1 197.1L20.26 453.1c-2.844 3.078-4.25 6.969-4.25 10.86c0 4.312 1.719 8.609 5.156 11.75c6.5 6 16.59 5.594 22.59-.8906L235.8 266.9z\" />\r\n </svg>\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n <div class=\"ngx-paination_page-size\">\r\n <span>{{ labels().pageSize }}:</span>\r\n <select\r\n name=\"pageSize\"\r\n [ngModel]=\"pageSize()\"\r\n (ngModelChange)=\"pageSize.update((u) => (u = $event))\">\r\n @for (opt of pageSizeOptions(); track $index) {\r\n <option [value]=\"opt\" [selected]=\"opt === pageSize()\">\r\n {{ opt }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n</nav>\r\n","import { Directive, inject, input, Input, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: 'ng-template[ngxTableCell]',\r\n})\r\nexport class TableCellDirective {\r\n readonly column = input.required<string>({\r\n alias: 'ngxTableCell',\r\n });\r\n\r\n readonly template = inject(TemplateRef);\r\n}\r\n","import { InjectionToken, Type } from '@angular/core';\r\nimport { NgxTableOptions } from '../types/TableOptions';\r\n\r\n/** Injected into every ngx-table instance. Populate via provideTable(). */\r\nexport const NGX_TABLE_CONFIG = new InjectionToken<NgxTableOptions>('NGX_TABLE_CONFIG', {\r\n factory: () => NGX_TABLE_CONFIG_DEFAULT,\r\n});\r\n\r\nexport const NGX_TABLE_CONFIG_DEFAULT: NgxTableOptions = {\r\n showRecordNumber: true,\r\n hoverable: true,\r\n multiSort: true,\r\n resizable: false,\r\n stickyHeader: true,\r\n stripedRows: true,\r\n labels: {\r\n noData: 'There is no data to display!',\r\n loading: 'Loading...',\r\n operation: 'Operation',\r\n },\r\n renderers: {},\r\n formatters: {},\r\n};\r\n","import {\r\n AfterContentInit,\r\n Component,\r\n computed,\r\n ContentChildren,\r\n effect,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n input,\r\n model,\r\n OnInit,\r\n output,\r\n Output,\r\n QueryList,\r\n signal,\r\n TemplateRef,\r\n Type,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { FieldsType, SortEvent } from '../../types/FieldsType';\r\nimport { TableCellDirective } from '../../directives/table-cell.directive';\r\nimport { NGX_TABLE_CONFIG } from '../../tokens/table-config.token';\r\nimport { NGX_PAGINATION_CONFIG } from '../../tokens/pagination-config.token';\r\nimport { PageEvent } from '../../types/PageEvent';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgxPagination } from '../pagination/pagination';\r\nimport { LazyLoadEvent } from '../../types/LazyLoadEvent';\r\n\r\n@Component({\r\n selector: 'ngx-table',\r\n templateUrl: './table.html',\r\n styleUrls: ['./table.scss'],\r\n imports: [CommonModule, NgxPagination],\r\n providers: [],\r\n})\r\nexport class NgxTable<T extends object> implements OnInit, AfterContentInit {\r\n protected readonly config = inject(NGX_TABLE_CONFIG);\r\n protected readonly paginationConfig = inject(NGX_PAGINATION_CONFIG);\r\n readonly fields = input.required<FieldsType<T>[]>();\r\n readonly data = input.required<T[]>();\r\n readonly totalRecords = input.required<number>();\r\n readonly showRecordNumber = input(this.config.showRecordNumber);\r\n list = signal<readonly T[]>([]);\r\n\r\n readonly operations = input<TemplateRef<any>>();\r\n readonly operationWidth = input(60);\r\n readonly numWidth = input(60);\r\n readonly pageSize = input(this.paginationConfig.defaultPageSize);\r\n readonly loading = input(false);\r\n readonly multiSort = input(this.config.multiSort);\r\n\r\n readonly lazy = input(false);\r\n readonly lazyLoad = output<LazyLoadEvent<T>>();\r\n\r\n sortField = '';\r\n sortDirection: 'asc' | 'desc' = 'asc';\r\n\r\n tableContainer = viewChild<ElementRef<HTMLDivElement>>('tableContainer');\r\n @Output() sortChange = new EventEmitter<SortEvent>();\r\n @ContentChildren(TableCellDirective) cellTemplates!: QueryList<TableCellDirective>;\r\n templateMap: Map<string, TemplateRef<any>> = new Map();\r\n\r\n page = 1;\r\n\r\n constructor() {\r\n effect(() => {\r\n const data = this.data();\r\n\r\n data.map(\r\n (r: any, index) => (r.ngxRecordNumber = this.pageSize() * (this.page - 1) + index + 1),\r\n );\r\n\r\n if (this.lazy()) {\r\n this.list.set(data);\r\n return;\r\n }\r\n\r\n this.loadClientPage(data);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.lazy()) {\r\n this.lazyLoad.emit({\r\n first: 0,\r\n pageIndex: 1,\r\n pageSize: this.pageSize(),\r\n sorts: [],\r\n });\r\n }\r\n }\r\n ngAfterContentInit(): void {\r\n this.templateMap.clear();\r\n this.cellTemplates.forEach((cell) => {\r\n // console.log(cell.columnName, cell.template);\r\n this.templateMap.set(cell.column.name, cell.template);\r\n });\r\n this.adjustScroll(this.tableContainer()?.nativeElement);\r\n }\r\n\r\n private loadClientPage(data: T[]): void {\r\n const from = (this.page - 1) * this.pageSize();\r\n const to = from + this.pageSize();\r\n\r\n this.list.set(data.slice(from, to));\r\n }\r\n\r\n onSortChange(item: FieldsType<T>) {}\r\n\r\n protected getTemplate(column: Extract<keyof T, string>): TemplateRef<unknown> | null {\r\n return this.templateMap.get(column) ?? null;\r\n }\r\n\r\n sortList() {\r\n // this._list = orderBy(this._list, [this.sortField], [this.sortDirection]);\r\n }\r\n getRecordNumber(item: T) {\r\n debugger;\r\n return (item as any).ngxRecordNumber;\r\n }\r\n onPageChange(event: PageEvent) {\r\n console.log('p', event);\r\n this.page = event.page;\r\n\r\n if (this.lazy()) {\r\n this.lazyLoad.emit({\r\n first: (event.page - 1) * event.pageSize,\r\n pageIndex: event.page,\r\n pageSize: event.pageSize,\r\n sorts: this.sortField\r\n ? [\r\n {\r\n field: this.sortField as Extract<keyof T, string>,\r\n direction: this.sortDirection,\r\n },\r\n ]\r\n : [],\r\n });\r\n\r\n return;\r\n }\r\n\r\n this.loadClientPage(this.data());\r\n }\r\n\r\n /**\r\n * اگر بدنه جدول اسکرول شد هدر جدول نیز منطبق شود\r\n */\r\n private adjustScroll(table?: HTMLElement) {\r\n if (!table) return;\r\n const body = table.querySelector('.tbody-mrs');\r\n const header = table.querySelector('.thead-mrs');\r\n if (!body || !header) return;\r\n body.addEventListener('scroll', () => {\r\n header.scrollLeft = body.scrollLeft;\r\n });\r\n }\r\n\r\n protected getRenderer(field: FieldsType<T>): Type<unknown> | null {\r\n const key = field.renderer ?? field.dataType;\r\n\r\n if (!key) {\r\n return null;\r\n }\r\n\r\n return this.config.renderers?.[key] ?? null;\r\n }\r\n\r\n protected getCellValue(row: T, field: FieldsType<T>): unknown {\r\n return row[field.column];\r\n }\r\n\r\n protected formatCellValue(row: T, field: FieldsType<T>): string {\r\n const value = this.getCellValue(row, field);\r\n\r\n if (typeof field.formatter === 'function') {\r\n return this.stringify(field.formatter(value, row, field as FieldsType<object>));\r\n }\r\n\r\n if (typeof field.formatter === 'string') {\r\n const formatter = this.config.formatters?.[field.formatter];\r\n\r\n if (formatter) {\r\n return this.stringify(formatter(value, row, field as FieldsType<object>));\r\n }\r\n }\r\n\r\n return this.stringify(value);\r\n }\r\n\r\n private stringify(value: unknown): string {\r\n return value == null ? '' : String(value);\r\n }\r\n\r\n protected getRendererInputs(row: T, field: FieldsType<T>): Record<string, unknown> {\r\n return {\r\n value: this.getCellValue(row, field),\r\n row,\r\n field,\r\n ...field.rendererInputs,\r\n };\r\n }\r\n}\r\n","<div class=\"table-responsive\" #tableContainer>\r\n <div class=\"table-mrs\">\r\n <div class=\"thead-mrs\">\r\n <div class=\"tr-mrs\">\r\n @if (operations()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n [style.max-width.px]=\"operationWidth()\"\r\n [style.min-width.px]=\"operationWidth()\">\r\n {{ config.labels.operation }}\r\n </div>\r\n }\r\n @if (showRecordNumber()) {\r\n <div\r\n class=\"th-mrs operations\"\r\n [style.max-width.px]=\"numWidth()\"\r\n [style.min-width.px]=\"numWidth()\">\r\n #\r\n </div>\r\n }\r\n @for (item of fields(); track $index) {\r\n <div class=\"th-mrs\" [style.max-width.px]=\"item.width\" [style.min-width.px]=\"item.width\">\r\n {{ item.title }}\r\n <span\r\n class=\"sort-icon\"\r\n [class.active]=\"sortField == item.column\"\r\n (click)=\"onSortChange(item)\">\r\n @if (sortField == item.column && sortDirection == 'asc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M368 432h-64c-8.844 0-15.1 7.156-15.1 16S295.2 464 304 464h64c8.844 0 16-7.156 16-16S376.8 432 368 432zM432 304h-128c-8.844 0-15.1 7.156-15.1 16S295.2 336 304 336h128c8.844 0 16-7.156 16-16S440.8 304 432 304zM496 176h-192c-8.844 0-15.1 7.156-15.1 16S295.2 208 304 208h192C504.8 208 512 200.8 512 192S504.8 176 496 176zM560 48h-256c-8.844 0-15.1 7.156-15.1 16S295.2 80 304 80h256C568.8 80 576 72.84 576 64S568.8 48 560 48zM224 352c-4.094 0-8.188 1.562-11.31 4.688L144 425.4V48C144 39.16 136.8 32 128 32S112 39.16 112 48v377.4l-68.69-68.69c-6.25-6.25-16.38-6.25-22.62 0s-6.25 16.38 0 22.62l96 96c6.25 6.25 16.38 6.25 22.62 0l96-96c6.25-6.25 6.25-16.38 0-22.62C232.2 353.6 228.1 352 224 352z\" />\r\n </svg>\r\n } @else if (sortField == item.column && sortDirection == 'desc') {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M304 208h128C440.8 208 448 200.8 448 192s-7.156-16-16-16h-128c-8.844 0-15.1 7.156-15.1 16S295.2 208 304 208zM304 336h192c8.844 0 16-7.156 16-16s-7.156-16-16-16h-192c-8.844 0-15.1 7.156-15.1 16S295.2 336 304 336zM304 80h64c8.844 0 16-7.156 16-16S376.8 48 368 48h-64c-8.844 0-15.1 7.156-15.1 16S295.2 80 304 80zM560 432h-256c-8.844 0-15.1 7.156-15.1 16S295.2 464 304 464h256c8.844 0 16-7.156 16-16S568.8 432 560 432zM224 352c-4.094 0-8.188 1.562-11.31 4.688L144 425.4V48C144 39.16 136.8 32 128 32S112 39.16 112 48v377.4l-68.69-68.69c-6.25-6.25-16.38-6.25-22.62 0s-6.25 16.38 0 22.62l96 96c6.25 6.25 16.38 6.25 22.62 0l96-96c6.25-6.25 6.25-16.38 0-22.62C232.2 353.6 228.1 352 224 352z\" />\r\n </svg>\r\n } @else {\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M224 352c-4.094 0-8.188 1.562-11.31 4.688L144 425.4V48C144 39.16 136.8 32 128 32S112 39.16 112 48v377.4l-68.69-68.69c-6.25-6.25-16.38-6.25-22.62 0s-6.25 16.38 0 22.62l96 96c6.25 6.25 16.38 6.25 22.62 0l96-96c6.25-6.25 6.25-16.38 0-22.62C232.2 353.6 228.1 352 224 352zM427.3 132.7l-96-96c-6.25-6.25-16.38-6.25-22.62 0l-96 96c-6.25 6.25-6.25 16.38 0 22.62s16.38 6.25 22.62 0L304 86.63V464c0 8.844 7.156 16 16 16s16-7.156 16-16V86.63l68.69 68.69C407.8 158.4 411.9 160 416 160s8.188-1.562 11.31-4.688C433.6 149.1 433.6 138.9 427.3 132.7z\" />\r\n </svg>\r\n }\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"tbody-mrs\">\r\n @if (!loading() && list().length === 0) {\r\n <div class=\"no-data\">{{ config.labels.noData }}</div>\r\n }\r\n @for (item of list(); track $index) {\r\n @let num = getRecordNumber(item);\r\n <div class=\"tr-mrs\">\r\n @if (operations()) {\r\n <div\r\n class=\"td-mrs operations\"\r\n vAlign=\"middle\"\r\n [style.max-width.px]=\"operationWidth()\"\r\n [style.min-width.px]=\"operationWidth()\">\r\n <div class=\"cel\">\r\n <span class=\"cell-title\">{{ config.labels.operation }}:</span>\r\n <ng-container\r\n [ngTemplateOutlet]=\"operations()\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (showRecordNumber()) {\r\n <div\r\n class=\"td-mrs operations\"\r\n vAlign=\"middle\"\r\n [style.max-width.px]=\"numWidth()\"\r\n [style.min-width.px]=\"numWidth()\">\r\n <div class=\"cel\">\r\n <span class=\"cell-title\"></span>\r\n {{ num }}\r\n </div>\r\n </div>\r\n }\r\n\r\n @for (f of fields(); track f.column) {\r\n @let template = getTemplate(f.column);\r\n @let renderer = getRenderer(f);\r\n\r\n <div\r\n class=\"td-mrs\"\r\n vAlign=\"middle\"\r\n [style.max-width.px]=\"f.width\"\r\n [style.min-width.px]=\"f.width\">\r\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\r\n <span class=\"cell-title\">{{ f.title }}</span>\r\n @if (template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: item,\r\n row: item,\r\n value: getCellValue(item, f),\r\n field: f,\r\n }\"></ng-container>\r\n } @else if (renderer) {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n renderer;\r\n inputs: getRendererInputs(item, f)\r\n \"></ng-container>\r\n } @else {\r\n {{ formatCellValue(item, f) }}\r\n }\r\n @if (f.prefix) {\r\n <span>{{ f.prefix }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (loading()) {\r\n <div class=\"loading-container\">\r\n <div class=\"loading\">{{ config.labels.loading }}</div>\r\n </div>\r\n }\r\n</div>\r\n\r\n<ngx-pagination\r\n [(page)]=\"page\"\r\n [pageSize]=\"pageSize()\"\r\n [total]=\"totalRecords()\"\r\n (paginate)=\"onPageChange($event)\"></ngx-pagination>\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport {\r\n NGX_PAGINATION_CONFIG,\r\n NGX_PAGINATION_CONFIG_DEFAULT,\r\n} from '../tokens/pagination-config.token';\r\nimport { mergeConfig } from 'ngx-kit/shared';\r\nimport { NgxPaginationOptions } from '../types/PaginationOptions';\r\n\r\nexport function providePagination(options?: NgxPaginationOptions): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: NGX_PAGINATION_CONFIG,\r\n useValue: mergeConfig(NGX_PAGINATION_CONFIG_DEFAULT, options),\r\n },\r\n ]);\r\n}\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { NGX_TABLE_CONFIG, NGX_TABLE_CONFIG_DEFAULT } from '../tokens/table-config.token';\r\nimport { NgxTableOptions } from '../types/TableOptions';\r\nimport { mergeConfig } from 'ngx-kit/shared';\r\n\r\nexport function provideTable(options?: NgxTableOptions): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: NGX_TABLE_CONFIG,\r\n useValue: mergeConfig(NGX_TABLE_CONFIG_DEFAULT, options) satisfies NgxTableOptions,\r\n },\r\n ]);\r\n}\r\n","import { TableCellFormatter } from './TableOptions';\r\n\r\nexport class FieldsType<T extends Object> {\r\n title!: string;\r\n column!: Extract<keyof T, string>;\r\n dataType?:\r\n | 'text'\r\n | 'image'\r\n | 'profilePicture'\r\n | 'date'\r\n | 'time'\r\n | 'dateTime'\r\n | 'yesNo'\r\n | 'boolean'\r\n | 'number'\r\n | 'localize'\r\n | 'template'\r\n | 'enum'\r\n | 'html'\r\n | 'userAgent'\r\n | undefined;\r\n width?: number;\r\n wrap?: boolean;\r\n\r\n prefix?: string;\r\n\r\n /**\r\n * نام renderer ثبتشده در provideTable\r\n */\r\n renderer?: string;\r\n\r\n /**\r\n * ورودیهای اضافه برای renderer\r\n */\r\n rendererInputs?: Record<string, unknown>;\r\n\r\n /**\r\n * نام formatter سراسری یا تابع اختصاصی\r\n */\r\n formatter?: string | TableCellFormatter;\r\n}\r\n\r\nexport class SortEvent {\r\n field: string = '';\r\n direction: 'asc' | 'desc' = 'asc';\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":";;;;;;;;MAGa,qBAAqB,GAAG,IAAI,cAAc,CACrD,uBAAuB,EACvB;AACE,IAAA,OAAO,EAAE,MAAM,6BAA6B;AAC7C,CAAA;AAEI,MAAM,6BAA6B,GAAyB;AACjE,IAAA,eAAe,EAAE,EAAE;AACnB,IAAA,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;AACpD,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,OAAO,EAAE,UAAU;AACnB,QAAA,QAAQ,EAAE,WAAW;AACtB,KAAA;;;MCZU,aAAa,CAAA;AACL,IAAA,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC;IAChD,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAU;IAEhC,IAAI,GAAG,KAAK,CAAC,CAAC;6EAAC;AAEf,IAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe;iFAAC;AAE7C,IAAA,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe;wFAAC;AAEpD,IAAA,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;+EAAC;IAElC,YAAY,GAAG,KAAK,CAAC,CAAC;qFAAC;IAEvB,aAAa,GAAG,KAAK,CAAC,CAAC;sFAAC;IAExB,QAAQ,GAAG,MAAM,EAAa;AAE9B,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;mFAAC;AACO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AAEhC,QAAA,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;IAChD,CAAC;kFAAC;AAEO,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;QAChC,OAAO,IAAI,CAAC,GAAG,CACb,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAEtC,IAAI,CAAC,KAAK,EAAE,CACb;IACH,CAAC;iFAAC;AACO,IAAA,KAAK,GAAG,QAAQ,CAAC,MACxB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;8EAC3F;AAED,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAExB,YAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE;;AAGjC,YAAA;AACA,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjB,IAAI;gBACJ,QAAQ;AACT,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC3C,QAAA,CAAC,CAAC;IACJ;IAEQ,UAAU,CAChB,OAAe,EACf,KAAa,EACb,OAAO,GAAG,CAAC,EACX,QAAQ,GAAG,CAAC,EAAA;AAEZ,QAAA,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,KACvC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;QAE9D,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,CAAC;QAEnD,IAAI,KAAK,IAAI,YAAY;AAAE,YAAA,OAAO,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AAEjD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,CAAC,CAAC;AAE7D,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;AAEtE,QAAA,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,CAAC;QAE/C,MAAM,aAAa,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,CAAC;QAEzD,MAAM,KAAK,GAAwB,EAAE;QAErC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAEjC,QAAA,IAAI,YAAY;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;;AAC9B,YAAA,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QAExD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAE/C,QAAA,IAAI,aAAa;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;;AAC/B,YAAA,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;AAE7D,QAAA,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAEjD,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,GAAA;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7D;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClB;IACA,IAAI,GAAA;QACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAClC;AACA,IAAA,IAAI,CAAC,IAAY,EAAA;QACf,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE;AAE9B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACrB;uGAlHW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX1B,mrIAiFA,EAAA,MAAA,EAAA,CAAA,ysCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxEY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,0JAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEV,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;+BACE,gBAAgB,EAAA,OAAA,EAGjB,CAAC,WAAW,CAAC,EAAA,QAAA,EAAA,mrIAAA,EAAA,MAAA,EAAA,CAAA,ysCAAA,CAAA,EAAA;;;MEJX,kBAAkB,CAAA;IACpB,MAAM,GAAG,KAAK,CAAC,QAAQ,6EAC9B,KAAK,EAAE,cAAc,EAAA,CACrB;AAEO,IAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;uGAL5B,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,2BAA2B;AACtC,iBAAA;;;ACDD;MACa,gBAAgB,GAAG,IAAI,cAAc,CAAkB,kBAAkB,EAAE;AACtF,IAAA,OAAO,EAAE,MAAM,wBAAwB;AACxC,CAAA;AAEM,MAAM,wBAAwB,GAAoB;AACvD,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,MAAM,EAAE;AACN,QAAA,MAAM,EAAE,8BAA8B;AACtC,QAAA,OAAO,EAAE,YAAY;AACrB,QAAA,SAAS,EAAE,WAAW;AACvB,KAAA;AACD,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,UAAU,EAAE,EAAE;;;MCeH,QAAQ,CAAA;AACA,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACjC,IAAA,gBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC;IAC1D,MAAM,GAAG,KAAK,CAAC,QAAQ;+EAAmB;IAC1C,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAO;IAC5B,YAAY,GAAG,KAAK,CAAC,QAAQ;qFAAU;AACvC,IAAA,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB;yFAAC;IAC/D,IAAI,GAAG,MAAM,CAAe,EAAE;6EAAC;AAEtB,IAAA,UAAU,GAAG,KAAK;8FAAoB;IACtC,cAAc,GAAG,KAAK,CAAC,EAAE;uFAAC;IAC1B,QAAQ,GAAG,KAAK,CAAC,EAAE;iFAAC;AACpB,IAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe;iFAAC;IACvD,OAAO,GAAG,KAAK,CAAC,KAAK;gFAAC;AACtB,IAAA,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;kFAAC;IAExC,IAAI,GAAG,KAAK,CAAC,KAAK;6EAAC;IACnB,QAAQ,GAAG,MAAM,EAAoB;IAE9C,SAAS,GAAG,EAAE;IACd,aAAa,GAAmB,KAAK;IAErC,cAAc,GAAG,SAAS,CAA6B,gBAAgB;uFAAC;AAC9D,IAAA,UAAU,GAAG,IAAI,YAAY,EAAa;AACf,IAAA,aAAa;AAClD,IAAA,WAAW,GAAkC,IAAI,GAAG,EAAE;IAEtD,IAAI,GAAG,CAAC;AAER,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAExB,YAAA,IAAI,CAAC,GAAG,CACN,CAAC,CAAM,EAAE,KAAK,MAAM,CAAC,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CACvF;AAED,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBACnB;YACF;AAEA,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AAC3B,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,SAAS,EAAE,CAAC;AACZ,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,gBAAA,KAAK,EAAE,EAAE;AACV,aAAA,CAAC;QACJ;IACF;IACA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;QACxB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;;AAElC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;AACvD,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC;IACzD;AAEQ,IAAA,cAAc,CAAC,IAAS,EAAA;AAC9B,QAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;QAC9C,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEjC,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrC;IAEA,YAAY,CAAC,IAAmB,EAAA,EAAG;AAEzB,IAAA,WAAW,CAAC,MAAgC,EAAA;QACpD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI;IAC7C;IAEA,QAAQ,GAAA;;IAER;AACA,IAAA,eAAe,CAAC,IAAO,EAAA;AACrB,QAAA;QACA,OAAQ,IAAY,CAAC,eAAe;IACtC;AACA,IAAA,YAAY,CAAC,KAAgB,EAAA;AAC3B,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;AAEtB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjB,KAAK,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ;gBACxC,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,KAAK,EAAE,IAAI,CAAC;AACV,sBAAE;AACE,wBAAA;4BACE,KAAK,EAAE,IAAI,CAAC,SAAqC;4BACjD,SAAS,EAAE,IAAI,CAAC,aAAa;AAC9B,yBAAA;AACF;AACH,sBAAE,EAAE;AACP,aAAA,CAAC;YAEF;QACF;QAEA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAClC;AAEA;;AAEG;AACK,IAAA,YAAY,CAAC,KAAmB,EAAA;AACtC,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC;QAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC;AAChD,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE;AACtB,QAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAK;AACnC,YAAA,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;AACrC,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,WAAW,CAAC,KAAoB,EAAA;QACxC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ;QAE5C,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI;IAC7C;IAEU,YAAY,CAAC,GAAM,EAAE,KAAoB,EAAA;AACjD,QAAA,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1B;IAEU,eAAe,CAAC,GAAM,EAAE,KAAoB,EAAA;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;AAE3C,QAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;AACzC,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,KAA2B,CAAC,CAAC;QACjF;AAEA,QAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;AACvC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC;YAE3D,IAAI,SAAS,EAAE;AACb,gBAAA,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,KAA2B,CAAC,CAAC;YAC3E;QACF;AAEA,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAC9B;AAEQ,IAAA,SAAS,CAAC,KAAc,EAAA;AAC9B,QAAA,OAAO,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3C;IAEU,iBAAiB,CAAC,GAAM,EAAE,KAAoB,EAAA;QACtD,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;YACpC,GAAG;YACH,KAAK;YACL,GAAG,KAAK,CAAC,cAAc;SACxB;IACH;uGAtKW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,SAAA,EAFR,EAAE,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,SAAA,EA0BI,kBAAkB,+JC5DrC,k2NA0IA,EAAA,MAAA,EAAA,CAAA,k+EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzGY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAG1B,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAPpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,WAGZ,CAAC,YAAY,EAAE,aAAa,CAAC,aAC3B,EAAE,EAAA,QAAA,EAAA,k2NAAA,EAAA,MAAA,EAAA,CAAA,k+EAAA,CAAA,EAAA;4sCAwB0C,gBAAgB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA;sBACtE;;sBACA,eAAe;uBAAC,kBAAkB;;;AEpD/B,SAAU,iBAAiB,CAAC,OAA8B,EAAA;AAC9D,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA;AACE,YAAA,OAAO,EAAE,qBAAqB;AAC9B,YAAA,QAAQ,EAAE,WAAW,CAAC,6BAA6B,EAAE,OAAO,CAAC;AAC9D,SAAA;AACF,KAAA,CAAC;AACJ;;ACVM,SAAU,YAAY,CAAC,OAAyB,EAAA;AACpD,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA;AACE,YAAA,OAAO,EAAE,gBAAgB;AACzB,YAAA,QAAQ,EAAE,WAAW,CAAC,wBAAwB,EAAE,OAAO,CAA2B;AACnF,SAAA;AACF,KAAA,CAAC;AACJ;;MCVa,UAAU,CAAA;AACrB,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,QAAQ;AAgBR,IAAA,KAAK;AACL,IAAA,IAAI;AAEJ,IAAA,MAAM;AAEN;;AAEG;AACH,IAAA,QAAQ;AAER;;AAEG;AACH,IAAA,cAAc;AAEd;;AAEG;AACH,IAAA,SAAS;AACV;MAEY,SAAS,CAAA;IACpB,KAAK,GAAW,EAAE;IAClB,SAAS,GAAmB,KAAK;AAClC;;AC7CD;;AAEG;;;;"}
|