@hitsoft/smart-warehouse 1.0.3 → 1.0.4

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.
@@ -0,0 +1,114 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import CustomStore from 'devextreme/data/custom_store';
3
+ import DataSource from 'devextreme/data/data_source';
4
+ import { Subject, firstValueFrom } from 'rxjs';
5
+ import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../hit-proxy/warehouse/warehouse.service";
8
+ import * as i2 from "@abp/ng.theme.shared";
9
+ import * as i3 from "@angular/common";
10
+ import * as i4 from "@angular/forms";
11
+ import * as i5 from "devextreme-angular";
12
+ import * as i6 from "devextreme-angular/ui/nested";
13
+ const DEFAULT_PAGE_SIZE = 50;
14
+ /**
15
+ * Dummy Kasa (depo yeri) seçim modalı.
16
+ *
17
+ * Depo yeri sayısı bir selectbox'a sığmayacak kadar çok olabildiği için grid ile çalışır ve
18
+ * sayfalama SUNUCU tarafındadır: grid her sayfa değişiminde yalnızca o sayfayı ister. Bu sayede
19
+ * "kaynak depo seçilince tüm depo yerlerini combobox'a doldur" davranışının yarattığı donma
20
+ * ortadan kalkar — veriler yalnızca modal açıldığında ve sayfa sayfa yüklenir.
21
+ */
22
+ export class BinLocationPickerComponent {
23
+ constructor(warehouseService, toaster) {
24
+ this.warehouseService = warehouseService;
25
+ this.toaster = toaster;
26
+ /** Seçim yapılacak kaynak depo kodu; sahibi bileşen ngModel ile geçirir. */
27
+ this.warehouseCode = '';
28
+ /** İki yönlü bağlanır; sahibi bileşen modalı bunu true yaparak açar. */
29
+ this.visible = false;
30
+ this.visibleChange = new EventEmitter();
31
+ this.selected = new EventEmitter();
32
+ this.pageSize = DEFAULT_PAGE_SIZE;
33
+ this.allowedPageSizes = [25, 50, 100];
34
+ this.searchTerm = '';
35
+ this.isSearching = false;
36
+ /** Her tuş vuruşunda sunucuya gitmemek için arama debounce edilir. */
37
+ this.searchInput = new Subject();
38
+ this.dataSource = new DataSource({
39
+ store: new CustomStore({
40
+ key: 'BinCode',
41
+ // Grid, filtreleme/sıralamayı sunucuya bırakır; yalnızca skip/take gelir.
42
+ loadMode: 'processed',
43
+ load: loadOptions => this.loadPage(loadOptions),
44
+ }),
45
+ paginate: true,
46
+ pageSize: DEFAULT_PAGE_SIZE,
47
+ requireTotalCount: true,
48
+ });
49
+ this.searchInput.pipe(debounceTime(350), distinctUntilChanged()).subscribe(() => {
50
+ // Yeni aramada ilk sayfaya dönülür, aksi halde kullanıcı boş bir sayfada kalabilir.
51
+ this.dataSource.pageIndex(0);
52
+ this.dataSource.reload();
53
+ });
54
+ }
55
+ /** Sahibi bileşen modalı açmadan hemen önce çağırır. */
56
+ open() {
57
+ // Arama kutusu boş açılır ki kullanıcı istediğinde doğrudan listeyi gezebilsin.
58
+ this.searchTerm = '';
59
+ this.visible = true;
60
+ this.visibleChange.emit(true);
61
+ this.dataSource.pageIndex(0);
62
+ this.dataSource.reload();
63
+ }
64
+ onSearchTermChange(term) {
65
+ this.searchInput.next(term);
66
+ }
67
+ onRowDoubleClick(event) {
68
+ if (event?.data) {
69
+ this.select(event.data);
70
+ }
71
+ }
72
+ select(bin) {
73
+ this.selected.emit(bin);
74
+ this.close();
75
+ }
76
+ close() {
77
+ this.visible = false;
78
+ this.visibleChange.emit(false);
79
+ }
80
+ async loadPage(loadOptions) {
81
+ if (!this.warehouseCode) {
82
+ return { data: [], totalCount: 0 };
83
+ }
84
+ const skip = loadOptions?.skip ?? 0;
85
+ const take = loadOptions?.take ?? DEFAULT_PAGE_SIZE;
86
+ this.isSearching = true;
87
+ try {
88
+ const result = await firstValueFrom(this.warehouseService.searchBinLocationsByWarehouse(this.warehouseCode, this.searchTerm.trim(), skip, take));
89
+ return { data: result?.Items ?? [], totalCount: result?.TotalCount ?? 0 };
90
+ }
91
+ catch (error) {
92
+ this.toaster.error(error?.error?.error?.message || 'Depo yerleri yüklenirken bir hata oluştu.');
93
+ return { data: [], totalCount: 0 };
94
+ }
95
+ finally {
96
+ this.isSearching = false;
97
+ }
98
+ }
99
+ }
100
+ BinLocationPickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BinLocationPickerComponent, deps: [{ token: i1.WarehouseService }, { token: i2.ToasterService }], target: i0.ɵɵFactoryTarget.Component });
101
+ BinLocationPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BinLocationPickerComponent, selector: "lib-bin-location-picker", inputs: { warehouseCode: "warehouseCode", visible: "visible" }, outputs: { visibleChange: "visibleChange", selected: "selected" }, ngImport: i0, template: "<abp-modal [(visible)]=\"visible\" [options]=\"{ size: 'lg' }\" (disappear)=\"close()\">\n <ng-template #abpHeader>\n <h3>Dummy Kasa Kodu Se\u00E7</h3>\n </ng-template>\n\n <ng-template #abpBody>\n <div class=\"mb-2\">\n <div class=\"input-group input-group-sm\">\n <span class=\"input-group-text\">\n <i class=\"fa\" [ngClass]=\"isSearching ? 'fa-spinner fa-spin' : 'fa-search'\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"Depo yeri kodu ile ara (bo\u015F b\u0131rak\u0131p sayfa sayfa da gezebilirsiniz)\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n />\n </div>\n <small class=\"text-muted\">Se\u00E7mek i\u00E7in sat\u0131ra \u00E7ift t\u0131klay\u0131n.</small>\n </div>\n\n <dx-data-grid\n [dataSource]=\"dataSource\"\n keyExpr=\"BinCode\"\n [remoteOperations]=\"{ paging: true }\"\n [showRowLines]=\"true\"\n [showBorders]=\"true\"\n [hoverStateEnabled]=\"true\"\n [columnAutoWidth]=\"true\"\n (onRowDblClick)=\"onRowDoubleClick($event)\"\n style=\"height: 45vh\"\n >\n <dxo-paging [pageSize]=\"pageSize\"></dxo-paging>\n <dxo-pager\n [visible]=\"true\"\n [showInfo]=\"true\"\n [showNavigationButtons]=\"true\"\n [showPageSizeSelector]=\"true\"\n [allowedPageSizes]=\"allowedPageSizes\"\n ></dxo-pager>\n <dxo-scrolling mode=\"standard\" showScrollbar=\"always\"></dxo-scrolling>\n <!-- S\u0131ralama kapal\u0131: sayfalama sunucuda oldu\u011Fu i\u00E7in istemci s\u0131ralamas\u0131 yaln\u0131zca a\u00E7\u0131k olan\n sayfay\u0131 s\u0131ralar ve kullan\u0131c\u0131ya t\u00FCm listeyi s\u0131ralad\u0131\u011F\u0131 izlenimini verirdi. Sunucu\n sorgusu zaten BinCode'a g\u00F6re s\u0131ral\u0131 d\u00F6ner. -->\n <dxo-sorting mode=\"none\"></dxo-sorting>\n\n <dxi-column dataField=\"BinCode\" caption=\"Depo Yeri Kodu\" [minWidth]=\"220\"></dxi-column>\n <dxi-column dataField=\"Warehouse\" caption=\"Depo\" [width]=\"120\"></dxi-column>\n </dx-data-grid>\n </ng-template>\n\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"close()\">Vazge\u00E7</button>\n </ng-template>\n</abp-modal>\n", styles: [":host ::ng-deep .dx-datagrid{font-size:12px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: i2.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "component", type: i5.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExporting", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i6.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i6.DxoPagerComponent, selector: "dxo-pager", inputs: ["allowedPageSizes", "displayMode", "infoText", "label", "showInfo", "showNavigationButtons", "showPageSizeSelector", "visible"] }, { kind: "component", type: i6.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i6.DxoScrollingComponent, selector: "dxo-scrolling", inputs: ["columnRenderingMode", "mode", "preloadEnabled", "renderAsync", "rowRenderingMode", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative"] }, { kind: "component", type: i6.DxoSortingComponent, selector: "dxo-sorting", inputs: ["ascendingText", "clearText", "descendingText", "mode", "showSortIndexes"] }] });
102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BinLocationPickerComponent, decorators: [{
103
+ type: Component,
104
+ args: [{ selector: 'lib-bin-location-picker', template: "<abp-modal [(visible)]=\"visible\" [options]=\"{ size: 'lg' }\" (disappear)=\"close()\">\n <ng-template #abpHeader>\n <h3>Dummy Kasa Kodu Se\u00E7</h3>\n </ng-template>\n\n <ng-template #abpBody>\n <div class=\"mb-2\">\n <div class=\"input-group input-group-sm\">\n <span class=\"input-group-text\">\n <i class=\"fa\" [ngClass]=\"isSearching ? 'fa-spinner fa-spin' : 'fa-search'\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"Depo yeri kodu ile ara (bo\u015F b\u0131rak\u0131p sayfa sayfa da gezebilirsiniz)\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n />\n </div>\n <small class=\"text-muted\">Se\u00E7mek i\u00E7in sat\u0131ra \u00E7ift t\u0131klay\u0131n.</small>\n </div>\n\n <dx-data-grid\n [dataSource]=\"dataSource\"\n keyExpr=\"BinCode\"\n [remoteOperations]=\"{ paging: true }\"\n [showRowLines]=\"true\"\n [showBorders]=\"true\"\n [hoverStateEnabled]=\"true\"\n [columnAutoWidth]=\"true\"\n (onRowDblClick)=\"onRowDoubleClick($event)\"\n style=\"height: 45vh\"\n >\n <dxo-paging [pageSize]=\"pageSize\"></dxo-paging>\n <dxo-pager\n [visible]=\"true\"\n [showInfo]=\"true\"\n [showNavigationButtons]=\"true\"\n [showPageSizeSelector]=\"true\"\n [allowedPageSizes]=\"allowedPageSizes\"\n ></dxo-pager>\n <dxo-scrolling mode=\"standard\" showScrollbar=\"always\"></dxo-scrolling>\n <!-- S\u0131ralama kapal\u0131: sayfalama sunucuda oldu\u011Fu i\u00E7in istemci s\u0131ralamas\u0131 yaln\u0131zca a\u00E7\u0131k olan\n sayfay\u0131 s\u0131ralar ve kullan\u0131c\u0131ya t\u00FCm listeyi s\u0131ralad\u0131\u011F\u0131 izlenimini verirdi. Sunucu\n sorgusu zaten BinCode'a g\u00F6re s\u0131ral\u0131 d\u00F6ner. -->\n <dxo-sorting mode=\"none\"></dxo-sorting>\n\n <dxi-column dataField=\"BinCode\" caption=\"Depo Yeri Kodu\" [minWidth]=\"220\"></dxi-column>\n <dxi-column dataField=\"Warehouse\" caption=\"Depo\" [width]=\"120\"></dxi-column>\n </dx-data-grid>\n </ng-template>\n\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"close()\">Vazge\u00E7</button>\n </ng-template>\n</abp-modal>\n", styles: [":host ::ng-deep .dx-datagrid{font-size:12px}\n"] }]
105
+ }], ctorParameters: function () { return [{ type: i1.WarehouseService }, { type: i2.ToasterService }]; }, propDecorators: { warehouseCode: [{
106
+ type: Input
107
+ }], visible: [{
108
+ type: Input
109
+ }], visibleChange: [{
110
+ type: Output
111
+ }], selected: [{
112
+ type: Output
113
+ }] } });
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluLWxvY2F0aW9uLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Jpbi1sb2NhdGlvbi1waWNrZXIvYmluLWxvY2F0aW9uLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Jpbi1sb2NhdGlvbi1waWNrZXIvYmluLWxvY2F0aW9uLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sV0FBVyxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sVUFBVSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7QUFHcEUsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFN0I7Ozs7Ozs7R0FPRztBQU1ILE1BQU0sT0FBTywwQkFBMEI7SUFxQnJDLFlBQ21CLGdCQUFrQyxFQUNsQyxPQUF1QjtRQUR2QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBdEIxQyw0RUFBNEU7UUFDbkUsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFFNUIsd0VBQXdFO1FBQy9ELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDZixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFNUMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFr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SUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUM1RyxDQUFDO1lBRUYsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQztTQUMzRTtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSwyQ0FBMkMsQ0FBQyxDQUFDO1lBQ2hHLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNwQztnQkFBUztZQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzs7dUhBakdVLDBCQUEwQjsyR0FBMUIsMEJBQTBCLGtNQ3ZCdkMsMjBFQXdEQTsyRkRqQ2EsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHlCQUF5QjtvSUFNMUIsYUFBYTtzQkFBckIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9hc3RlclNlcnZpY2UgfSBmcm9tICdAYWJwL25nLnRoZW1lLnNoYXJlZCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IEN1c3RvbVN0b3JlIGZyb20gJ2RldmV4dHJlbWUvZGF0YS9jdXN0b21fc3RvcmUnO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnZGV2ZXh0cmVtZS9kYXRhL2RhdGFfc291cmNlJztcbmltcG9ydCB7IFN1YmplY3QsIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmluTG9jYXRpb25EdG8sIFdhcmVob3VzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9oaXQtcHJveHkvd2FyZWhvdXNlL3dhcmVob3VzZS5zZXJ2aWNlJztcblxuY29uc3QgREVGQVVMVF9QQUdFX1NJWkUgPSA1MDtcblxuLyoqXG4gKiBEdW1teSBLYXNhIChkZXBvIHllcmkpIHNlw6dpbSBtb2RhbMSxLlxuICpcbiAqIERlcG8geWVyaSBzYXnEsXPEsSBiaXIgc2VsZWN0Ym94J2Egc8SxxJ9tYXlhY2FrIGthZGFyIMOnb2sgb2xhYmlsZGnEn2kgacOnaW4gZ3JpZCBpbGUgw6dhbMSxxZ/EsXIgdmVcbiAqIHNheWZhbGFtYSBTVU5VQ1UgdGFyYWbEsW5kYWTEsXI6IGdyaWQgaGVyIHNheWZhIGRlxJ9pxZ9pbWluZGUgeWFsbsSxemNhIG8gc2F5ZmF5xLEgaXN0ZXIuIEJ1IHNheWVkZVxuICogXCJrYXluYWsgZGVwbyBzZcOnaWxpbmNlIHTDvG0gZGVwbyB5ZXJsZXJpbmkgY29tYm9ib3gnYSBkb2xkdXJcIiBkYXZyYW7EscWfxLFuxLFuIHlhcmF0dMSxxJ/EsSBkb25tYVxuICogb3J0YWRhbiBrYWxrYXIg4oCUIHZlcmlsZXIgeWFsbsSxemNhIG1vZGFsIGHDp8SxbGTEscSfxLFuZGEgdmUgc2F5ZmEgc2F5ZmEgecO8a2xlbmlyLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYmluLWxvY2F0aW9uLXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9iaW4tbG9jYXRpb24tcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmluLWxvY2F0aW9uLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBCaW5Mb2NhdGlvblBpY2tlckNvbXBvbmVudCB7XG4gIC8qKiBTZcOnaW0geWFwxLFsYWNhayBrYXluYWsgZGVwbyBrb2R1OyBzYWhpYmkgYmlsZcWfZW4gbmdNb2RlbCBpbGUgZ2XDp2lyaXIuICovXG4gIEBJbnB1dCgpIHdhcmVob3VzZUNvZGUgPSAnJztcblxuICAvKiogxLBraSB5w7ZubMO8IGJhxJ9sYW7EsXI7IHNhaGliaSBiaWxlxZ9lbiBtb2RhbMSxIGJ1bnUgdHJ1ZSB5YXBhcmFrIGHDp2FyLiAqL1xuICBASW5wdXQoKSB2aXNpYmxlID0gZmFsc2U7XG4gIEBPdXRwdXQoKSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QmluTG9jYXRpb25EdG8+KCk7XG5cbiAgcmVhZG9ubHkgcGFnZVNpemUgPSBERUZBVUxUX1BBR0VfU0laRTtcbiAgcmVhZG9ubHkgYWxsb3dlZFBhZ2VTaXplcyA9IFsyNSwgNTAsIDEwMF07XG5cbiAgc2VhcmNoVGVybSA9ICcnO1xuICBpc1NlYXJjaGluZyA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IGRhdGFTb3VyY2U6IERhdGFTb3VyY2U7XG5cbiAgLyoqIEhlciB0dcWfIHZ1cnXFn3VuZGEgc3VudWN1eWEgZ2l0bWVtZWsgacOnaW4gYXJhbWEgZGVib3VuY2UgZWRpbGlyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlYXJjaElucHV0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2FyZWhvdXNlU2VydmljZTogV2FyZWhvdXNlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRvYXN0ZXI6IFRvYXN0ZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKHtcbiAgICAgIHN0b3JlOiBuZXcgQ3VzdG9tU3RvcmUoe1xuICAgICAgICBrZXk6ICdCaW5Db2RlJyxcbiAgICAgICAgLy8gR3JpZCwgZmlsdHJlbGVtZS9zxLFyYWxhbWF5xLEgc3VudWN1eWEgYsSxcmFrxLFyOyB5YWxuxLF6Y2Egc2tpcC90YWtlIGdlbGlyLlxuICAgICAgICBsb2FkTW9kZTogJ3Byb2Nlc3NlZCcsXG4gICAgICAgIGxvYWQ6IGxvYWRPcHRpb25zID0+IHRoaXMubG9hZFBhZ2UobG9hZE9wdGlvbnMpLFxuICAgICAgfSksXG4gICAgICBwYWdpbmF0ZTogdHJ1ZSxcbiAgICAgIHBhZ2VTaXplOiBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgIHJlcXVpcmVUb3RhbENvdW50OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWFyY2hJbnB1dC5waXBlKGRlYm91bmNlVGltZSgzNTApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gWWVuaSBhcmFtYWRhIGlsayBzYXlmYXlhIGTDtm7DvGzDvHIsIGFrc2kgaGFsZGUga3VsbGFuxLFjxLEgYm/FnyBiaXIgc2F5ZmFkYSBrYWxhYmlsaXIuXG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnZUluZGV4KDApO1xuICAgICAgdGhpcy5kYXRhU291cmNlLnJlbG9hZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNhaGliaSBiaWxlxZ9lbiBtb2RhbMSxIGHDp21hZGFuIGhlbWVuIMO2bmNlIMOnYcSfxLFyxLFyLiAqL1xuICBvcGVuKCk6IHZvaWQge1xuICAgIC8vIEFyYW1hIGt1dHVzdSBib8WfIGHDp8SxbMSxciBraSBrdWxsYW7EsWPEsSBpc3RlZGnEn2luZGUgZG/En3J1ZGFuIGxpc3RleWkgZ2V6ZWJpbHNpbi5cbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHRydWUpO1xuXG4gICAgdGhpcy5kYXRhU291cmNlLnBhZ2VJbmRleCgwKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UucmVsb2FkKCk7XG4gIH1cblxuICBvblNlYXJjaFRlcm1DaGFuZ2UodGVybTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hJbnB1dC5uZXh0KHRlcm0pO1xuICB9XG5cbiAgb25Sb3dEb3VibGVDbGljayhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Py5kYXRhKSB7XG4gICAgICB0aGlzLnNlbGVjdChldmVudC5kYXRhKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3QoYmluOiBCaW5Mb2NhdGlvbkR0byk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChiaW4pO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFBhZ2UobG9hZE9wdGlvbnM6IGFueSk6IFByb21pc2U8eyBkYXRhOiBCaW5Mb2NhdGlvbkR0b1tdOyB0b3RhbENvdW50OiBudW1iZXIgfT4ge1xuICAgIGlmICghdGhpcy53YXJlaG91c2VDb2RlKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiBbXSwgdG90YWxDb3VudDogMCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNraXAgPSBsb2FkT3B0aW9ucz8uc2tpcCA/PyAwO1xuICAgIGNvbnN0IHRha2UgPSBsb2FkT3B0aW9ucz8udGFrZSA/PyBERUZBVUxUX1BBR0VfU0laRTtcblxuICAgIHRoaXMuaXNTZWFyY2hpbmcgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLndhcmVob3VzZVNlcnZpY2Uuc2VhcmNoQmluTG9jYXRpb25zQnlXYXJlaG91c2UodGhpcy53YXJlaG91c2VDb2RlLCB0aGlzLnNlYXJjaFRlcm0udHJpbSgpLCBza2lwLCB0YWtlKVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0Py5JdGVtcyA/PyBbXSwgdG90YWxDb3VudDogcmVzdWx0Py5Ub3RhbENvdW50ID8/IDAgfTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLnRvYXN0ZXIuZXJyb3IoZXJyb3I/LmVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCAnRGVwbyB5ZXJsZXJpIHnDvGtsZW5pcmtlbiBiaXIgaGF0YSBvbHXFn3R1LicpO1xuICAgICAgcmV0dXJuIHsgZGF0YTogW10sIHRvdGFsQ291bnQ6IDAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc1NlYXJjaGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiPGFicC1tb2RhbCBbKHZpc2libGUpXT1cInZpc2libGVcIiBbb3B0aW9uc109XCJ7IHNpemU6ICdsZycgfVwiIChkaXNhcHBlYXIpPVwiY2xvc2UoKVwiPlxuICA8bmctdGVtcGxhdGUgI2FicEhlYWRlcj5cbiAgICA8aDM+RHVtbXkgS2FzYSBLb2R1IFNlw6c8L2gzPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT5cbiAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmFcIiBbbmdDbGFzc109XCJpc1NlYXJjaGluZyA/ICdmYS1zcGlubmVyIGZhLXNwaW4nIDogJ2ZhLXNlYXJjaCdcIj48L2k+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkRlcG8geWVyaSBrb2R1IGlsZSBhcmEgKGJvxZ8gYsSxcmFrxLFwIHNheWZhIHNheWZhIGRhIGdlemViaWxpcnNpbml6KVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXJtXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlYXJjaFRlcm1DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj5TZcOnbWVrIGnDp2luIHNhdMSxcmEgw6dpZnQgdMSxa2xhecSxbi48L3NtYWxsPlxuICAgIDwvZGl2PlxuXG4gICAgPGR4LWRhdGEtZ3JpZFxuICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgICBrZXlFeHByPVwiQmluQ29kZVwiXG4gICAgICBbcmVtb3RlT3BlcmF0aW9uc109XCJ7IHBhZ2luZzogdHJ1ZSB9XCJcbiAgICAgIFtzaG93Um93TGluZXNdPVwidHJ1ZVwiXG4gICAgICBbc2hvd0JvcmRlcnNdPVwidHJ1ZVwiXG4gICAgICBbaG92ZXJTdGF0ZUVuYWJsZWRdPVwidHJ1ZVwiXG4gICAgICBbY29sdW1uQXV0b1dpZHRoXT1cInRydWVcIlxuICAgICAgKG9uUm93RGJsQ2xpY2spPVwib25Sb3dEb3VibGVDbGljaygkZXZlbnQpXCJcbiAgICAgIHN0eWxlPVwiaGVpZ2h0OiA0NXZoXCJcbiAgICA+XG4gICAgICA8ZHhvLXBhZ2luZyBbcGFnZVNpemVdPVwicGFnZVNpemVcIj48L2R4by1wYWdpbmc+XG4gICAgICA8ZHhvLXBhZ2VyXG4gICAgICAgIFt2aXNpYmxlXT1cInRydWVcIlxuICAgICAgICBbc2hvd0luZm9dPVwidHJ1ZVwiXG4gICAgICAgIFtzaG93TmF2aWdhdGlvbkJ1dHRvbnNdPVwidHJ1ZVwiXG4gICAgICAgIFtzaG93UGFnZVNpemVTZWxlY3Rvcl09XCJ0cnVlXCJcbiAgICAgICAgW2FsbG93ZWRQYWdlU2l6ZXNdPVwiYWxsb3dlZFBhZ2VTaXplc1wiXG4gICAgICA+PC9keG8tcGFnZXI+XG4gICAgICA8ZHhvLXNjcm9sbGluZyBtb2RlPVwic3RhbmRhcmRcIiBzaG93U2Nyb2xsYmFyPVwiYWx3YXlzXCI+PC9keG8tc2Nyb2xsaW5nPlxuICAgICAgPCEtLSBTxLFyYWxhbWEga2FwYWzEsTogc2F5ZmFsYW1hIHN1bnVjdWRhIG9sZHXEn3UgacOnaW4gaXN0ZW1jaSBzxLFyYWxhbWFzxLEgeWFsbsSxemNhIGHDp8SxayBvbGFuXG4gICAgICAgICAgIHNheWZhecSxIHPEsXJhbGFyIHZlIGt1bGxhbsSxY8SxeWEgdMO8bSBsaXN0ZXlpIHPEsXJhbGFkxLHEn8SxIGl6bGVuaW1pbmkgdmVyaXJkaS4gU3VudWN1XG4gICAgICAgICAgIHNvcmd1c3UgemF0ZW4gQmluQ29kZSdhIGfDtnJlIHPEsXJhbMSxIGTDtm5lci4gLS0+XG4gICAgICA8ZHhvLXNvcnRpbmcgbW9kZT1cIm5vbmVcIj48L2R4by1zb3J0aW5nPlxuXG4gICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJCaW5Db2RlXCIgY2FwdGlvbj1cIkRlcG8gWWVyaSBLb2R1XCIgW21pbldpZHRoXT1cIjIyMFwiPjwvZHhpLWNvbHVtbj5cbiAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cIldhcmVob3VzZVwiIGNhcHRpb249XCJEZXBvXCIgW3dpZHRoXT1cIjEyMFwiPjwvZHhpLWNvbHVtbj5cbiAgICA8L2R4LWRhdGEtZ3JpZD5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNsb3NlKClcIj5WYXpnZcOnPC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L2FicC1tb2RhbD5cbiJdfQ==
@@ -1,4 +1,5 @@
1
- import { Component, ViewEncapsulation } from '@angular/core';
1
+ import { Component, ViewChild, ViewEncapsulation } from '@angular/core';
2
+ import { BinLocationPickerComponent } from '../bin-location-picker/bin-location-picker.component';
2
3
  import { forkJoin, of } from 'rxjs';
