ngx-histaff-alpha 4.6.5 → 4.6.6

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.
@@ -1,13 +1,17 @@
1
- import { Component } from '@angular/core';
1
+ import { Component, ViewChild } from '@angular/core';
2
2
  import { BaseComponent } from '../base-component/base/base.component';
3
3
  import { CoreTableComponent } from '../core-table/core-table.component';
4
4
  import { CorePageHeaderComponent } from '../core-page-header/core-page-header/core-page-header.component';
5
5
  import { BehaviorSubject, distinctUntilChanged, switchMap, tap } from 'rxjs';
6
6
  import { CorePaginationComponent } from '../core-pagination/core-pagination/core-pagination.component';
7
7
  import { CoreButtonGroupVnsComponent } from '../core-button-group-vns/core-button-group-vns/core-button-group-vns.component';
8
+ import { TooltipDirective } from '../tooltip/tooltip.directive';
9
+ import { CoreCheckboxComponent } from '../core-checkbox/core-checkbox/core-checkbox.component';
10
+ import { FormsModule } from '@angular/forms';
8
11
  import * as i0 from "@angular/core";
9
12
  import * as i1 from "../../services/multi-language.service";
10
13
  import * as i2 from "../../services/app.service";
14
+ import * as i3 from "@angular/forms";
11
15
  export class CoreCompareDbPipelineComponent extends BaseComponent {
12
16
  constructor(mls, appService) {
13
17
  super(mls);
@@ -24,20 +28,20 @@ export class CoreCompareDbPipelineComponent extends BaseComponent {
24
28
  width: 0
25
29
  },
26
30
  {
27
- field: 'sourceDb',
31
+ field: 'sourceAlias',
28
32
  type: 'string',
29
- caption: 'DB nguồn',
33
+ caption: 'Nguồn',
30
34
  align: 'left',
31
35
  sortDisabled: true,
32
- width: 160
36
+ width: 60
33
37
  },
34
38
  {
35
- field: 'targetDb',
39
+ field: 'targetAlias',
36
40
  type: 'string',
37
- caption: 'DB đích',
41
+ caption: 'Đích',
38
42
  align: 'left',
39
43
  sortDisabled: true,
40
- width: 160
44
+ width: 60
41
45
  },
42
46
  {
43
47
  field: 'tableName',
@@ -64,12 +68,12 @@ export class CoreCompareDbPipelineComponent extends BaseComponent {
64
68
  width: 100
65
69
  },
66
70
  {
67
- field: 'targetType',
68
- type: 'string',
69
- caption: 'Kiểu đích',
70
- align: 'left',
71
+ field: 'sourceAllowsNull',
72
+ type: 'boolean',
73
+ caption: 'Source nullablity',
74
+ align: 'center',
71
75
  sortDisabled: true,
72
- width: 100
76
+ width: 70
73
77
  },
74
78
  {
75
79
  field: 'sourceSize',
@@ -79,6 +83,22 @@ export class CoreCompareDbPipelineComponent extends BaseComponent {
79
83
  sortDisabled: true,
80
84
  width: 100
81
85
  },
86
+ {
87
+ field: 'targetType',
88
+ type: 'string',
89
+ caption: 'Kiểu đích',
90
+ align: 'left',
91
+ sortDisabled: true,
92
+ width: 100
93
+ },
94
+ {
95
+ field: 'targetAllowsNull',
96
+ type: 'boolean',
97
+ caption: 'Target nullablity',
98
+ align: 'center',
99
+ sortDisabled: true,
100
+ width: 70
101
+ },
82
102
  {
83
103
  field: 'targetSize',
84
104
  type: 'string',
@@ -107,9 +127,36 @@ export class CoreCompareDbPipelineComponent extends BaseComponent {
107
127
  this.pageSize$ = new BehaviorSubject(50);
108
128
  this.pageCount = 0;
109
129
  this.suspendCurrentPageSubscription$ = new BehaviorSubject(false);
130
+ this.sqlCommand = '';
131
+ this.resolverSessionId = '';
132
+ this.conflictTotal = 0;
133
+ }
134
+ refreshList() {
135
+ this.loading = true;
136
+ this.subscriptions.push(this.appService.post('/api/SqlServerPipeline/CompareDbStructure', this.request$.value).subscribe(x => {
137
+ this.loading = false;
138
+ if (x.ok && x.status === 200 && x.body?.statusCode === 200) {
139
+ this.data = x.body.innerBody.data;
140
+ this.pageCount = Math.ceil(x.body.innerBody.count / this.pageSize$.value);
141
+ this.currentPage$.next(x.body.innerBody.pageNumber);
142
+ this.conflictTotal = x.body.innerBody.count || 0;
143
+ }
144
+ }));
110
145
  }
111
146
  ngAfterViewInit() {
112
147
  setTimeout(() => {
148
+ const tryFilterDifference = this.columns.filter(x => x.field === 'difference');
149
+ if (!!tryFilterDifference.length) {
150
+ tryFilterDifference[0].templateRef = this.toolBlock;
151
+ }
152
+ const tryFilterSourceAllowsNull = this.columns.filter(x => x.field === 'sourceAllowsNull');
153
+ if (!!tryFilterSourceAllowsNull.length) {
154
+ tryFilterSourceAllowsNull[0].templateRef = this.sourceAllowsNull;
155
+ }
156
+ const tryFilterTargetAllowsNull = this.columns.filter(x => x.field === 'targetAllowsNull');
157
+ if (!!tryFilterTargetAllowsNull.length) {
158
+ tryFilterTargetAllowsNull[0].templateRef = this.targetAllowsNull;
159
+ }
113
160
  this.tableHeight = window.innerHeight - 60 - 50 - 46 - 30;
114
161
  this.subscriptions.push(this.request$.pipe(distinctUntilChanged((pre, cur) => JSON.stringify(pre) === JSON.stringify(cur)), tap(() => this.loading = true), switchMap(x => this.appService.post('/api/SqlServerPipeline/CompareDbStructure', x))).subscribe(x => {
115
162
  this.loading = false;
@@ -117,6 +164,7 @@ export class CoreCompareDbPipelineComponent extends BaseComponent {
117
164
  this.data = x.body.innerBody.data;
118
165
  this.pageCount = Math.ceil(x.body.innerBody.count / this.pageSize$.value);
119
166
  this.currentPage$.next(x.body.innerBody.pageNumber);
167
+ this.conflictTotal = x.body.innerBody.count || 0;
120
168
  }
121
169
  }));
122
170
  this.subscriptions.push(this.currentPage$.subscribe(x => {
@@ -129,9 +177,42 @@ export class CoreCompareDbPipelineComponent extends BaseComponent {
129
177
  });
130
178
  }
131
179
  onSearching(e) {
180
+ const filtered = e.filter(x => !!x.searchFor.length);
181
+ this.request$.next({
182
+ ...this.request$.value,
183
+ filter: filtered
184
+ });
185
+ }
186
+ openRowResolver(event, context) {
187
+ event.stopPropagation();
188
+ this.loading = true;
189
+ this.subscriptions.push(this.appService.post('/api/SqlServerPipeline/GenerateConflictResolverCommand', context).subscribe(x => {
190
+ this.loading = false;
191
+ if (x.ok && x.status === 200 && x.body?.statusCode === 200) {
192
+ this.showRowResolverWindow = true;
193
+ this.resolverSessionId = x.body.innerBody.resolverSessionId;
194
+ this.sqlCommand = x.body.innerBody.sqlCommand.trim();
195
+ }
196
+ }));
197
+ }
198
+ closeRowResolver(event) {
199
+ this.showRowResolverWindow = false;
200
+ }
201
+ resolve(event) {
202
+ this.loading = true;
203
+ this.subscriptions.push(this.appService.post('/api/SqlServerPipeline/RunConflictResolverCommand', {
204
+ resolverSessionId: this.resolverSessionId,
205
+ sqlCommand: this.sqlCommand
206
+ }).subscribe(x => {
207
+ this.loading = false;
208
+ if (x.ok && x.status === 200 && x.body?.statusCode === 200) {
209
+ this.showRowResolverWindow = false;
210
+ this.refreshList();
211
+ }
212
+ }));
132
213
  }
133
214
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: CoreCompareDbPipelineComponent, deps: [{ token: i1.MultiLanguageService }, { token: i2.AppService }], target: i0.ɵɵFactoryTarget.Component }); }
134
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.1", type: CoreCompareDbPipelineComponent, isStandalone: true, selector: "core-compare-db-pipeline", usesInheritance: true, ngImport: i0, template: "<core-page-header [title]=\"'SO S\u00C1NH C\u1EA4U TR\u00DAC C\u00C1C DB TRONG M\u00D4I TR\u01AF\u1EDCNG PH\u00C1T TRI\u1EC2N'\"\r\n [hideButtonGroup]=\"true\"></core-page-header>\r\n<core-table [showCheckbox]=\"true\" [columns]=\"columns\" [height]=\"tableHeight\" [data]=\"data\" [loading]=\"loading\"\r\n [autoColumnFitAvailableSpace]=\"false\" [frozen]=\"2\" [lazyLoading]=\"true\"\r\n (onSearching)=\"onSearching($event)\"></core-table>\r\n<div class=\"h15\"></div>\r\n<div class=\"w-100 d-flex d-flex-end\">\r\n <core-pagination [$height]=\"46\" [$currentPage]=\"currentPage$\" [$pageCount]=\"pageCount\" [$loading]=\"loading\"\r\n [$background]=\"'#848484'\" [$fixedPageSize]=\"20\" [$suspendCurrentPageSubscription]=\"suspendCurrentPageSubscription$\"></core-pagination>\r\n</div>\r\n\r\n<ng-template #tools let-context=\"context\">\r\n \r\n</ng-template>", styles: [".core-compare-db-pipeline-container{position:fixed;display:block;z-index:9999999999;left:0;top:60px;width:100vw;height:calc(100vh - 60px)}.core-compare-db-pipeline-container .h15{height:15px}\n"], dependencies: [{ kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup"], outputs: ["buttonClick"] }, { kind: "component", type: CoreTableComponent, selector: "core-table", inputs: ["id", "width", "height", "showCheckbox", "checkboxSize", "outerButtons", "showTools", "tools", "checkingResetFlag", "borderRadius", "headerColor", "headerBackgroundColor", "headerWrap", "headerFirstRowHeight", "headerSecondRowHeight", "wrap", "allowCellScrollY", "loading", "rowHeight", "frozen", "footer", "columns", "data", "selectedIds", "corePageListInstanceNumber", "disableHighlightOnClick", "freeMode", "searchSwitchDisabled", "disableSorting", "inlineToolItems", "columnSearchDefaultOpen", "lazyLoading", "primaryKey", "rowHoverBgColor", "noPaddingCell", "autoColumnFitAvailableSpace"], outputs: ["onSearching", "onToolClick", "onRowClick", "onRowDoubleClick", "onSelectedIdsChange", "onSelectedDataChange", "onColumnCaptionClick"] }, { kind: "component", type: CorePaginationComponent, selector: "core-pagination", inputs: ["$currentPage", "$height", "$pageCount", "$loading", "$suspendCurrentPageSubscription", "$showAdd", "$background", "$fixedPageSize"], outputs: ["$onClickAdd"] }] }); }
215
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.1", type: CoreCompareDbPipelineComponent, isStandalone: true, selector: "core-compare-db-pipeline", viewQueries: [{ propertyName: "toolBlock", first: true, predicate: ["toolBlock"], descendants: true }, { propertyName: "sourceAllowsNull", first: true, predicate: ["sourceAllowsNull"], descendants: true }, { propertyName: "targetAllowsNull", first: true, predicate: ["targetAllowsNull"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"core-compare-db-pipeline-container\">\r\n <core-page-header [title]=\"'SO S\u00C1NH C\u1EA4U TR\u00DAC C\u00C1C DB TRONG M\u00D4I TR\u01AF\u1EDCNG PH\u00C1T TRI\u1EC2N'\"\r\n [hideButtonGroup]=\"true\"></core-page-header>\r\n <core-table [showCheckbox]=\"true\" [columns]=\"columns\" [height]=\"tableHeight\" [data]=\"data\" [loading]=\"loading\"\r\n [autoColumnFitAvailableSpace]=\"false\" [frozen]=\"2\" [lazyLoading]=\"true\"\r\n (onSearching)=\"onSearching($event)\"></core-table>\r\n <div class=\"h15\"></div>\r\n <div class=\"w-100 d-flex d-flex-between\">\r\n <div class=\"conflict-total\" [class.error]=\"!!conflictTotal\">\r\n {{ !!conflictTotal ? conflictTotal + ' conflicts found!' : 'No conflict found' }} \r\n </div>\r\n <core-pagination [$height]=\"46\" [$currentPage]=\"currentPage$\" [$pageCount]=\"pageCount\" [$loading]=\"loading\"\r\n [$background]=\"'#848484'\" [$fixedPageSize]=\"20\"\r\n [$suspendCurrentPageSubscription]=\"suspendCurrentPageSubscription$\"></core-pagination>\r\n </div>\r\n\r\n @if (showRowResolverWindow) {\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"row-resolver-window\">\r\n <core-page-header [title]=\"'RESOLVER WINDOW'\" [hideButtonGroup]=\"true\"></core-page-header>\r\n <i class=\"close-icon pointer feather-x fs24\" (click)=\"closeRowResolver($event)\"></i>\r\n <textarea class=\"form-control\" [rows]=\"'10'\" style=\"height: 400px; padding: 15px;\" disabled>\r\n {{ sqlCommand }}\r\n </textarea>\r\n <button class=\"btn btn-primary\" (click)=\"resolve($event)\" style=\"margin-top: 15px;\">Resolve</button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <ng-template #toolBlock let-context=\"context\">\r\n <div class=\"tools inter-font d-flex d-flex-start\">\r\n <div class=\"icon-wrapper\" [appTooltip]=\"'Resolve'\" [position]=\"'right'\" [showAnyway]=\"true\" (click)=\"openRowResolver($event, context)\">\r\n <i class=\"feather-play fs24\"></i>\r\n </div>\r\n <span>{{ context.difference }}</span>\r\n </div>\r\n </ng-template>\r\n <ng-template #sourceAllowsNull let-context=\"context\">\r\n <core-checkbox [ngModel]=\"context.sourceAllowsNull\" [disabled]=\"true\"></core-checkbox>\r\n </ng-template>\r\n <ng-template #targetAllowsNull let-context=\"context\">\r\n <core-checkbox [ngModel]=\"context.targetAllowsNull\" [disabled]=\"true\"></core-checkbox>\r\n </ng-template>\r\n</div>", styles: [".core-compare-db-pipeline-container .h15{height:15px}.core-compare-db-pipeline-container .tools{height:36px}.core-compare-db-pipeline-container .tools .icon-wrapper{color:#848484;opacity:.5;display:inline-flex;width:36px;height:36px;border-radius:50%}.core-compare-db-pipeline-container .tools .icon-wrapper:hover{opacity:1;color:#fff;background-color:#848484}.core-compare-db-pipeline-container .modal-content-root{padding-top:0}.core-compare-db-pipeline-container .close-icon{display:block;position:absolute;top:8px;right:8px;color:#848484}.core-compare-db-pipeline-container .close-icon:hover{color:inherit}.core-compare-db-pipeline-container .row-resolver-window{display:block;width:992px;max-width:100vw!important;height:500px}.core-compare-db-pipeline-container .conflict-total{height:50px;display:flex;align-items:center;justify-content:flex-start;color:#848484;font-size:24px;font-weight:700}.core-compare-db-pipeline-container .conflict-total.error{color:brown}\n"], dependencies: [{ kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup"], outputs: ["buttonClick"] }, { kind: "component", type: CoreTableComponent, selector: "core-table", inputs: ["id", "width", "height", "showCheckbox", "checkboxSize", "outerButtons", "showTools", "tools", "checkingResetFlag", "borderRadius", "headerColor", "headerBackgroundColor", "headerWrap", "headerFirstRowHeight", "headerSecondRowHeight", "wrap", "allowCellScrollY", "loading", "rowHeight", "frozen", "footer", "columns", "data", "selectedIds", "corePageListInstanceNumber", "disableHighlightOnClick", "freeMode", "searchSwitchDisabled", "disableSorting", "inlineToolItems", "columnSearchDefaultOpen", "lazyLoading", "primaryKey", "rowHoverBgColor", "noPaddingCell", "autoColumnFitAvailableSpace"], outputs: ["onSearching", "onToolClick", "onRowClick", "onRowDoubleClick", "onSelectedIdsChange", "onSelectedDataChange", "onColumnCaptionClick"] }, { kind: "component", type: CorePaginationComponent, selector: "core-pagination", inputs: ["$currentPage", "$height", "$pageCount", "$loading", "$suspendCurrentPageSubscription", "$showAdd", "$background", "$fixedPageSize"], outputs: ["$onClickAdd"] }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["color", "backgroundColor", "appTooltip", "showAnyway", "position"] }, { kind: "component", type: CoreCheckboxComponent, selector: "core-checkbox", inputs: ["text", "tooltipPosition", "tooltip", "inputValue", "disabled"], outputs: ["onClick"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
135
216
  }
136
217
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: CoreCompareDbPipelineComponent, decorators: [{
137
218
  type: Component,
@@ -139,7 +220,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImpor
139
220
  CoreButtonGroupVnsComponent,
140
221
  CorePageHeaderComponent,
141
222
  CoreTableComponent,
142
- CorePaginationComponent
143
- ], template: "<core-page-header [title]=\"'SO S\u00C1NH C\u1EA4U TR\u00DAC C\u00C1C DB TRONG M\u00D4I TR\u01AF\u1EDCNG PH\u00C1T TRI\u1EC2N'\"\r\n [hideButtonGroup]=\"true\"></core-page-header>\r\n<core-table [showCheckbox]=\"true\" [columns]=\"columns\" [height]=\"tableHeight\" [data]=\"data\" [loading]=\"loading\"\r\n [autoColumnFitAvailableSpace]=\"false\" [frozen]=\"2\" [lazyLoading]=\"true\"\r\n (onSearching)=\"onSearching($event)\"></core-table>\r\n<div class=\"h15\"></div>\r\n<div class=\"w-100 d-flex d-flex-end\">\r\n <core-pagination [$height]=\"46\" [$currentPage]=\"currentPage$\" [$pageCount]=\"pageCount\" [$loading]=\"loading\"\r\n [$background]=\"'#848484'\" [$fixedPageSize]=\"20\" [$suspendCurrentPageSubscription]=\"suspendCurrentPageSubscription$\"></core-pagination>\r\n</div>\r\n\r\n<ng-template #tools let-context=\"context\">\r\n \r\n</ng-template>", styles: [".core-compare-db-pipeline-container{position:fixed;display:block;z-index:9999999999;left:0;top:60px;width:100vw;height:calc(100vh - 60px)}.core-compare-db-pipeline-container .h15{height:15px}\n"] }]
144
- }], ctorParameters: () => [{ type: i1.MultiLanguageService }, { type: i2.AppService }] });
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS1jb21wYXJlLWRiLXBpcGVsaW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLWNvbXBhcmUtZGItcGlwZWxpbmUvY29yZS1jb21wYXJlLWRiLXBpcGVsaW5lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLWNvbXBhcmUtZGItcGlwZWxpbmUvY29yZS1jb21wYXJlLWRiLXBpcGVsaW5lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdkcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0ZBQWdGLENBQUM7Ozs7QUF3QjdILE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxhQUFhO0lBd0cvRCxZQUNrQixHQUF5QixFQUNqQyxVQUFzQjtRQUU5QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFISyxRQUFHLEdBQUgsR0FBRyxDQUFzQjtRQUNqQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBeEdoQyxTQUFJLEdBQVUsRUFBRSxDQUFDO1FB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QyxDQUNILENBQUE7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sVUFBVSxHQUErQjtvQkFDN0MsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUs7b0JBQ3RCLFVBQVUsRUFBRSxDQUFDO2lCQUNkLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM1RCxDQUFDLENBQUMsQ0FDSCxDQUFBO1FBRUgsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUFDLENBQU07SUFFbEIsQ0FBQzs4R0FsSlUsOEJBQThCO2tHQUE5Qiw4QkFBOEIsMkdDakMzQyx1M0JBYWMsMlBEYU4sdUJBQXVCLDZKQUN2QixrQkFBa0IscXlCQUNsQix1QkFBdUI7OzJGQUtsQiw4QkFBOEI7a0JBWDFDLFNBQVM7K0JBQ0ksMEJBQTBCLFdBQzNCO3dCQUNMLDJCQUEyQjt3QkFDM0IsdUJBQXVCO3dCQUN2QixrQkFBa0I7d0JBQ2xCLHVCQUF1QjtxQkFDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTXVsdGlMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tdWx0aS1sYW5ndWFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UtY29tcG9uZW50L2Jhc2UvYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb3JlVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jb3JlLXRhYmxlL2NvcmUtdGFibGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSUNvcmVUYWJsZUNvbHVtbkl0ZW0gfSBmcm9tICcuLi9jb3JlLXRhYmxlL0lDb3JlVGFibGVDb2x1bW5JdGVtJztcclxuaW1wb3J0IHsgQ29yZVBhZ2VIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb3JlLXBhZ2UtaGVhZGVyL2NvcmUtcGFnZS1oZWFkZXIvY29yZS1wYWdlLWhlYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb3JlUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUtcGFnaW5hdGlvbi9jb3JlLXBhZ2luYXRpb24vY29yZS1wYWdpbmF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvcmVCdXR0b25Hcm91cFZuc0NvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUtYnV0dG9uLWdyb3VwLXZucy9jb3JlLWJ1dHRvbi1ncm91cC12bnMvY29yZS1idXR0b24tZ3JvdXAtdm5zLmNvbXBvbmVudCc7XHJcblxyXG5pbnRlcmZhY2UgSUNvbXBhcmVEYlN0cnVjdHVyZUZpbHRlckl0ZW0ge1xyXG4gIGZpZWxkOiBzdHJpbmc7XHJcbiAgc2VhcmNoRm9yOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJQ29tcGFyZURiU3RydWN0dXJlUmVxdWVzdCB7XHJcbiAgZmlsdGVyPzogSUNvbXBhcmVEYlN0cnVjdHVyZUZpbHRlckl0ZW1bXTtcclxuICBwYWdlTnVtYmVyOiBudW1iZXI7XHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NvcmUtY29tcGFyZS1kYi1waXBlbGluZScsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgQ29yZUJ1dHRvbkdyb3VwVm5zQ29tcG9uZW50LFxyXG4gICAgICAgIENvcmVQYWdlSGVhZGVyQ29tcG9uZW50LFxyXG4gICAgICAgIENvcmVUYWJsZUNvbXBvbmVudCxcclxuICAgICAgICBDb3JlUGFnaW5hdGlvbkNvbXBvbmVudFxyXG4gICAgXSxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb3JlLWNvbXBhcmUtZGItcGlwZWxpbmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmw6ICcuL2NvcmUtY29tcGFyZS1kYi1waXBlbGluZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIENvcmVDb21wYXJlRGJQaXBlbGluZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgZGF0YTogYW55W10gPSBbXTtcclxuXHJcbiAgY29sdW1uczogSUNvcmVUYWJsZUNvbHVtbkl0ZW1bXSA9IFtcclxuICAgIHtcclxuICAgICAgZmllbGQ6ICdpZCcsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBjYXB0aW9uOiAnaWQnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBoaWRkZW46IHRydWUsXHJcbiAgICAgIHdpZHRoOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBmaWVsZDogJ3NvdXJjZURiJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGNhcHRpb246ICdEQiBuZ3Xhu5NuJyxcclxuICAgICAgYWxpZ246ICdsZWZ0JyxcclxuICAgICAgc29ydERpc2FibGVkOiB0cnVlLFxyXG4gICAgICB3aWR0aDogMTYwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBmaWVsZDogJ3RhcmdldERiJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGNhcHRpb246ICdEQiDEkcOtY2gnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAxNjBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAndGFibGVOYW1lJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGNhcHRpb246ICdC4bqjbmcnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAyMDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAnY29sdW1uTmFtZScsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBjYXB0aW9uOiAnQ+G7mXQnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAyMDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAnc291cmNlVHlwZScsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBjYXB0aW9uOiAnS2nhu4N1IG5ndeG7k24nLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAxMDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAndGFyZ2V0VHlwZScsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBjYXB0aW9uOiAnS2nhu4N1IMSRw61jaCcsXHJcbiAgICAgIGFsaWduOiAnbGVmdCcsXHJcbiAgICAgIHNvcnREaXNhYmxlZDogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDEwMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmllbGQ6ICdzb3VyY2VTaXplJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGNhcHRpb246ICdD4buhIG5ndeG7k24nLFxyXG4gICAgICBhbGlnbjogJ3JpZ2h0JyxcclxuICAgICAgc29ydERpc2FibGVkOiB0cnVlLFxyXG4gICAgICB3aWR0aDogMTAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBmaWVsZDogJ3RhcmdldFNpemUnLFxyXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcclxuICAgICAgY2FwdGlvbjogJ0Phu6EgxJHDrWNoJyxcclxuICAgICAgYWxpZ246ICdyaWdodCcsXHJcbiAgICAgIHNvcnREaXNhYmxlZDogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDEwMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmllbGQ6ICdkaWZmZXJlbmNlJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGNhcHRpb246ICdLaMOhYyBiaeG7h3QnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiA0MDBcclxuICAgIH0sXHJcbiAgXVxyXG5cclxuICB0YWJsZUhlaWdodDogbnVtYmVyID0gNTAwO1xyXG5cclxuICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGRlZmF1bHRSZXF1ZXN0OiBJQ29tcGFyZURiU3RydWN0dXJlUmVxdWVzdCA9IHtcclxuICAgIHBhZ2VOdW1iZXI6IDEsXHJcbiAgICBwYWdlU2l6ZTogNTBcclxuICB9XHJcblxyXG4gIHJlcXVlc3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJQ29tcGFyZURiU3RydWN0dXJlUmVxdWVzdD4odGhpcy5kZWZhdWx0UmVxdWVzdCk7XHJcblxyXG4gIGN1cnJlbnRQYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigxKTtcclxuICBwYWdlU2l6ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oNTApO1xyXG4gIHBhZ2VDb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgc3VzcGVuZEN1cnJlbnRQYWdlU3Vic2NyaXB0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBvdmVycmlkZSBtbHM6IE11bHRpTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcHBTZXJ2aWNlOiBBcHBTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihtbHMpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICB0aGlzLnRhYmxlSGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gNjAgLSA1MCAtIDQ2IC0gMzA7XHJcblxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICB0aGlzLnJlcXVlc3QkLnBpcGUoXHJcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJlLCBjdXIpID0+IEpTT04uc3RyaW5naWZ5KHByZSkgPT09IEpTT04uc3RyaW5naWZ5KGN1cikpLFxyXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMubG9hZGluZyA9IHRydWUpLFxyXG4gICAgICAgICAgc3dpdGNoTWFwKHggPT4gdGhpcy5hcHBTZXJ2aWNlLnBvc3QoJy9hcGkvU3FsU2VydmVyUGlwZWxpbmUvQ29tcGFyZURiU3RydWN0dXJlJywgeCkpXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICh4Lm9rICYmIHguc3RhdHVzID09PSAyMDAgJiYgeC5ib2R5Py5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhID0geC5ib2R5LmlubmVyQm9keS5kYXRhXHJcbiAgICAgICAgICAgIHRoaXMucGFnZUNvdW50ID0gTWF0aC5jZWlsKHguYm9keS5pbm5lckJvZHkuY291bnQgLyB0aGlzLnBhZ2VTaXplJC52YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UkLm5leHQoeC5ib2R5LmlubmVyQm9keS5wYWdlTnVtYmVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcblxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlJC5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuZXdSZXF1ZXN0OiBJQ29tcGFyZURiU3RydWN0dXJlUmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5yZXF1ZXN0JC52YWx1ZSxcclxuICAgICAgICAgICAgcGFnZU51bWJlcjogeFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0JC5uZXh0KEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobmV3UmVxdWVzdCkpKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgb25TZWFyY2hpbmcoZTogYW55KTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbn1cclxuIiwiPGNvcmUtcGFnZS1oZWFkZXIgW3RpdGxlXT1cIidTTyBTw4FOSCBD4bqkVSBUUsOaQyBDw4FDIERCIFRST05HIE3DlEkgVFLGr+G7nE5HIFBIw4FUIFRSSeG7gk4nXCJcclxuICAgIFtoaWRlQnV0dG9uR3JvdXBdPVwidHJ1ZVwiPjwvY29yZS1wYWdlLWhlYWRlcj5cclxuPGNvcmUtdGFibGUgW3Nob3dDaGVja2JveF09XCJ0cnVlXCIgW2NvbHVtbnNdPVwiY29sdW1uc1wiIFtoZWlnaHRdPVwidGFibGVIZWlnaHRcIiBbZGF0YV09XCJkYXRhXCIgW2xvYWRpbmddPVwibG9hZGluZ1wiXHJcbiAgICBbYXV0b0NvbHVtbkZpdEF2YWlsYWJsZVNwYWNlXT1cImZhbHNlXCIgW2Zyb3plbl09XCIyXCIgW2xhenlMb2FkaW5nXT1cInRydWVcIlxyXG4gICAgKG9uU2VhcmNoaW5nKT1cIm9uU2VhcmNoaW5nKCRldmVudClcIj48L2NvcmUtdGFibGU+XHJcbjxkaXYgY2xhc3M9XCJoMTVcIj48L2Rpdj5cclxuPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBkLWZsZXgtZW5kXCI+XHJcbiAgICA8Y29yZS1wYWdpbmF0aW9uIFskaGVpZ2h0XT1cIjQ2XCIgWyRjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZSRcIiBbJHBhZ2VDb3VudF09XCJwYWdlQ291bnRcIiBbJGxvYWRpbmddPVwibG9hZGluZ1wiXHJcbiAgICAgICAgWyRiYWNrZ3JvdW5kXT1cIicjODQ4NDg0J1wiIFskZml4ZWRQYWdlU2l6ZV09XCIyMFwiIFskc3VzcGVuZEN1cnJlbnRQYWdlU3Vic2NyaXB0aW9uXT1cInN1c3BlbmRDdXJyZW50UGFnZVN1YnNjcmlwdGlvbiRcIj48L2NvcmUtcGFnaW5hdGlvbj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI3Rvb2xzIGxldC1jb250ZXh0PVwiY29udGV4dFwiPlxyXG4gICAgXHJcbjwvbmctdGVtcGxhdGU+Il19
223
+ CorePaginationComponent,
224
+ TooltipDirective,
225
+ CoreCheckboxComponent,
226
+ FormsModule
227
+ ], template: "<div class=\"core-compare-db-pipeline-container\">\r\n <core-page-header [title]=\"'SO S\u00C1NH C\u1EA4U TR\u00DAC C\u00C1C DB TRONG M\u00D4I TR\u01AF\u1EDCNG PH\u00C1T TRI\u1EC2N'\"\r\n [hideButtonGroup]=\"true\"></core-page-header>\r\n <core-table [showCheckbox]=\"true\" [columns]=\"columns\" [height]=\"tableHeight\" [data]=\"data\" [loading]=\"loading\"\r\n [autoColumnFitAvailableSpace]=\"false\" [frozen]=\"2\" [lazyLoading]=\"true\"\r\n (onSearching)=\"onSearching($event)\"></core-table>\r\n <div class=\"h15\"></div>\r\n <div class=\"w-100 d-flex d-flex-between\">\r\n <div class=\"conflict-total\" [class.error]=\"!!conflictTotal\">\r\n {{ !!conflictTotal ? conflictTotal + ' conflicts found!' : 'No conflict found' }} \r\n </div>\r\n <core-pagination [$height]=\"46\" [$currentPage]=\"currentPage$\" [$pageCount]=\"pageCount\" [$loading]=\"loading\"\r\n [$background]=\"'#848484'\" [$fixedPageSize]=\"20\"\r\n [$suspendCurrentPageSubscription]=\"suspendCurrentPageSubscription$\"></core-pagination>\r\n </div>\r\n\r\n @if (showRowResolverWindow) {\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"row-resolver-window\">\r\n <core-page-header [title]=\"'RESOLVER WINDOW'\" [hideButtonGroup]=\"true\"></core-page-header>\r\n <i class=\"close-icon pointer feather-x fs24\" (click)=\"closeRowResolver($event)\"></i>\r\n <textarea class=\"form-control\" [rows]=\"'10'\" style=\"height: 400px; padding: 15px;\" disabled>\r\n {{ sqlCommand }}\r\n </textarea>\r\n <button class=\"btn btn-primary\" (click)=\"resolve($event)\" style=\"margin-top: 15px;\">Resolve</button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <ng-template #toolBlock let-context=\"context\">\r\n <div class=\"tools inter-font d-flex d-flex-start\">\r\n <div class=\"icon-wrapper\" [appTooltip]=\"'Resolve'\" [position]=\"'right'\" [showAnyway]=\"true\" (click)=\"openRowResolver($event, context)\">\r\n <i class=\"feather-play fs24\"></i>\r\n </div>\r\n <span>{{ context.difference }}</span>\r\n </div>\r\n </ng-template>\r\n <ng-template #sourceAllowsNull let-context=\"context\">\r\n <core-checkbox [ngModel]=\"context.sourceAllowsNull\" [disabled]=\"true\"></core-checkbox>\r\n </ng-template>\r\n <ng-template #targetAllowsNull let-context=\"context\">\r\n <core-checkbox [ngModel]=\"context.targetAllowsNull\" [disabled]=\"true\"></core-checkbox>\r\n </ng-template>\r\n</div>", styles: [".core-compare-db-pipeline-container .h15{height:15px}.core-compare-db-pipeline-container .tools{height:36px}.core-compare-db-pipeline-container .tools .icon-wrapper{color:#848484;opacity:.5;display:inline-flex;width:36px;height:36px;border-radius:50%}.core-compare-db-pipeline-container .tools .icon-wrapper:hover{opacity:1;color:#fff;background-color:#848484}.core-compare-db-pipeline-container .modal-content-root{padding-top:0}.core-compare-db-pipeline-container .close-icon{display:block;position:absolute;top:8px;right:8px;color:#848484}.core-compare-db-pipeline-container .close-icon:hover{color:inherit}.core-compare-db-pipeline-container .row-resolver-window{display:block;width:992px;max-width:100vw!important;height:500px}.core-compare-db-pipeline-container .conflict-total{height:50px;display:flex;align-items:center;justify-content:flex-start;color:#848484;font-size:24px;font-weight:700}.core-compare-db-pipeline-container .conflict-total.error{color:brown}\n"] }]
228
+ }], ctorParameters: () => [{ type: i1.MultiLanguageService }, { type: i2.AppService }], propDecorators: { toolBlock: [{
229
+ type: ViewChild,
230
+ args: ['toolBlock']
231
+ }], sourceAllowsNull: [{
232
+ type: ViewChild,
233
+ args: ['sourceAllowsNull']
234
+ }], targetAllowsNull: [{
235
+ type: ViewChild,
236
+ args: ['targetAllowsNull']
237
+ }] } });
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS1jb21wYXJlLWRiLXBpcGVsaW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLWNvbXBhcmUtZGItcGlwZWxpbmUvY29yZS1jb21wYXJlLWRiLXBpcGVsaW5lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLWNvbXBhcmUtZGItcGlwZWxpbmUvY29yZS1jb21wYXJlLWRiLXBpcGVsaW5lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFlLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFeEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFDMUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdGQUFnRixDQUFDO0FBQzdILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQy9GLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUE2QzdDLE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxhQUFh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QUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztnQkFDbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFBO0lBQ0gsQ0FBQzs4R0FqUFUsOEJBQThCO2tHQUE5Qiw4QkFBOEIsaWFDekQzQywwdEZBNkNNLHNnQ0RFRSx1QkFBdUIsNkpBQ3ZCLGtCQUFrQixxeUJBQ2xCLHVCQUF1QixxT0FDdkIsZ0JBQWdCLHVJQUNoQixxQkFBcUIseUpBQ3JCLFdBQVc7OzJGQUtOLDhCQUE4QjtrQkFkMUMsU0FBUzsrQkFDSSwwQkFBMEIsV0FDM0I7d0JBQ0wsMkJBQTJCO3dCQUMzQix1QkFBdUI7d0JBQ3ZCLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3dCQUN2QixnQkFBZ0I7d0JBQ2hCLHFCQUFxQjt3QkFDckIsV0FBVztxQkFDZDtrSEFNcUIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNTLGdCQUFnQjtzQkFBOUMsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBQ0UsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNdWx0aUxhbmd1YWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL211bHRpLWxhbmd1YWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZS1jb21wb25lbnQvYmFzZS9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvcmVUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUtdGFibGUvY29yZS10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJQ29yZVRhYmxlQ29sdW1uSXRlbSB9IGZyb20gJy4uL2NvcmUtdGFibGUvSUNvcmVUYWJsZUNvbHVtbkl0ZW0nO1xyXG5pbXBvcnQgeyBDb3JlUGFnZUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUtcGFnZS1oZWFkZXIvY29yZS1wYWdlLWhlYWRlci9jb3JlLXBhZ2UtaGVhZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvcmVQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS1wYWdpbmF0aW9uL2NvcmUtcGFnaW5hdGlvbi9jb3JlLXBhZ2luYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29yZUJ1dHRvbkdyb3VwVm5zQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS1idXR0b24tZ3JvdXAtdm5zL2NvcmUtYnV0dG9uLWdyb3VwLXZucy9jb3JlLWJ1dHRvbi1ncm91cC12bnMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb3JlQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi9jb3JlLWNoZWNrYm94L2NvcmUtY2hlY2tib3gvY29yZS1jaGVja2JveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmludGVyZmFjZSBJQ29tcGFyZURiU3RydWN0dXJlRmlsdGVySXRlbSB7XHJcbiAgZmllbGQ6IHN0cmluZztcclxuICBzZWFyY2hGb3I6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIElDb21wYXJlRGJTdHJ1Y3R1cmVSZXF1ZXN0IHtcclxuICBmaWx0ZXI/OiBJQ29tcGFyZURiU3RydWN0dXJlRmlsdGVySXRlbVtdO1xyXG4gIHBhZ2VOdW1iZXI6IG51bWJlcjtcclxuICBwYWdlU2l6ZTogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSURiU3RydWN0dXJlRGlmZmVyZW5jZVxyXG57XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgc291cmNlQWxpYXM6IHN0cmluZztcclxuICAgIHRhcmdldEFsaWFzOiBzdHJpbmc7XHJcbiAgICB0YWJsZU5hbWU6IHN0cmluZztcclxuICAgIGNvbHVtbk5hbWU6IHN0cmluZztcclxuICAgIGNvbmZsaWN0VHlwZTogc3RyaW5nO1xyXG4gICAgc291cmNlVHlwZT86IHN0cmluZztcclxuICAgIHNvdXJjZVNpemU/OiBudW1iZXI7XHJcbiAgICBzb3VyY2VBbGxvd3NOdWxsPzogYm9vbGVhbjtcclxuICAgIHRhcmdldFR5cGU/OiBzdHJpbmc7XHJcbiAgICB0YXJnZXRTaXplPzogbnVtYmVyO1xyXG4gICAgdGFyZ2V0QWxsb3dzTnVsbD86IGJvb2xlYW47XHJcbiAgICBkaWZmZXJlbmNlOiBzdHJpbmc7XHJcbiAgICByZXNvbHZlclNlc3Npb25JZD86IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NvcmUtY29tcGFyZS1kYi1waXBlbGluZScsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgQ29yZUJ1dHRvbkdyb3VwVm5zQ29tcG9uZW50LFxyXG4gICAgICAgIENvcmVQYWdlSGVhZGVyQ29tcG9uZW50LFxyXG4gICAgICAgIENvcmVUYWJsZUNvbXBvbmVudCxcclxuICAgICAgICBDb3JlUGFnaW5hdGlvbkNvbXBvbmVudCxcclxuICAgICAgICBUb29sdGlwRGlyZWN0aXZlLFxyXG4gICAgICAgIENvcmVDaGVja2JveENvbXBvbmVudCxcclxuICAgICAgICBGb3Jtc01vZHVsZVxyXG4gICAgXSxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb3JlLWNvbXBhcmUtZGItcGlwZWxpbmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmw6ICcuL2NvcmUtY29tcGFyZS1kYi1waXBlbGluZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIENvcmVDb21wYXJlRGJQaXBlbGluZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgQFZpZXdDaGlsZCgndG9vbEJsb2NrJykgdG9vbEJsb2NrITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdzb3VyY2VBbGxvd3NOdWxsJykgc291cmNlQWxsb3dzTnVsbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndGFyZ2V0QWxsb3dzTnVsbCcpIHRhcmdldEFsbG93c051bGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBkYXRhOiBhbnlbXSA9IFtdO1xyXG5cclxuICBzaG93Um93UmVzb2x2ZXJXaW5kb3chOiBib29sZWFuO1xyXG5cclxuICBjb2x1bW5zOiBJQ29yZVRhYmxlQ29sdW1uSXRlbVtdID0gW1xyXG4gICAge1xyXG4gICAgICBmaWVsZDogJ2lkJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGNhcHRpb246ICdpZCcsXHJcbiAgICAgIGFsaWduOiAnbGVmdCcsXHJcbiAgICAgIGhpZGRlbjogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAnc291cmNlQWxpYXMnLFxyXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcclxuICAgICAgY2FwdGlvbjogJ05ndeG7k24nLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiA2MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmllbGQ6ICd0YXJnZXRBbGlhcycsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBjYXB0aW9uOiAnxJDDrWNoJyxcclxuICAgICAgYWxpZ246ICdsZWZ0JyxcclxuICAgICAgc29ydERpc2FibGVkOiB0cnVlLFxyXG4gICAgICB3aWR0aDogNjBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAndGFibGVOYW1lJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGNhcHRpb246ICdC4bqjbmcnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAyMDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAnY29sdW1uTmFtZScsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBjYXB0aW9uOiAnQ+G7mXQnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAyMDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAnc291cmNlVHlwZScsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBjYXB0aW9uOiAnS2nhu4N1IG5ndeG7k24nLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAxMDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAnc291cmNlQWxsb3dzTnVsbCcsXHJcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcclxuICAgICAgY2FwdGlvbjogJ1NvdXJjZSBudWxsYWJsaXR5JyxcclxuICAgICAgYWxpZ246ICdjZW50ZXInLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiA3MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmllbGQ6ICdzb3VyY2VTaXplJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGNhcHRpb246ICdD4buhIG5ndeG7k24nLFxyXG4gICAgICBhbGlnbjogJ3JpZ2h0JyxcclxuICAgICAgc29ydERpc2FibGVkOiB0cnVlLFxyXG4gICAgICB3aWR0aDogMTAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBmaWVsZDogJ3RhcmdldFR5cGUnLFxyXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcclxuICAgICAgY2FwdGlvbjogJ0tp4buDdSDEkcOtY2gnLFxyXG4gICAgICBhbGlnbjogJ2xlZnQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAxMDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAndGFyZ2V0QWxsb3dzTnVsbCcsXHJcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcclxuICAgICAgY2FwdGlvbjogJ1RhcmdldCBudWxsYWJsaXR5JyxcclxuICAgICAgYWxpZ246ICdjZW50ZXInLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiA3MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmllbGQ6ICd0YXJnZXRTaXplJyxcclxuICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgIGNhcHRpb246ICdD4buhIMSRw61jaCcsXHJcbiAgICAgIGFsaWduOiAncmlnaHQnLFxyXG4gICAgICBzb3J0RGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAxMDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpZWxkOiAnZGlmZmVyZW5jZScsXHJcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBjYXB0aW9uOiAnS2jDoWMgYmnhu4d0JyxcclxuICAgICAgYWxpZ246ICdsZWZ0JyxcclxuICAgICAgc29ydERpc2FibGVkOiB0cnVlLFxyXG4gICAgICB3aWR0aDogNDAwXHJcbiAgICB9LFxyXG4gIF1cclxuXHJcbiAgdGFibGVIZWlnaHQ6IG51bWJlciA9IDUwMDtcclxuXHJcbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBkZWZhdWx0UmVxdWVzdDogSUNvbXBhcmVEYlN0cnVjdHVyZVJlcXVlc3QgPSB7XHJcbiAgICBwYWdlTnVtYmVyOiAxLFxyXG4gICAgcGFnZVNpemU6IDUwXHJcbiAgfVxyXG5cclxuICByZXF1ZXN0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SUNvbXBhcmVEYlN0cnVjdHVyZVJlcXVlc3Q+KHRoaXMuZGVmYXVsdFJlcXVlc3QpO1xyXG5cclxuICBjdXJyZW50UGFnZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMSk7XHJcbiAgcGFnZVNpemUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDUwKTtcclxuICBwYWdlQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG4gIHN1c3BlbmRDdXJyZW50UGFnZVN1YnNjcmlwdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgc3FsQ29tbWFuZDogc3RyaW5nID0gJyc7XHJcbiAgcmVzb2x2ZXJTZXNzaW9uSWQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICBjb25mbGljdFRvdGFsOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBvdmVycmlkZSBtbHM6IE11bHRpTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcHBTZXJ2aWNlOiBBcHBTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihtbHMpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaExpc3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuYXBwU2VydmljZS5wb3N0KCcvYXBpL1NxbFNlcnZlclBpcGVsaW5lL0NvbXBhcmVEYlN0cnVjdHVyZScsIHRoaXMucmVxdWVzdCQudmFsdWUpLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAoeC5vayAmJiB4LnN0YXR1cyA9PT0gMjAwICYmIHguYm9keT8uc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGEgPSB4LmJvZHkuaW5uZXJCb2R5LmRhdGFcclxuICAgICAgICAgIHRoaXMucGFnZUNvdW50ID0gTWF0aC5jZWlsKHguYm9keS5pbm5lckJvZHkuY291bnQgLyB0aGlzLnBhZ2VTaXplJC52YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlJC5uZXh0KHguYm9keS5pbm5lckJvZHkucGFnZU51bWJlcik7XHJcbiAgICAgICAgICB0aGlzLmNvbmZsaWN0VG90YWwgPSB4LmJvZHkuaW5uZXJCb2R5LmNvdW50IHx8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICBjb25zdCB0cnlGaWx0ZXJEaWZmZXJlbmNlICA9dGhpcy5jb2x1bW5zLmZpbHRlcih4ID0+IHguZmllbGQgPT09ICdkaWZmZXJlbmNlJyk7XHJcbiAgICAgIGlmICghIXRyeUZpbHRlckRpZmZlcmVuY2UubGVuZ3RoKSB7XHJcbiAgICAgICAgdHJ5RmlsdGVyRGlmZmVyZW5jZVswXS50ZW1wbGF0ZVJlZiA9IHRoaXMudG9vbEJsb2NrO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRyeUZpbHRlclNvdXJjZUFsbG93c051bGwgID10aGlzLmNvbHVtbnMuZmlsdGVyKHggPT4geC5maWVsZCA9PT0gJ3NvdXJjZUFsbG93c051bGwnKTtcclxuICAgICAgaWYgKCEhdHJ5RmlsdGVyU291cmNlQWxsb3dzTnVsbC5sZW5ndGgpIHtcclxuICAgICAgICB0cnlGaWx0ZXJTb3VyY2VBbGxvd3NOdWxsWzBdLnRlbXBsYXRlUmVmID0gdGhpcy5zb3VyY2VBbGxvd3NOdWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRyeUZpbHRlclRhcmdldEFsbG93c051bGwgID10aGlzLmNvbHVtbnMuZmlsdGVyKHggPT4geC5maWVsZCA9PT0gJ3RhcmdldEFsbG93c051bGwnKTtcclxuICAgICAgaWYgKCEhdHJ5RmlsdGVyVGFyZ2V0QWxsb3dzTnVsbC5sZW5ndGgpIHtcclxuICAgICAgICB0cnlGaWx0ZXJUYXJnZXRBbGxvd3NOdWxsWzBdLnRlbXBsYXRlUmVmID0gdGhpcy50YXJnZXRBbGxvd3NOdWxsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnRhYmxlSGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gNjAgLSA1MCAtIDQ2IC0gMzA7XHJcblxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICB0aGlzLnJlcXVlc3QkLnBpcGUoXHJcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJlLCBjdXIpID0+IEpTT04uc3RyaW5naWZ5KHByZSkgPT09IEpTT04uc3RyaW5naWZ5KGN1cikpLFxyXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMubG9hZGluZyA9IHRydWUpLFxyXG4gICAgICAgICAgc3dpdGNoTWFwKHggPT4gdGhpcy5hcHBTZXJ2aWNlLnBvc3QoJy9hcGkvU3FsU2VydmVyUGlwZWxpbmUvQ29tcGFyZURiU3RydWN0dXJlJywgeCkpXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICh4Lm9rICYmIHguc3RhdHVzID09PSAyMDAgJiYgeC5ib2R5Py5zdGF0dXNDb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhID0geC5ib2R5LmlubmVyQm9keS5kYXRhXHJcbiAgICAgICAgICAgIHRoaXMucGFnZUNvdW50ID0gTWF0aC5jZWlsKHguYm9keS5pbm5lckJvZHkuY291bnQgLyB0aGlzLnBhZ2VTaXplJC52YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UkLm5leHQoeC5ib2R5LmlubmVyQm9keS5wYWdlTnVtYmVyKTtcclxuICAgICAgICAgICAgdGhpcy5jb25mbGljdFRvdGFsID0geC5ib2R5LmlubmVyQm9keS5jb3VudCB8fCAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuXHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UkLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgIGNvbnN0IG5ld1JlcXVlc3Q6IElDb21wYXJlRGJTdHJ1Y3R1cmVSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLnJlcXVlc3QkLnZhbHVlLFxyXG4gICAgICAgICAgICBwYWdlTnVtYmVyOiB4XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJlcXVlc3QkLm5leHQoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuZXdSZXF1ZXN0KSkpXHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG5cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBvblNlYXJjaGluZyhlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpbHRlcmVkID0gZS5maWx0ZXIoeCA9PiAhIXguc2VhcmNoRm9yLmxlbmd0aClcclxuICAgIHRoaXMucmVxdWVzdCQubmV4dCh7XHJcbiAgICAgIC4uLnRoaXMucmVxdWVzdCQudmFsdWUsXHJcbiAgICAgIGZpbHRlcjogZmlsdGVyZWRcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBvcGVuUm93UmVzb2x2ZXIoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5hcHBTZXJ2aWNlLnBvc3QoJy9hcGkvU3FsU2VydmVyUGlwZWxpbmUvR2VuZXJhdGVDb25mbGljdFJlc29sdmVyQ29tbWFuZCcsIGNvbnRleHQpLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAoeC5vayAmJiB4LnN0YXR1cyA9PT0gMjAwICYmIHguYm9keT8uc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dSb3dSZXNvbHZlcldpbmRvdyA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnJlc29sdmVyU2Vzc2lvbklkID0geC5ib2R5LmlubmVyQm9keS5yZXNvbHZlclNlc3Npb25JZFxyXG4gICAgICAgICAgdGhpcy5zcWxDb21tYW5kID0gKHguYm9keS5pbm5lckJvZHkuc3FsQ29tbWFuZCBhcyBzdHJpbmcpLnRyaW0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBjbG9zZVJvd1Jlc29sdmVyKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2hvd1Jvd1Jlc29sdmVyV2luZG93ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZXNvbHZlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5hcHBTZXJ2aWNlLnBvc3QoJy9hcGkvU3FsU2VydmVyUGlwZWxpbmUvUnVuQ29uZmxpY3RSZXNvbHZlckNvbW1hbmQnLCB7XHJcbiAgICAgICAgcmVzb2x2ZXJTZXNzaW9uSWQ6IHRoaXMucmVzb2x2ZXJTZXNzaW9uSWQsXHJcbiAgICAgICAgc3FsQ29tbWFuZDogdGhpcy5zcWxDb21tYW5kXHJcbiAgICAgIH0pLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAoeC5vayAmJiB4LnN0YXR1cyA9PT0gMjAwICYmIHguYm9keT8uc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dSb3dSZXNvbHZlcldpbmRvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoTGlzdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIClcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb3JlLWNvbXBhcmUtZGItcGlwZWxpbmUtY29udGFpbmVyXCI+XHJcbiAgICA8Y29yZS1wYWdlLWhlYWRlciBbdGl0bGVdPVwiJ1NPIFPDgU5IIEPhuqRVIFRSw5pDIEPDgUMgREIgVFJPTkcgTcOUSSBUUsav4bucTkcgUEjDgVQgVFJJ4buCTidcIlxyXG4gICAgICAgIFtoaWRlQnV0dG9uR3JvdXBdPVwidHJ1ZVwiPjwvY29yZS1wYWdlLWhlYWRlcj5cclxuICAgIDxjb3JlLXRhYmxlIFtzaG93Q2hlY2tib3hdPVwidHJ1ZVwiIFtjb2x1bW5zXT1cImNvbHVtbnNcIiBbaGVpZ2h0XT1cInRhYmxlSGVpZ2h0XCIgW2RhdGFdPVwiZGF0YVwiIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgICAgIFthdXRvQ29sdW1uRml0QXZhaWxhYmxlU3BhY2VdPVwiZmFsc2VcIiBbZnJvemVuXT1cIjJcIiBbbGF6eUxvYWRpbmddPVwidHJ1ZVwiXHJcbiAgICAgICAgKG9uU2VhcmNoaW5nKT1cIm9uU2VhcmNoaW5nKCRldmVudClcIj48L2NvcmUtdGFibGU+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaDE1XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGQtZmxleC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZsaWN0LXRvdGFsXCIgW2NsYXNzLmVycm9yXT1cIiEhY29uZmxpY3RUb3RhbFwiPlxyXG4gICAgICAgICAgICB7eyAhIWNvbmZsaWN0VG90YWwgPyBjb25mbGljdFRvdGFsICsgJyBjb25mbGljdHMgZm91bmQhJyA6ICdObyBjb25mbGljdCBmb3VuZCcgfX0gXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGNvcmUtcGFnaW5hdGlvbiBbJGhlaWdodF09XCI0NlwiIFskY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2UkXCIgWyRwYWdlQ291bnRdPVwicGFnZUNvdW50XCIgWyRsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgICAgICAgICBbJGJhY2tncm91bmRdPVwiJyM4NDg0ODQnXCIgWyRmaXhlZFBhZ2VTaXplXT1cIjIwXCJcclxuICAgICAgICAgICAgWyRzdXNwZW5kQ3VycmVudFBhZ2VTdWJzY3JpcHRpb25dPVwic3VzcGVuZEN1cnJlbnRQYWdlU3Vic2NyaXB0aW9uJFwiPjwvY29yZS1wYWdpbmF0aW9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmIChzaG93Um93UmVzb2x2ZXJXaW5kb3cpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50LXJvb3RcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctcmVzb2x2ZXItd2luZG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNvcmUtcGFnZS1oZWFkZXIgW3RpdGxlXT1cIidSRVNPTFZFUiBXSU5ET1cnXCIgW2hpZGVCdXR0b25Hcm91cF09XCJ0cnVlXCI+PC9jb3JlLXBhZ2UtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiY2xvc2UtaWNvbiBwb2ludGVyIGZlYXRoZXIteCBmczI0XCIgKGNsaWNrKT1cImNsb3NlUm93UmVzb2x2ZXIoJGV2ZW50KVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbcm93c109XCInMTAnXCIgc3R5bGU9XCJoZWlnaHQ6IDQwMHB4OyBwYWRkaW5nOiAxNXB4O1wiIGRpc2FibGVkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzcWxDb21tYW5kIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInJlc29sdmUoJGV2ZW50KVwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTVweDtcIj5SZXNvbHZlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICN0b29sQmxvY2sgbGV0LWNvbnRleHQ9XCJjb250ZXh0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRvb2xzIGludGVyLWZvbnQgZC1mbGV4IGQtZmxleC1zdGFydFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi13cmFwcGVyXCIgW2FwcFRvb2x0aXBdPVwiJ1Jlc29sdmUnXCIgW3Bvc2l0aW9uXT1cIidyaWdodCdcIiBbc2hvd0FueXdheV09XCJ0cnVlXCIgKGNsaWNrKT1cIm9wZW5Sb3dSZXNvbHZlcigkZXZlbnQsIGNvbnRleHQpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZlYXRoZXItcGxheSBmczI0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNwYW4+e3sgY29udGV4dC5kaWZmZXJlbmNlIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjc291cmNlQWxsb3dzTnVsbCBsZXQtY29udGV4dD1cImNvbnRleHRcIj5cclxuICAgICAgICA8Y29yZS1jaGVja2JveCBbbmdNb2RlbF09XCJjb250ZXh0LnNvdXJjZUFsbG93c051bGxcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiPjwvY29yZS1jaGVja2JveD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgI3RhcmdldEFsbG93c051bGwgbGV0LWNvbnRleHQ9XCJjb250ZXh0XCI+XHJcbiAgICAgICAgPGNvcmUtY2hlY2tib3ggW25nTW9kZWxdPVwiY29udGV4dC50YXJnZXRBbGxvd3NOdWxsXCIgW2Rpc2FibGVkXT1cInRydWVcIj48L2NvcmUtY2hlY2tib3g+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L2Rpdj4iXX0=
@@ -25456,20 +25456,20 @@ class CoreCompareDbPipelineComponent extends BaseComponent {
25456
25456
  width: 0
25457
25457
  },
