@hitsoft/smart-warehouse 1.0.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 +24 -0
- package/config/enums/index.d.ts +1 -0
- package/config/enums/route-names.d.ts +12 -0
- package/config/index.d.ts +5 -0
- package/config/providers/connector-params-route.provider.d.ts +8 -0
- package/config/providers/index.d.ts +7 -0
- package/config/providers/order-station-route.provider.d.ts +8 -0
- package/config/providers/orders-route.provider.d.ts +8 -0
- package/config/providers/quantity-correction-route.provider.d.ts +8 -0
- package/config/providers/route.provider.d.ts +8 -0
- package/config/providers/shelf-placement-route.provider.d.ts +8 -0
- package/config/providers/shelf-transfer-route.provider.d.ts +8 -0
- package/config/providers/shortages-route.provider.d.ts +8 -0
- package/config/providers/station.provider.d.ts +8 -0
- package/config/providers/stock-report.d.ts +8 -0
- package/config/public-api.d.ts +3 -0
- package/config/smart-warehouse-config.module.d.ts +8 -0
- package/esm2020/config/enums/index.mjs +2 -0
- package/esm2020/config/enums/route-names.mjs +2 -0
- package/esm2020/config/hitsoft-smart-warehouse-config.mjs +5 -0
- package/esm2020/config/providers/connector-params-route.provider.mjs +25 -0
- package/esm2020/config/providers/index.mjs +8 -0
- package/esm2020/config/providers/order-station-route.provider.mjs +25 -0
- package/esm2020/config/providers/orders-route.provider.mjs +25 -0
- package/esm2020/config/providers/quantity-correction-route.provider.mjs +25 -0
- package/esm2020/config/providers/route.provider.mjs +24 -0
- package/esm2020/config/providers/shelf-placement-route.provider.mjs +25 -0
- package/esm2020/config/providers/shelf-transfer-route.provider.mjs +25 -0
- package/esm2020/config/providers/shortages-route.provider.mjs +25 -0
- package/esm2020/config/providers/station.provider.mjs +25 -0
- package/esm2020/config/providers/stock-report.mjs +25 -0
- package/esm2020/config/public-api.mjs +4 -0
- package/esm2020/config/smart-warehouse-config.module.mjs +37 -0
- package/esm2020/hitsoft-smart-warehouse.mjs +5 -0
- package/esm2020/lib/components/connector-params/connector-params.component.mjs +182 -0
- package/esm2020/lib/components/connector-params/connector-params.module.mjs +41 -0
- package/esm2020/lib/components/order-station/order-station.component.mjs +160 -0
- package/esm2020/lib/components/order-station/order-station.module.mjs +57 -0
- package/esm2020/lib/components/orders/orders.component.mjs +445 -0
- package/esm2020/lib/components/orders/orders.module.mjs +75 -0
- package/esm2020/lib/components/quantity-correction/quantity-correction.component.mjs +231 -0
- package/esm2020/lib/components/quantity-correction/quantity-correction.module.mjs +41 -0
- package/esm2020/lib/components/shelf-placement/shelf-placement.component.mjs +297 -0
- package/esm2020/lib/components/shelf-placement/shelf-placement.module.mjs +66 -0
- package/esm2020/lib/components/shelf-transfer/shelf-transfer.component.mjs +146 -0
- package/esm2020/lib/components/shelf-transfer/shelf-transfer.module.mjs +41 -0
- package/esm2020/lib/components/shortages/shortages.component.mjs +75 -0
- package/esm2020/lib/components/shortages/shortages.module.mjs +42 -0
- package/esm2020/lib/components/smart-warehouse.component.mjs +18 -0
- package/esm2020/lib/components/stock-report/stock-report.component.mjs +29 -0
- package/esm2020/lib/components/stock-report/stock-report.module.mjs +42 -0
- package/esm2020/lib/guards/connector-params.guard.mjs +58 -0
- package/esm2020/lib/hit-proxy/connector-params/connector-params.service.mjs +27 -0
- package/esm2020/lib/hit-proxy/devexpress-query-builder/devexpress-load-options.model.mjs +2 -0
- package/esm2020/lib/hit-proxy/devexpress-query-builder/devexpress-query-builder.mjs +62 -0
- package/esm2020/lib/hit-proxy/inventory/inventory.service.mjs +21 -0
- package/esm2020/lib/hit-proxy/order-station/order-station.service.mjs +18 -0
- package/esm2020/lib/hit-proxy/orders/model.mjs +2 -0
- package/esm2020/lib/hit-proxy/orders/order.service.mjs +81 -0
- package/esm2020/lib/hit-proxy/quantity-correction/quantity-correction.service.mjs +47 -0
- package/esm2020/lib/hit-proxy/shortages/model.mjs +2 -0
- package/esm2020/lib/hit-proxy/shortages/shortages.service.mjs +26 -0
- package/esm2020/lib/hit-proxy/stations/station.service.mjs +86 -0
- package/esm2020/lib/hit-proxy/stock-report/stock-report.service.mjs +22 -0
- package/esm2020/lib/hit-proxy/stock-transfer/stock-transfer.service.mjs +21 -0
- package/esm2020/lib/hit-proxy/warehouse/warehouse.service.mjs +65 -0
- package/esm2020/lib/services/smart-warehouse.service.mjs +21 -0
- package/esm2020/lib/smart-warehouse-routing.module.mjs +79 -0
- package/esm2020/lib/smart-warehouse.module.mjs +34 -0
- package/esm2020/lib/stations/station.component.mjs +43 -0
- package/esm2020/lib/stations/station.module.mjs +42 -0
- package/esm2020/public-api.mjs +20 -0
- package/fesm2015/hitsoft-smart-warehouse-config.mjs +264 -0
- package/fesm2015/hitsoft-smart-warehouse-config.mjs.map +1 -0
- package/fesm2015/hitsoft-smart-warehouse.mjs +2577 -0
- package/fesm2015/hitsoft-smart-warehouse.mjs.map +1 -0
- package/fesm2020/hitsoft-smart-warehouse-config.mjs +264 -0
- package/fesm2020/hitsoft-smart-warehouse-config.mjs.map +1 -0
- package/fesm2020/hitsoft-smart-warehouse.mjs +2515 -0
- package/fesm2020/hitsoft-smart-warehouse.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/connector-params/connector-params.component.d.ts +44 -0
- package/lib/components/connector-params/connector-params.module.d.ts +13 -0
- package/lib/components/order-station/order-station.component.d.ts +31 -0
- package/lib/components/order-station/order-station.module.d.ts +16 -0
- package/lib/components/orders/orders.component.d.ts +63 -0
- package/lib/components/orders/orders.module.d.ts +17 -0
- package/lib/components/quantity-correction/quantity-correction.component.d.ts +52 -0
- package/lib/components/quantity-correction/quantity-correction.module.d.ts +16 -0
- package/lib/components/shelf-placement/shelf-placement.component.d.ts +93 -0
- package/lib/components/shelf-placement/shelf-placement.module.d.ts +17 -0
- package/lib/components/shelf-transfer/shelf-transfer.component.d.ts +26 -0
- package/lib/components/shelf-transfer/shelf-transfer.module.d.ts +16 -0
- package/lib/components/shortages/shortages.component.d.ts +25 -0
- package/lib/components/shortages/shortages.module.d.ts +17 -0
- package/lib/components/smart-warehouse.component.d.ts +10 -0
- package/lib/components/stock-report/stock-report.component.d.ts +16 -0
- package/lib/components/stock-report/stock-report.module.d.ts +17 -0
- package/lib/guards/connector-params.guard.d.ts +21 -0
- package/lib/hit-proxy/connector-params/connector-params.service.d.ts +46 -0
- package/lib/hit-proxy/devexpress-query-builder/devexpress-load-options.model.d.ts +8 -0
- package/lib/hit-proxy/devexpress-query-builder/devexpress-query-builder.d.ts +17 -0
- package/lib/hit-proxy/inventory/inventory.service.d.ts +22 -0
- package/lib/hit-proxy/order-station/order-station.service.d.ts +24 -0
- package/lib/hit-proxy/orders/model.d.ts +74 -0
- package/lib/hit-proxy/orders/order.service.d.ts +26 -0
- package/lib/hit-proxy/quantity-correction/quantity-correction.service.d.ts +88 -0
- package/lib/hit-proxy/shortages/model.d.ts +17 -0
- package/lib/hit-proxy/shortages/shortages.service.d.ts +13 -0
- package/lib/hit-proxy/stations/station.service.d.ts +25 -0
- package/lib/hit-proxy/stock-report/stock-report.service.d.ts +12 -0
- package/lib/hit-proxy/stock-transfer/stock-transfer.service.d.ts +19 -0
- package/lib/hit-proxy/warehouse/warehouse.service.d.ts +59 -0
- package/lib/services/smart-warehouse.service.d.ts +10 -0
- package/lib/smart-warehouse-routing.module.d.ts +7 -0
- package/lib/smart-warehouse.module.d.ts +13 -0
- package/lib/stations/station.component.d.ts +14 -0
- package/lib/stations/station.module.d.ts +17 -0
- package/package.json +45 -0
- package/public-api.d.ts +16 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { Component, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { forkJoin, of } from 'rxjs';
|
|
3
|
+
import { catchError } from 'rxjs/operators';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../../hit-proxy/connector-params/connector-params.service";
|
|
6
|
+
import * as i2 from "@abp/ng.theme.shared";
|
|
7
|
+
import * as i3 from "../../guards/connector-params.guard";
|
|
8
|
+
import * as i4 from "@angular/router";
|
|
9
|
+
import * as i5 from "../../hit-proxy/warehouse/warehouse.service";
|
|
10
|
+
import * as i6 from "@angular/common";
|
|
11
|
+
import * as i7 from "@angular/forms";
|
|
12
|
+
import * as i8 from "@abp/ng.components/page";
|
|
13
|
+
export class ConnectorParamsComponent {
|
|
14
|
+
constructor(connectorParamsService, toasterService, guard, router, route, warehouseService) {
|
|
15
|
+
this.connectorParamsService = connectorParamsService;
|
|
16
|
+
this.toasterService = toasterService;
|
|
17
|
+
this.guard = guard;
|
|
18
|
+
this.router = router;
|
|
19
|
+
this.route = route;
|
|
20
|
+
this.warehouseService = warehouseService;
|
|
21
|
+
this.erpOptions = [
|
|
22
|
+
{ value: 'MIKRO', label: 'Mikro ERP' },
|
|
23
|
+
];
|
|
24
|
+
this.warehouses = [];
|
|
25
|
+
this.binLocations = [];
|
|
26
|
+
this.isLoadingBinLocations = false;
|
|
27
|
+
this.form = {
|
|
28
|
+
erpType: 'MIKRO',
|
|
29
|
+
baseUrl: '',
|
|
30
|
+
apiKey: '',
|
|
31
|
+
username: '',
|
|
32
|
+
password: '',
|
|
33
|
+
isActive: true,
|
|
34
|
+
fromWarehouseCode: '',
|
|
35
|
+
targetWarehouseCode: '',
|
|
36
|
+
dummyBoxCode: '',
|
|
37
|
+
beeCellUsername: '',
|
|
38
|
+
beeCellPassword: '',
|
|
39
|
+
};
|
|
40
|
+
this.passwordSet = false;
|
|
41
|
+
this.beeCellPasswordSet = false;
|
|
42
|
+
this.isLoading = false;
|
|
43
|
+
this.isSaving = false;
|
|
44
|
+
}
|
|
45
|
+
ngOnInit() {
|
|
46
|
+
const reason = this.route.snapshot.queryParamMap.get('reason');
|
|
47
|
+
if (reason === 'no-config') {
|
|
48
|
+
this.toasterService.warn('Connector parametreleri yapılandırılmamış.');
|
|
49
|
+
}
|
|
50
|
+
this.loadData();
|
|
51
|
+
}
|
|
52
|
+
// İki API'yi birlikte bekle: depo listesi hazır olmadan form render edilmez,
|
|
53
|
+
// böylece ngModel option geçişi (race condition) yaşanmaz.
|
|
54
|
+
loadData() {
|
|
55
|
+
this.isLoading = true;
|
|
56
|
+
forkJoin({
|
|
57
|
+
params: this.connectorParamsService.getConnectorParams(),
|
|
58
|
+
warehouses: this.warehouseService.getSmartWarehouses().pipe(catchError(() => of([]))),
|
|
59
|
+
}).subscribe({
|
|
60
|
+
next: ({ params, warehouses }) => {
|
|
61
|
+
this.warehouses = warehouses;
|
|
62
|
+
if (params) {
|
|
63
|
+
this.form.erpType = params.erpType ?? 'MIKRO';
|
|
64
|
+
this.form.baseUrl = params.baseUrl ?? '';
|
|
65
|
+
this.form.apiKey = params.apiKey ?? '';
|
|
66
|
+
this.form.username = params.username ?? '';
|
|
67
|
+
this.form.isActive = params.isActive;
|
|
68
|
+
this.form.password = '';
|
|
69
|
+
this.form.fromWarehouseCode = params.fromWarehouseCode ?? '';
|
|
70
|
+
this.form.targetWarehouseCode = params.targetWarehouseCode ?? '';
|
|
71
|
+
this.form.dummyBoxCode = params.dummyBoxCode ?? '';
|
|
72
|
+
this.form.beeCellUsername = params.beeCellUsername ?? '';
|
|
73
|
+
this.form.beeCellPassword = '';
|
|
74
|
+
this.passwordSet = params.passwordSet;
|
|
75
|
+
this.beeCellPasswordSet = params.beeCellPasswordSet ?? false;
|
|
76
|
+
}
|
|
77
|
+
this.isLoading = false;
|
|
78
|
+
// Kayıtlı kaynak depo varsa, Dummy Kasa combobox'ının o depoya ait depo yerleriyle dolması için yükle.
|
|
79
|
+
if (this.form.fromWarehouseCode) {
|
|
80
|
+
this.loadBinLocations(this.form.fromWarehouseCode);
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
error: err => {
|
|
84
|
+
this.toasterService.error(err?.error?.error?.message ?? 'Parametreler yüklenirken bir hata oluştu.');
|
|
85
|
+
this.isLoading = false;
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
get isCurrentFromWhsInList() {
|
|
90
|
+
return this.warehouses.some(w => w.WhsCode === this.form.fromWarehouseCode);
|
|
91
|
+
}
|
|
92
|
+
get isCurrentWhsInList() {
|
|
93
|
+
return this.warehouses.some(w => w.WhsCode === this.form.targetWarehouseCode);
|
|
94
|
+
}
|
|
95
|
+
get isCurrentDummyBoxInList() {
|
|
96
|
+
return this.binLocations.some(b => b.BinCode === this.form.dummyBoxCode);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Kaynak Depo seçimi değiştiğinde çalışır: Dummy Kasa combobox'ını seçilen deponun
|
|
100
|
+
* depo yerleriyle doldurur. Depo değiştiği için önceki depoya ait seçim artık geçerli değil.
|
|
101
|
+
*/
|
|
102
|
+
onFromWarehouseChange(whsCode) {
|
|
103
|
+
this.form.fromWarehouseCode = whsCode;
|
|
104
|
+
this.form.dummyBoxCode = '';
|
|
105
|
+
this.loadBinLocations(whsCode);
|
|
106
|
+
}
|
|
107
|
+
loadBinLocations(whsCode) {
|
|
108
|
+
if (!whsCode) {
|
|
109
|
+
this.binLocations = [];
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.isLoadingBinLocations = true;
|
|
113
|
+
this.warehouseService.getBinLocationsByWarehouse(whsCode).subscribe({
|
|
114
|
+
next: (bins) => {
|
|
115
|
+
this.binLocations = bins || [];
|
|
116
|
+
this.isLoadingBinLocations = false;
|
|
117
|
+
},
|
|
118
|
+
error: () => {
|
|
119
|
+
this.binLocations = [];
|
|
120
|
+
this.isLoadingBinLocations = false;
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
save() {
|
|
125
|
+
if (!this.form.erpType) {
|
|
126
|
+
this.toasterService.warn('ERP Sağlayıcısı zorunludur.');
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (!this.form.baseUrl?.trim()) {
|
|
130
|
+
this.toasterService.warn('Base URL zorunludur.');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (!this.form.apiKey?.trim()) {
|
|
134
|
+
this.toasterService.warn('API Key zorunludur.');
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (!this.form.username?.trim()) {
|
|
138
|
+
this.toasterService.warn('Kullanıcı Adı zorunludur.');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (!this.passwordSet && !this.form.password?.trim()) {
|
|
142
|
+
this.toasterService.warn('Şifre zorunludur.');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (!this.form.beeCellUsername?.trim()) {
|
|
146
|
+
this.toasterService.warn('BeeCell Kullanıcı Adı zorunludur.');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (!this.beeCellPasswordSet && !this.form.beeCellPassword?.trim()) {
|
|
150
|
+
this.toasterService.warn('BeeCell Şifresi zorunludur.');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
this.isSaving = true;
|
|
154
|
+
this.connectorParamsService.saveConnectorParams(this.form).subscribe({
|
|
155
|
+
next: () => {
|
|
156
|
+
this.toasterService.success('Parametreler başarıyla kaydedildi.');
|
|
157
|
+
if (this.form.password) {
|
|
158
|
+
this.passwordSet = true;
|
|
159
|
+
this.form.password = '';
|
|
160
|
+
}
|
|
161
|
+
if (this.form.beeCellPassword) {
|
|
162
|
+
this.beeCellPasswordSet = true;
|
|
163
|
+
this.form.beeCellPassword = '';
|
|
164
|
+
}
|
|
165
|
+
// Guard cache'ini güncelle — diğer ekranlar artık erişilebilir
|
|
166
|
+
this.guard.invalidate();
|
|
167
|
+
this.isSaving = false;
|
|
168
|
+
},
|
|
169
|
+
error: err => {
|
|
170
|
+
this.toasterService.error(err?.error?.error?.message ?? 'Kayıt sırasında bir hata oluştu.');
|
|
171
|
+
this.isSaving = false;
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
ConnectorParamsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsComponent, deps: [{ token: i1.ConnectorParamsService }, { token: i2.ToasterService }, { token: i3.ConnectorParamsGuard }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i5.WarehouseService }], target: i0.ɵɵFactoryTarget.Component });
|
|
177
|
+
ConnectorParamsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ConnectorParamsComponent, selector: "lib-connector-params", ngImport: i0, template: "<abp-page [title]=\"'Connector Parametreleri'\">\r\n <div class=\"connector-params-container\">\r\n\r\n <!-- Y\u00FCkleniyor -->\r\n <div class=\"text-center py-4\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-border text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Y\u00FCkleniyor...</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Form -->\r\n <div class=\"card connector-params-card\" [hidden]=\"isLoading\">\r\n <div class=\"card-body\">\r\n\r\n <!-- ERP Sa\u011Flay\u0131c\u0131s\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"erpTypeSelect\">ERP Sa\u011Flay\u0131c\u0131s\u0131 <span class=\"text-danger\">*</span></label>\r\n <select id=\"erpTypeSelect\" class=\"form-select\" [(ngModel)]=\"form.erpType\" required>\r\n <option *ngFor=\"let opt of erpOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Base URL -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"baseUrlInput\">Base URL <span class=\"text-danger\">*</span></label>\r\n <input id=\"baseUrlInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.baseUrl\"\r\n placeholder=\"https://erp-server:38080\" required />\r\n </div>\r\n\r\n <!-- API Key -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"apiKeyInput\">API Key <span class=\"text-danger\">*</span></label>\r\n <input id=\"apiKeyInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.apiKey\"\r\n placeholder=\"API anahtar\u0131\" required />\r\n </div>\r\n\r\n <!-- Kullan\u0131c\u0131 Ad\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"usernameInput\">Kullan\u0131c\u0131 Ad\u0131 <span class=\"text-danger\">*</span></label>\r\n <input id=\"usernameInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.username\"\r\n placeholder=\"Kullan\u0131c\u0131 ad\u0131\" required />\r\n </div>\r\n\r\n <!-- \u015Eifre -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"passwordInput\">\r\n \u015Eifre <span class=\"text-danger\">*</span>\r\n <span class=\"badge bg-success ms-2\" *ngIf=\"passwordSet && !form.password\">Kay\u0131tl\u0131</span>\r\n </label>\r\n <input id=\"passwordInput\" type=\"password\" class=\"form-control\"\r\n [(ngModel)]=\"form.password\"\r\n [placeholder]=\"passwordSet ? 'De\u011Fi\u015Ftirmek i\u00E7in yeni \u015Fifre girin, bo\u015F b\u0131rak\u0131rsan\u0131z mevcut \u015Fifre korunur' : '\u015Eifre'\" />\r\n <small class=\"text-muted\" *ngIf=\"passwordSet\">Mevcut \u015Fifreyi korumak i\u00E7in bo\u015F b\u0131rak\u0131n.</small>\r\n </div>\r\n\r\n <!-- BeeCell Kullan\u0131c\u0131 Ad\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"beeCellUsernameInput\">BeeCell Kullan\u0131c\u0131 Ad\u0131 <span class=\"text-danger\">*</span></label>\r\n <input id=\"beeCellUsernameInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.beeCellUsername\"\r\n placeholder=\"BeeCell kullan\u0131c\u0131 ad\u0131\" required />\r\n <small class=\"text-muted\">BeeCell/Orchestrator API giri\u015Fi i\u00E7in kullan\u0131l\u0131r (ERP kullan\u0131c\u0131s\u0131ndan ayr\u0131d\u0131r).</small>\r\n </div>\r\n\r\n <!-- BeeCell \u015Eifre -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"beeCellPasswordInput\">\r\n BeeCell \u015Eifre <span class=\"text-danger\">*</span>\r\n <span class=\"badge bg-success ms-2\" *ngIf=\"beeCellPasswordSet && !form.beeCellPassword\">Kay\u0131tl\u0131</span>\r\n </label>\r\n <input id=\"beeCellPasswordInput\" type=\"password\" class=\"form-control\"\r\n [(ngModel)]=\"form.beeCellPassword\"\r\n [placeholder]=\"beeCellPasswordSet ? 'De\u011Fi\u015Ftirmek i\u00E7in yeni \u015Fifre girin, bo\u015F b\u0131rak\u0131rsan\u0131z mevcut \u015Fifre korunur' : 'BeeCell \u015Fifresi'\" />\r\n <small class=\"text-muted\" *ngIf=\"beeCellPasswordSet\">Mevcut \u015Fifreyi korumak i\u00E7in bo\u015F b\u0131rak\u0131n.</small>\r\n </div>\r\n\r\n <!-- Kaynak Depo -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"fromWhsSelect\">\r\n Kaynak Depo (Stok Transfer)\r\n </label>\r\n <select id=\"fromWhsSelect\" class=\"form-select\"\r\n [ngModel]=\"form.fromWarehouseCode\"\r\n (ngModelChange)=\"onFromWarehouseChange($event)\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.fromWarehouseCode && !isCurrentFromWhsInList\"\r\n [value]=\"form.fromWarehouseCode\">\r\n {{ form.fromWarehouseCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let whs of warehouses\" [value]=\"whs.WhsCode\">\r\n {{ whs.WhsCode }} \u2013 {{ whs.WhsName }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\">G\u00F6rev Ba\u015Flat'ta olu\u015Fturulan stok naklinin kaynak deposu.</small>\r\n </div>\r\n\r\n <!-- Hedef Depo -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"targetWhsSelect\">\r\n Hedef Depo (Stok Transfer) <span class=\"text-danger\">*</span>\r\n </label>\r\n <select id=\"targetWhsSelect\" class=\"form-select\" [(ngModel)]=\"form.targetWarehouseCode\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.targetWarehouseCode && !isCurrentWhsInList\"\r\n [value]=\"form.targetWarehouseCode\">\r\n {{ form.targetWarehouseCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let whs of warehouses\" [value]=\"whs.WhsCode\">\r\n {{ whs.WhsCode }} \u2013 {{ whs.WhsName }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\">G\u00F6rev Ba\u015Flat'ta olu\u015Fturulan stok naklinin hedef deposu.</small>\r\n </div>\r\n\r\n <!-- Dummy Kasa -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"dummyBoxSelect\">Dummy Kasa Kodu</label>\r\n <select id=\"dummyBoxSelect\" class=\"form-select\"\r\n [(ngModel)]=\"form.dummyBoxCode\"\r\n [disabled]=\"!form.fromWarehouseCode || isLoadingBinLocations\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.dummyBoxCode && !isCurrentDummyBoxInList\"\r\n [value]=\"form.dummyBoxCode\">\r\n {{ form.dummyBoxCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let bin of binLocations\" [value]=\"bin.BinCode\">\r\n {{ bin.BinCode }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\" *ngIf=\"!form.fromWarehouseCode\">\u00D6nce Kaynak Depo se\u00E7in.</small>\r\n <small class=\"text-muted\" *ngIf=\"isLoadingBinLocations\">Depo yerleri y\u00FCkleniyor...</small>\r\n <small class=\"text-muted\" *ngIf=\"form.fromWarehouseCode && !isLoadingBinLocations\">\r\n Kasa Miktar\u0131 G\u00FCncelleme'de fiili say\u0131m fark\u0131n\u0131n muhasebele\u015Ftirildi\u011Fi SAP bin kodu \u2014 se\u00E7ilen kaynak deponun depo yeri.\r\n </small>\r\n </div>\r\n\r\n <!-- Aktif -->\r\n <div class=\"mb-4 form-check\">\r\n <input id=\"isActiveCheck\" type=\"checkbox\" class=\"form-check-input\"\r\n [(ngModel)]=\"form.isActive\" />\r\n <label class=\"form-check-label\" for=\"isActiveCheck\">Aktif</label>\r\n </div>\r\n\r\n <!-- Kaydet Butonu -->\r\n <div class=\"d-flex gap-2\">\r\n <button class=\"btn btn-primary\" (click)=\"save()\" [disabled]=\"isSaving\">\r\n <span *ngIf=\"isSaving\" class=\"spinner-border spinner-border-sm me-1\" role=\"status\"></span>\r\n {{ isSaving ? 'Kaydediliyor...' : 'Kaydet' }}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</abp-page>\r\n", styles: [".connector-params-container{padding:1rem 0}.connector-params-container .connector-params-card{max-width:640px}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
178
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsComponent, decorators: [{
|
|
179
|
+
type: Component,
|
|
180
|
+
args: [{ selector: 'lib-connector-params', encapsulation: ViewEncapsulation.None, template: "<abp-page [title]=\"'Connector Parametreleri'\">\r\n <div class=\"connector-params-container\">\r\n\r\n <!-- Y\u00FCkleniyor -->\r\n <div class=\"text-center py-4\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-border text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Y\u00FCkleniyor...</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Form -->\r\n <div class=\"card connector-params-card\" [hidden]=\"isLoading\">\r\n <div class=\"card-body\">\r\n\r\n <!-- ERP Sa\u011Flay\u0131c\u0131s\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"erpTypeSelect\">ERP Sa\u011Flay\u0131c\u0131s\u0131 <span class=\"text-danger\">*</span></label>\r\n <select id=\"erpTypeSelect\" class=\"form-select\" [(ngModel)]=\"form.erpType\" required>\r\n <option *ngFor=\"let opt of erpOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Base URL -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"baseUrlInput\">Base URL <span class=\"text-danger\">*</span></label>\r\n <input id=\"baseUrlInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.baseUrl\"\r\n placeholder=\"https://erp-server:38080\" required />\r\n </div>\r\n\r\n <!-- API Key -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"apiKeyInput\">API Key <span class=\"text-danger\">*</span></label>\r\n <input id=\"apiKeyInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.apiKey\"\r\n placeholder=\"API anahtar\u0131\" required />\r\n </div>\r\n\r\n <!-- Kullan\u0131c\u0131 Ad\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"usernameInput\">Kullan\u0131c\u0131 Ad\u0131 <span class=\"text-danger\">*</span></label>\r\n <input id=\"usernameInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.username\"\r\n placeholder=\"Kullan\u0131c\u0131 ad\u0131\" required />\r\n </div>\r\n\r\n <!-- \u015Eifre -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"passwordInput\">\r\n \u015Eifre <span class=\"text-danger\">*</span>\r\n <span class=\"badge bg-success ms-2\" *ngIf=\"passwordSet && !form.password\">Kay\u0131tl\u0131</span>\r\n </label>\r\n <input id=\"passwordInput\" type=\"password\" class=\"form-control\"\r\n [(ngModel)]=\"form.password\"\r\n [placeholder]=\"passwordSet ? 'De\u011Fi\u015Ftirmek i\u00E7in yeni \u015Fifre girin, bo\u015F b\u0131rak\u0131rsan\u0131z mevcut \u015Fifre korunur' : '\u015Eifre'\" />\r\n <small class=\"text-muted\" *ngIf=\"passwordSet\">Mevcut \u015Fifreyi korumak i\u00E7in bo\u015F b\u0131rak\u0131n.</small>\r\n </div>\r\n\r\n <!-- BeeCell Kullan\u0131c\u0131 Ad\u0131 -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"beeCellUsernameInput\">BeeCell Kullan\u0131c\u0131 Ad\u0131 <span class=\"text-danger\">*</span></label>\r\n <input id=\"beeCellUsernameInput\" type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"form.beeCellUsername\"\r\n placeholder=\"BeeCell kullan\u0131c\u0131 ad\u0131\" required />\r\n <small class=\"text-muted\">BeeCell/Orchestrator API giri\u015Fi i\u00E7in kullan\u0131l\u0131r (ERP kullan\u0131c\u0131s\u0131ndan ayr\u0131d\u0131r).</small>\r\n </div>\r\n\r\n <!-- BeeCell \u015Eifre -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"beeCellPasswordInput\">\r\n BeeCell \u015Eifre <span class=\"text-danger\">*</span>\r\n <span class=\"badge bg-success ms-2\" *ngIf=\"beeCellPasswordSet && !form.beeCellPassword\">Kay\u0131tl\u0131</span>\r\n </label>\r\n <input id=\"beeCellPasswordInput\" type=\"password\" class=\"form-control\"\r\n [(ngModel)]=\"form.beeCellPassword\"\r\n [placeholder]=\"beeCellPasswordSet ? 'De\u011Fi\u015Ftirmek i\u00E7in yeni \u015Fifre girin, bo\u015F b\u0131rak\u0131rsan\u0131z mevcut \u015Fifre korunur' : 'BeeCell \u015Fifresi'\" />\r\n <small class=\"text-muted\" *ngIf=\"beeCellPasswordSet\">Mevcut \u015Fifreyi korumak i\u00E7in bo\u015F b\u0131rak\u0131n.</small>\r\n </div>\r\n\r\n <!-- Kaynak Depo -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"fromWhsSelect\">\r\n Kaynak Depo (Stok Transfer)\r\n </label>\r\n <select id=\"fromWhsSelect\" class=\"form-select\"\r\n [ngModel]=\"form.fromWarehouseCode\"\r\n (ngModelChange)=\"onFromWarehouseChange($event)\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.fromWarehouseCode && !isCurrentFromWhsInList\"\r\n [value]=\"form.fromWarehouseCode\">\r\n {{ form.fromWarehouseCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let whs of warehouses\" [value]=\"whs.WhsCode\">\r\n {{ whs.WhsCode }} \u2013 {{ whs.WhsName }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\">G\u00F6rev Ba\u015Flat'ta olu\u015Fturulan stok naklinin kaynak deposu.</small>\r\n </div>\r\n\r\n <!-- Hedef Depo -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"targetWhsSelect\">\r\n Hedef Depo (Stok Transfer) <span class=\"text-danger\">*</span>\r\n </label>\r\n <select id=\"targetWhsSelect\" class=\"form-select\" [(ngModel)]=\"form.targetWarehouseCode\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.targetWarehouseCode && !isCurrentWhsInList\"\r\n [value]=\"form.targetWarehouseCode\">\r\n {{ form.targetWarehouseCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let whs of warehouses\" [value]=\"whs.WhsCode\">\r\n {{ whs.WhsCode }} \u2013 {{ whs.WhsName }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\">G\u00F6rev Ba\u015Flat'ta olu\u015Fturulan stok naklinin hedef deposu.</small>\r\n </div>\r\n\r\n <!-- Dummy Kasa -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"dummyBoxSelect\">Dummy Kasa Kodu</label>\r\n <select id=\"dummyBoxSelect\" class=\"form-select\"\r\n [(ngModel)]=\"form.dummyBoxCode\"\r\n [disabled]=\"!form.fromWarehouseCode || isLoadingBinLocations\">\r\n <option value=\"\">-- Se\u00E7iniz --</option>\r\n <option *ngIf=\"form.dummyBoxCode && !isCurrentDummyBoxInList\"\r\n [value]=\"form.dummyBoxCode\">\r\n {{ form.dummyBoxCode }} (Kay\u0131tl\u0131)\r\n </option>\r\n <option *ngFor=\"let bin of binLocations\" [value]=\"bin.BinCode\">\r\n {{ bin.BinCode }}\r\n </option>\r\n </select>\r\n <small class=\"text-muted\" *ngIf=\"!form.fromWarehouseCode\">\u00D6nce Kaynak Depo se\u00E7in.</small>\r\n <small class=\"text-muted\" *ngIf=\"isLoadingBinLocations\">Depo yerleri y\u00FCkleniyor...</small>\r\n <small class=\"text-muted\" *ngIf=\"form.fromWarehouseCode && !isLoadingBinLocations\">\r\n Kasa Miktar\u0131 G\u00FCncelleme'de fiili say\u0131m fark\u0131n\u0131n muhasebele\u015Ftirildi\u011Fi SAP bin kodu \u2014 se\u00E7ilen kaynak deponun depo yeri.\r\n </small>\r\n </div>\r\n\r\n <!-- Aktif -->\r\n <div class=\"mb-4 form-check\">\r\n <input id=\"isActiveCheck\" type=\"checkbox\" class=\"form-check-input\"\r\n [(ngModel)]=\"form.isActive\" />\r\n <label class=\"form-check-label\" for=\"isActiveCheck\">Aktif</label>\r\n </div>\r\n\r\n <!-- Kaydet Butonu -->\r\n <div class=\"d-flex gap-2\">\r\n <button class=\"btn btn-primary\" (click)=\"save()\" [disabled]=\"isSaving\">\r\n <span *ngIf=\"isSaving\" class=\"spinner-border spinner-border-sm me-1\" role=\"status\"></span>\r\n {{ isSaving ? 'Kaydediliyor...' : 'Kaydet' }}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</abp-page>\r\n", styles: [".connector-params-container{padding:1rem 0}.connector-params-container .connector-params-card{max-width:640px}\n"] }]
|
|
181
|
+
}], ctorParameters: function () { return [{ type: i1.ConnectorParamsService }, { type: i2.ToasterService }, { type: i3.ConnectorParamsGuard }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i5.WarehouseService }]; } });
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rvci1wYXJhbXMvY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rvci1wYXJhbXMvY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBVXJFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQWE1QyxNQUFNLE9BQU8sd0JBQXdCO0lBNEJuQyxZQUNVLHNCQUE4QyxFQUM5QyxjQUE4QixFQUM5QixLQUEyQixFQUMzQixNQUFjLEVBQ2QsS0FBcUIsRUFDckIsZ0JBQWtDO1FBTGxDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLFVBQUssR0FBTCxLQUFLLENBQXNCO1FBQzNCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBakM1QyxlQUFVLEdBQWdCO1lBQ3hCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO1NBQ3ZDLENBQUM7UUFFRixlQUFVLEdBQW1CLEVBQUUsQ0FBQztRQUNoQyxpQkFBWSxHQUFxQixFQUFFLENBQUM7UUFDcEMsMEJBQXFC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QUM7b0JBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztpQkFDekI7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztvQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO2lCQUNoQztnQkFDRCwrREFBK0Q7Z0JBQy9ELElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLGtDQUFrQyxDQUFDLENBQUM7Z0JBQzVGLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztxSEFsTFUsd0JBQXdCO3lHQUF4Qix3QkFBd0IsNERDeEJyQyw2OVFBK0pBOzJGRHZJYSx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGlCQUdqQixpQkFBaUIsQ0FBQyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJ0BhYnAvbmcudGhlbWUuc2hhcmVkJztcclxuaW1wb3J0IHtcclxuICBDb25uZWN0b3JQYXJhbXNTZXJ2aWNlLFxyXG4gIENvbm5lY3RvclBhcmFtc0R0byxcclxuICBTYXZlQ29ubmVjdG9yUGFyYW1zRHRvLFxyXG59IGZyb20gJy4uLy4uL2hpdC1wcm94eS9jb25uZWN0b3ItcGFyYW1zL2Nvbm5lY3Rvci1wYXJhbXMuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbm5lY3RvclBhcmFtc0d1YXJkIH0gZnJvbSAnLi4vLi4vZ3VhcmRzL2Nvbm5lY3Rvci1wYXJhbXMuZ3VhcmQnO1xyXG5pbXBvcnQgeyBXYXJlaG91c2VTZXJ2aWNlLCBXYXJlaG91c2VEdG8sIEJpbkxvY2F0aW9uRHRvIH0gZnJvbSAnLi4vLi4vaGl0LXByb3h5L3dhcmVob3VzZS93YXJlaG91c2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW50ZXJmYWNlIEVycE9wdGlvbiB7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1jb25uZWN0b3ItcGFyYW1zJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb25uZWN0b3JQYXJhbXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGVycE9wdGlvbnM6IEVycE9wdGlvbltdID0gW1xyXG4gICAgeyB2YWx1ZTogJ01JS1JPJywgbGFiZWw6ICdNaWtybyBFUlAnIH0sXHJcbiAgXTtcclxuXHJcbiAgd2FyZWhvdXNlczogV2FyZWhvdXNlRHRvW10gPSBbXTtcclxuICBiaW5Mb2NhdGlvbnM6IEJpbkxvY2F0aW9uRHRvW10gPSBbXTtcclxuICBpc0xvYWRpbmdCaW5Mb2NhdGlvbnMgPSBmYWxzZTtcclxuXHJcbiAgZm9ybTogU2F2ZUNvbm5lY3RvclBhcmFtc0R0byA9IHtcclxuICAgIGVycFR5cGU6ICdNSUtSTycsXHJcbiAgICBiYXNlVXJsOiAnJyxcclxuICAgIGFwaUtleTogJycsXHJcbiAgICB1c2VybmFtZTogJycsXHJcbiAgICBwYXNzd29yZDogJycsXHJcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcclxuICAgIGZyb21XYXJlaG91c2VDb2RlOiAnJyxcclxuICAgIHRhcmdldFdhcmVob3VzZUNvZGU6ICcnLFxyXG4gICAgZHVtbXlCb3hDb2RlOiAnJyxcclxuICAgIGJlZUNlbGxVc2VybmFtZTogJycsXHJcbiAgICBiZWVDZWxsUGFzc3dvcmQ6ICcnLFxyXG4gIH07XHJcblxyXG4gIHBhc3N3b3JkU2V0ID0gZmFsc2U7XHJcbiAgYmVlQ2VsbFBhc3N3b3JkU2V0ID0gZmFsc2U7XHJcbiAgaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgaXNTYXZpbmcgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbm5lY3RvclBhcmFtc1NlcnZpY2U6IENvbm5lY3RvclBhcmFtc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3VhcmQ6IENvbm5lY3RvclBhcmFtc0d1YXJkLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSB3YXJlaG91c2VTZXJ2aWNlOiBXYXJlaG91c2VTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCByZWFzb24gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdyZWFzb24nKTtcclxuICAgIGlmIChyZWFzb24gPT09ICduby1jb25maWcnKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignQ29ubmVjdG9yIHBhcmFtZXRyZWxlcmkgeWFwxLFsYW5kxLFyxLFsbWFtxLHFny4nKTtcclxuICAgIH1cclxuICAgIHRoaXMubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIC8vIMSwa2kgQVBJJ3lpIGJpcmxpa3RlIGJla2xlOiBkZXBvIGxpc3Rlc2kgaGF6xLFyIG9sbWFkYW4gZm9ybSByZW5kZXIgZWRpbG1leixcclxuICAvLyBiw7Z5bGVjZSBuZ01vZGVsIG9wdGlvbiBnZcOnacWfaSAocmFjZSBjb25kaXRpb24pIHlhxZ9hbm1hei5cclxuICBsb2FkRGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgcGFyYW1zOiB0aGlzLmNvbm5lY3RvclBhcmFtc1NlcnZpY2UuZ2V0Q29ubmVjdG9yUGFyYW1zKCksXHJcbiAgICAgIHdhcmVob3VzZXM6IHRoaXMud2FyZWhvdXNlU2VydmljZS5nZXRTbWFydFdhcmVob3VzZXMoKS5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgV2FyZWhvdXNlRHRvW10pKVxyXG4gICAgICApLFxyXG4gICAgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHsgcGFyYW1zLCB3YXJlaG91c2VzIH0pID0+IHtcclxuICAgICAgICB0aGlzLndhcmVob3VzZXMgPSB3YXJlaG91c2VzO1xyXG4gICAgICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgICAgIHRoaXMuZm9ybS5lcnBUeXBlICAgICAgICAgICAgID0gcGFyYW1zLmVycFR5cGUgID8/ICdNSUtSTyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uYmFzZVVybCAgICAgICAgICAgICA9IHBhcmFtcy5iYXNlVXJsICA/PyAnJztcclxuICAgICAgICAgIHRoaXMuZm9ybS5hcGlLZXkgICAgICAgICAgICAgID0gcGFyYW1zLmFwaUtleSAgID8/ICcnO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLnVzZXJuYW1lICAgICAgICAgICAgPSBwYXJhbXMudXNlcm5hbWUgPz8gJyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uaXNBY3RpdmUgICAgICAgICAgICA9IHBhcmFtcy5pc0FjdGl2ZTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5wYXNzd29yZCAgICAgICAgICAgID0gJyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uZnJvbVdhcmVob3VzZUNvZGUgICA9IHBhcmFtcy5mcm9tV2FyZWhvdXNlQ29kZSAgPz8gJyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0udGFyZ2V0V2FyZWhvdXNlQ29kZSA9IHBhcmFtcy50YXJnZXRXYXJlaG91c2VDb2RlID8/ICcnO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmR1bW15Qm94Q29kZSAgICAgICAgPSBwYXJhbXMuZHVtbXlCb3hDb2RlID8/ICcnO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmJlZUNlbGxVc2VybmFtZSAgICAgPSBwYXJhbXMuYmVlQ2VsbFVzZXJuYW1lID8/ICcnO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmJlZUNlbGxQYXNzd29yZCAgICAgPSAnJztcclxuICAgICAgICAgIHRoaXMucGFzc3dvcmRTZXQgICAgICAgICAgICAgID0gcGFyYW1zLnBhc3N3b3JkU2V0O1xyXG4gICAgICAgICAgdGhpcy5iZWVDZWxsUGFzc3dvcmRTZXQgICAgICAgPSBwYXJhbXMuYmVlQ2VsbFBhc3N3b3JkU2V0ID8/IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBLYXnEsXRsxLEga2F5bmFrIGRlcG8gdmFyc2EsIER1bW15IEthc2EgY29tYm9ib3gnxLFuxLFuIG8gZGVwb3lhIGFpdCBkZXBvIHllcmxlcml5bGUgZG9sbWFzxLEgacOnaW4gecO8a2xlLlxyXG4gICAgICAgIGlmICh0aGlzLmZvcm0uZnJvbVdhcmVob3VzZUNvZGUpIHtcclxuICAgICAgICAgIHRoaXMubG9hZEJpbkxvY2F0aW9ucyh0aGlzLmZvcm0uZnJvbVdhcmVob3VzZUNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IGVyciA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihlcnI/LmVycm9yPy5lcnJvcj8ubWVzc2FnZSA/PyAnUGFyYW1ldHJlbGVyIHnDvGtsZW5pcmtlbiBiaXIgaGF0YSBvbHXFn3R1LicpO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBpc0N1cnJlbnRGcm9tV2hzSW5MaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMud2FyZWhvdXNlcy5zb21lKHcgPT4gdy5XaHNDb2RlID09PSB0aGlzLmZvcm0uZnJvbVdhcmVob3VzZUNvZGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQ3VycmVudFdoc0luTGlzdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLndhcmVob3VzZXMuc29tZSh3ID0+IHcuV2hzQ29kZSA9PT0gdGhpcy5mb3JtLnRhcmdldFdhcmVob3VzZUNvZGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQ3VycmVudER1bW15Qm94SW5MaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYmluTG9jYXRpb25zLnNvbWUoYiA9PiBiLkJpbkNvZGUgPT09IHRoaXMuZm9ybS5kdW1teUJveENvZGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS2F5bmFrIERlcG8gc2XDp2ltaSBkZcSfacWfdGnEn2luZGUgw6dhbMSxxZ/EsXI6IER1bW15IEthc2EgY29tYm9ib3gnxLFuxLEgc2XDp2lsZW4gZGVwb251blxyXG4gICAqIGRlcG8geWVybGVyaXlsZSBkb2xkdXJ1ci4gRGVwbyBkZcSfacWfdGnEn2kgacOnaW4gw7ZuY2VraSBkZXBveWEgYWl0IHNlw6dpbSBhcnTEsWsgZ2XDp2VybGkgZGXEn2lsLlxyXG4gICAqL1xyXG4gIG9uRnJvbVdhcmVob3VzZUNoYW5nZSh3aHNDb2RlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybS5mcm9tV2FyZWhvdXNlQ29kZSA9IHdoc0NvZGU7XHJcbiAgICB0aGlzLmZvcm0uZHVtbXlCb3hDb2RlID0gJyc7XHJcbiAgICB0aGlzLmxvYWRCaW5Mb2NhdGlvbnMod2hzQ29kZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRCaW5Mb2NhdGlvbnMod2hzQ29kZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIXdoc0NvZGUpIHtcclxuICAgICAgdGhpcy5iaW5Mb2NhdGlvbnMgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nQmluTG9jYXRpb25zID0gdHJ1ZTtcclxuICAgIHRoaXMud2FyZWhvdXNlU2VydmljZS5nZXRCaW5Mb2NhdGlvbnNCeVdhcmVob3VzZSh3aHNDb2RlKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoYmlucykgPT4ge1xyXG4gICAgICAgIHRoaXMuYmluTG9jYXRpb25zID0gYmlucyB8fCBbXTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZ0JpbkxvY2F0aW9ucyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYmluTG9jYXRpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdCaW5Mb2NhdGlvbnMgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5mb3JtLmVycFR5cGUpIHtcclxuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKCdFUlAgU2HEn2xhecSxY8Sxc8SxIHpvcnVubHVkdXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5mb3JtLmJhc2VVcmw/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0Jhc2UgVVJMIHpvcnVubHVkdXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5mb3JtLmFwaUtleT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignQVBJIEtleSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZm9ybS51c2VybmFtZT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignS3VsbGFuxLFjxLEgQWTEsSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucGFzc3dvcmRTZXQgJiYgIXRoaXMuZm9ybS5wYXNzd29yZD8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignxZ5pZnJlIHpvcnVubHVkdXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5mb3JtLmJlZUNlbGxVc2VybmFtZT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignQmVlQ2VsbCBLdWxsYW7EsWPEsSBBZMSxIHpvcnVubHVkdXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5iZWVDZWxsUGFzc3dvcmRTZXQgJiYgIXRoaXMuZm9ybS5iZWVDZWxsUGFzc3dvcmQ/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0JlZUNlbGwgxZ5pZnJlc2kgem9ydW5sdWR1ci4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb25uZWN0b3JQYXJhbXNTZXJ2aWNlLnNhdmVDb25uZWN0b3JQYXJhbXModGhpcy5mb3JtKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKCdQYXJhbWV0cmVsZXIgYmHFn2FyxLF5bGEga2F5ZGVkaWxkaS4nKTtcclxuICAgICAgICBpZiAodGhpcy5mb3JtLnBhc3N3b3JkKSB7XHJcbiAgICAgICAgICB0aGlzLnBhc3N3b3JkU2V0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5wYXNzd29yZCA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5mb3JtLmJlZUNlbGxQYXNzd29yZCkge1xyXG4gICAgICAgICAgdGhpcy5iZWVDZWxsUGFzc3dvcmRTZXQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmJlZUNlbGxQYXNzd29yZCA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBHdWFyZCBjYWNoZSdpbmkgZ8O8bmNlbGxlIOKAlCBkacSfZXIgZWtyYW5sYXIgYXJ0xLFrIGVyacWfaWxlYmlsaXJcclxuICAgICAgICB0aGlzLmd1YXJkLmludmFsaWRhdGUoKTtcclxuICAgICAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoZXJyPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgPz8gJ0thecSxdCBzxLFyYXPEsW5kYSBiaXIgaGF0YSBvbHXFn3R1LicpO1xyXG4gICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8YWJwLXBhZ2UgW3RpdGxlXT1cIidDb25uZWN0b3IgUGFyYW1ldHJlbGVyaSdcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29ubmVjdG9yLXBhcmFtcy1jb250YWluZXJcIj5cclxuXHJcbiAgICA8IS0tIFnDvGtsZW5peW9yIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTRcIiAqbmdJZj1cImlzTG9hZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1wcmltYXJ5XCIgcm9sZT1cInN0YXR1c1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+WcO8a2xlbml5b3IuLi48L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgY29ubmVjdG9yLXBhcmFtcy1jYXJkXCIgW2hpZGRlbl09XCJpc0xvYWRpbmdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG5cclxuICAgICAgICA8IS0tIEVSUCBTYcSfbGF5xLFjxLFzxLEgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJlcnBUeXBlU2VsZWN0XCI+RVJQIFNhxJ9sYXnEsWPEsXPEsSA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgPHNlbGVjdCBpZD1cImVycFR5cGVTZWxlY3RcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJmb3JtLmVycFR5cGVcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0IG9mIGVycE9wdGlvbnNcIiBbdmFsdWVdPVwib3B0LnZhbHVlXCI+e3sgb3B0LmxhYmVsIH19PC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBCYXNlIFVSTCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cImJhc2VVcmxJbnB1dFwiPkJhc2UgVVJMIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJiYXNlVXJsSW5wdXRcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm0uYmFzZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJodHRwczovL2VycC1zZXJ2ZXI6MzgwODBcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEFQSSBLZXkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJhcGlLZXlJbnB1dFwiPkFQSSBLZXkgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBpZD1cImFwaUtleUlucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtLmFwaUtleVwiXHJcbiAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJBUEkgYW5haHRhcsSxXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBLdWxsYW7EsWPEsSBBZMSxIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwidXNlcm5hbWVJbnB1dFwiPkt1bGxhbsSxY8SxIEFkxLEgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBpZD1cInVzZXJuYW1lSW5wdXRcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm0udXNlcm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiS3VsbGFuxLFjxLEgYWTEsVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gxZ5pZnJlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwicGFzc3dvcmRJbnB1dFwiPlxyXG4gICAgICAgICAgICDFnmlmcmUgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2VzcyBtcy0yXCIgKm5nSWY9XCJwYXNzd29yZFNldCAmJiAhZm9ybS5wYXNzd29yZFwiPkthecSxdGzEsTwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJwYXNzd29yZElucHV0XCIgdHlwZT1cInBhc3N3b3JkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybS5wYXNzd29yZFwiXHJcbiAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBhc3N3b3JkU2V0ID8gJ0RlxJ9pxZ90aXJtZWsgacOnaW4geWVuaSDFn2lmcmUgZ2lyaW4sIGJvxZ8gYsSxcmFrxLFyc2FuxLF6IG1ldmN1dCDFn2lmcmUga29ydW51cicgOiAnxZ5pZnJlJ1wiIC8+XHJcbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJwYXNzd29yZFNldFwiPk1ldmN1dCDFn2lmcmV5aSBrb3J1bWFrIGnDp2luIGJvxZ8gYsSxcmFrxLFuLjwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQmVlQ2VsbCBLdWxsYW7EsWPEsSBBZMSxIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiYmVlQ2VsbFVzZXJuYW1lSW5wdXRcIj5CZWVDZWxsIEt1bGxhbsSxY8SxIEFkxLEgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBpZD1cImJlZUNlbGxVc2VybmFtZUlucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtLmJlZUNlbGxVc2VybmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCZWVDZWxsIGt1bGxhbsSxY8SxIGFkxLFcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPkJlZUNlbGwvT3JjaGVzdHJhdG9yIEFQSSBnaXJpxZ9pIGnDp2luIGt1bGxhbsSxbMSxciAoRVJQIGt1bGxhbsSxY8Sxc8SxbmRhbiBheXLEsWTEsXIpLjwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQmVlQ2VsbCDFnmlmcmUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJiZWVDZWxsUGFzc3dvcmRJbnB1dFwiPlxyXG4gICAgICAgICAgICBCZWVDZWxsIMWeaWZyZSA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zdWNjZXNzIG1zLTJcIiAqbmdJZj1cImJlZUNlbGxQYXNzd29yZFNldCAmJiAhZm9ybS5iZWVDZWxsUGFzc3dvcmRcIj5LYXnEsXRsxLE8L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IGlkPVwiYmVlQ2VsbFBhc3N3b3JkSW5wdXRcIiB0eXBlPVwicGFzc3dvcmRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtLmJlZUNlbGxQYXNzd29yZFwiXHJcbiAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImJlZUNlbGxQYXNzd29yZFNldCA/ICdEZcSfacWfdGlybWVrIGnDp2luIHllbmkgxZ9pZnJlIGdpcmluLCBib8WfIGLEsXJha8SxcnNhbsSxeiBtZXZjdXQgxZ9pZnJlIGtvcnVudXInIDogJ0JlZUNlbGwgxZ9pZnJlc2knXCIgLz5cclxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIiAqbmdJZj1cImJlZUNlbGxQYXNzd29yZFNldFwiPk1ldmN1dCDFn2lmcmV5aSBrb3J1bWFrIGnDp2luIGJvxZ8gYsSxcmFrxLFuLjwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gS2F5bmFrIERlcG8gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJmcm9tV2hzU2VsZWN0XCI+XHJcbiAgICAgICAgICAgIEtheW5hayBEZXBvIChTdG9rIFRyYW5zZmVyKVxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJmcm9tV2hzU2VsZWN0XCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZvcm0uZnJvbVdhcmVob3VzZUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZyb21XYXJlaG91c2VDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gU2XDp2luaXogLS08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImZvcm0uZnJvbVdhcmVob3VzZUNvZGUgJiYgIWlzQ3VycmVudEZyb21XaHNJbkxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmZyb21XYXJlaG91c2VDb2RlXCI+XHJcbiAgICAgICAgICAgICAge3sgZm9ybS5mcm9tV2FyZWhvdXNlQ29kZSB9fSAoS2F5xLF0bMSxKVxyXG4gICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgd2hzIG9mIHdhcmVob3VzZXNcIiBbdmFsdWVdPVwid2hzLldoc0NvZGVcIj5cclxuICAgICAgICAgICAgICB7eyB3aHMuV2hzQ29kZSB9fSDigJMge3sgd2hzLldoc05hbWUgfX1cclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj5Hw7ZyZXYgQmHFn2xhdCd0YSBvbHXFn3R1cnVsYW4gc3RvayBuYWtsaW5pbiBrYXluYWsgZGVwb3N1Ljwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gSGVkZWYgRGVwbyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cInRhcmdldFdoc1NlbGVjdFwiPlxyXG4gICAgICAgICAgICBIZWRlZiBEZXBvIChTdG9rIFRyYW5zZmVyKSA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8c2VsZWN0IGlkPVwidGFyZ2V0V2hzU2VsZWN0XCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZm9ybS50YXJnZXRXYXJlaG91c2VDb2RlXCI+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZcOnaW5peiAtLTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwiZm9ybS50YXJnZXRXYXJlaG91c2VDb2RlICYmICFpc0N1cnJlbnRXaHNJbkxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLnRhcmdldFdhcmVob3VzZUNvZGVcIj5cclxuICAgICAgICAgICAgICB7eyBmb3JtLnRhcmdldFdhcmVob3VzZUNvZGUgfX0gKEthecSxdGzEsSlcclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHdocyBvZiB3YXJlaG91c2VzXCIgW3ZhbHVlXT1cIndocy5XaHNDb2RlXCI+XHJcbiAgICAgICAgICAgICAge3sgd2hzLldoc0NvZGUgfX0g4oCTIHt7IHdocy5XaHNOYW1lIH19XHJcbiAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+R8O2cmV2IEJhxZ9sYXQndGEgb2x1xZ90dXJ1bGFuIHN0b2sgbmFrbGluaW4gaGVkZWYgZGVwb3N1Ljwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gRHVtbXkgS2FzYSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cImR1bW15Qm94U2VsZWN0XCI+RHVtbXkgS2FzYSBLb2R1PC9sYWJlbD5cclxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJkdW1teUJveFNlbGVjdFwiIGNsYXNzPVwiZm9ybS1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm0uZHVtbXlCb3hDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmb3JtLmZyb21XYXJlaG91c2VDb2RlIHx8IGlzTG9hZGluZ0JpbkxvY2F0aW9uc1wiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gU2XDp2luaXogLS08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImZvcm0uZHVtbXlCb3hDb2RlICYmICFpc0N1cnJlbnREdW1teUJveEluTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZHVtbXlCb3hDb2RlXCI+XHJcbiAgICAgICAgICAgICAge3sgZm9ybS5kdW1teUJveENvZGUgfX0gKEthecSxdGzEsSlcclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGJpbiBvZiBiaW5Mb2NhdGlvbnNcIiBbdmFsdWVdPVwiYmluLkJpbkNvZGVcIj5cclxuICAgICAgICAgICAgICB7eyBiaW4uQmluQ29kZSB9fVxyXG4gICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiICpuZ0lmPVwiIWZvcm0uZnJvbVdhcmVob3VzZUNvZGVcIj7Dlm5jZSBLYXluYWsgRGVwbyBzZcOnaW4uPC9zbWFsbD5cclxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIiAqbmdJZj1cImlzTG9hZGluZ0JpbkxvY2F0aW9uc1wiPkRlcG8geWVybGVyaSB5w7xrbGVuaXlvci4uLjwvc21hbGw+XHJcbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJmb3JtLmZyb21XYXJlaG91c2VDb2RlICYmICFpc0xvYWRpbmdCaW5Mb2NhdGlvbnNcIj5cclxuICAgICAgICAgICAgS2FzYSBNaWt0YXLEsSBHw7xuY2VsbGVtZSdkZSBmaWlsaSBzYXnEsW0gZmFya8SxbsSxbiBtdWhhc2ViZWxlxZ90aXJpbGRpxJ9pIFNBUCBiaW4ga29kdSDigJQgc2XDp2lsZW4ga2F5bmFrIGRlcG9udW4gZGVwbyB5ZXJpLlxyXG4gICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBBa3RpZiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItNCBmb3JtLWNoZWNrXCI+XHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJpc0FjdGl2ZUNoZWNrXCIgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm0uaXNBY3RpdmVcIiAvPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImlzQWN0aXZlQ2hlY2tcIj5Ba3RpZjwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gS2F5ZGV0IEJ1dG9udSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInNhdmUoKVwiIFtkaXNhYmxlZF09XCJpc1NhdmluZ1wiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU2F2aW5nXCIgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0xXCIgcm9sZT1cInN0YXR1c1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAge3sgaXNTYXZpbmcgPyAnS2F5ZGVkaWxpeW9yLi4uJyA6ICdLYXlkZXQnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvZGl2PlxyXG48L2FicC1wYWdlPlxyXG4iXX0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { CoreModule } from '@abp/ng.core';
|
|
2
|
+
import { ThemeSharedModule } from '@abp/ng.theme.shared';
|
|
3
|
+
import { NgModule } from '@angular/core';
|
|
4
|
+
import { FormsModule } from '@angular/forms';
|
|
5
|
+
import { RouterModule } from '@angular/router';
|
|
6
|
+
import { PageModule } from '@abp/ng.components/page';
|
|
7
|
+
import { ConnectorParamsComponent } from './connector-params.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/router";
|
|
10
|
+
const routes = [
|
|
11
|
+
{ path: '', component: ConnectorParamsComponent },
|
|
12
|
+
];
|
|
13
|
+
export class ConnectorParamsModule {
|
|
14
|
+
}
|
|
15
|
+
ConnectorParamsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
16
|
+
ConnectorParamsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, declarations: [ConnectorParamsComponent], imports: [CoreModule,
|
|
17
|
+
ThemeSharedModule,
|
|
18
|
+
FormsModule,
|
|
19
|
+
PageModule, i1.RouterModule] });
|
|
20
|
+
ConnectorParamsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, imports: [CoreModule,
|
|
21
|
+
ThemeSharedModule,
|
|
22
|
+
FormsModule,
|
|
23
|
+
PageModule,
|
|
24
|
+
RouterModule.forChild(routes)] });
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, decorators: [{
|
|
26
|
+
type: NgModule,
|
|
27
|
+
args: [{
|
|
28
|
+
declarations: [ConnectorParamsComponent],
|
|
29
|
+
imports: [
|
|
30
|
+
CoreModule,
|
|
31
|
+
ThemeSharedModule,
|
|
32
|
+
FormsModule,
|
|
33
|
+
PageModule,
|
|
34
|
+
RouterModule.forChild(routes),
|
|
35
|
+
],
|
|
36
|
+
}]
|
|
37
|
+
}] });
|
|
38
|
+
export function loadConnectorParamsModuleAsChild() {
|
|
39
|
+
return Promise.resolve(ConnectorParamsModule);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdG9yLXBhcmFtcy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rvci1wYXJhbXMvY29ubmVjdG9yLXBhcmFtcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7QUFFeEUsTUFBTSxNQUFNLEdBQVc7SUFDckIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSx3QkFBd0IsRUFBRTtDQUNsRCxDQUFDO0FBWUYsTUFBTSxPQUFPLHFCQUFxQjs7a0hBQXJCLHFCQUFxQjttSEFBckIscUJBQXFCLGlCQVRqQix3QkFBd0IsYUFFckMsVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixXQUFXO1FBQ1gsVUFBVTttSEFJRCxxQkFBcUIsWUFQOUIsVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixXQUFXO1FBQ1gsVUFBVTtRQUNWLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDOzJGQUdwQixxQkFBcUI7a0JBVmpDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsd0JBQXdCLENBQUM7b0JBQ3hDLE9BQU8sRUFBRTt3QkFDUCxVQUFVO3dCQUNWLGlCQUFpQjt3QkFDakIsV0FBVzt3QkFDWCxVQUFVO3dCQUNWLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO3FCQUM5QjtpQkFDRjs7QUFHRCxNQUFNLFVBQVUsZ0NBQWdDO0lBQzlDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb3JlTW9kdWxlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcclxuaW1wb3J0IHsgVGhlbWVTaGFyZWRNb2R1bGUgfSBmcm9tICdAYWJwL25nLnRoZW1lLnNoYXJlZCc7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFBhZ2VNb2R1bGUgfSBmcm9tICdAYWJwL25nLmNvbXBvbmVudHMvcGFnZSc7XHJcbmltcG9ydCB7IENvbm5lY3RvclBhcmFtc0NvbXBvbmVudCB9IGZyb20gJy4vY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQnO1xyXG5cclxuY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXHJcbiAgeyBwYXRoOiAnJywgY29tcG9uZW50OiBDb25uZWN0b3JQYXJhbXNDb21wb25lbnQgfSxcclxuXTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbQ29ubmVjdG9yUGFyYW1zQ29tcG9uZW50XSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb3JlTW9kdWxlLFxyXG4gICAgVGhlbWVTaGFyZWRNb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFBhZ2VNb2R1bGUsXHJcbiAgICBSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQocm91dGVzKSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29ubmVjdG9yUGFyYW1zTW9kdWxlIHt9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZENvbm5lY3RvclBhcmFtc01vZHVsZUFzQ2hpbGQoKSB7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDb25uZWN0b3JQYXJhbXNNb2R1bGUpO1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../hit-proxy/order-station/order-station.service";
|
|
4
|
+
import * as i2 from "@abp/ng.theme.shared";
|
|
5
|
+
import * as i3 from "@angular/common";
|
|
6
|
+
import * as i4 from "@angular/forms";
|
|
7
|
+
import * as i5 from "@abp/ng.components/page";
|
|
8
|
+
export class OrderStationComponent {
|
|
9
|
+
constructor(orderStationService, toasterService) {
|
|
10
|
+
this.orderStationService = orderStationService;
|
|
11
|
+
this.toasterService = toasterService;
|
|
12
|
+
this.stationCode = '';
|
|
13
|
+
this.eyeCode = '';
|
|
14
|
+
this.absBinEntry = '';
|
|
15
|
+
this.orderId = '';
|
|
16
|
+
this.isSaving = false;
|
|
17
|
+
this.isCheckingOrder = false;
|
|
18
|
+
this.orderStatus = null;
|
|
19
|
+
}
|
|
20
|
+
ngAfterViewInit() {
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
this.stationInputRef?.nativeElement?.focus();
|
|
23
|
+
}, 200);
|
|
24
|
+
}
|
|
25
|
+
onStationScanned() {
|
|
26
|
+
if (!this.stationCode?.trim())
|
|
27
|
+
return;
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
this.shelfInputRef?.nativeElement?.focus();
|
|
30
|
+
}, 100);
|
|
31
|
+
}
|
|
32
|
+
onShelfScanned() {
|
|
33
|
+
if (!this.eyeCode?.trim())
|
|
34
|
+
return;
|
|
35
|
+
setTimeout(() => {
|
|
36
|
+
this.binInputRef?.nativeElement?.focus();
|
|
37
|
+
}, 100);
|
|
38
|
+
}
|
|
39
|
+
onBinScanned() {
|
|
40
|
+
if (!this.absBinEntry?.trim())
|
|
41
|
+
return;
|
|
42
|
+
setTimeout(() => {
|
|
43
|
+
this.orderInputRef?.nativeElement?.focus();
|
|
44
|
+
}, 100);
|
|
45
|
+
}
|
|
46
|
+
onOrderChanged() {
|
|
47
|
+
this.orderStatus = null;
|
|
48
|
+
}
|
|
49
|
+
onOrderScanned() {
|
|
50
|
+
if (!this.orderId?.trim())
|
|
51
|
+
return;
|
|
52
|
+
const orderIdNum = Number(this.orderId.trim());
|
|
53
|
+
if (isNaN(orderIdNum)) {
|
|
54
|
+
this.toasterService.warn('Sipariş alanı sayısal bir değer olmalıdır.');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.checkOrderStatus(orderIdNum);
|
|
58
|
+
}
|
|
59
|
+
checkOrderStatus(docEntry) {
|
|
60
|
+
this.isCheckingOrder = true;
|
|
61
|
+
this.orderStatus = null;
|
|
62
|
+
this.orderStationService.getOrderStatus(docEntry).subscribe({
|
|
63
|
+
next: (result) => {
|
|
64
|
+
console.log(result);
|
|
65
|
+
this.orderStatus = result;
|
|
66
|
+
this.isCheckingOrder = false;
|
|
67
|
+
if (!result.IsEligibleForMatching) {
|
|
68
|
+
this.toasterService.error(`Bu siparişin durumu ${result.StatusText}. Eşleştirme işlemi yapılamaz.`);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
error: (error) => {
|
|
72
|
+
const errorMessage = error?.error?.error?.message || 'Sipariş durumu kontrol edilemedi.';
|
|
73
|
+
this.toasterService.error(errorMessage);
|
|
74
|
+
this.isCheckingOrder = false;
|
|
75
|
+
this.orderStatus = null;
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
onSave() {
|
|
80
|
+
if (!this.stationCode?.trim()) {
|
|
81
|
+
this.toasterService.warn('İstasyon alanı zorunludur.');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (!this.eyeCode?.trim()) {
|
|
85
|
+
this.toasterService.warn('Raf alanı zorunludur.');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (!this.absBinEntry?.trim()) {
|
|
89
|
+
this.toasterService.warn('Toplanacak Kasa alanı zorunludur.');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!this.orderId?.trim()) {
|
|
93
|
+
this.toasterService.warn('Sipariş alanı zorunludur.');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const eyeCodeNum = this.eyeCode.trim();
|
|
97
|
+
const absBinEntryNum = Number(this.absBinEntry.trim());
|
|
98
|
+
const orderIdNum = Number(this.orderId.trim());
|
|
99
|
+
if (isNaN(absBinEntryNum)) {
|
|
100
|
+
this.toasterService.warn('Toplanacak Kasa alanı sayısal bir değer olmalıdır.');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (isNaN(orderIdNum)) {
|
|
104
|
+
this.toasterService.warn('Sipariş alanı sayısal bir değer olmalıdır.');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (this.orderStatus && !this.orderStatus.IsEligibleForMatching) {
|
|
108
|
+
this.toasterService.error(`Bu siparişin durumu ${this.orderStatus.StatusText}. Eşleştirme işlemi yapılamaz.`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const dto = {
|
|
112
|
+
orderId: orderIdNum,
|
|
113
|
+
stationCode: this.stationCode.trim(),
|
|
114
|
+
eyeCode: eyeCodeNum,
|
|
115
|
+
absBinEntry: absBinEntryNum,
|
|
116
|
+
};
|
|
117
|
+
this.isSaving = true;
|
|
118
|
+
this.orderStationService.createOrderStation(dto).subscribe({
|
|
119
|
+
next: (result) => {
|
|
120
|
+
this.toasterService.success(result);
|
|
121
|
+
this.onClear();
|
|
122
|
+
this.isSaving = false;
|
|
123
|
+
},
|
|
124
|
+
error: (error) => {
|
|
125
|
+
const errorMessage = error?.error?.error?.message || 'İşlem sırasında bir hata oluştu.';
|
|
126
|
+
this.toasterService.error(errorMessage);
|
|
127
|
+
this.isSaving = false;
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
onClear() {
|
|
132
|
+
this.stationCode = '';
|
|
133
|
+
this.eyeCode = '';
|
|
134
|
+
this.absBinEntry = '';
|
|
135
|
+
this.orderId = '';
|
|
136
|
+
this.orderStatus = null;
|
|
137
|
+
setTimeout(() => {
|
|
138
|
+
this.stationInputRef?.nativeElement?.focus();
|
|
139
|
+
}, 100);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
OrderStationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OrderStationComponent, deps: [{ token: i1.OrderStationService }, { token: i2.ToasterService }], target: i0.ɵɵFactoryTarget.Component });
|
|
143
|
+
OrderStationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OrderStationComponent, selector: "lib-order-station", viewQueries: [{ propertyName: "stationInputRef", first: true, predicate: ["stationInput"], descendants: true }, { propertyName: "shelfInputRef", first: true, predicate: ["shelfInput"], descendants: true }, { propertyName: "binInputRef", first: true, predicate: ["binInput"], descendants: true }, { propertyName: "orderInputRef", first: true, predicate: ["orderInput"], descendants: true }], ngImport: i0, template: "<abp-page [title]=\"'Sipari\u015F-Toplama Noktas\u0131 E\u015Fle\u015Ftirme'\">\r\n <div class=\"order-station-container\">\r\n <div class=\"order-station-layout\">\r\n <div class=\"order-station-form-card\">\r\n\r\n <!-- \u0130stasyon -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"stationInput\">\u0130stasyon</label>\r\n <input #stationInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"stationInput\"\r\n [(ngModel)]=\"stationCode\"\r\n (keydown.enter)=\"onStationScanned()\"\r\n placeholder=\"\u0130stasyon kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Raf -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"shelfInput\">G\u00F6z</label>\r\n <input #shelfInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"shelfInput\"\r\n [(ngModel)]=\"eyeCode\"\r\n (keydown.enter)=\"onShelfScanned()\"\r\n placeholder=\"Raf kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Toplanacak Kasa -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"binInput\">Toplanacak Kasa</label>\r\n <input #binInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"binInput\"\r\n [(ngModel)]=\"absBinEntry\"\r\n (keydown.enter)=\"onBinScanned()\"\r\n placeholder=\"Toplanacak kasa kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Sipari\u015F -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"orderInput\">Sipari\u015F</label>\r\n <input #orderInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"orderInput\"\r\n [(ngModel)]=\"orderId\"\r\n (ngModelChange)=\"onOrderChanged()\"\r\n (keydown.enter)=\"onOrderScanned()\"\r\n placeholder=\"Sipari\u015F numaras\u0131n\u0131 okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Sipari\u015F Durum Bilgisi -->\r\n <div class=\"form-section\" *ngIf=\"isCheckingOrder\">\r\n <div class=\"status-loading\">\r\n <i class=\"fa fa-spinner fa-spin\"></i> Sipari\u015F durumu kontrol ediliyor...\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-section\" *ngIf=\"orderStatus && !isCheckingOrder\">\r\n <div class=\"status-card\" [ngClass]=\"{\r\n 'status-ok': orderStatus.IsEligibleForMatching,\r\n 'status-error': !orderStatus.IsEligibleForMatching\r\n }\">\r\n <i class=\"fa\" [ngClass]=\"orderStatus.IsEligibleForMatching ? 'fa-check-circle' : 'fa-times-circle'\"></i>\r\n <span *ngIf=\"orderStatus.IsEligibleForMatching\">\r\n Sipari\u015F Durumu: {{ orderStatus.StatusText }}\r\n </span>\r\n <span *ngIf=\"!orderStatus.IsEligibleForMatching\">\r\n Bu sipari\u015Fin durumu {{ orderStatus.StatusText }}. E\u015Fle\u015Ftirme i\u015Flemi yap\u0131lamaz.\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"form-divider\" />\r\n\r\n <!-- Buttons -->\r\n <div class=\"form-section button-group\">\r\n <button class=\"btn btn-action-success btn-sm\"\r\n (click)=\"onSave()\"\r\n [disabled]=\"isSaving || isCheckingOrder || !stationCode || !eyeCode || !absBinEntry || !orderId || !orderStatus || !orderStatus.IsEligibleForMatching\">\r\n <i class=\"fa\" [ngClass]=\"isSaving ? 'fa-spinner fa-spin' : 'fa-save'\"></i>\r\n {{ isSaving ? 'Kaydediliyor...' : 'Kaydet' }}\r\n </button>\r\n <button class=\"btn btn-action-outline btn-sm\"\r\n (click)=\"onClear()\"\r\n [disabled]=\"isSaving\">\r\n <i class=\"fa fa-eraser\"></i> Temizle\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n", styles: [".order-station-container{width:100%}.order-station-layout{display:flex;gap:20px;align-items:flex-start;justify-content:center}.order-station-form-card{background:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:20px 24px;box-shadow:0 1px 3px #0000000f;flex:0 0 500px;min-width:320px;max-width:500px}.form-divider{border:none;border-top:1px solid #eee;margin:14px 0}.form-section{margin-bottom:12px}.section-label{display:block;font-size:11px;font-weight:600;color:#6c757d;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}.form-input{height:40px;border:1px solid #ced4da;border-radius:6px;padding:0 12px;font-size:14px;background:#fff;transition:border-color .15s;width:100%}.form-input:focus{border-color:#556ee6;outline:none;box-shadow:0 0 0 2px #556ee626}.form-input[readonly]{background:#f5f5f5;color:#888}.status-loading{padding:10px 14px;background:#f8f9fa;border:1px solid #e0e0e0;border-radius:6px;font-size:13px;color:#6c757d}.status-loading i{margin-right:6px;color:#556ee6}.status-card{padding:10px 14px;border-radius:6px;font-size:13px;font-weight:500;display:flex;align-items:center;gap:8px}.status-card i{font-size:16px}.status-ok{background:#e8f5e9;border:1px solid #a5d6a7;color:#2e7d32}.status-ok i{color:#2e7d32}.status-error{background:#fbe9e7;border:1px solid #ef9a9a;color:#c62828}.status-error i{color:#c62828}.button-group{display:flex;gap:10px;margin-top:4px;flex-wrap:wrap}.button-group .btn{display:inline-flex;align-items:center;gap:6px;font-size:13px;padding:8px 20px;border-radius:6px;font-weight:500;white-space:nowrap;transition:all .15s;flex:1 1 0;justify-content:center;min-width:120px}.btn-action-success{background:#34c38f;color:#fff;border:none}.btn-action-success:hover{background:#2ca67a;color:#fff}.btn-action-success:disabled{background:#9dd3bd;color:#fff;cursor:not-allowed}.btn-action-outline{background:transparent;color:#556ee6;border:1px solid #556ee6}.btn-action-outline:hover{background:#556ee6;color:#fff}@media (max-width: 768px){.order-station-container{padding:0 8px}.order-station-form-card{padding:16px;min-width:100%;flex:1}.button-group{flex-direction:column}.button-group .btn{font-size:12px;padding:7px 14px;width:100%;flex:1 1 auto}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }] });
|
|
144
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OrderStationComponent, decorators: [{
|
|
145
|
+
type: Component,
|
|
146
|
+
args: [{ selector: 'lib-order-station', template: "<abp-page [title]=\"'Sipari\u015F-Toplama Noktas\u0131 E\u015Fle\u015Ftirme'\">\r\n <div class=\"order-station-container\">\r\n <div class=\"order-station-layout\">\r\n <div class=\"order-station-form-card\">\r\n\r\n <!-- \u0130stasyon -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"stationInput\">\u0130stasyon</label>\r\n <input #stationInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"stationInput\"\r\n [(ngModel)]=\"stationCode\"\r\n (keydown.enter)=\"onStationScanned()\"\r\n placeholder=\"\u0130stasyon kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Raf -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"shelfInput\">G\u00F6z</label>\r\n <input #shelfInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"shelfInput\"\r\n [(ngModel)]=\"eyeCode\"\r\n (keydown.enter)=\"onShelfScanned()\"\r\n placeholder=\"Raf kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Toplanacak Kasa -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"binInput\">Toplanacak Kasa</label>\r\n <input #binInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"binInput\"\r\n [(ngModel)]=\"absBinEntry\"\r\n (keydown.enter)=\"onBinScanned()\"\r\n placeholder=\"Toplanacak kasa kodunu okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Sipari\u015F -->\r\n <div class=\"form-section\">\r\n <label class=\"section-label\" for=\"orderInput\">Sipari\u015F</label>\r\n <input #orderInput\r\n type=\"text\"\r\n class=\"form-control form-input\"\r\n id=\"orderInput\"\r\n [(ngModel)]=\"orderId\"\r\n (ngModelChange)=\"onOrderChanged()\"\r\n (keydown.enter)=\"onOrderScanned()\"\r\n placeholder=\"Sipari\u015F numaras\u0131n\u0131 okutun...\"\r\n autocomplete=\"off\" />\r\n </div>\r\n\r\n <!-- Sipari\u015F Durum Bilgisi -->\r\n <div class=\"form-section\" *ngIf=\"isCheckingOrder\">\r\n <div class=\"status-loading\">\r\n <i class=\"fa fa-spinner fa-spin\"></i> Sipari\u015F durumu kontrol ediliyor...\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-section\" *ngIf=\"orderStatus && !isCheckingOrder\">\r\n <div class=\"status-card\" [ngClass]=\"{\r\n 'status-ok': orderStatus.IsEligibleForMatching,\r\n 'status-error': !orderStatus.IsEligibleForMatching\r\n }\">\r\n <i class=\"fa\" [ngClass]=\"orderStatus.IsEligibleForMatching ? 'fa-check-circle' : 'fa-times-circle'\"></i>\r\n <span *ngIf=\"orderStatus.IsEligibleForMatching\">\r\n Sipari\u015F Durumu: {{ orderStatus.StatusText }}\r\n </span>\r\n <span *ngIf=\"!orderStatus.IsEligibleForMatching\">\r\n Bu sipari\u015Fin durumu {{ orderStatus.StatusText }}. E\u015Fle\u015Ftirme i\u015Flemi yap\u0131lamaz.\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"form-divider\" />\r\n\r\n <!-- Buttons -->\r\n <div class=\"form-section button-group\">\r\n <button class=\"btn btn-action-success btn-sm\"\r\n (click)=\"onSave()\"\r\n [disabled]=\"isSaving || isCheckingOrder || !stationCode || !eyeCode || !absBinEntry || !orderId || !orderStatus || !orderStatus.IsEligibleForMatching\">\r\n <i class=\"fa\" [ngClass]=\"isSaving ? 'fa-spinner fa-spin' : 'fa-save'\"></i>\r\n {{ isSaving ? 'Kaydediliyor...' : 'Kaydet' }}\r\n </button>\r\n <button class=\"btn btn-action-outline btn-sm\"\r\n (click)=\"onClear()\"\r\n [disabled]=\"isSaving\">\r\n <i class=\"fa fa-eraser\"></i> Temizle\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n", styles: [".order-station-container{width:100%}.order-station-layout{display:flex;gap:20px;align-items:flex-start;justify-content:center}.order-station-form-card{background:#fff;border:1px solid #e0e0e0;border-radius:8px;padding:20px 24px;box-shadow:0 1px 3px #0000000f;flex:0 0 500px;min-width:320px;max-width:500px}.form-divider{border:none;border-top:1px solid #eee;margin:14px 0}.form-section{margin-bottom:12px}.section-label{display:block;font-size:11px;font-weight:600;color:#6c757d;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}.form-input{height:40px;border:1px solid #ced4da;border-radius:6px;padding:0 12px;font-size:14px;background:#fff;transition:border-color .15s;width:100%}.form-input:focus{border-color:#556ee6;outline:none;box-shadow:0 0 0 2px #556ee626}.form-input[readonly]{background:#f5f5f5;color:#888}.status-loading{padding:10px 14px;background:#f8f9fa;border:1px solid #e0e0e0;border-radius:6px;font-size:13px;color:#6c757d}.status-loading i{margin-right:6px;color:#556ee6}.status-card{padding:10px 14px;border-radius:6px;font-size:13px;font-weight:500;display:flex;align-items:center;gap:8px}.status-card i{font-size:16px}.status-ok{background:#e8f5e9;border:1px solid #a5d6a7;color:#2e7d32}.status-ok i{color:#2e7d32}.status-error{background:#fbe9e7;border:1px solid #ef9a9a;color:#c62828}.status-error i{color:#c62828}.button-group{display:flex;gap:10px;margin-top:4px;flex-wrap:wrap}.button-group .btn{display:inline-flex;align-items:center;gap:6px;font-size:13px;padding:8px 20px;border-radius:6px;font-weight:500;white-space:nowrap;transition:all .15s;flex:1 1 0;justify-content:center;min-width:120px}.btn-action-success{background:#34c38f;color:#fff;border:none}.btn-action-success:hover{background:#2ca67a;color:#fff}.btn-action-success:disabled{background:#9dd3bd;color:#fff;cursor:not-allowed}.btn-action-outline{background:transparent;color:#556ee6;border:1px solid #556ee6}.btn-action-outline:hover{background:#556ee6;color:#fff}@media (max-width: 768px){.order-station-container{padding:0 8px}.order-station-form-card{padding:16px;min-width:100%;flex:1}.button-group{flex-direction:column}.button-group .btn{font-size:12px;padding:7px 14px;width:100%;flex:1 1 auto}}\n"] }]
|
|
147
|
+
}], ctorParameters: function () { return [{ type: i1.OrderStationService }, { type: i2.ToasterService }]; }, propDecorators: { stationInputRef: [{
|
|
148
|
+
type: ViewChild,
|
|
149
|
+
args: ['stationInput', { static: false }]
|
|
150
|
+
}], shelfInputRef: [{
|
|
151
|
+
type: ViewChild,
|
|
152
|
+
args: ['shelfInput', { static: false }]
|
|
153
|
+
}], binInputRef: [{
|
|
154
|
+
type: ViewChild,
|
|
155
|
+
args: ['binInput', { static: false }]
|
|
156
|
+
}], orderInputRef: [{
|
|
157
|
+
type: ViewChild,
|
|
158
|
+
args: ['orderInput', { static: false }]
|
|
159
|
+
}] } });
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItc3RhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL29yZGVyLXN0YXRpb24vb3JkZXItc3RhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL29yZGVyLXN0YXRpb24vb3JkZXItc3RhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQVNqRSxNQUFNLE9BQU8scUJBQXFCO0lBZ0JoQyxZQUNVLG1CQUF3QyxFQUN4QyxjQUE4QjtRQUQ5Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQVp4QyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBQ3pCLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFFckIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUVqQyxnQkFBVyxHQUEwQixJQUFJLENBQUM7SUFLdkMsQ0FBQztJQUVKLGVBQWU7UUFDYixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDL0MsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRTtZQUFFLE9BQU87UUFDdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZ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LG1CQUFtQjt1SUFLaUIsZUFBZTtzQkFBNUQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNBLGFBQWE7c0JBQXhELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDQSxXQUFXO3NCQUFwRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0ksYUFBYTtzQkFBeEQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT3JkZXJTdGF0aW9uU2VydmljZSwgT3JkZXJTdGF0aW9uQ3JlYXRlRHRvLCBPcmRlclN0YXR1c0R0byB9IGZyb20gJy4uLy4uL2hpdC1wcm94eS9vcmRlci1zdGF0aW9uL29yZGVyLXN0YXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy50aGVtZS5zaGFyZWQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItb3JkZXItc3RhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL29yZGVyLXN0YXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL29yZGVyLXN0YXRpb24uY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyU3RhdGlvbkNvbXBvbmVudCB7XHJcbiAgQFZpZXdDaGlsZCgnc3RhdGlvbklucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIHN0YXRpb25JbnB1dFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdzaGVsZklucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIHNoZWxmSW5wdXRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnYmluSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgYmluSW5wdXRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnb3JkZXJJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBvcmRlcklucHV0UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICBzdGF0aW9uQ29kZTogc3RyaW5nID0gJyc7XHJcbiAgZXllQ29kZTogc3RyaW5nID0gJyc7XHJcbiAgYWJzQmluRW50cnk6IHN0cmluZyA9ICcnO1xyXG4gIG9yZGVySWQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICBpc1NhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ2hlY2tpbmdPcmRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBvcmRlclN0YXR1czogT3JkZXJTdGF0dXNEdG8gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG9yZGVyU3RhdGlvblNlcnZpY2U6IE9yZGVyU3RhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhdGlvbklucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIG9uU3RhdGlvblNjYW5uZWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc3RhdGlvbkNvZGU/LnRyaW0oKSkgcmV0dXJuO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hlbGZJbnB1dFJlZj8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBvblNoZWxmU2Nhbm5lZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5leWVDb2RlPy50cmltKCkpIHJldHVybjtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmJpbklucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIG9uQmluU2Nhbm5lZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5hYnNCaW5FbnRyeT8udHJpbSgpKSByZXR1cm47XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5vcmRlcklucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIG9uT3JkZXJDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vcmRlclN0YXR1cyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBvbk9yZGVyU2Nhbm5lZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5vcmRlcklkPy50cmltKCkpIHJldHVybjtcclxuICAgIGNvbnN0IG9yZGVySWROdW0gPSBOdW1iZXIodGhpcy5vcmRlcklkLnRyaW0oKSk7XHJcbiAgICBpZiAoaXNOYU4ob3JkZXJJZE51bSkpIHtcclxuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKCdTaXBhcmnFnyBhbGFuxLEgc2F5xLFzYWwgYmlyIGRlxJ9lciBvbG1hbMSxZMSxci4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGVja09yZGVyU3RhdHVzKG9yZGVySWROdW0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja09yZGVyU3RhdHVzKGRvY0VudHJ5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNDaGVja2luZ09yZGVyID0gdHJ1ZTtcclxuICAgIHRoaXMub3JkZXJTdGF0dXMgPSBudWxsO1xyXG4gICAgdGhpcy5vcmRlclN0YXRpb25TZXJ2aWNlLmdldE9yZGVyU3RhdHVzKGRvY0VudHJ5KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgICAgICB0aGlzLm9yZGVyU3RhdHVzID0gcmVzdWx0O1xyXG4gICAgICAgIHRoaXMuaXNDaGVja2luZ09yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQuSXNFbGlnaWJsZUZvck1hdGNoaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKFxyXG4gICAgICAgICAgICBgQnUgc2lwYXJpxZ9pbiBkdXJ1bXUgJHtyZXN1bHQuU3RhdHVzVGV4dH0uIEXFn2xlxZ90aXJtZSBpxZ9sZW1pIHlhcMSxbGFtYXouYFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgICAgZXJyb3I/LmVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCAnU2lwYXJpxZ8gZHVydW11IGtvbnRyb2wgZWRpbGVtZWRpLic7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuaXNDaGVja2luZ09yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vcmRlclN0YXR1cyA9IG51bGw7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zdGF0aW9uQ29kZT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignxLBzdGFzeW9uIGFsYW7EsSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZXllQ29kZT8udHJpbSgpKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignUmFmIGFsYW7EsSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuYWJzQmluRW50cnk/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ1RvcGxhbmFjYWsgS2FzYSBhbGFuxLEgem9ydW5sdWR1ci4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLm9yZGVySWQ/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ1NpcGFyacWfIGFsYW7EsSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXllQ29kZU51bSA9IHRoaXMuZXllQ29kZS50cmltKCk7XHJcbiAgICBjb25zdCBhYnNCaW5FbnRyeU51bSA9IE51bWJlcih0aGlzLmFic0JpbkVudHJ5LnRyaW0oKSk7XHJcbiAgICBjb25zdCBvcmRlcklkTnVtID0gTnVtYmVyKHRoaXMub3JkZXJJZC50cmltKCkpO1xyXG5cclxuICAgIGlmIChpc05hTihhYnNCaW5FbnRyeU51bSkpIHtcclxuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKCdUb3BsYW5hY2FrIEthc2EgYWxhbsSxIHNhecSxc2FsIGJpciBkZcSfZXIgb2xtYWzEsWTEsXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChpc05hTihvcmRlcklkTnVtKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ1NpcGFyacWfIGFsYW7EsSBzYXnEsXNhbCBiaXIgZGXEn2VyIG9sbWFsxLFkxLFyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3JkZXJTdGF0dXMgJiYgIXRoaXMub3JkZXJTdGF0dXMuSXNFbGlnaWJsZUZvck1hdGNoaW5nKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXHJcbiAgICAgICAgYEJ1IHNpcGFyacWfaW4gZHVydW11ICR7dGhpcy5vcmRlclN0YXR1cy5TdGF0dXNUZXh0fS4gRcWfbGXFn3Rpcm1lIGnFn2xlbWkgeWFwxLFsYW1hei5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkdG86IE9yZGVyU3RhdGlvbkNyZWF0ZUR0byA9IHtcclxuICAgICAgb3JkZXJJZDogb3JkZXJJZE51bSxcclxuICAgICAgc3RhdGlvbkNvZGU6IHRoaXMuc3RhdGlvbkNvZGUudHJpbSgpLFxyXG4gICAgICBleWVDb2RlOiBleWVDb2RlTnVtLFxyXG4gICAgICBhYnNCaW5FbnRyeTogYWJzQmluRW50cnlOdW0sXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5vcmRlclN0YXRpb25TZXJ2aWNlLmNyZWF0ZU9yZGVyU3RhdGlvbihkdG8pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MocmVzdWx0KTtcclxuICAgICAgICB0aGlzLm9uQ2xlYXIoKTtcclxuICAgICAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgICAgZXJyb3I/LmVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCAnxLDFn2xlbSBzxLFyYXPEsW5kYSBiaXIgaGF0YSBvbHXFn3R1Lic7XHJcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGlvbkNvZGUgPSAnJztcclxuICAgIHRoaXMuZXllQ29kZSA9ICcnO1xyXG4gICAgdGhpcy5hYnNCaW5FbnRyeSA9ICcnO1xyXG4gICAgdGhpcy5vcmRlcklkID0gJyc7XHJcbiAgICB0aGlzLm9yZGVyU3RhdHVzID0gbnVsbDtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN0YXRpb25JbnB1dFJlZj8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG59XHJcbiIsIjxhYnAtcGFnZSBbdGl0bGVdPVwiJ1NpcGFyacWfLVRvcGxhbWEgTm9rdGFzxLEgRcWfbGXFn3Rpcm1lJ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJvcmRlci1zdGF0aW9uLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm9yZGVyLXN0YXRpb24tbGF5b3V0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJvcmRlci1zdGF0aW9uLWZvcm0tY2FyZFwiPlxyXG5cclxuICAgICAgICA8IS0tIMSwc3Rhc3lvbiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZWN0aW9uLWxhYmVsXCIgZm9yPVwic3RhdGlvbklucHV0XCI+xLBzdGFzeW9uPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCAjc3RhdGlvbklucHV0XHJcbiAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgIGlkPVwic3RhdGlvbklucHV0XCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRpb25Db2RlXCJcclxuICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvblN0YXRpb25TY2FubmVkKClcIlxyXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwixLBzdGFzeW9uIGtvZHVudSBva3V0dW4uLi5cIlxyXG4gICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUmFmIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNlY3Rpb24tbGFiZWxcIiBmb3I9XCJzaGVsZklucHV0XCI+R8O2ejwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgI3NoZWxmSW5wdXRcclxuICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgaWQ9XCJzaGVsZklucHV0XCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImV5ZUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uU2hlbGZTY2FubmVkKClcIlxyXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmFmIGtvZHVudSBva3V0dW4uLi5cIlxyXG4gICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gVG9wbGFuYWNhayBLYXNhIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNlY3Rpb24tbGFiZWxcIiBmb3I9XCJiaW5JbnB1dFwiPlRvcGxhbmFjYWsgS2FzYTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgI2JpbklucHV0XHJcbiAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgIGlkPVwiYmluSW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWJzQmluRW50cnlcIlxyXG4gICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uQmluU2Nhbm5lZCgpXCJcclxuICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRvcGxhbmFjYWsga2FzYSBrb2R1bnUgb2t1dHVuLi4uXCJcclxuICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNpcGFyacWfIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNlY3Rpb24tbGFiZWxcIiBmb3I9XCJvcmRlcklucHV0XCI+U2lwYXJpxZ88L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0ICNvcmRlcklucHV0XHJcbiAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgIGlkPVwib3JkZXJJbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcmRlcklkXCJcclxuICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk9yZGVyQ2hhbmdlZCgpXCJcclxuICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbk9yZGVyU2Nhbm5lZCgpXCJcclxuICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNpcGFyacWfIG51bWFyYXPEsW7EsSBva3V0dW4uLi5cIlxyXG4gICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2lwYXJpxZ8gRHVydW0gQmlsZ2lzaSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgKm5nSWY9XCJpc0NoZWNraW5nT3JkZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtbG9hZGluZ1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpblwiPjwvaT4gU2lwYXJpxZ8gZHVydW11IGtvbnRyb2wgZWRpbGl5b3IuLi5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgKm5nSWY9XCJvcmRlclN0YXR1cyAmJiAhaXNDaGVja2luZ09yZGVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWNhcmRcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICdzdGF0dXMtb2snOiBvcmRlclN0YXR1cy5Jc0VsaWdpYmxlRm9yTWF0Y2hpbmcsXHJcbiAgICAgICAgICAgICdzdGF0dXMtZXJyb3InOiAhb3JkZXJTdGF0dXMuSXNFbGlnaWJsZUZvck1hdGNoaW5nXHJcbiAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFcIiBbbmdDbGFzc109XCJvcmRlclN0YXR1cy5Jc0VsaWdpYmxlRm9yTWF0Y2hpbmcgPyAnZmEtY2hlY2stY2lyY2xlJyA6ICdmYS10aW1lcy1jaXJjbGUnXCI+PC9pPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm9yZGVyU3RhdHVzLklzRWxpZ2libGVGb3JNYXRjaGluZ1wiPlxyXG4gICAgICAgICAgICAgIFNpcGFyacWfIER1cnVtdToge3sgb3JkZXJTdGF0dXMuU3RhdHVzVGV4dCB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIW9yZGVyU3RhdHVzLklzRWxpZ2libGVGb3JNYXRjaGluZ1wiPlxyXG4gICAgICAgICAgICAgIEJ1IHNpcGFyacWfaW4gZHVydW11IHt7IG9yZGVyU3RhdHVzLlN0YXR1c1RleHQgfX0uIEXFn2xlxZ90aXJtZSBpxZ9sZW1pIHlhcMSxbGFtYXouXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8aHIgY2xhc3M9XCJmb3JtLWRpdmlkZXJcIiAvPlxyXG5cclxuICAgICAgICA8IS0tIEJ1dHRvbnMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvbiBidXR0b24tZ3JvdXBcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1zdWNjZXNzIGJ0bi1zbVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNhdmUoKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZyB8fCBpc0NoZWNraW5nT3JkZXIgfHwgIXN0YXRpb25Db2RlIHx8ICFleWVDb2RlIHx8ICFhYnNCaW5FbnRyeSB8fCAhb3JkZXJJZCB8fCAhb3JkZXJTdGF0dXMgfHwgIW9yZGVyU3RhdHVzLklzRWxpZ2libGVGb3JNYXRjaGluZ1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhXCIgW25nQ2xhc3NdPVwiaXNTYXZpbmcgPyAnZmEtc3Bpbm5lciBmYS1zcGluJyA6ICdmYS1zYXZlJ1wiPjwvaT5cclxuICAgICAgICAgICAge3sgaXNTYXZpbmcgPyAnS2F5ZGVkaWxpeW9yLi4uJyA6ICdLYXlkZXQnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWFjdGlvbi1vdXRsaW5lIGJ0bi1zbVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsZWFyKClcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZpbmdcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lcmFzZXJcIj48L2k+IFRlbWl6bGVcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9hYnAtcGFnZT5cclxuIl19
|