3
4
  import { catchError } from 'rxjs/operators';
4
5
  import * as i0 from "@angular/core";
@@ -10,6 +11,7 @@ import * as i5 from "../../hit-proxy/warehouse/warehouse.service";
10
11
  import * as i6 from "@angular/common";
11
12
  import * as i7 from "@angular/forms";
12
13
  import * as i8 from "@abp/ng.components/page";
14
+ import * as i9 from "../bin-location-picker/bin-location-picker.component";
13
15
  export class ConnectorParamsComponent {
14
16
  constructor(connectorParamsService, toasterService, guard, router, route, warehouseService) {
15
17
  this.connectorParamsService = connectorParamsService;
@@ -22,8 +24,7 @@ export class ConnectorParamsComponent {
22
24
  { value: 'MIKRO', label: 'Mikro ERP' },
23
25
  ];
24
26
  this.warehouses = [];
25
- this.binLocations = [];
26
- this.isLoadingBinLocations = false;
27
+ this.isDummyBoxPickerOpen = false;
27
28
  this.form = {
28
29
  erpType: 'MIKRO',
29
30
  baseUrl: '',
@@ -75,10 +76,6 @@ export class ConnectorParamsComponent {
75
76
  this.beeCellPasswordSet = params.beeCellPasswordSet ?? false;
76
77
  }
77
78
  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
79
  },
83
80
  error: err => {
84
81
  this.toasterService.error(err?.error?.error?.message ?? 'Parametreler yüklenirken bir hata oluştu.');
@@ -92,34 +89,25 @@ export class ConnectorParamsComponent {
92
89
  get isCurrentWhsInList() {
93
90
  return this.warehouses.some(w => w.WhsCode === this.form.targetWarehouseCode);
94
91
  }
95
- get isCurrentDummyBoxInList() {
96
- return this.binLocations.some(b => b.BinCode === this.form.dummyBoxCode);
97
- }
98
92
  /**
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.
93
+ * Kaynak Depo seçimi değiştiğinde çalışır. Depo değiştiği için önceki depoya ait Dummy Kasa
94
+ * seçimi artık geçerli değil temizlenir. Depo yerleri artık burada YÜKLENMEZ; kullanıcı
95
+ * "Seç" ile modalı açtığında sunucudan sayfa sayfa gelir (çok fazla veri combobox'ı kilitliyordu).
101
96
  */
102
97
  onFromWarehouseChange(whsCode) {
103
98
  this.form.fromWarehouseCode = whsCode;
104
99
  this.form.dummyBoxCode = '';
105
- this.loadBinLocations(whsCode);
106
100
  }
107
- loadBinLocations(whsCode) {
108
- if (!whsCode) {
109
- this.binLocations = [];
101
+ /** Dummy Kasa seçim modalını açar. Kaynak depo seçilmeden açılamaz. */
102
+ openDummyBoxPicker() {
103
+ if (!this.form.fromWarehouseCode) {
104
+ this.toasterService.warn('Önce Kaynak Depo seçin.');
110
105
  return;
111
106
  }
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
- });
107
+ this.dummyBoxPicker?.open();
108
+ }
109
+ onDummyBoxSelected(bin) {
110
+ this.form.dummyBoxCode = bin?.BinCode ?? '';
123
111
  }
124
112
  save() {
125
113
  if (!this.form.erpType) {
@@ -174,9 +162,12 @@ export class ConnectorParamsComponent {
174
162
  }
175
163
  }
176
164
  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 });
165
+ ConnectorParamsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ConnectorParamsComponent, selector: "lib-connector-params", viewQueries: [{ propertyName: "dummyBoxPicker", first: true, predicate: BinLocationPickerComponent, descendants: true }], 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=\"dummyBoxInput\">Dummy Kasa Kodu</label>\r\n <div class=\"input-group\">\r\n <input id=\"dummyBoxInput\" type=\"text\" class=\"form-control\" readonly\r\n [ngModel]=\"form.dummyBoxCode\"\r\n placeholder=\"Se\u00E7mek i\u00E7in &quot;Se\u00E7&quot;e t\u0131klay\u0131n\" />\r\n <button type=\"button\" class=\"btn btn-outline-primary\"\r\n [disabled]=\"!form.fromWarehouseCode\"\r\n (click)=\"openDummyBoxPicker()\">\r\n <i class=\"fa fa-search\"></i> Se\u00E7\r\n </button>\r\n <button type=\"button\" class=\"btn btn-outline-secondary\"\r\n [disabled]=\"!form.dummyBoxCode\"\r\n (click)=\"form.dummyBoxCode = ''\">\r\n Temizle\r\n </button>\r\n </div>\r\n <small class=\"text-muted\" *ngIf=\"!form.fromWarehouseCode\">\u00D6nce Kaynak Depo se\u00E7in.</small>\r\n <small class=\"text-muted\" *ngIf=\"form.fromWarehouseCode\">\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 Liste modal a\u00E7\u0131ld\u0131\u011F\u0131nda sunucudan sayfa sayfa y\u00FCklenir.\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\r\n <!-- Dummy Kasa Kodu se\u00E7im modal\u0131 \u2014 veriler yaln\u0131zca modal a\u00E7\u0131ld\u0131\u011F\u0131nda sunucudan sayfa sayfa gelir -->\r\n <lib-bin-location-picker\r\n [warehouseCode]=\"form.fromWarehouseCode\"\r\n [(visible)]=\"isDummyBoxPickerOpen\"\r\n (selected)=\"onDummyBoxSelected($event)\">\r\n </lib-bin-location-picker>\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"] }, { kind: "component", type: i9.BinLocationPickerComponent, selector: "lib-bin-location-picker", inputs: ["warehouseCode", "visible"], outputs: ["visibleChange", "selected"] }], encapsulation: i0.ViewEncapsulation.None });
178
166
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsComponent, decorators: [{
179
167
  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=
168
+ 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=\"dummyBoxInput\">Dummy Kasa Kodu</label>\r\n <div class=\"input-group\">\r\n <input id=\"dummyBoxInput\" type=\"text\" class=\"form-control\" readonly\r\n [ngModel]=\"form.dummyBoxCode\"\r\n placeholder=\"Se\u00E7mek i\u00E7in &quot;Se\u00E7&quot;e t\u0131klay\u0131n\" />\r\n <button type=\"button\" class=\"btn btn-outline-primary\"\r\n [disabled]=\"!form.fromWarehouseCode\"\r\n (click)=\"openDummyBoxPicker()\">\r\n <i class=\"fa fa-search\"></i> Se\u00E7\r\n </button>\r\n <button type=\"button\" class=\"btn btn-outline-secondary\"\r\n [disabled]=\"!form.dummyBoxCode\"\r\n (click)=\"form.dummyBoxCode = ''\">\r\n Temizle\r\n </button>\r\n </div>\r\n <small class=\"text-muted\" *ngIf=\"!form.fromWarehouseCode\">\u00D6nce Kaynak Depo se\u00E7in.</small>\r\n <small class=\"text-muted\" *ngIf=\"form.fromWarehouseCode\">\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 Liste modal a\u00E7\u0131ld\u0131\u011F\u0131nda sunucudan sayfa sayfa y\u00FCklenir.\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\r\n <!-- Dummy Kasa Kodu se\u00E7im modal\u0131 \u2014 veriler yaln\u0131zca modal a\u00E7\u0131ld\u0131\u011F\u0131nda sunucudan sayfa sayfa gelir -->\r\n <lib-bin-location-picker\r\n [warehouseCode]=\"form.fromWarehouseCode\"\r\n [(visible)]=\"isDummyBoxPickerOpen\"\r\n (selected)=\"onDummyBoxSelected($event)\">\r\n </lib-bin-location-picker>\r\n</abp-page>\r\n", styles: [".connector-params-container{padding:1rem 0}.connector-params-container .connector-params-card{max-width:640px}\n"] }]
169
+ }], ctorParameters: function () { return [{ type: i1.ConnectorParamsService }, { type: i2.ToasterService }, { type: i3.ConnectorParamsGuard }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i5.WarehouseService }]; }, propDecorators: { dummyBoxPicker: [{
170
+ type: ViewChild,
171
+ args: [BinLocationPickerComponent, { static: false }]
172
+ }] } });
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rvci1wYXJhbXMvY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rvci1wYXJhbXMvY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVVoRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNsRyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBYTVDLE1BQU0sT0FBTyx3QkFBd0I7SUE2Qm5DLFlBQ1Usc0JBQThDLEVBQzlDLGNBQThCLEVBQzlCLEtBQTJCLEVBQzNCLE1BQWMsRUFDZCxLQUFxQixFQUNyQixnQkFBa0M7UUFMbEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsVUFBSyxHQUFMLEtBQUssQ0FBc0I7UUFDM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFsQzVDLGVBQVUsR0FBZ0I7WUFDeEIsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7U0FDdkMsQ0FBQztRQUlGLGVBQVUs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O1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7cUhBcEtVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLDRHQUt4QiwwQkFBMEIsZ0RDOUJ2QywyOFJBeUtBOzJGRGhKYSx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGlCQUdqQixpQkFBaUIsQ0FBQyxJQUFJOzhQQU9xQixjQUFjO3NCQUF2RSxTQUFTO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJ0BhYnAvbmcudGhlbWUuc2hhcmVkJztcclxuaW1wb3J0IHtcclxuICBDb25uZWN0b3JQYXJhbXNTZXJ2aWNlLFxyXG4gIENvbm5lY3RvclBhcmFtc0R0byxcclxuICBTYXZlQ29ubmVjdG9yUGFyYW1zRHRvLFxyXG59IGZyb20gJy4uLy4uL2hpdC1wcm94eS9jb25uZWN0b3ItcGFyYW1zL2Nvbm5lY3Rvci1wYXJhbXMuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbm5lY3RvclBhcmFtc0d1YXJkIH0gZnJvbSAnLi4vLi4vZ3VhcmRzL2Nvbm5lY3Rvci1wYXJhbXMuZ3VhcmQnO1xyXG5pbXBvcnQgeyBXYXJlaG91c2VTZXJ2aWNlLCBXYXJlaG91c2VEdG8sIEJpbkxvY2F0aW9uRHRvIH0gZnJvbSAnLi4vLi4vaGl0LXByb3h5L3dhcmVob3VzZS93YXJlaG91c2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEJpbkxvY2F0aW9uUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vYmluLWxvY2F0aW9uLXBpY2tlci9iaW4tbG9jYXRpb24tcGlja2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW50ZXJmYWNlIEVycE9wdGlvbiB7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1jb25uZWN0b3ItcGFyYW1zJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb25uZWN0b3JQYXJhbXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGVycE9wdGlvbnM6IEVycE9wdGlvbltdID0gW1xyXG4gICAgeyB2YWx1ZTogJ01JS1JPJywgbGFiZWw6ICdNaWtybyBFUlAnIH0sXHJcbiAgXTtcclxuXHJcbiAgQFZpZXdDaGlsZChCaW5Mb2NhdGlvblBpY2tlckNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIGR1bW15Qm94UGlja2VyOiBCaW5Mb2NhdGlvblBpY2tlckNvbXBvbmVudDtcclxuXHJcbiAgd2FyZWhvdXNlczogV2FyZWhvdXNlRHRvW10gPSBbXTtcclxuICBpc0R1bW15Qm94UGlja2VyT3BlbiA9IGZhbHNlO1xyXG5cclxuICBmb3JtOiBTYXZlQ29ubmVjdG9yUGFyYW1zRHRvID0ge1xyXG4gICAgZXJwVHlwZTogJ01JS1JPJyxcclxuICAgIGJhc2VVcmw6ICcnLFxyXG4gICAgYXBpS2V5OiAnJyxcclxuICAgIHVzZXJuYW1lOiAnJyxcclxuICAgIHBhc3N3b3JkOiAnJyxcclxuICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gICAgZnJvbVdhcmVob3VzZUNvZGU6ICcnLFxyXG4gICAgdGFyZ2V0V2FyZWhvdXNlQ29kZTogJycsXHJcbiAgICBkdW1teUJveENvZGU6ICcnLFxyXG4gICAgYmVlQ2VsbFVzZXJuYW1lOiAnJyxcclxuICAgIGJlZUNlbGxQYXNzd29yZDogJycsXHJcbiAgfTtcclxuXHJcbiAgcGFzc3dvcmRTZXQgPSBmYWxzZTtcclxuICBiZWVDZWxsUGFzc3dvcmRTZXQgPSBmYWxzZTtcclxuICBpc0xvYWRpbmcgPSBmYWxzZTtcclxuICBpc1NhdmluZyA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29ubmVjdG9yUGFyYW1zU2VydmljZTogQ29ubmVjdG9yUGFyYW1zU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RlclNlcnZpY2U6IFRvYXN0ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBndWFyZDogQ29ubmVjdG9yUGFyYW1zR3VhcmQsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHdhcmVob3VzZVNlcnZpY2U6IFdhcmVob3VzZVNlcnZpY2UsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ3JlYXNvbicpO1xyXG4gICAgaWYgKHJlYXNvbiA9PT0gJ25vLWNvbmZpZycpIHtcclxuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKCdDb25uZWN0b3IgcGFyYW1ldHJlbGVyaSB5YXDEsWxhbmTEsXLEsWxtYW3EscWfLicpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gxLBraSBBUEkneWkgYmlybGlrdGUgYmVrbGU6IGRlcG8gbGlzdGVzaSBoYXrEsXIgb2xtYWRhbiBmb3JtIHJlbmRlciBlZGlsbWV6LFxyXG4gIC8vIGLDtnlsZWNlIG5nTW9kZWwgb3B0aW9uIGdlw6dpxZ9pIChyYWNlIGNvbmRpdGlvbikgeWHFn2FubWF6LlxyXG4gIGxvYWREYXRhKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgZm9ya0pvaW4oe1xyXG4gICAgICBwYXJhbXM6IHRoaXMuY29ubmVjdG9yUGFyYW1zU2VydmljZS5nZXRDb25uZWN0b3JQYXJhbXMoKSxcclxuICAgICAgd2FyZWhvdXNlczogdGhpcy53YXJlaG91c2VTZXJ2aWNlLmdldFNtYXJ0V2FyZWhvdXNlcygpLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihbXSBhcyBXYXJlaG91c2VEdG9bXSkpXHJcbiAgICAgICksXHJcbiAgICB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoeyBwYXJhbXMsIHdhcmVob3VzZXMgfSkgPT4ge1xyXG4gICAgICAgIHRoaXMud2FyZWhvdXNlcyA9IHdhcmVob3VzZXM7XHJcbiAgICAgICAgaWYgKHBhcmFtcykge1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmVycFR5cGUgICAgICAgICAgICAgPSBwYXJhbXMuZXJwVHlwZSAgPz8gJ01JS1JPJztcclxuICAgICAgICAgIHRoaXMuZm9ybS5iYXNlVXJsICAgICAgICAgICAgID0gcGFyYW1zLmJhc2VVcmwgID8/ICcnO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLmFwaUtleSAgICAgICAgICAgICAgPSBwYXJhbXMuYXBpS2V5ICAgPz8gJyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0udXNlcm5hbWUgICAgICAgICAgICA9IHBhcmFtcy51c2VybmFtZSA/PyAnJztcclxuICAgICAgICAgIHRoaXMuZm9ybS5pc0FjdGl2ZSAgICAgICAgICAgID0gcGFyYW1zLmlzQWN0aXZlO1xyXG4gICAgICAgICAgdGhpcy5mb3JtLnBhc3N3b3JkICAgICAgICAgICAgPSAnJztcclxuICAgICAgICAgIHRoaXMuZm9ybS5mcm9tV2FyZWhvdXNlQ29kZSAgID0gcGFyYW1zLmZyb21XYXJlaG91c2VDb2RlICA/PyAnJztcclxuICAgICAgICAgIHRoaXMuZm9ybS50YXJnZXRXYXJlaG91c2VDb2RlID0gcGFyYW1zLnRhcmdldFdhcmVob3VzZUNvZGUgPz8gJyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uZHVtbXlCb3hDb2RlICAgICAgICA9IHBhcmFtcy5kdW1teUJveENvZGUgPz8gJyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uYmVlQ2VsbFVzZXJuYW1lICAgICA9IHBhcmFtcy5iZWVDZWxsVXNlcm5hbWUgPz8gJyc7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uYmVlQ2VsbFBhc3N3b3JkICAgICA9ICcnO1xyXG4gICAgICAgICAgdGhpcy5wYXNzd29yZFNldCAgICAgICAgICAgICAgPSBwYXJhbXMucGFzc3dvcmRTZXQ7XHJcbiAgICAgICAgICB0aGlzLmJlZUNlbGxQYXNzd29yZFNldCAgICAgICA9IHBhcmFtcy5iZWVDZWxsUGFzc3dvcmRTZXQgPz8gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoZXJyPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgPz8gJ1BhcmFtZXRyZWxlciB5w7xrbGVuaXJrZW4gYmlyIGhhdGEgb2x1xZ90dS4nKTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNDdXJyZW50RnJvbVdoc0luTGlzdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLndhcmVob3VzZXMuc29tZSh3ID0+IHcuV2hzQ29kZSA9PT0gdGhpcy5mb3JtLmZyb21XYXJlaG91c2VDb2RlKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0N1cnJlbnRXaHNJbkxpc3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy53YXJlaG91c2VzLnNvbWUodyA9PiB3Lldoc0NvZGUgPT09IHRoaXMuZm9ybS50YXJnZXRXYXJlaG91c2VDb2RlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEtheW5hayBEZXBvIHNlw6dpbWkgZGXEn2nFn3RpxJ9pbmRlIMOnYWzEscWfxLFyLiBEZXBvIGRlxJ9pxZ90acSfaSBpw6dpbiDDtm5jZWtpIGRlcG95YSBhaXQgRHVtbXkgS2FzYVxyXG4gICAqIHNlw6dpbWkgYXJ0xLFrIGdlw6dlcmxpIGRlxJ9pbCDigJQgdGVtaXpsZW5pci4gRGVwbyB5ZXJsZXJpIGFydMSxayBidXJhZGEgWcOcS0xFTk1FWjsga3VsbGFuxLFjxLFcclxuICAgKiBcIlNlw6dcIiBpbGUgbW9kYWzEsSBhw6d0xLHEn8SxbmRhIHN1bnVjdWRhbiBzYXlmYSBzYXlmYSBnZWxpciAow6dvayBmYXpsYSB2ZXJpIGNvbWJvYm94J8SxIGtpbGl0bGl5b3JkdSkuXHJcbiAgICovXHJcbiAgb25Gcm9tV2FyZWhvdXNlQ2hhbmdlKHdoc0NvZGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtLmZyb21XYXJlaG91c2VDb2RlID0gd2hzQ29kZTtcclxuICAgIHRoaXMuZm9ybS5kdW1teUJveENvZGUgPSAnJztcclxuICB9XHJcblxyXG4gIC8qKiBEdW1teSBLYXNhIHNlw6dpbSBtb2RhbMSxbsSxIGHDp2FyLiBLYXluYWsgZGVwbyBzZcOnaWxtZWRlbiBhw6fEsWxhbWF6LiAqL1xyXG4gIG9wZW5EdW1teUJveFBpY2tlcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5mb3JtLmZyb21XYXJlaG91c2VDb2RlKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2Fybignw5ZuY2UgS2F5bmFrIERlcG8gc2XDp2luLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmR1bW15Qm94UGlja2VyPy5vcGVuKCk7XHJcbiAgfVxyXG5cclxuICBvbkR1bW15Qm94U2VsZWN0ZWQoYmluOiBCaW5Mb2NhdGlvbkR0byk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtLmR1bW15Qm94Q29kZSA9IGJpbj8uQmluQ29kZSA/PyAnJztcclxuICB9XHJcblxyXG4gIHNhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZm9ybS5lcnBUeXBlKSB7XHJcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uud2FybignRVJQIFNhxJ9sYXnEsWPEsXPEsSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZm9ybS5iYXNlVXJsPy50cmltKCkpIHtcclxuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKCdCYXNlIFVSTCB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZm9ybS5hcGlLZXk/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0FQSSBLZXkgem9ydW5sdWR1ci4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmZvcm0udXNlcm5hbWU/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0t1bGxhbsSxY8SxIEFkxLEgem9ydW5sdWR1ci4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBhc3N3b3JkU2V0ICYmICF0aGlzLmZvcm0ucGFzc3dvcmQ/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ8WeaWZyZSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZm9ybS5iZWVDZWxsVXNlcm5hbWU/LnRyaW0oKSkge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLndhcm4oJ0JlZUNlbGwgS3VsbGFuxLFjxLEgQWTEsSB6b3J1bmx1ZHVyLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuYmVlQ2VsbFBhc3N3b3JkU2V0ICYmICF0aGlzLmZvcm0uYmVlQ2VsbFBhc3N3b3JkPy50cmltKCkpIHtcclxuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS53YXJuKCdCZWVDZWxsIMWeaWZyZXNpIHpvcnVubHVkdXIuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzU2F2aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY29ubmVjdG9yUGFyYW1zU2VydmljZS5zYXZlQ29ubmVjdG9yUGFyYW1zKHRoaXMuZm9ybSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcygnUGFyYW1ldHJlbGVyIGJhxZ9hcsSxeWxhIGtheWRlZGlsZGkuJyk7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybS5wYXNzd29yZCkge1xyXG4gICAgICAgICAgdGhpcy5wYXNzd29yZFNldCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmZvcm0ucGFzc3dvcmQgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybS5iZWVDZWxsUGFzc3dvcmQpIHtcclxuICAgICAgICAgIHRoaXMuYmVlQ2VsbFBhc3N3b3JkU2V0ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5iZWVDZWxsUGFzc3dvcmQgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gR3VhcmQgY2FjaGUnaW5pIGfDvG5jZWxsZSDigJQgZGnEn2VyIGVrcmFubGFyIGFydMSxayBlcmnFn2lsZWJpbGlyXHJcbiAgICAgICAgdGhpcy5ndWFyZC5pbnZhbGlkYXRlKCk7XHJcbiAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogZXJyID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKGVycj8uZXJyb3I/LmVycm9yPy5tZXNzYWdlID8/ICdLYXnEsXQgc8SxcmFzxLFuZGEgYmlyIGhhdGEgb2x1xZ90dS4nKTtcclxuICAgICAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGFicC1wYWdlIFt0aXRsZV09XCInQ29ubmVjdG9yIFBhcmFtZXRyZWxlcmknXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNvbm5lY3Rvci1wYXJhbXMtY29udGFpbmVyXCI+XHJcblxyXG4gICAgPCEtLSBZw7xrbGVuaXlvciAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS00XCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHRleHQtcHJpbWFyeVwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPlnDvGtsZW5peW9yLi4uPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gRm9ybSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbm5lY3Rvci1wYXJhbXMtY2FyZFwiIFtoaWRkZW5dPVwiaXNMb2FkaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuXHJcbiAgICAgICAgPCEtLSBFUlAgU2HEn2xhecSxY8Sxc8SxIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiZXJwVHlwZVNlbGVjdFwiPkVSUCBTYcSfbGF5xLFjxLFzxLEgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJlcnBUeXBlU2VsZWN0XCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZm9ybS5lcnBUeXBlXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBlcnBPcHRpb25zXCIgW3ZhbHVlXT1cIm9wdC52YWx1ZVwiPnt7IG9wdC5sYWJlbCB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQmFzZSBVUkwgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJiYXNlVXJsSW5wdXRcIj5CYXNlIFVSTCA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IGlkPVwiYmFzZVVybElucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtLmJhc2VVcmxcIlxyXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9lcnAtc2VydmVyOjM4MDgwXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBBUEkgS2V5IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiYXBpS2V5SW5wdXRcIj5BUEkgS2V5IDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJhcGlLZXlJbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybS5hcGlLZXlcIlxyXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQVBJIGFuYWh0YXLEsVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gS3VsbGFuxLFjxLEgQWTEsSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cInVzZXJuYW1lSW5wdXRcIj5LdWxsYW7EsWPEsSBBZMSxIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJ1c2VybmFtZUlucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtLnVzZXJuYW1lXCJcclxuICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkt1bGxhbsSxY8SxIGFkxLFcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIMWeaWZyZSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cInBhc3N3b3JkSW5wdXRcIj5cclxuICAgICAgICAgICAgxZ5pZnJlIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLXN1Y2Nlc3MgbXMtMlwiICpuZ0lmPVwicGFzc3dvcmRTZXQgJiYgIWZvcm0ucGFzc3dvcmRcIj5LYXnEsXRsxLE8L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IGlkPVwicGFzc3dvcmRJbnB1dFwiIHR5cGU9XCJwYXNzd29yZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm0ucGFzc3dvcmRcIlxyXG4gICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwYXNzd29yZFNldCA/ICdEZcSfacWfdGlybWVrIGnDp2luIHllbmkgxZ9pZnJlIGdpcmluLCBib8WfIGLEsXJha8SxcnNhbsSxeiBtZXZjdXQgxZ9pZnJlIGtvcnVudXInIDogJ8WeaWZyZSdcIiAvPlxyXG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiICpuZ0lmPVwicGFzc3dvcmRTZXRcIj5NZXZjdXQgxZ9pZnJleWkga29ydW1hayBpw6dpbiBib8WfIGLEsXJha8Sxbi48L3NtYWxsPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEJlZUNlbGwgS3VsbGFuxLFjxLEgQWTEsSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cImJlZUNlbGxVc2VybmFtZUlucHV0XCI+QmVlQ2VsbCBLdWxsYW7EsWPEsSBBZMSxIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJiZWVDZWxsVXNlcm5hbWVJbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybS5iZWVDZWxsVXNlcm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQmVlQ2VsbCBrdWxsYW7EsWPEsSBhZMSxXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj5CZWVDZWxsL09yY2hlc3RyYXRvciBBUEkgZ2lyacWfaSBpw6dpbiBrdWxsYW7EsWzEsXIgKEVSUCBrdWxsYW7EsWPEsXPEsW5kYW4gYXlyxLFkxLFyKS48L3NtYWxsPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEJlZUNlbGwgxZ5pZnJlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiYmVlQ2VsbFBhc3N3b3JkSW5wdXRcIj5cclxuICAgICAgICAgICAgQmVlQ2VsbCDFnmlmcmUgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2VzcyBtcy0yXCIgKm5nSWY9XCJiZWVDZWxsUGFzc3dvcmRTZXQgJiYgIWZvcm0uYmVlQ2VsbFBhc3N3b3JkXCI+S2F5xLF0bMSxPC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBpZD1cImJlZUNlbGxQYXNzd29yZElucHV0XCIgdHlwZT1cInBhc3N3b3JkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybS5iZWVDZWxsUGFzc3dvcmRcIlxyXG4gICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJiZWVDZWxsUGFzc3dvcmRTZXQgPyAnRGXEn2nFn3Rpcm1layBpw6dpbiB5ZW5pIMWfaWZyZSBnaXJpbiwgYm/FnyBixLFyYWvEsXJzYW7EsXogbWV2Y3V0IMWfaWZyZSBrb3J1bnVyJyA6ICdCZWVDZWxsIMWfaWZyZXNpJ1wiIC8+XHJcbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJiZWVDZWxsUGFzc3dvcmRTZXRcIj5NZXZjdXQgxZ9pZnJleWkga29ydW1hayBpw6dpbiBib8WfIGLEsXJha8Sxbi48L3NtYWxsPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEtheW5hayBEZXBvIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiZnJvbVdoc1NlbGVjdFwiPlxyXG4gICAgICAgICAgICBLYXluYWsgRGVwbyAoU3RvayBUcmFuc2ZlcilcclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8c2VsZWN0IGlkPVwiZnJvbVdoc1NlbGVjdFwiIGNsYXNzPVwiZm9ybS1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmb3JtLmZyb21XYXJlaG91c2VDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Gcm9tV2FyZWhvdXNlQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIFNlw6dpbml6IC0tPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJmb3JtLmZyb21XYXJlaG91c2VDb2RlICYmICFpc0N1cnJlbnRGcm9tV2hzSW5MaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5mcm9tV2FyZWhvdXNlQ29kZVwiPlxyXG4gICAgICAgICAgICAgIHt7IGZvcm0uZnJvbVdhcmVob3VzZUNvZGUgfX0gKEthecSxdGzEsSlcclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHdocyBvZiB3YXJlaG91c2VzXCIgW3ZhbHVlXT1cIndocy5XaHNDb2RlXCI+XHJcbiAgICAgICAgICAgICAge3sgd2hzLldoc0NvZGUgfX0g4oCTIHt7IHdocy5XaHNOYW1lIH19XHJcbiAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+R8O2cmV2IEJhxZ9sYXQndGEgb2x1xZ90dXJ1bGFuIHN0b2sgbmFrbGluaW4ga2F5bmFrIGRlcG9zdS48L3NtYWxsPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEhlZGVmIERlcG8gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJ0YXJnZXRXaHNTZWxlY3RcIj5cclxuICAgICAgICAgICAgSGVkZWYgRGVwbyAoU3RvayBUcmFuc2ZlcikgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPHNlbGVjdCBpZD1cInRhcmdldFdoc1NlbGVjdFwiIGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImZvcm0udGFyZ2V0V2FyZWhvdXNlQ29kZVwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gU2XDp2luaXogLS08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImZvcm0udGFyZ2V0V2FyZWhvdXNlQ29kZSAmJiAhaXNDdXJyZW50V2hzSW5MaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS50YXJnZXRXYXJlaG91c2VDb2RlXCI+XHJcbiAgICAgICAgICAgICAge3sgZm9ybS50YXJnZXRXYXJlaG91c2VDb2RlIH19IChLYXnEsXRsxLEpXHJcbiAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB3aHMgb2Ygd2FyZWhvdXNlc1wiIFt2YWx1ZV09XCJ3aHMuV2hzQ29kZVwiPlxyXG4gICAgICAgICAgICAgIHt7IHdocy5XaHNDb2RlIH19IOKAkyB7eyB3aHMuV2hzTmFtZSB9fVxyXG4gICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPkfDtnJldiBCYcWfbGF0J3RhIG9sdcWfdHVydWxhbiBzdG9rIG5ha2xpbmluIGhlZGVmIGRlcG9zdS48L3NtYWxsPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIER1bW15IEthc2EgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIiBmb3I9XCJkdW1teUJveElucHV0XCI+RHVtbXkgS2FzYSBLb2R1PC9sYWJlbD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgaWQ9XCJkdW1teUJveElucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmb3JtLmR1bW15Qm94Q29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlw6dtZWsgacOnaW4gJnF1b3Q7U2XDpyZxdW90O2UgdMSxa2xhecSxblwiIC8+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZm9ybS5mcm9tV2FyZWhvdXNlQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5EdW1teUJveFBpY2tlcigpXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2hcIj48L2k+IFNlw6dcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmb3JtLmR1bW15Qm94Q29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm0uZHVtbXlCb3hDb2RlID0gJydcIj5cclxuICAgICAgICAgICAgICBUZW1pemxlXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCIhZm9ybS5mcm9tV2FyZWhvdXNlQ29kZVwiPsOWbmNlIEtheW5hayBEZXBvIHNlw6dpbi48L3NtYWxsPlxyXG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiICpuZ0lmPVwiZm9ybS5mcm9tV2FyZWhvdXNlQ29kZVwiPlxyXG4gICAgICAgICAgICBLYXNhIE1pa3RhcsSxIEfDvG5jZWxsZW1lJ2RlIGZpaWxpIHNhecSxbSBmYXJrxLFuxLFuIG11aGFzZWJlbGXFn3RpcmlsZGnEn2kgU0FQIGJpbiBrb2R1IOKAlCBzZcOnaWxlbiBrYXluYWsgZGVwb251biBkZXBvIHllcmkuXHJcbiAgICAgICAgICAgIExpc3RlIG1vZGFsIGHDp8SxbGTEscSfxLFuZGEgc3VudWN1ZGFuIHNheWZhIHNheWZhIHnDvGtsZW5pci5cclxuICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQWt0aWYgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgPGlucHV0IGlkPVwiaXNBY3RpdmVDaGVja1wiIHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtLmlzQWN0aXZlXCIgLz5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJpc0FjdGl2ZUNoZWNrXCI+QWt0aWY8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEtheWRldCBCdXRvbnUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzYXZlKClcIiBbZGlzYWJsZWRdPVwiaXNTYXZpbmdcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1NhdmluZ1wiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gbWUtMVwiIHJvbGU9XCJzdGF0dXNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIHt7IGlzU2F2aW5nID8gJ0theWRlZGlsaXlvci4uLicgOiAnS2F5ZGV0JyB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBEdW1teSBLYXNhIEtvZHUgc2XDp2ltIG1vZGFsxLEg4oCUIHZlcmlsZXIgeWFsbsSxemNhIG1vZGFsIGHDp8SxbGTEscSfxLFuZGEgc3VudWN1ZGFuIHNheWZhIHNheWZhIGdlbGlyIC0tPlxyXG4gIDxsaWItYmluLWxvY2F0aW9uLXBpY2tlclxyXG4gICAgW3dhcmVob3VzZUNvZGVdPVwiZm9ybS5mcm9tV2FyZWhvdXNlQ29kZVwiXHJcbiAgICBbKHZpc2libGUpXT1cImlzRHVtbXlCb3hQaWNrZXJPcGVuXCJcclxuICAgIChzZWxlY3RlZCk9XCJvbkR1bW15Qm94U2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gIDwvbGliLWJpbi1sb2NhdGlvbi1waWNrZXI+XHJcbjwvYWJwLXBhZ2U+XHJcbiJdfQ==
@@ -4,7 +4,9 @@ import { NgModule } from '@angular/core';
4
4
  import { FormsModule } from '@angular/forms';