25458
25458
  {
25459
- field: 'sourceDb',
25459
+ field: 'sourceAlias',
25460
25460
  type: 'string',
25461
- caption: 'DB nguồn',
25461
+ caption: 'Nguồn',
25462
25462
  align: 'left',
25463
25463
  sortDisabled: true,
25464
- width: 160
25464
+ width: 60
25465
25465
  },
25466
25466
  {
25467
- field: 'targetDb',
25467
+ field: 'targetAlias',
25468
25468
  type: 'string',
25469
- caption: 'DB đích',
25469
+ caption: 'Đích',
25470
25470
  align: 'left',
25471
25471
  sortDisabled: true,
25472
- width: 160
25472
+ width: 60
25473
25473
  },
25474
25474
  {
25475
25475
  field: 'tableName',
@@ -25496,12 +25496,12 @@ class CoreCompareDbPipelineComponent extends BaseComponent {
25496
25496
  width: 100
25497
25497
  },
25498
25498
  {
25499
- field: 'targetType',
25500
- type: 'string',
25501
- caption: 'Kiểu đích',
25502
- align: 'left',
25499
+ field: 'sourceAllowsNull',
25500
+ type: 'boolean',
25501
+ caption: 'Source nullablity',
25502
+ align: 'center',
25503
25503
  sortDisabled: true,
25504
- width: 100
25504
+ width: 70
25505
25505
  },
25506
25506
  {
25507
25507
  field: 'sourceSize',
@@ -25511,6 +25511,22 @@ class CoreCompareDbPipelineComponent extends BaseComponent {
25511
25511
  sortDisabled: true,
25512
25512
  width: 100
25513
25513
  },
25514
+ {
25515
+ field: 'targetType',
25516
+ type: 'string',
25517
+ caption: 'Kiểu đích',
25518
+ align: 'left',
25519
+ sortDisabled: true,
25520
+ width: 100
25521
+ },
25522
+ {
25523
+ field: 'targetAllowsNull',
25524
+ type: 'boolean',
25525
+ caption: 'Target nullablity',
25526
+ align: 'center',
25527
+ sortDisabled: true,
25528
+ width: 70
25529
+ },
25514
25530
  {
25515
25531
  field: 'targetSize',
25516
25532
  type: 'string',
@@ -25539,9 +25555,36 @@ class CoreCompareDbPipelineComponent extends BaseComponent {
25539
25555
  this.pageSize$ = new BehaviorSubject(50);
25540
25556
  this.pageCount = 0;
25541
25557
  this.suspendCurrentPageSubscription$ = new BehaviorSubject(false);
25558
+ this.sqlCommand = '';
25559
+ this.resolverSessionId = '';
25560
+ this.conflictTotal = 0;
25561
+ }
25562
+ refreshList() {
25563
+ this.loading = true;
25564
+ this.subscriptions.push(this.appService.post('/api/SqlServerPipeline/CompareDbStructure', this.request$.value).subscribe(x => {
25565
+ this.loading = false;
25566
+ if (x.ok && x.status === 200 && x.body?.statusCode === 200) {
25567
+ this.data = x.body.innerBody.data;
25568
+ this.pageCount = Math.ceil(x.body.innerBody.count / this.pageSize$.value);
25569
+ this.currentPage$.next(x.body.innerBody.pageNumber);
25570
+ this.conflictTotal = x.body.innerBody.count || 0;
25571
+ }
25572
+ }));
25542
25573
  }
25543
25574
  ngAfterViewInit() {
25544
25575
  setTimeout(() => {
25576
+ const tryFilterDifference = this.columns.filter(x => x.field === 'difference');
25577
+ if (!!tryFilterDifference.length) {
25578
+ tryFilterDifference[0].templateRef = this.toolBlock;
25579
+ }
25580
+ const tryFilterSourceAllowsNull = this.columns.filter(x => x.field === 'sourceAllowsNull');
25581
+ if (!!tryFilterSourceAllowsNull.length) {
25582
+ tryFilterSourceAllowsNull[0].templateRef = this.sourceAllowsNull;
25583
+ }
25584
+ const tryFilterTargetAllowsNull = this.columns.filter(x => x.field === 'targetAllowsNull');
25585
+ if (!!tryFilterTargetAllowsNull.length) {
25586
+ tryFilterTargetAllowsNull[0].templateRef = this.targetAllowsNull;
25587
+ }
25545
25588
  this.tableHeight = window.innerHeight - 60 - 50 - 46 - 30;
25546
25589
  this.subscriptions.push(this.request$.pipe(distinctUntilChanged((pre, cur) => JSON.stringify(pre) === JSON.stringify(cur)), tap$1(() => this.loading = true), switchMap(x => this.appService.post('/api/SqlServerPipeline/CompareDbStructure', x))).subscribe(x => {
25547
25590
  this.loading = false;
@@ -25549,6 +25592,7 @@ class CoreCompareDbPipelineComponent extends BaseComponent {
25549
25592
  this.data = x.body.innerBody.data;
25550
25593
  this.pageCount = Math.ceil(x.body.innerBody.count / this.pageSize$.value);
25551
25594
  this.currentPage$.next(x.body.innerBody.pageNumber);
25595
+ this.conflictTotal = x.body.innerBody.count || 0;
25552
25596
  }
25553
25597
  }));
25554
25598
  this.subscriptions.push(this.currentPage$.subscribe(x => {
@@ -25561,9 +25605,42 @@ class CoreCompareDbPipelineComponent extends BaseComponent {
25561
25605
  });
25562
25606
  }
25563
25607
  onSearching(e) {
25608
+ const filtered = e.filter(x => !!x.searchFor.length);
25609
+ this.request$.next({
25610
+ ...this.request$.value,
25611
+ filter: filtered
25612
+ });
25613
+ }
25614
+ openRowResolver(event, context) {
25615
+ event.stopPropagation();
25616
+ this.loading = true;
25617
+ this.subscriptions.push(this.appService.post('/api/SqlServerPipeline/GenerateConflictResolverCommand', context).subscribe(x => {
25618
+ this.loading = false;
25619
+ if (x.ok && x.status === 200 && x.body?.statusCode === 200) {
25620
+ this.showRowResolverWindow = true;
25621
+ this.resolverSessionId = x.body.innerBody.resolverSessionId;
25622
+ this.sqlCommand = x.body.innerBody.sqlCommand.trim();
25623
+ }
25624
+ }));
25625
+ }
25626
+ closeRowResolver(event) {
25627
+ this.showRowResolverWindow = false;
25628
+ }
25629
+ resolve(event) {
25630
+ this.loading = true;
25631
+ this.subscriptions.push(this.appService.post('/api/SqlServerPipeline/RunConflictResolverCommand', {
25632
+ resolverSessionId: this.resolverSessionId,
25633
+ sqlCommand: this.sqlCommand
25634
+ }).subscribe(x => {
25635
+ this.loading = false;
25636
+ if (x.ok && x.status === 200 && x.body?.statusCode === 200) {
25637
+ this.showRowResolverWindow = false;
25638
+ this.refreshList();
25639
+ }
25640
+ }));
25564
25641
  }
25565
25642
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: CoreCompareDbPipelineComponent, deps: [{ token: MultiLanguageService }, { token: AppService }], target: i0.ɵɵFactoryTarget.Component }); }
25566
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.1", type: CoreCompareDbPipelineComponent, isStandalone: true, selector: "core-compare-db-pipeline", usesInheritance: true, ngImport: i0, template: "<core-page-header [title]=\"'SO S\u00C1NH C\u1EA4U TR\u00DAC C\u00C1C DB TRONG M\u00D4I TR\u01AF\u1EDCNG PH\u00C1T TRI\u1EC2N'\"\r\n [hideButtonGroup]=\"true\"></core-page-header>\r\n<core-table [showCheckbox]=\"true\" [columns]=\"columns\" [height]=\"tableHeight\" [data]=\"data\" [loading]=\"loading\"\r\n [autoColumnFitAvailableSpace]=\"false\" [frozen]=\"2\" [lazyLoading]=\"true\"\r\n (onSearching)=\"onSearching($event)\"></core-table>\r\n<div class=\"h15\"></div>\r\n<div class=\"w-100 d-flex d-flex-end\">\r\n <core-pagination [$height]=\"46\" [$currentPage]=\"currentPage$\" [$pageCount]=\"pageCount\" [$loading]=\"loading\"\r\n [$background]=\"'#848484'\" [$fixedPageSize]=\"20\" [$suspendCurrentPageSubscription]=\"suspendCurrentPageSubscription$\"></core-pagination>\r\n</div>\r\n\r\n<ng-template #tools let-context=\"context\">\r\n \r\n</ng-template>", styles: [".core-compare-db-pipeline-container{position:fixed;display:block;z-index:9999999999;left:0;top:60px;width:100vw;height:calc(100vh - 60px)}.core-compare-db-pipeline-container .h15{height:15px}\n"], dependencies: [{ kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup"], outputs: ["buttonClick"] }, { kind: "component", type: CoreTableComponent, selector: "core-table", inputs: ["id", "width", "height", "showCheckbox", "checkboxSize", "outerButtons", "showTools", "tools", "checkingResetFlag", "borderRadius", "headerColor", "headerBackgroundColor", "headerWrap", "headerFirstRowHeight", "headerSecondRowHeight", "wrap", "allowCellScrollY", "loading", "rowHeight", "frozen", "footer", "columns", "data", "selectedIds", "corePageListInstanceNumber", "disableHighlightOnClick", "freeMode", "searchSwitchDisabled", "disableSorting", "inlineToolItems", "columnSearchDefaultOpen", "lazyLoading", "primaryKey", "rowHoverBgColor", "noPaddingCell", "autoColumnFitAvailableSpace"], outputs: ["onSearching", "onToolClick", "onRowClick", "onRowDoubleClick", "onSelectedIdsChange", "onSelectedDataChange", "onColumnCaptionClick"] }, { kind: "component", type: CorePaginationComponent, selector: "core-pagination", inputs: ["$currentPage", "$height", "$pageCount", "$loading", "$suspendCurrentPageSubscription", "$showAdd", "$background", "$fixedPageSize"], outputs: ["$onClickAdd"] }] }); }
25643
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.1", type: CoreCompareDbPipelineComponent, isStandalone: true, selector: "core-compare-db-pipeline", viewQueries: [{ propertyName: "toolBlock", first: true, predicate: ["toolBlock"], descendants: true }, { propertyName: "sourceAllowsNull", first: true, predicate: ["sourceAllowsNull"], descendants: true }, { propertyName: "targetAllowsNull", first: true, predicate: ["targetAllowsNull"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"core-compare-db-pipeline-container\">\r\n <core-page-header [title]=\"'SO S\u00C1NH C\u1EA4U TR\u00DAC C\u00C1C DB TRONG M\u00D4I TR\u01AF\u1EDCNG PH\u00C1T TRI\u1EC2N'\"\r\n [hideButtonGroup]=\"true\"></core-page-header>\r\n <core-table [showCheckbox]=\"true\" [columns]=\"columns\" [height]=\"tableHeight\" [data]=\"data\" [loading]=\"loading\"\r\n [autoColumnFitAvailableSpace]=\"false\" [frozen]=\"2\" [lazyLoading]=\"true\"\r\n (onSearching)=\"onSearching($event)\"></core-table>\r\n <div class=\"h15\"></div>\r\n <div class=\"w-100 d-flex d-flex-between\">\r\n <div class=\"conflict-total\" [class.error]=\"!!conflictTotal\">\r\n {{ !!conflictTotal ? conflictTotal + ' conflicts found!' : 'No conflict found' }} \r\n </div>\r\n <core-pagination [$height]=\"46\" [$currentPage]=\"currentPage$\" [$pageCount]=\"pageCount\" [$loading]=\"loading\"\r\n [$background]=\"'#848484'\" [$fixedPageSize]=\"20\"\r\n [$suspendCurrentPageSubscription]=\"suspendCurrentPageSubscription$\"></core-pagination>\r\n </div>\r\n\r\n @if (showRowResolverWindow) {\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"row-resolver-window\">\r\n <core-page-header [title]=\"'RESOLVER WINDOW'\" [hideButtonGroup]=\"true\"></core-page-header>\r\n <i class=\"close-icon pointer feather-x fs24\" (click)=\"closeRowResolver($event)\"></i>\r\n <textarea class=\"form-control\" [rows]=\"'10'\" style=\"height: 400px; padding: 15px;\" disabled>\r\n {{ sqlCommand }}\r\n </textarea>\r\n <button class=\"btn btn-primary\" (click)=\"resolve($event)\" style=\"margin-top: 15px;\">Resolve</button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <ng-template #toolBlock let-context=\"context\">\r\n <div class=\"tools inter-font d-flex d-flex-start\">\r\n <div class=\"icon-wrapper\" [appTooltip]=\"'Resolve'\" [position]=\"'right'\" [showAnyway]=\"true\" (click)=\"openRowResolver($event, context)\">\r\n <i class=\"feather-play fs24\"></i>\r\n </div>\r\n <span>{{ context.difference }}</span>\r\n </div>\r\n </ng-template>\r\n <ng-template #sourceAllowsNull let-context=\"context\">\r\n <core-checkbox [ngModel]=\"context.sourceAllowsNull\" [disabled]=\"true\"></core-checkbox>\r\n </ng-template>\r\n <ng-template #targetAllowsNull let-context=\"context\">\r\n <core-checkbox [ngModel]=\"context.targetAllowsNull\" [disabled]=\"true\"></core-checkbox>\r\n </ng-template>\r\n</div>", styles: [".core-compare-db-pipeline-container .h15{height:15px}.core-compare-db-pipeline-container .tools{height:36px}.core-compare-db-pipeline-container .tools .icon-wrapper{color:#848484;opacity:.5;display:inline-flex;width:36px;height:36px;border-radius:50%}.core-compare-db-pipeline-container .tools .icon-wrapper:hover{opacity:1;color:#fff;background-color:#848484}.core-compare-db-pipeline-container .modal-content-root{padding-top:0}.core-compare-db-pipeline-container .close-icon{display:block;position:absolute;top:8px;right:8px;color:#848484}.core-compare-db-pipeline-container .close-icon:hover{color:inherit}.core-compare-db-pipeline-container .row-resolver-window{display:block;width:992px;max-width:100vw!important;height:500px}.core-compare-db-pipeline-container .conflict-total{height:50px;display:flex;align-items:center;justify-content:flex-start;color:#848484;font-size:24px;font-weight:700}.core-compare-db-pipeline-container .conflict-total.error{color:brown}\n"], dependencies: [{ kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup"], outputs: ["buttonClick"] }, { kind: "component", type: CoreTableComponent, selector: "core-table", inputs: ["id", "width", "height", "showCheckbox", "checkboxSize", "outerButtons", "showTools", "tools", "checkingResetFlag", "borderRadius", "headerColor", "headerBackgroundColor", "headerWrap", "headerFirstRowHeight", "headerSecondRowHeight", "wrap", "allowCellScrollY", "loading", "rowHeight", "frozen", "footer", "columns", "data", "selectedIds", "corePageListInstanceNumber", "disableHighlightOnClick", "freeMode", "searchSwitchDisabled", "disableSorting", "inlineToolItems", "columnSearchDefaultOpen", "lazyLoading", "primaryKey", "rowHoverBgColor", "noPaddingCell", "autoColumnFitAvailableSpace"], outputs: ["onSearching", "onToolClick", "onRowClick", "onRowDoubleClick", "onSelectedIdsChange", "onSelectedDataChange", "onColumnCaptionClick"] }, { kind: "component", type: CorePaginationComponent, selector: "core-pagination", inputs: ["$currentPage", "$height", "$pageCount", "$loading", "$suspendCurrentPageSubscription", "$showAdd", "$background", "$fixedPageSize"], outputs: ["$onClickAdd"] }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["color", "backgroundColor", "appTooltip", "showAnyway", "position"] }, { kind: "component", type: CoreCheckboxComponent, selector: "core-checkbox", inputs: ["text", "tooltipPosition", "tooltip", "inputValue", "disabled"], outputs: ["onClick"] }, { kind: "ngmodule", type: FormsModule }, { 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"] }] }); }
25567
25644
  }
25568
25645
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImport: i0, type: CoreCompareDbPipelineComponent, decorators: [{
25569
25646
  type: Component,
@@ -25571,9 +25648,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.1", ngImpor
25571
25648
  CoreButtonGroupVnsComponent,
25572
25649
  CorePageHeaderComponent,
25573
25650
  CoreTableComponent,
25574
- CorePaginationComponent
25575
- ], template: "<core-page-header [title]=\"'SO S\u00C1NH C\u1EA4U TR\u00DAC C\u00C1C DB TRONG M\u00D4I TR\u01AF\u1EDCNG PH\u00C1T TRI\u1EC2N'\"\r\n [hideButtonGroup]=\"true\"></core-page-header>\r\n<core-table [showCheckbox]=\"true\" [columns]=\"columns\" [height]=\"tableHeight\" [data]=\"data\" [loading]=\"loading\"\r\n [autoColumnFitAvailableSpace]=\"false\" [frozen]=\"2\" [lazyLoading]=\"true\"\r\n (onSearching)=\"onSearching($event)\"></core-table>\r\n<div class=\"h15\"></div>\r\n<div class=\"w-100 d-flex d-flex-end\">\r\n <core-pagination [$height]=\"46\" [$currentPage]=\"currentPage$\" [$pageCount]=\"pageCount\" [$loading]=\"loading\"\r\n [$background]=\"'#848484'\" [$fixedPageSize]=\"20\" [$suspendCurrentPageSubscription]=\"suspendCurrentPageSubscription$\"></core-pagination>\r\n</div>\r\n\r\n<ng-template #tools let-context=\"context\">\r\n \r\n</ng-template>", styles: [".core-compare-db-pipeline-container{position:fixed;display:block;z-index:9999999999;left:0;top:60px;width:100vw;height:calc(100vh - 60px)}.core-compare-db-pipeline-container .h15{height:15px}\n"] }]
25576
- }], ctorParameters: () => [{ type: MultiLanguageService }, { type: AppService }] });
25651
+ CorePaginationComponent,
25652
+ TooltipDirective,
25653
+ CoreCheckboxComponent,
25654
+ FormsModule
25655
+ ], template: "<div class=\"core-compare-db-pipeline-container\">\r\n <core-page-header [title]=\"'SO S\u00C1NH C\u1EA4U TR\u00DAC C\u00C1C DB TRONG M\u00D4I TR\u01AF\u1EDCNG PH\u00C1T TRI\u1EC2N'\"\r\n [hideButtonGroup]=\"true\"></core-page-header>\r\n <core-table [showCheckbox]=\"true\" [columns]=\"columns\" [height]=\"tableHeight\" [data]=\"data\" [loading]=\"loading\"\r\n [autoColumnFitAvailableSpace]=\"false\" [frozen]=\"2\" [lazyLoading]=\"true\"\r\n (onSearching)=\"onSearching($event)\"></core-table>\r\n <div class=\"h15\"></div>\r\n <div class=\"w-100 d-flex d-flex-between\">\r\n <div class=\"conflict-total\" [class.error]=\"!!conflictTotal\">\r\n {{ !!conflictTotal ? conflictTotal + ' conflicts found!' : 'No conflict found' }} \r\n </div>\r\n <core-pagination [$height]=\"46\" [$currentPage]=\"currentPage$\" [$pageCount]=\"pageCount\" [$loading]=\"loading\"\r\n [$background]=\"'#848484'\" [$fixedPageSize]=\"20\"\r\n [$suspendCurrentPageSubscription]=\"suspendCurrentPageSubscription$\"></core-pagination>\r\n </div>\r\n\r\n @if (showRowResolverWindow) {\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"row-resolver-window\">\r\n <core-page-header [title]=\"'RESOLVER WINDOW'\" [hideButtonGroup]=\"true\"></core-page-header>\r\n <i class=\"close-icon pointer feather-x fs24\" (click)=\"closeRowResolver($event)\"></i>\r\n <textarea class=\"form-control\" [rows]=\"'10'\" style=\"height: 400px; padding: 15px;\" disabled>\r\n {{ sqlCommand }}\r\n </textarea>\r\n <button class=\"btn btn-primary\" (click)=\"resolve($event)\" style=\"margin-top: 15px;\">Resolve</button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <ng-template #toolBlock let-context=\"context\">\r\n <div class=\"tools inter-font d-flex d-flex-start\">\r\n <div class=\"icon-wrapper\" [appTooltip]=\"'Resolve'\" [position]=\"'right'\" [showAnyway]=\"true\" (click)=\"openRowResolver($event, context)\">\r\n <i class=\"feather-play fs24\"></i>\r\n </div>\r\n <span>{{ context.difference }}</span>\r\n </div>\r\n </ng-template>\r\n <ng-template #sourceAllowsNull let-context=\"context\">\r\n <core-checkbox [ngModel]=\"context.sourceAllowsNull\" [disabled]=\"true\"></core-checkbox>\r\n </ng-template>\r\n <ng-template #targetAllowsNull let-context=\"context\">\r\n <core-checkbox [ngModel]=\"context.targetAllowsNull\" [disabled]=\"true\"></core-checkbox>\r\n </ng-template>\r\n</div>", styles: [".core-compare-db-pipeline-container .h15{height:15px}.core-compare-db-pipeline-container .tools{height:36px}.core-compare-db-pipeline-container .tools .icon-wrapper{color:#848484;opacity:.5;display:inline-flex;width:36px;height:36px;border-radius:50%}.core-compare-db-pipeline-container .tools .icon-wrapper:hover{opacity:1;color:#fff;background-color:#848484}.core-compare-db-pipeline-container .modal-content-root{padding-top:0}.core-compare-db-pipeline-container .close-icon{display:block;position:absolute;top:8px;right:8px;color:#848484}.core-compare-db-pipeline-container .close-icon:hover{color:inherit}.core-compare-db-pipeline-container .row-resolver-window{display:block;width:992px;max-width:100vw!important;height:500px}.core-compare-db-pipeline-container .conflict-total{height:50px;display:flex;align-items:center;justify-content:flex-start;color:#848484;font-size:24px;font-weight:700}.core-compare-db-pipeline-container .conflict-total.error{color:brown}\n"] }]
25656
+ }], ctorParameters: () => [{ type: MultiLanguageService }, { type: AppService }], propDecorators: { toolBlock: [{
25657
+ type: ViewChild,
25658
+ args: ['toolBlock']
25659
+ }], sourceAllowsNull: [{
25660
+ type: ViewChild,
25661
+ args: ['sourceAllowsNull']
25662
+ }], targetAllowsNull: [{
25663
+ type: ViewChild,
25664
+ args: ['targetAllowsNull']
25665
+ }] } });
25577
25666
 
25578
25667
  class CoreConfirmDialogComponent extends BaseComponent {
25579
25668
  constructor(mls, dialogService, routingService) {