ng-configcat-publicapi-ui 2.3.3 → 2.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2015/lib/_models/index.js → esm2020/lib/_models/index.mjs} +0 -0
- package/{esm2015/lib/_models/settingValuesModel.js → esm2020/lib/_models/settingValuesModel.mjs} +0 -0
- package/{esm2015/lib/_models/updateSettingValuesModel.js → esm2020/lib/_models/updateSettingValuesModel.mjs} +0 -0
- package/{esm2015/lib/_services/form-helper.js → esm2020/lib/_services/form-helper.mjs} +0 -0
- package/{esm2015/lib/_services/index.js → esm2020/lib/_services/index.mjs} +0 -0
- package/esm2020/lib/_services/public-api.service.mjs +68 -0
- package/esm2020/lib/_services/setting-list-form-helper.mjs +152 -0
- package/esm2020/lib/authorization/authorization.component.mjs +50 -0
- package/{esm2015/lib/base/base.component.js → esm2020/lib/base/base.component.mjs} +7 -4
- package/{esm2015/lib/configuration.js → esm2020/lib/configuration.mjs} +4 -4
- package/esm2020/lib/dialogs/concurrent-dialog/concurrent-dialog.component.mjs +25 -0
- package/esm2020/lib/dialogs/expand-dialog/expand-dialog.component.mjs +77 -0
- package/esm2020/lib/dialogs/reason-dialog/reason-dialog.component.mjs +36 -0
- package/esm2020/lib/dialogs/save-snackbar/save-snackbar.component.mjs +14 -0
- package/{esm2015/lib/ng-configcat-publicapi-ui.module.js → esm2020/lib/ng-configcat-publicapi-ui.module.mjs} +5 -5
- package/{esm2015/lib/selects/config-select/config-select.component.js → esm2020/lib/selects/config-select/config-select.component.mjs} +7 -12
- package/esm2020/lib/selects/environment-select/environment-select.component.mjs +43 -0
- package/esm2020/lib/selects/product-select/product-select.component.mjs +36 -0
- package/esm2020/lib/selects/setting-select/setting-select.component.mjs +43 -0
- package/esm2020/lib/setting-item/setting-item.component.mjs +126 -0
- package/esm2020/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +81 -0
- package/esm2020/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +295 -0
- package/esm2020/lib/setting-list/setting/setting.component.mjs +134 -0
- package/esm2020/lib/setting-list/setting/value/value.component.mjs +32 -0
- package/esm2020/lib/setting-list/setting-list.component.mjs +197 -0
- package/{esm2015/ng-configcat-publicapi-ui.js → esm2020/ng-configcat-publicapi-ui.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/ng-configcat-publicapi-ui.mjs +1579 -0
- package/fesm2015/ng-configcat-publicapi-ui.mjs.map +1 -0
- package/fesm2020/ng-configcat-publicapi-ui.mjs +1560 -0
- package/fesm2020/ng-configcat-publicapi-ui.mjs.map +1 -0
- package/lib/_services/public-api.service.d.ts +2 -1
- package/lib/base/base.component.d.ts +1 -0
- package/lib/setting-item/setting-item.component.d.ts +3 -1
- package/lib/setting-list/setting/rollout-rules/rollout-rules.component.d.ts +10 -2
- package/lib/setting-list/setting/setting.component.d.ts +4 -2
- package/lib/setting-list/setting-list.component.d.ts +4 -1
- package/package.json +22 -9
- package/bundles/ng-configcat-publicapi-ui.umd.js +0 -1979
- package/bundles/ng-configcat-publicapi-ui.umd.js.map +0 -1
- package/esm2015/lib/_services/public-api.service.js +0 -69
- package/esm2015/lib/_services/setting-list-form-helper.js +0 -135
- package/esm2015/lib/authorization/authorization.component.js +0 -54
- package/esm2015/lib/dialogs/concurrent-dialog/concurrent-dialog.component.js +0 -29
- package/esm2015/lib/dialogs/expand-dialog/expand-dialog.component.js +0 -81
- package/esm2015/lib/dialogs/reason-dialog/reason-dialog.component.js +0 -40
- package/esm2015/lib/dialogs/save-snackbar/save-snackbar.component.js +0 -18
- package/esm2015/lib/selects/environment-select/environment-select.component.js +0 -47
- package/esm2015/lib/selects/product-select/product-select.component.js +0 -40
- package/esm2015/lib/selects/setting-select/setting-select.component.js +0 -47
- package/esm2015/lib/setting-item/setting-item.component.js +0 -121
- package/esm2015/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.js +0 -87
- package/esm2015/lib/setting-list/setting/rollout-rules/rollout-rules.component.js +0 -287
- package/esm2015/lib/setting-list/setting/setting.component.js +0 -131
- package/esm2015/lib/setting-list/setting/value/value.component.js +0 -39
- package/esm2015/lib/setting-list/setting-list.component.js +0 -195
- package/fesm2015/ng-configcat-publicapi-ui.js +0 -1574
- package/fesm2015/ng-configcat-publicapi-ui.js.map +0 -1
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import { ExpandDialogComponent } from '../../../dialogs/expand-dialog/expand-dialog.component';
|
|
3
|
-
import { SettingType } from 'ng-configcat-publicapi';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/material/dialog";
|
|
6
|
-
import * as i2 from "@angular/material/icon";
|
|
7
|
-
import * as i3 from "@angular/common";
|
|
8
|
-
import * as i4 from "@angular/forms";
|
|
9
|
-
import * as i5 from "@angular/material/tooltip";
|
|
10
|
-
export class ValueComponent {
|
|
11
|
-
constructor(dialog) {
|
|
12
|
-
this.dialog = dialog;
|
|
13
|
-
this.SettingType = SettingType;
|
|
14
|
-
}
|
|
15
|
-
popOut() {
|
|
16
|
-
this.dialog.open(ExpandDialogComponent, {
|
|
17
|
-
width: '640px',
|
|
18
|
-
data: { control: this.valueFormControl }
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
ValueComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: ValueComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
23
|
-
ValueComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.12", type: ValueComponent, selector: "configcat-value", inputs: { valueFormControl: "valueFormControl", setting: "setting" }, ngImport: i0, template: "<div class=\"flex\">\n <div class=\"container\" [ngSwitch]=\"setting.settingType\">\n <div *ngSwitchCase=\"SettingType.String\" class=\"with-validation\">\n <span *ngIf=\"valueFormControl.invalid\" class=\"error\">*</span>\n <input [ngClass]=\"{'invalid': valueFormControl.invalid}\" type=\"text\"\n [formControl]=\"valueFormControl\" placeholder=\"my value\" name=\"value\">\n <div class=\"expand\" (click)=\"popOut()\" matTooltip=\"Pop-out Editor\">\n <mat-icon>height</mat-icon>\n </div>\n </div>\n <div *ngSwitchCase=\"SettingType.Int\" class=\"with-validation\">\n <span *ngIf=\"valueFormControl.invalid\" class=\"error\">*</span>\n <input [ngClass]=\"{'invalid': valueFormControl.invalid}\" type=\"number\" [formControl]=\"valueFormControl\"\n placeholder=\"42\" name=\"value\" />\n </div>\n <div *ngSwitchCase=\"SettingType.Double\" class=\"with-validation\">\n <span *ngIf=\"valueFormControl.invalid\" class=\"error\">*</span>\n <input [ngClass]=\"{'invalid': valueFormControl.invalid}\" type=\"number\" [formControl]=\"valueFormControl\"\n placeholder=\"3.14\" name=\"value\">\n </div>\n <div *ngSwitchCase=\"SettingType.Boolean\" class=\"toggle\">\n <label class=\"switch\">\n <input type=\"checkbox\" [formControl]=\"valueFormControl\" name=\"value\" />\n <span class=\"slider round\"></span>\n </label>\n </div>\n </div>\n <div *ngIf=\"setting.settingType === SettingType.Boolean\" class=\"spacer\"></div>\n\n</div>\n", styles: [".switch{position:relative;width:66px;height:30px;margin-left:4px;margin-top:0;margin-bottom:0}.switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ff5252;transition:.4s;width:66px;height:30px}.slider:before{position:absolute;content:\"\";height:22px;width:22px;left:4px;bottom:4px;background-color:#fff;transition:.4s}input:checked+.slider{background-color:#9acd32}input:focus+.slider{box-shadow:0 0 1px #9acd32}input:checked+.slider:before{transform:translate(36px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}.slider:after{content:\"Off\";color:#fff;display:block;position:absolute;transform:translate(-14%,-50%);top:50%;left:50%;font-size:10px;font-family:Verdana,sans-serif}input:checked+.slider:after{content:\"On\";transform:translate(-91%,-50%)}\n", ".flex{display:flex;margin-right:20px;align-items:center}.flex .spacer{width:15px}.flex .container .with-validation{display:flex;flex-wrap:nowrap}.flex .container .toggle{width:66px;height:30px}.flex .container input{background-color:#fff;border:1px solid #e5e5e5;min-height:28px;font-size:15px;padding:0 30px 0 10px;font-family:Montserrat,Roboto,\"Helvetica Neue\",sans-serif;font-weight:300;min-width:170px}.flex .container .invalid{border:1px solid #ff5252}.flex .container .error{color:#ff5252;margin-right:5px}@media (max-width: 1200px){.flex .container input{min-width:auto}}.flex .variationId{margin-left:5px;cursor:pointer;color:#888;display:flex;align-items:center}.flex .expand{position:relative;top:2px;height:24px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.flex .expand mat-icon{transform:rotate(45deg)}\n"], components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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]" }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i5.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }] });
|
|
24
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: ValueComponent, decorators: [{
|
|
25
|
-
type: Component,
|
|
26
|
-
args: [{
|
|
27
|
-
selector: 'configcat-value',
|
|
28
|
-
templateUrl: './value.component.html',
|
|
29
|
-
styleUrls: [
|
|
30
|
-
'./slider.scss',
|
|
31
|
-
'./value.component.scss'
|
|
32
|
-
]
|
|
33
|
-
}]
|
|
34
|
-
}], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { valueFormControl: [{
|
|
35
|
-
type: Input
|
|
36
|
-
}], setting: [{
|
|
37
|
-
type: Input
|
|
38
|
-
}] } });
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29uZmlnY2F0LXB1YmxpY2FwaS11aS9zcmMvbGliL3NldHRpbmctbGlzdC9zZXR0aW5nL3ZhbHVlL3ZhbHVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy92YWx1ZS92YWx1ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUc3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUMvRixPQUFPLEVBQWdCLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7O0FBVW5FLE1BQU0sT0FBTyxjQUFjO0lBUXpCLFlBQW9CLE1BQWlCO1FBQWpCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFGckMsZ0JBQVcsR0FBRyxXQUFXLENBQUM7SUFHMUIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUN0QyxLQUFLLEVBQUUsT0FBTztZQUNkLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7NEdBaEJVLGNBQWM7Z0dBQWQsY0FBYyw2SENkM0IsNmhEQThCQTs0RkRoQmEsY0FBYztrQkFSMUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixXQUFXLEVBQUUsd0JBQXdCO29CQUNyQyxTQUFTLEVBQUU7d0JBQ1QsZUFBZTt3QkFDZix3QkFBd0I7cUJBQ3pCO2lCQUNGO2dHQUdVLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBFeHBhbmREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kaWFsb2dzL2V4cGFuZC1kaWFsb2cvZXhwYW5kLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2V0dGluZ01vZGVsLCBTZXR0aW5nVHlwZSB9IGZyb20gJ25nLWNvbmZpZ2NhdC1wdWJsaWNhcGknO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb25maWdjYXQtdmFsdWUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdmFsdWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi9zbGlkZXIuc2NzcycsXG4gICAgJy4vdmFsdWUuY29tcG9uZW50LnNjc3MnXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVmFsdWVDb21wb25lbnQge1xuXG4gIEBJbnB1dCgpIHZhbHVlRm9ybUNvbnRyb2whOiBGb3JtQ29udHJvbDtcblxuICBASW5wdXQoKSBzZXR0aW5nITogU2V0dGluZ01vZGVsO1xuXG4gIFNldHRpbmdUeXBlID0gU2V0dGluZ1R5cGU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZykge1xuICB9XG5cbiAgcG9wT3V0KCkge1xuICAgIHRoaXMuZGlhbG9nLm9wZW4oRXhwYW5kRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzY0MHB4JyxcbiAgICAgIGRhdGE6IHsgY29udHJvbDogdGhpcy52YWx1ZUZvcm1Db250cm9sIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiIFtuZ1N3aXRjaF09XCJzZXR0aW5nLnNldHRpbmdUeXBlXCI+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiU2V0dGluZ1R5cGUuU3RyaW5nXCIgY2xhc3M9XCJ3aXRoLXZhbGlkYXRpb25cIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwidmFsdWVGb3JtQ29udHJvbC5pbnZhbGlkXCIgY2xhc3M9XCJlcnJvclwiPio8L3NwYW4+XG4gICAgICA8aW5wdXQgW25nQ2xhc3NdPVwieydpbnZhbGlkJzogdmFsdWVGb3JtQ29udHJvbC5pbnZhbGlkfVwiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwidmFsdWVGb3JtQ29udHJvbFwiIHBsYWNlaG9sZGVyPVwibXkgdmFsdWVcIiBuYW1lPVwidmFsdWVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJleHBhbmRcIiAoY2xpY2spPVwicG9wT3V0KClcIiBtYXRUb29sdGlwPVwiUG9wLW91dCBFZGl0b3JcIj5cbiAgICAgICAgPG1hdC1pY29uPmhlaWdodDwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJTZXR0aW5nVHlwZS5JbnRcIiBjbGFzcz1cIndpdGgtdmFsaWRhdGlvblwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YWx1ZUZvcm1Db250cm9sLmludmFsaWRcIiBjbGFzcz1cImVycm9yXCI+Kjwvc3Bhbj5cbiAgICAgIDxpbnB1dCBbbmdDbGFzc109XCJ7J2ludmFsaWQnOiB2YWx1ZUZvcm1Db250cm9sLmludmFsaWR9XCIgdHlwZT1cIm51bWJlclwiIFtmb3JtQ29udHJvbF09XCJ2YWx1ZUZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjQyXCIgbmFtZT1cInZhbHVlXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJTZXR0aW5nVHlwZS5Eb3VibGVcIiBjbGFzcz1cIndpdGgtdmFsaWRhdGlvblwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YWx1ZUZvcm1Db250cm9sLmludmFsaWRcIiBjbGFzcz1cImVycm9yXCI+Kjwvc3Bhbj5cbiAgICAgIDxpbnB1dCBbbmdDbGFzc109XCJ7J2ludmFsaWQnOiB2YWx1ZUZvcm1Db250cm9sLmludmFsaWR9XCIgdHlwZT1cIm51bWJlclwiIFtmb3JtQ29udHJvbF09XCJ2YWx1ZUZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjMuMTRcIiBuYW1lPVwidmFsdWVcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJTZXR0aW5nVHlwZS5Cb29sZWFuXCIgY2xhc3M9XCJ0b2dnbGVcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInN3aXRjaFwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2Zvcm1Db250cm9sXT1cInZhbHVlRm9ybUNvbnRyb2xcIiBuYW1lPVwidmFsdWVcIiAvPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNsaWRlciByb3VuZFwiPjwvc3Bhbj5cbiAgICAgIDwvbGFiZWw+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwic2V0dGluZy5zZXR0aW5nVHlwZSA9PT0gU2V0dGluZ1R5cGUuQm9vbGVhblwiIGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XG5cbjwvZGl2PlxuIl19
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { ReasonDialogComponent } from '../dialogs/reason-dialog/reason-dialog.component';
|
|
3
|
-
import { SaveSnackbarComponent } from '../dialogs/save-snackbar/save-snackbar.component';
|
|
4
|
-
import { ConcurrentDialogComponent } from '../dialogs/concurrent-dialog/concurrent-dialog.component';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../_services/setting-list-form-helper";
|
|
7
|
-
import * as i2 from "@angular/material/snack-bar";
|
|
8
|
-
import * as i3 from "@angular/material/dialog";
|
|
9
|
-
import * as i4 from "./setting/setting.component";
|
|
10
|
-
import * as i5 from "@angular/material/button";
|
|
11
|
-
import * as i6 from "@angular/material/icon";
|
|
12
|
-
import * as i7 from "@angular/common";
|
|
13
|
-
import * as i8 from "@angular/forms";
|
|
14
|
-
export class SettingListComponent {
|
|
15
|
-
constructor(formHelper, snackBar, dialog) {
|
|
16
|
-
this.formHelper = formHelper;
|
|
17
|
-
this.snackBar = snackBar;
|
|
18
|
-
this.dialog = dialog;
|
|
19
|
-
this.canEditSetting = false;
|
|
20
|
-
this.canDeleteSetting = false;
|
|
21
|
-
this.deleteSettingText = 'Delete setting';
|
|
22
|
-
this.showEnvironmentName = false;
|
|
23
|
-
this.editSettingRequested = new EventEmitter();
|
|
24
|
-
this.deleteSettingRequested = new EventEmitter();
|
|
25
|
-
this.formValuesChanged = new EventEmitter();
|
|
26
|
-
this.loading = true;
|
|
27
|
-
this.submitting = false;
|
|
28
|
-
this.showRevertQuestion = false;
|
|
29
|
-
this.showFeedBackMessage = false;
|
|
30
|
-
this.readOnly = false;
|
|
31
|
-
}
|
|
32
|
-
ngOnInit() {
|
|
33
|
-
this.reloadSettingValues();
|
|
34
|
-
}
|
|
35
|
-
ngOnChanges() {
|
|
36
|
-
this.reloadSettingValues();
|
|
37
|
-
}
|
|
38
|
-
ngOnDestroy() {
|
|
39
|
-
if (this.formValuesChangedSubscription) {
|
|
40
|
-
this.formValuesChangedSubscription.unsubscribe();
|
|
41
|
-
this.formValuesChangedSubscription = null;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
reloadSettingValues() {
|
|
45
|
-
this.showFeedBackMessage = false;
|
|
46
|
-
this.loading = true;
|
|
47
|
-
this.loadSettingValues()
|
|
48
|
-
.subscribe(settingValues => {
|
|
49
|
-
this.readOnly = settingValues.readOnly;
|
|
50
|
-
this.settingValues = settingValues;
|
|
51
|
-
this.createFormGroup();
|
|
52
|
-
this.loading = false;
|
|
53
|
-
}, error => {
|
|
54
|
-
this.snackBar.open('Ooops. We could not load your Feature Flags and Settings. Please try again or contact us.', 'Dismiss', { duration: 60000, panelClass: 'red-snackbar' });
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
createFormGroup() {
|
|
58
|
-
this.formGroup = this.formHelper.createSettingValuesFormGroup(this.settingValues);
|
|
59
|
-
this.formValuesChangedSubscription = this.formGroup.valueChanges.subscribe(() => {
|
|
60
|
-
this.formValuesChanged.emit();
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
settingValuesFormArray() {
|
|
64
|
-
return this.formGroup.get('settingValues');
|
|
65
|
-
}
|
|
66
|
-
getSettingValueFormGroups() {
|
|
67
|
-
return this.settingValuesFormArray().controls.map(c => c);
|
|
68
|
-
}
|
|
69
|
-
submit() {
|
|
70
|
-
if (!this.formGroup || !this.formGroup.valid) {
|
|
71
|
-
this.showFeedBackMessage = true;
|
|
72
|
-
this.formGroup.markAsTouched();
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
this.showFeedBackMessage = false;
|
|
76
|
-
this.submitting = true;
|
|
77
|
-
const updateSettingValuesModel = {
|
|
78
|
-
settingValues: this.formGroup.controls.settingValues.value,
|
|
79
|
-
knownLastUpdatedAt: this.settingValues.lastUpdatedAt,
|
|
80
|
-
forced: false
|
|
81
|
-
};
|
|
82
|
-
if (this.settingValues.reasonRequired) {
|
|
83
|
-
const dialogRef = this.dialog.open(ReasonDialogComponent, {
|
|
84
|
-
width: '450px'
|
|
85
|
-
});
|
|
86
|
-
dialogRef.afterClosed()
|
|
87
|
-
.subscribe(result => {
|
|
88
|
-
if (result && result.button === 'save' && result.reason) {
|
|
89
|
-
updateSettingValuesModel.reason = result.reason;
|
|
90
|
-
this.updateSettingValues(updateSettingValuesModel);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
this.submitting = false;
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
this.updateSettingValues(updateSettingValuesModel);
|
|
99
|
-
}
|
|
100
|
-
updateSettingValues(updateSettingValuesModel) {
|
|
101
|
-
this.onSave(updateSettingValuesModel).subscribe(settingValues => {
|
|
102
|
-
this.settingValues = settingValues;
|
|
103
|
-
this.createFormGroup();
|
|
104
|
-
this.submitting = false;
|
|
105
|
-
this.snackBar.openFromComponent(SaveSnackbarComponent, { duration: 5000, panelClass: 'green-snackbar' });
|
|
106
|
-
}, (error) => {
|
|
107
|
-
if (error.status === 400 && error.error
|
|
108
|
-
&& error.error.KnownLastUpdatedAt && error.error.KnownLastUpdatedAt[0] === 'Concurrent update') {
|
|
109
|
-
const dialogRef = this.dialog.open(ConcurrentDialogComponent, {
|
|
110
|
-
width: '560px'
|
|
111
|
-
});
|
|
112
|
-
dialogRef.afterClosed()
|
|
113
|
-
.subscribe(result => {
|
|
114
|
-
if (result && result.button === 'save') {
|
|
115
|
-
updateSettingValuesModel.forced = true;
|
|
116
|
-
this.updateSettingValues(updateSettingValuesModel);
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
this.reloadSettingValues();
|
|
120
|
-
this.submitting = false;
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
if (error.status === 400 && error.error && error.error.Reason && error.error.Reason[0] === 'Reason required') {
|
|
126
|
-
const dialogRef = this.dialog.open(ReasonDialogComponent, {
|
|
127
|
-
width: '450px'
|
|
128
|
-
});
|
|
129
|
-
dialogRef.afterClosed()
|
|
130
|
-
.subscribe(result => {
|
|
131
|
-
if (result && result.button === 'save' && result.reason) {
|
|
132
|
-
updateSettingValuesModel.reason = result.reason;
|
|
133
|
-
this.updateSettingValues(updateSettingValuesModel);
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
this.submitting = false;
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
this.formGroup.setErrors({ internalServerError: 'Internal server error' });
|
|
142
|
-
this.showFeedBackMessage = true;
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
handleRevertYes() {
|
|
146
|
-
this.showRevertQuestion = false;
|
|
147
|
-
this.reloadSettingValues();
|
|
148
|
-
}
|
|
149
|
-
handleRevertCancel() {
|
|
150
|
-
this.showRevertQuestion = false;
|
|
151
|
-
}
|
|
152
|
-
onEditSettingRequested(setting) {
|
|
153
|
-
this.editSettingRequested.emit({
|
|
154
|
-
setting: setting.setting,
|
|
155
|
-
environment: this.settingValues.environment,
|
|
156
|
-
config: this.settingValues.config
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
onDeleteSettingRequested(setting) {
|
|
160
|
-
this.deleteSettingRequested.emit({
|
|
161
|
-
setting: setting.setting,
|
|
162
|
-
environment: this.settingValues.environment,
|
|
163
|
-
config: this.settingValues.config
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
SettingListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: SettingListComponent, deps: [{ token: i1.SettingListFormHelper }, { token: i2.MatSnackBar }, { token: i3.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
168
|
-
SettingListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.12", type: SettingListComponent, selector: "configcat-setting-list", inputs: { canEditSetting: "canEditSetting", canDeleteSetting: "canDeleteSetting", onSave: "onSave", loadSettingValues: "loadSettingValues", deleteSettingText: "deleteSettingText", showEnvironmentName: "showEnvironmentName" }, outputs: { editSettingRequested: "editSettingRequested", deleteSettingRequested: "deleteSettingRequested", formValuesChanged: "formValuesChanged" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"formGroup\" (ngSubmit)=\"submit()\" *ngIf=\"!loading\">\n <div class=\"wrapper\" *ngFor=\"let settingValueFromGroup of getSettingValueFormGroups(); let i = index\">\n <setting [formGroup]=\"settingValueFromGroup\" [readOnly]=\"readOnly\" [canEditSetting]=\"canEditSetting\"\n [canDeleteSetting]=\"canDeleteSetting\" (editSettingRequested)=\"onEditSettingRequested($event)\"\n (deleteSettingRequested)=\"onDeleteSettingRequested($event)\" [deleteSettingText]=\"deleteSettingText\"\n [showEnvironmentName]=\"showEnvironmentName\">\n </setting>\n </div>\n\n <div class=\"save\" *ngIf=\"!readOnly && !submitting && formGroup.dirty\">\n <div class=\"feedback\" *ngIf=\"formGroup.touched && formGroup.invalid && showFeedBackMessage\">\n <div class=\"error\" *ngIf=\"formGroup.errors && formGroup.errors.internalServerError\">\n <span>Something went wrong and we could not save your settings. You can try again or <a\n href=\"https://configcat.com/support\" target=\"_blank\" rel=\"noopener noreferrer\">contact us.</a></span>\n </div>\n <div class=\"error\" *ngIf=\"!formGroup.errors || !formGroup.errors.internalServerError\">\n <span>Oh no! A feature flag has invalid or missing data.</span>\n </div>\n </div>\n <button type=\"button\" mat-stroked-button *ngIf=\"!showRevertQuestion\" (click)=\"showRevertQuestion = true\">\n <mat-icon>history</mat-icon><span>Revert changes</span>\n </button>\n <div *ngIf=\"showRevertQuestion\">\n <span class=\"revert\">Revert to last saved state?</span>\n <button type=\"button\" class=\"yes\" mat-stroked-button (click)=\"handleRevertYes()\">Yes</button>\n <button type=\"button\" mat-stroked-button (click)=\"handleRevertCancel()\">No</button>\n </div>\n <button class=\"save-button\" mat-flat-button color=\"warn\" type=\"submit\" [disabled]=\"submitting\">\n <mat-icon>backup</mat-icon> <span> Save & publish changes</span>\n </button>\n </div>\n</form>", styles: [".wrapper{background-color:#f3f3f3;border:1px solid rgba(0,0,0,.12);border-radius:4px;margin:1em 0}.show-hide a{cursor:pointer;font-size:.8rem}.save{position:sticky;bottom:0;min-height:38px;padding:.5rem .5rem .5rem 0;background-color:#fff;display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:flex-end;z-index:1000}.save .save-button{animation:shadow-pulse 1s 3;margin-left:1rem}.save>*{margin:.3em}.save .revert{margin:0 16px;font-size:14px}.save .yes{margin:0 5px}.error{background-color:#a32b2d;color:#fff;padding:5px;font-size:.9em}.error a{color:#fff;text-decoration:underline}@media (max-width: 700px){.save{padding:.5rem 0}}\n"], components: [{ type: i4.SettingComponent, selector: "setting", inputs: ["formGroup", "readOnly", "canEditSetting", "canDeleteSetting", "deleteSettingText", "showEnvironmentName"], outputs: ["editSettingRequested", "deleteSettingRequested"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
169
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: SettingListComponent, decorators: [{
|
|
170
|
-
type: Component,
|
|
171
|
-
args: [{
|
|
172
|
-
selector: 'configcat-setting-list',
|
|
173
|
-
templateUrl: './setting-list.component.html',
|
|
174
|
-
styleUrls: ['./setting-list.component.scss']
|
|
175
|
-
}]
|
|
176
|
-
}], ctorParameters: function () { return [{ type: i1.SettingListFormHelper }, { type: i2.MatSnackBar }, { type: i3.MatDialog }]; }, propDecorators: { canEditSetting: [{
|
|
177
|
-
type: Input
|
|
178
|
-
}], canDeleteSetting: [{
|
|
179
|
-
type: Input
|
|
180
|
-
}], onSave: [{
|
|
181
|
-
type: Input
|
|
182
|
-
}], loadSettingValues: [{
|
|
183
|
-
type: Input
|
|
184
|
-
}], deleteSettingText: [{
|
|
185
|
-
type: Input
|
|
186
|
-
}], showEnvironmentName: [{
|
|
187
|
-
type: Input
|
|
188
|
-
}], editSettingRequested: [{
|
|
189
|
-
type: Output
|
|
190
|
-
}], deleteSettingRequested: [{
|
|
191
|
-
type: Output
|
|
192
|
-
}], formValuesChanged: [{
|
|
193
|
-
type: Output
|
|
194
|
-
}] } });
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBTXJHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDOzs7Ozs7Ozs7O0FBUXJHLE1BQU0sT0FBTyxvQkFBb0I7SUEwQi9CLFlBQW9CLFVBQWlDLEVBQzNDLFFBQXFCLEVBQ3JCLE1BQWlCO1FBRlAsZUFBVSxHQUFWLFVBQVUsQ0FBdUI7UUFDM0MsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBMUJsQixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFJekIsc0JBQWlCLEdBQUcsZ0JBQWdCLENBQUM7UUFDckMsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRTNCLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsMkJBQXNCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM1QyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSWpELFlBQU8sR0FB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QUM1QyxTQUFTLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztpQkFDN0M7OEpBR1UsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVJLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25EZXN0cm95LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNldHRpbmdWYWx1ZXNNb2RlbCwgVXBkYXRlU2V0dGluZ1ZhbHVlc01vZGVsIH0gZnJvbSAnLi4vX21vZGVscyc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IFJlYXNvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2RpYWxvZ3MvcmVhc29uLWRpYWxvZy9yZWFzb24tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYXZlU25hY2tiYXJDb21wb25lbnQgfSBmcm9tICcuLi9kaWFsb2dzL3NhdmUtc25hY2tiYXIvc2F2ZS1zbmFja2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29uY3VycmVudERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2RpYWxvZ3MvY29uY3VycmVudC1kaWFsb2cvY29uY3VycmVudC1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IFNldHRpbmdMaXN0Rm9ybUhlbHBlciB9IGZyb20gJy4uL19zZXJ2aWNlcy9zZXR0aW5nLWxpc3QtZm9ybS1oZWxwZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb25maWdjYXQtc2V0dGluZy1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NldHRpbmctbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NldHRpbmctbGlzdC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNldHRpbmdMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgY2FuRWRpdFNldHRpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuRGVsZXRlU2V0dGluZyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG9uU2F2ZSE6ICh2YWx1ZTogVXBkYXRlU2V0dGluZ1ZhbHVlc01vZGVsKSA9PiBPYnNlcnZhYmxlPFNldHRpbmdWYWx1ZXNNb2RlbD47XG4gIEBJbnB1dCgpIGxvYWRTZXR0aW5nVmFsdWVzITogKCkgPT4gT2JzZXJ2YWJsZTxTZXR0aW5nVmFsdWVzTW9kZWw+O1xuICBASW5wdXQoKSBkZWxldGVTZXR0aW5nVGV4dCA9ICdEZWxldGUgc2V0dGluZyc7XG4gIEBJbnB1dCgpIHNob3dFbnZpcm9ubWVudE5hbWUgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgZWRpdFNldHRpbmdSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBkZWxldGVTZXR0aW5nUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZm9ybVZhbHVlc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZm9ybVZhbHVlc0NoYW5nZWRTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb24gfCBudWxsO1xuXG4gIGxvYWRpbmcgPSB0cnVlO1xuXG4gIHNldHRpbmdWYWx1ZXMhOiBTZXR0aW5nVmFsdWVzTW9kZWw7XG4gIGZvcm1Hcm91cCE6IEZvcm1Hcm91cDtcblxuICBzdWJtaXR0aW5nID0gZmFsc2U7XG4gIHNob3dSZXZlcnRRdWVzdGlvbiA9IGZhbHNlO1xuICBzaG93RmVlZEJhY2tNZXNzYWdlID0gZmFsc2U7XG4gIHJlYWRPbmx5ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtSGVscGVyOiBTZXR0aW5nTGlzdEZvcm1IZWxwZXIsXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZykgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWxvYWRTZXR0aW5nVmFsdWVzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbG9hZFNldHRpbmdWYWx1ZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmZvcm1WYWx1ZXNDaGFuZ2VkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZvcm1WYWx1ZXNDaGFuZ2VkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmZvcm1WYWx1ZXNDaGFuZ2VkU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZWxvYWRTZXR0aW5nVmFsdWVzKCkge1xuICAgIHRoaXMuc2hvd0ZlZWRCYWNrTWVzc2FnZSA9IGZhbHNlO1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5sb2FkU2V0dGluZ1ZhbHVlcygpXG4gICAgICAuc3Vic2NyaWJlKHNldHRpbmdWYWx1ZXMgPT4ge1xuICAgICAgICB0aGlzLnJlYWRPbmx5ID0gc2V0dGluZ1ZhbHVlcy5yZWFkT25seTtcbiAgICAgICAgdGhpcy5zZXR0aW5nVmFsdWVzID0gc2V0dGluZ1ZhbHVlcztcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtR3JvdXAoKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdPb29wcy4gV2UgY291bGQgbm90IGxvYWQgeW91ciBGZWF0dXJlIEZsYWdzIGFuZCBTZXR0aW5ncy4gUGxlYXNlIHRyeSBhZ2FpbiBvciBjb250YWN0IHVzLicsXG4gICAgICAgICAgICAnRGlzbWlzcycsIHsgZHVyYXRpb246IDYwMDAwLCBwYW5lbENsYXNzOiAncmVkLXNuYWNrYmFyJyB9KTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBjcmVhdGVGb3JtR3JvdXAoKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmZvcm1IZWxwZXIuY3JlYXRlU2V0dGluZ1ZhbHVlc0Zvcm1Hcm91cCh0aGlzLnNldHRpbmdWYWx1ZXMpO1xuICAgIHRoaXMuZm9ybVZhbHVlc0NoYW5nZWRTdWJzY3JpcHRpb24gPSB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZm9ybVZhbHVlc0NoYW5nZWQuZW1pdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0dGluZ1ZhbHVlc0Zvcm1BcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KCdzZXR0aW5nVmFsdWVzJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgZ2V0U2V0dGluZ1ZhbHVlRm9ybUdyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nVmFsdWVzRm9ybUFycmF5KCkuY29udHJvbHMubWFwKGMgPT4gYyBhcyBGb3JtR3JvdXApO1xuICB9XG5cbiAgc3VibWl0KCkge1xuICAgIGlmICghdGhpcy5mb3JtR3JvdXAgfHwgIXRoaXMuZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICB0aGlzLnNob3dGZWVkQmFja01lc3NhZ2UgPSB0cnVlO1xuICAgICAgdGhpcy5mb3JtR3JvdXAubWFya0FzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0ZlZWRCYWNrTWVzc2FnZSA9IGZhbHNlO1xuICAgIHRoaXMuc3VibWl0dGluZyA9IHRydWU7XG5cbiAgICBjb25zdCB1cGRhdGVTZXR0aW5nVmFsdWVzTW9kZWwgPSA8VXBkYXRlU2V0dGluZ1ZhbHVlc01vZGVsPntcbiAgICAgIHNldHRpbmdWYWx1ZXM6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnNldHRpbmdWYWx1ZXMudmFsdWUsXG4gICAgICBrbm93bkxhc3RVcGRhdGVkQXQ6IHRoaXMuc2V0dGluZ1ZhbHVlcy5sYXN0VXBkYXRlZEF0LFxuICAgICAgZm9yY2VkOiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZXR0aW5nVmFsdWVzLnJlYXNvblJlcXVpcmVkKSB7XG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFJlYXNvbkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICB3aWR0aDogJzQ1MHB4J1xuICAgICAgfSk7XG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKVxuICAgICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuYnV0dG9uID09PSAnc2F2ZScgJiYgcmVzdWx0LnJlYXNvbikge1xuXG4gICAgICAgICAgICB1cGRhdGVTZXR0aW5nVmFsdWVzTW9kZWwucmVhc29uID0gcmVzdWx0LnJlYXNvbjtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ1ZhbHVlcyh1cGRhdGVTZXR0aW5nVmFsdWVzTW9kZWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU2V0dGluZ1ZhbHVlcyh1cGRhdGVTZXR0aW5nVmFsdWVzTW9kZWwpO1xuICB9XG5cbiAgdXBkYXRlU2V0dGluZ1ZhbHVlcyh1cGRhdGVTZXR0aW5nVmFsdWVzTW9kZWw6IGFueSkge1xuICAgIHRoaXMub25TYXZlKHVwZGF0ZVNldHRpbmdWYWx1ZXNNb2RlbCkuc3Vic2NyaWJlKHNldHRpbmdWYWx1ZXMgPT4ge1xuICAgICAgdGhpcy5zZXR0aW5nVmFsdWVzID0gc2V0dGluZ1ZhbHVlcztcbiAgICAgIHRoaXMuY3JlYXRlRm9ybUdyb3VwKCk7XG4gICAgICB0aGlzLnN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbkZyb21Db21wb25lbnQoU2F2ZVNuYWNrYmFyQ29tcG9uZW50LCB7IGR1cmF0aW9uOiA1MDAwLCBwYW5lbENsYXNzOiAnZ3JlZW4tc25hY2tiYXInIH0pO1xuICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAwICYmIGVycm9yLmVycm9yXG4gICAgICAgICYmIGVycm9yLmVycm9yLktub3duTGFzdFVwZGF0ZWRBdCAmJiBlcnJvci5lcnJvci5Lbm93bkxhc3RVcGRhdGVkQXRbMF0gPT09ICdDb25jdXJyZW50IHVwZGF0ZScpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25jdXJyZW50RGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgd2lkdGg6ICc1NjBweCdcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpXG4gICAgICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuYnV0dG9uID09PSAnc2F2ZScpIHtcbiAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ1ZhbHVlc01vZGVsLmZvcmNlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ1ZhbHVlcyh1cGRhdGVTZXR0aW5nVmFsdWVzTW9kZWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5yZWxvYWRTZXR0aW5nVmFsdWVzKCk7XG4gICAgICAgICAgICAgIHRoaXMuc3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwMCAmJiBlcnJvci5lcnJvciAmJiBlcnJvci5lcnJvci5SZWFzb24gJiYgZXJyb3IuZXJyb3IuUmVhc29uWzBdID09PSAnUmVhc29uIHJlcXVpcmVkJykge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFJlYXNvbkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgIHdpZHRoOiAnNDUwcHgnXG4gICAgICAgIH0pO1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKVxuICAgICAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmJ1dHRvbiA9PT0gJ3NhdmUnICYmIHJlc3VsdC5yZWFzb24pIHtcbiAgICAgICAgICAgICAgdXBkYXRlU2V0dGluZ1ZhbHVlc01vZGVsLnJlYXNvbiA9IHJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ1ZhbHVlcyh1cGRhdGVTZXR0aW5nVmFsdWVzTW9kZWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5mb3JtR3JvdXAuc2V0RXJyb3JzKHsgaW50ZXJuYWxTZXJ2ZXJFcnJvcjogJ0ludGVybmFsIHNlcnZlciBlcnJvcicgfSk7XG4gICAgICB0aGlzLnNob3dGZWVkQmFja01lc3NhZ2UgPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlUmV2ZXJ0WWVzKCkge1xuICAgIHRoaXMuc2hvd1JldmVydFF1ZXN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5yZWxvYWRTZXR0aW5nVmFsdWVzKCk7XG4gIH1cblxuICBoYW5kbGVSZXZlcnRDYW5jZWwoKSB7XG4gICAgdGhpcy5zaG93UmV2ZXJ0UXVlc3Rpb24gPSBmYWxzZTtcbiAgfVxuXG4gIG9uRWRpdFNldHRpbmdSZXF1ZXN0ZWQoc2V0dGluZzogYW55KSB7XG4gICAgdGhpcy5lZGl0U2V0dGluZ1JlcXVlc3RlZC5lbWl0KHtcbiAgICAgIHNldHRpbmc6IHNldHRpbmcuc2V0dGluZyxcbiAgICAgIGVudmlyb25tZW50OiB0aGlzLnNldHRpbmdWYWx1ZXMuZW52aXJvbm1lbnQsXG4gICAgICBjb25maWc6IHRoaXMuc2V0dGluZ1ZhbHVlcy5jb25maWdcbiAgICB9KTtcbiAgfVxuXG4gIG9uRGVsZXRlU2V0dGluZ1JlcXVlc3RlZChzZXR0aW5nOiBhbnkpIHtcbiAgICB0aGlzLmRlbGV0ZVNldHRpbmdSZXF1ZXN0ZWQuZW1pdCh7XG4gICAgICBzZXR0aW5nOiBzZXR0aW5nLnNldHRpbmcsXG4gICAgICBlbnZpcm9ubWVudDogdGhpcy5zZXR0aW5nVmFsdWVzLmVudmlyb25tZW50LFxuICAgICAgY29uZmlnOiB0aGlzLnNldHRpbmdWYWx1ZXMuY29uZmlnXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCIgKm5nSWY9XCIhbG9hZGluZ1wiPlxuICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiICpuZ0Zvcj1cImxldCBzZXR0aW5nVmFsdWVGcm9tR3JvdXAgb2YgZ2V0U2V0dGluZ1ZhbHVlRm9ybUdyb3VwcygpOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgPHNldHRpbmcgW2Zvcm1Hcm91cF09XCJzZXR0aW5nVmFsdWVGcm9tR3JvdXBcIiBbcmVhZE9ubHldPVwicmVhZE9ubHlcIiBbY2FuRWRpdFNldHRpbmddPVwiY2FuRWRpdFNldHRpbmdcIlxuICAgICAgW2NhbkRlbGV0ZVNldHRpbmddPVwiY2FuRGVsZXRlU2V0dGluZ1wiIChlZGl0U2V0dGluZ1JlcXVlc3RlZCk9XCJvbkVkaXRTZXR0aW5nUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgKGRlbGV0ZVNldHRpbmdSZXF1ZXN0ZWQpPVwib25EZWxldGVTZXR0aW5nUmVxdWVzdGVkKCRldmVudClcIiBbZGVsZXRlU2V0dGluZ1RleHRdPVwiZGVsZXRlU2V0dGluZ1RleHRcIlxuICAgICAgW3Nob3dFbnZpcm9ubWVudE5hbWVdPVwic2hvd0Vudmlyb25tZW50TmFtZVwiPlxuICAgIDwvc2V0dGluZz5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInNhdmVcIiAqbmdJZj1cIiFyZWFkT25seSAmJiAhc3VibWl0dGluZyAmJiBmb3JtR3JvdXAuZGlydHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmVlZGJhY2tcIiAqbmdJZj1cImZvcm1Hcm91cC50b3VjaGVkICYmIGZvcm1Hcm91cC5pbnZhbGlkICYmIHNob3dGZWVkQmFja01lc3NhZ2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJlcnJvclwiICpuZ0lmPVwiZm9ybUdyb3VwLmVycm9ycyAmJiBmb3JtR3JvdXAuZXJyb3JzLmludGVybmFsU2VydmVyRXJyb3JcIj5cbiAgICAgICAgPHNwYW4+U29tZXRoaW5nIHdlbnQgd3JvbmcgYW5kIHdlIGNvdWxkIG5vdCBzYXZlIHlvdXIgc2V0dGluZ3MuIFlvdSBjYW4gdHJ5IGFnYWluIG9yIDxhXG4gICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9jb25maWdjYXQuY29tL3N1cHBvcnRcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+Y29udGFjdCB1cy48L2E+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZXJyb3JcIiAqbmdJZj1cIiFmb3JtR3JvdXAuZXJyb3JzIHx8ICFmb3JtR3JvdXAuZXJyb3JzLmludGVybmFsU2VydmVyRXJyb3JcIj5cbiAgICAgICAgPHNwYW4+T2ggbm8hIEEgZmVhdHVyZSBmbGFnIGhhcyBpbnZhbGlkIG9yIG1pc3NpbmcgZGF0YS48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gKm5nSWY9XCIhc2hvd1JldmVydFF1ZXN0aW9uXCIgKGNsaWNrKT1cInNob3dSZXZlcnRRdWVzdGlvbiA9IHRydWVcIj5cbiAgICAgIDxtYXQtaWNvbj5oaXN0b3J5PC9tYXQtaWNvbj48c3Bhbj5SZXZlcnQgY2hhbmdlczwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd1JldmVydFF1ZXN0aW9uXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInJldmVydFwiPlJldmVydCB0byBsYXN0IHNhdmVkIHN0YXRlPzwvc3Bhbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwieWVzXCIgbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJoYW5kbGVSZXZlcnRZZXMoKVwiPlllczwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJoYW5kbGVSZXZlcnRDYW5jZWwoKVwiPk5vPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInNhdmUtYnV0dG9uXCIgbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwid2FyblwiIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwic3VibWl0dGluZ1wiPlxuICAgICAgPG1hdC1pY29uPmJhY2t1cDwvbWF0LWljb24+IDxzcGFuPiBTYXZlICYgcHVibGlzaCBjaGFuZ2VzPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT4iXX0=
|