5
5
  import { RouterModule } from '@angular/router';
6
6
  import { PageModule } from '@abp/ng.components/page';
7
+ import { DxDataGridModule } from 'devextreme-angular';
7
8
  import { ConnectorParamsComponent } from './connector-params.component';
9
+ import { BinLocationPickerComponent } from '../bin-location-picker/bin-location-picker.component';
8
10
  import * as i0 from "@angular/core";
9
11
  import * as i1 from "@angular/router";
10
12
  const routes = [
@@ -13,24 +15,27 @@ const routes = [
13
15
  export class ConnectorParamsModule {
14
16
  }
15
17
  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,
18
+ ConnectorParamsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, declarations: [ConnectorParamsComponent, BinLocationPickerComponent], imports: [CoreModule,
17
19
  ThemeSharedModule,
18
20
  FormsModule,
19
- PageModule, i1.RouterModule] });
21
+ PageModule,
22
+ DxDataGridModule, i1.RouterModule] });
20
23
  ConnectorParamsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, imports: [CoreModule,
21
24
  ThemeSharedModule,
22
25
  FormsModule,
23
26
  PageModule,
27
+ DxDataGridModule,
24
28
  RouterModule.forChild(routes)] });
25
29
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConnectorParamsModule, decorators: [{
26
30
  type: NgModule,
27
31
  args: [{
28
- declarations: [ConnectorParamsComponent],
32
+ declarations: [ConnectorParamsComponent, BinLocationPickerComponent],
29
33
  imports: [
30
34
  CoreModule,
31
35
  ThemeSharedModule,
32
36
  FormsModule,
33
37
  PageModule,
38
+ DxDataGridModule,
34
39
  RouterModule.forChild(routes),
35
40
  ],
36
41
  }]
@@ -38,4 +43,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
38
43
  export function loadConnectorParamsModuleAsChild() {
39
44
  return Promise.resolve(ConnectorParamsModule);
40
45
  }
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdG9yLXBhcmFtcy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rvci1wYXJhbXMvY29ubmVjdG9yLXBhcmFtcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7QUFFeEUsTUFBTSxNQUFNLEdBQVc7SUFDckIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSx3QkFBd0IsRUFBRTtDQUNsRCxDQUFDO0FBWUYsTUFBTSxPQUFPLHFCQUFxQjs7a0hBQXJCLHFCQUFxQjttSEFBckIscUJBQXFCLGlCQVRqQix3QkFBd0IsYUFFckMsVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixXQUFXO1FBQ1gsVUFBVTttSEFJRCxxQkFBcUIsWUFQOUIsVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixXQUFXO1FBQ1gsVUFBVTtRQUNWLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDOzJGQUdwQixxQkFBcUI7a0JBVmpDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsd0JBQXdCLENBQUM7b0JBQ3hDLE9BQU8sRUFBRTt3QkFDUCxVQUFVO3dCQUNWLGlCQUFpQjt3QkFDakIsV0FBVzt3QkFDWCxVQUFVO3dCQUNWLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO3FCQUM5QjtpQkFDRjs7QUFHRCxNQUFNLFVBQVUsZ0NBQWdDO0lBQzlDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb3JlTW9kdWxlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcclxuaW1wb3J0IHsgVGhlbWVTaGFyZWRNb2R1bGUgfSBmcm9tICdAYWJwL25nLnRoZW1lLnNoYXJlZCc7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFBhZ2VNb2R1bGUgfSBmcm9tICdAYWJwL25nLmNvbXBvbmVudHMvcGFnZSc7XHJcbmltcG9ydCB7IENvbm5lY3RvclBhcmFtc0NvbXBvbmVudCB9IGZyb20gJy4vY29ubmVjdG9yLXBhcmFtcy5jb21wb25lbnQnO1xyXG5cclxuY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXHJcbiAgeyBwYXRoOiAnJywgY29tcG9uZW50OiBDb25uZWN0b3JQYXJhbXNDb21wb25lbnQgfSxcclxuXTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbQ29ubmVjdG9yUGFyYW1zQ29tcG9uZW50XSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb3JlTW9kdWxlLFxyXG4gICAgVGhlbWVTaGFyZWRNb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFBhZ2VNb2R1bGUsXHJcbiAgICBSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQocm91dGVzKSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29ubmVjdG9yUGFyYW1zTW9kdWxlIHt9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZENvbm5lY3RvclBhcmFtc01vZHVsZUFzQ2hpbGQoKSB7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDb25uZWN0b3JQYXJhbXNNb2R1bGUpO1xyXG59XHJcbiJdfQ==
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdG9yLXBhcmFtcy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC13YXJlaG91c2Uvc3JjL2xpYi9jb21wb25lbnRzL2Nvbm5lY3Rvci1wYXJhbXMvY29ubmVjdG9yLXBhcmFtcy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDOzs7QUFFbEcsTUFBTSxNQUFNLEdBQVc7SUFDckIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSx3QkFBd0IsRUFBRTtDQUNsRCxDQUFDO0FBYUYsTUFBTSxPQUFPLHFCQUFxQjs7a0hBQXJCLHFCQUFxQjttSEFBckIscUJBQXFCLGlCQVZqQix3QkFBd0IsRUFBRSwwQkFBMEIsYUFFakUsVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixXQUFXO1FBQ1gsVUFBVTtRQUNWLGdCQUFnQjttSEFJUCxxQkFBcUIsWUFSOUIsVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixXQUFXO1FBQ1gsVUFBVTtRQUNWLGdCQUFnQjtRQUNoQixZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQzsyRkFHcEIscUJBQXFCO2tCQVhqQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLHdCQUF3QixFQUFFLDBCQUEwQixDQUFDO29CQUNwRSxPQUFPLEVBQUU7d0JBQ1AsVUFBVTt3QkFDVixpQkFBaUI7d0JBQ2pCLFdBQVc7d0JBQ1gsVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO3FCQUM5QjtpQkFDRjs7QUFHRCxNQUFNLFVBQVUsZ0NBQWdDO0lBQzlDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb3JlTW9kdWxlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcclxuaW1wb3J0IHsgVGhlbWVTaGFyZWRNb2R1bGUgfSBmcm9tICdAYWJwL25nLnRoZW1lLnNoYXJlZCc7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFBhZ2VNb2R1bGUgfSBmcm9tICdAYWJwL25nLmNvbXBvbmVudHMvcGFnZSc7XHJcbmltcG9ydCB7IER4RGF0YUdyaWRNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBDb25uZWN0b3JQYXJhbXNDb21wb25lbnQgfSBmcm9tICcuL2Nvbm5lY3Rvci1wYXJhbXMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQmluTG9jYXRpb25QaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9iaW4tbG9jYXRpb24tcGlja2VyL2Jpbi1sb2NhdGlvbi1waWNrZXIuY29tcG9uZW50JztcclxuXHJcbmNvbnN0IHJvdXRlczogUm91dGVzID0gW1xyXG4gIHsgcGF0aDogJycsIGNvbXBvbmVudDogQ29ubmVjdG9yUGFyYW1zQ29tcG9uZW50IH0sXHJcbl07XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGRlY2xhcmF0aW9uczogW0Nvbm5lY3RvclBhcmFtc0NvbXBvbmVudCwgQmluTG9jYXRpb25QaWNrZXJDb21wb25lbnRdLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvcmVNb2R1bGUsXHJcbiAgICBUaGVtZVNoYXJlZE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgUGFnZU1vZHVsZSxcclxuICAgIER4RGF0YUdyaWRNb2R1bGUsXHJcbiAgICBSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQocm91dGVzKSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29ubmVjdG9yUGFyYW1zTW9kdWxlIHt9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZENvbm5lY3RvclBhcmFtc01vZHVsZUFzQ2hpbGQoKSB7XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDb25uZWN0b3JQYXJhbXNNb2R1bGUpO1xyXG59XHJcbiJdfQ==