ng-configcat-publicapi-ui 4.2.2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/fesm2022/ng-configcat-publicapi-ui.mjs +4240 -3534
- package/fesm2022/ng-configcat-publicapi-ui.mjs.map +1 -1
- package/index.d.ts +476 -3
- package/package.json +11 -10
- package/src/css/button.scss +83 -0
- package/src/css/controls.scss +390 -0
- package/src/css/dialog.scss +63 -0
- package/src/css/icon.scss +7 -0
- package/src/css/slider.scss +82 -0
- package/src/css/snackbar.scss +16 -0
- package/src/css/table.scss +142 -0
- package/src/css/theme.scss +47 -0
- package/src/css/tooltip.scss +12 -0
- package/src/css/variables.scss +324 -0
- package/src/css/vars/auth.scss +24 -0
- package/src/css/vars/banner.scss +116 -0
- package/src/css/vars/box.scss +48 -0
- package/src/css/vars/config-overview.scss +27 -0
- package/src/css/vars/flag.scss +146 -0
- package/src/css/vars/header.scss +24 -0
- package/src/css/vars/icon.scss +33 -0
- package/src/css/vars/logo.scss +19 -0
- package/src/css/vars/notification.scss +38 -0
- package/src/css/vars/overview.scss +51 -0
- package/src/css/vars/prism.scss +44 -0
- package/src/css/vars/sidenav.scss +42 -0
- package/src/css/vars/theme.scss +78 -0
- package/src/public-api.scss +208 -0
- package/esm2022/lib/_directives/index.mjs +0 -2
- package/esm2022/lib/_directives/input-display-normalizer.directive.mjs +0 -38
- package/esm2022/lib/_models/deleteSettingModel.mjs +0 -2
- package/esm2022/lib/_models/flag-state.mjs +0 -2
- package/esm2022/lib/_models/index.mjs +0 -4
- package/esm2022/lib/_models/setting-value-formgroup.mjs +0 -2
- package/esm2022/lib/_models/settingValuesModel.mjs +0 -2
- package/esm2022/lib/_models/updateSettingValuesModel.mjs +0 -2
- package/esm2022/lib/_models/user-comparator.mjs +0 -100
- package/esm2022/lib/_services/app-data-adapter.mjs +0 -18
- package/esm2022/lib/_services/comparison-value-list-helper.mjs +0 -72
- package/esm2022/lib/_services/date-helper.mjs +0 -56
- package/esm2022/lib/_services/form-generator.mjs +0 -359
- package/esm2022/lib/_services/form-helper.mjs +0 -163
- package/esm2022/lib/_services/index.mjs +0 -3
- package/esm2022/lib/_services/messaging.service.mjs +0 -26
- package/esm2022/lib/_services/platform-helper.mjs +0 -7
- package/esm2022/lib/_services/public-api.service.mjs +0 -77
- package/esm2022/lib/_services/setting-list-form-helper.mjs +0 -171
- package/esm2022/lib/_services/tracking.directive.mjs +0 -16
- package/esm2022/lib/ace-editor/ace-editor.component.mjs +0 -137
- package/esm2022/lib/authorization/authorization.component.mjs +0 -62
- package/esm2022/lib/base/base-select.component.mjs +0 -27
- package/esm2022/lib/base/base.component.mjs +0 -48
- package/esm2022/lib/bootstrap.mjs +0 -11
- package/esm2022/lib/configuration.mjs +0 -14
- package/esm2022/lib/dialogs/confirmation-dialog/confirmation-dialog.mjs +0 -28
- package/esm2022/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.mjs +0 -27
- package/esm2022/lib/dialogs/expand-dialog/expand-dialog.component.mjs +0 -80
- package/esm2022/lib/dialogs/info-dialog/info-dialog.mjs +0 -29
- package/esm2022/lib/dialogs/reason-dialog/reason-dialog.component.mjs +0 -36
- package/esm2022/lib/dialogs/reroute-dialog/reroute-dialog.mjs +0 -28
- package/esm2022/lib/dialogs/save-snackbar/save-snackbar.component.mjs +0 -14
- package/esm2022/lib/ng-configcat-publicapi-ui.module.mjs +0 -288
- package/esm2022/lib/selects/config-select/config-select.component.mjs +0 -60
- package/esm2022/lib/selects/environment-select/environment-select.component.mjs +0 -47
- package/esm2022/lib/selects/product-select/product-select.component.mjs +0 -40
- package/esm2022/lib/selects/setting-select/setting-select.component.mjs +0 -47
- package/esm2022/lib/setting-item/setting-item.component.mjs +0 -118
- package/esm2022/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +0 -81
- package/esm2022/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +0 -293
- package/esm2022/lib/setting-list/setting/setting.component.mjs +0 -136
- package/esm2022/lib/setting-list/setting/value/value.component.mjs +0 -37
- package/esm2022/lib/setting-list/setting-list.component.mjs +0 -194
- package/esm2022/lib/v2/feature-flag/date-time-picker/date-time-picker.component.mjs +0 -123
- package/esm2022/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.mjs +0 -30
- package/esm2022/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.mjs +0 -220
- package/esm2022/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.mjs +0 -61
- package/esm2022/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.mjs +0 -72
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.mjs +0 -25
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.mjs +0 -105
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.mjs +0 -75
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.mjs +0 -48
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.mjs +0 -113
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/popout-list-editor-dialog/popout-list-editor-dialog.component.mjs +0 -251
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.mjs +0 -444
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.mjs +0 -84
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.mjs +0 -129
- package/esm2022/lib/v2/feature-flag/feature-flag.component.mjs +0 -190
- package/esm2022/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.mjs +0 -65
- package/esm2022/lib/v2/feature-flag-item.component.mjs +0 -330
- package/esm2022/ng-configcat-publicapi-ui.mjs +0 -5
- package/esm2022/public-api.mjs +0 -15
- package/lib/_directives/index.d.ts +0 -1
- package/lib/_directives/input-display-normalizer.directive.d.ts +0 -13
- package/lib/_models/deleteSettingModel.d.ts +0 -6
- package/lib/_models/flag-state.d.ts +0 -20
- package/lib/_models/index.d.ts +0 -3
- package/lib/_models/setting-value-formgroup.d.ts +0 -69
- package/lib/_models/settingValuesModel.d.ts +0 -11
- package/lib/_models/updateSettingValuesModel.d.ts +0 -7
- package/lib/_models/user-comparator.d.ts +0 -84
- package/lib/_services/app-data-adapter.d.ts +0 -7
- package/lib/_services/comparison-value-list-helper.d.ts +0 -17
- package/lib/_services/date-helper.d.ts +0 -6
- package/lib/_services/form-generator.d.ts +0 -59
- package/lib/_services/form-helper.d.ts +0 -21
- package/lib/_services/index.d.ts +0 -2
- package/lib/_services/messaging.service.d.ts +0 -12
- package/lib/_services/platform-helper.d.ts +0 -3
- package/lib/_services/public-api.service.d.ts +0 -21
- package/lib/_services/setting-list-form-helper.d.ts +0 -19
- package/lib/_services/tracking.directive.d.ts +0 -6
- package/lib/ace-editor/ace-editor.component.d.ts +0 -32
- package/lib/authorization/authorization.component.d.ts +0 -21
- package/lib/base/base-select.component.d.ts +0 -10
- package/lib/base/base.component.d.ts +0 -18
- package/lib/bootstrap.d.ts +0 -13
- package/lib/configuration.d.ts +0 -9
- package/lib/dialogs/confirmation-dialog/confirmation-dialog.d.ts +0 -19
- package/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.d.ts +0 -17
- package/lib/dialogs/expand-dialog/expand-dialog.component.d.ts +0 -25
- package/lib/dialogs/info-dialog/info-dialog.d.ts +0 -17
- package/lib/dialogs/reason-dialog/reason-dialog.component.d.ts +0 -15
- package/lib/dialogs/reroute-dialog/reroute-dialog.d.ts +0 -20
- package/lib/dialogs/save-snackbar/save-snackbar.component.d.ts +0 -8
- package/lib/ng-configcat-publicapi-ui.module.d.ts +0 -75
- package/lib/selects/config-select/config-select.component.d.ts +0 -17
- package/lib/selects/environment-select/environment-select.component.d.ts +0 -17
- package/lib/selects/product-select/product-select.component.d.ts +0 -14
- package/lib/selects/setting-select/setting-select.component.d.ts +0 -17
- package/lib/setting-item/setting-item.component.d.ts +0 -37
- package/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.d.ts +0 -27
- package/lib/setting-list/setting/rollout-rules/rollout-rules.component.d.ts +0 -61
- package/lib/setting-list/setting/setting.component.d.ts +0 -43
- package/lib/setting-list/setting/value/value.component.d.ts +0 -20
- package/lib/setting-list/setting-list.component.d.ts +0 -53
- package/lib/v2/feature-flag/date-time-picker/date-time-picker.component.d.ts +0 -25
- package/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.d.ts +0 -27
- package/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.d.ts +0 -41
- package/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.d.ts +0 -18
- package/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.d.ts +0 -30
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.d.ts +0 -10
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.d.ts +0 -27
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.d.ts +0 -36
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.d.ts +0 -21
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.d.ts +0 -79
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/popout-list-editor-dialog/popout-list-editor-dialog.component.d.ts +0 -63
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.d.ts +0 -94
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.d.ts +0 -31
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.d.ts +0 -33
- package/lib/v2/feature-flag/feature-flag.component.d.ts +0 -49
- package/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.d.ts +0 -28
- package/lib/v2/feature-flag-item.component.d.ts +0 -66
- package/public-api.d.ts +0 -11
- package/public-api.scss +0 -350
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { Component, DestroyRef, Input, forwardRef, inject } from '@angular/core';
|
|
2
|
-
import { FormControl, FormGroup, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
|
|
3
|
-
import { FormHelper, timeRegex } from '../../../_services/form-helper';
|
|
4
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
|
-
import { DateAdapter } from '@angular/material/core';
|
|
6
|
-
import { AppDateAdapter } from '../../../_services/app-data-adapter';
|
|
7
|
-
import { DateHelper } from '../../../_services/date-helper';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/common";
|
|
10
|
-
import * as i2 from "@angular/forms";
|
|
11
|
-
import * as i3 from "@angular/material/form-field";
|
|
12
|
-
import * as i4 from "@angular/material/input";
|
|
13
|
-
import * as i5 from "@angular/material/tooltip";
|
|
14
|
-
import * as i6 from "@angular/material/datepicker";
|
|
15
|
-
export class DateTimePickerComponent {
|
|
16
|
-
constructor() {
|
|
17
|
-
this.FormHelper = FormHelper;
|
|
18
|
-
this.destroyRef = inject(DestroyRef);
|
|
19
|
-
}
|
|
20
|
-
ngOnInit() {
|
|
21
|
-
this.formGroup = new FormGroup({
|
|
22
|
-
dateValue: new FormControl(undefined, { nonNullable: true, validators: [Validators.required] }),
|
|
23
|
-
timeValue: new FormControl(undefined, { nonNullable: true, validators: [Validators.pattern(timeRegex), Validators.required] })
|
|
24
|
-
});
|
|
25
|
-
this.formGroup.valueChanges
|
|
26
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
27
|
-
.subscribe(value => {
|
|
28
|
-
if (!value.dateValue || !value.timeValue) {
|
|
29
|
-
if (this.onChangeModel) {
|
|
30
|
-
this.onChangeModel(undefined);
|
|
31
|
-
}
|
|
32
|
-
if (this.onTouchModel) {
|
|
33
|
-
this.onTouchModel();
|
|
34
|
-
}
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
let dateTimeValue = new Date(value.dateValue);
|
|
38
|
-
dateTimeValue = DateHelper.offsetDate(dateTimeValue, -dateTimeValue.getTimezoneOffset());
|
|
39
|
-
const splitted = value.timeValue.split(':');
|
|
40
|
-
if (splitted.length === 2) {
|
|
41
|
-
dateTimeValue.setUTCHours(parseInt(splitted[0]));
|
|
42
|
-
dateTimeValue.setUTCMinutes(parseInt(splitted[1]));
|
|
43
|
-
dateTimeValue.setUTCSeconds(0);
|
|
44
|
-
dateTimeValue.setUTCMilliseconds(0);
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
dateTimeValue.setUTCHours(0);
|
|
48
|
-
dateTimeValue.setUTCMinutes(0);
|
|
49
|
-
dateTimeValue.setUTCSeconds(0);
|
|
50
|
-
dateTimeValue.setUTCMilliseconds(0);
|
|
51
|
-
}
|
|
52
|
-
if (this.onChangeModel) {
|
|
53
|
-
this.onChangeModel(dateTimeValue.getTime() / 1000.0);
|
|
54
|
-
}
|
|
55
|
-
if (this.onTouchModel) {
|
|
56
|
-
this.onTouchModel();
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
writeValue(obj) {
|
|
61
|
-
if (!obj) {
|
|
62
|
-
this.formGroup.patchValue({ dateValue: undefined, timeValue: undefined });
|
|
63
|
-
}
|
|
64
|
-
const date = new Date(obj * 1000.0);
|
|
65
|
-
const dateValue = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
|
|
66
|
-
const utcHours = date.getUTCHours();
|
|
67
|
-
const utcMinutes = date.getUTCMinutes();
|
|
68
|
-
const timeValue = `${(utcHours < 10 ? '0' : '') + utcHours}:${(utcMinutes < 10 ? '0' : '') + utcMinutes}`;
|
|
69
|
-
this.formGroup.patchValue({ dateValue, timeValue }, { onlySelf: true, emitEvent: false });
|
|
70
|
-
}
|
|
71
|
-
registerOnChange(fn) {
|
|
72
|
-
this.onChangeModel = fn;
|
|
73
|
-
}
|
|
74
|
-
registerOnTouched(fn) {
|
|
75
|
-
this.onTouchModel = fn;
|
|
76
|
-
}
|
|
77
|
-
setDisabledState(isDisabled) {
|
|
78
|
-
if (isDisabled) {
|
|
79
|
-
this.formGroup.disable();
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
this.formGroup.enable();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
validate() {
|
|
86
|
-
return this.formGroup.errors;
|
|
87
|
-
}
|
|
88
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateTimePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
89
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateTimePickerComponent, selector: "app-date-time-picker", inputs: { dateTooltip: "dateTooltip", timeTooltip: "timeTooltip" }, providers: [
|
|
90
|
-
{
|
|
91
|
-
provide: NG_VALUE_ACCESSOR,
|
|
92
|
-
useExisting: forwardRef(() => DateTimePickerComponent),
|
|
93
|
-
multi: true,
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
provide: NG_VALIDATORS,
|
|
97
|
-
useExisting: forwardRef(() => DateTimePickerComponent),
|
|
98
|
-
multi: true,
|
|
99
|
-
},
|
|
100
|
-
{ provide: DateAdapter, useClass: AppDateAdapter }
|
|
101
|
-
], ngImport: i0, template: "<div class=\"outer\">\n <div class=\"component date\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"small-icon-button\">\n <input matInput [formControl]=\"formGroup.controls.dateValue\" [matDatepicker]=\"datepicker\"\n [matTooltip]=\"dateTooltip\">\n <mat-datepicker-toggle matSuffix [for]=\"datepicker\"></mat-datepicker-toggle>\n <mat-datepicker #datepicker></mat-datepicker>\n <mat-error *ngIf=\"formGroup.controls.dateValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.dateValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n <div class=\"component\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"time\" [formControl]=\"formGroup.controls.timeValue\" [matTooltip]=\"timeTooltip\" />\n <mat-error *ngIf=\"formGroup.controls.timeValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.timeValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</div>", styles: [".outer{display:flex;flex-wrap:wrap}.outer .component{width:140px;margin:2px 0}.outer .component.date{margin-right:8px}.outer .component mat-form-field{width:100%;font-size:12px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i6.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i6.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i6.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }] }); }
|
|
102
|
-
}
|
|
103
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateTimePickerComponent, decorators: [{
|
|
104
|
-
type: Component,
|
|
105
|
-
args: [{ selector: 'app-date-time-picker', providers: [
|
|
106
|
-
{
|
|
107
|
-
provide: NG_VALUE_ACCESSOR,
|
|
108
|
-
useExisting: forwardRef(() => DateTimePickerComponent),
|
|
109
|
-
multi: true,
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
provide: NG_VALIDATORS,
|
|
113
|
-
useExisting: forwardRef(() => DateTimePickerComponent),
|
|
114
|
-
multi: true,
|
|
115
|
-
},
|
|
116
|
-
{ provide: DateAdapter, useClass: AppDateAdapter }
|
|
117
|
-
], template: "<div class=\"outer\">\n <div class=\"component date\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"small-icon-button\">\n <input matInput [formControl]=\"formGroup.controls.dateValue\" [matDatepicker]=\"datepicker\"\n [matTooltip]=\"dateTooltip\">\n <mat-datepicker-toggle matSuffix [for]=\"datepicker\"></mat-datepicker-toggle>\n <mat-datepicker #datepicker></mat-datepicker>\n <mat-error *ngIf=\"formGroup.controls.dateValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.dateValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n <div class=\"component\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"time\" [formControl]=\"formGroup.controls.timeValue\" [matTooltip]=\"timeTooltip\" />\n <mat-error *ngIf=\"formGroup.controls.timeValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.timeValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</div>", styles: [".outer{display:flex;flex-wrap:wrap}.outer .component{width:140px;margin:2px 0}.outer .component.date{margin-right:8px}.outer .component mat-form-field{width:100%;font-size:12px}\n"] }]
|
|
118
|
-
}], propDecorators: { dateTooltip: [{
|
|
119
|
-
type: Input
|
|
120
|
-
}], timeTooltip: [{
|
|
121
|
-
type: Input
|
|
122
|
-
}] } });
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvdjIvZmVhdHVyZS1mbGFnL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvdjIvZmVhdHVyZS1mbGFnL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQXdCLFdBQVcsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUErQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6SixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7OztBQXlCNUQsTUFBTSxPQUFPLHVCQUF1QjtJQWxCcEM7UUFtQkUsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN4QixlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBK0VqQztJQXhFQyxRQUFRO1FBQ04sSUFBSSxDQUFDLFNBQVMs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SUFDL0IsQ0FBQzsrR0FoRlUsdUJBQXVCO21HQUF2Qix1QkFBdUIsbUhBZHZCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztnQkFDdEQsS0FBSyxFQUFFLElBQUk7YUFDWjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHVCQUF1QixDQUFDO2dCQUN0RCxLQUFLLEVBQUUsSUFBSTthQUNaO1lBQ0QsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7U0FDbkQsMEJDN0JILGluQ0FvQk07OzRGRFdPLHVCQUF1QjtrQkFsQm5DLFNBQVM7K0JBQ0Usc0JBQXNCLGFBR3JCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixDQUFDOzRCQUN0RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUM7NEJBQ3RELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNELEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO3FCQUNuRDs4QkFRUSxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIERlc3Ryb3lSZWYsIElucHV0LCBPbkluaXQsIGZvcndhcmRSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3IsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtSGVscGVyLCB0aW1lUmVnZXggfSBmcm9tICcuLi8uLi8uLi9fc2VydmljZXMvZm9ybS1oZWxwZXInO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IEFwcERhdGVBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vX3NlcnZpY2VzL2FwcC1kYXRhLWFkYXB0ZXInO1xuaW1wb3J0IHsgRGF0ZUhlbHBlciB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy9kYXRlLWhlbHBlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVRpbWVGb3JtIHtcbiAgZGF0ZVZhbHVlOiBGb3JtQ29udHJvbDxEYXRlIHwgdW5kZWZpbmVkPjtcbiAgdGltZVZhbHVlOiBGb3JtQ29udHJvbDxzdHJpbmc+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGF0ZS10aW1lLXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVUaW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVUaW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAgeyBwcm92aWRlOiBEYXRlQWRhcHRlciwgdXNlQ2xhc3M6IEFwcERhdGVBZGFwdGVyIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlVGltZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciB7XG4gIEZvcm1IZWxwZXIgPSBGb3JtSGVscGVyO1xuICBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBmb3JtR3JvdXA6IEZvcm1Hcm91cDxEYXRlVGltZUZvcm0+O1xuICBwcml2YXRlIG9uQ2hhbmdlTW9kZWw6IGFueTtcbiAgcHJpdmF0ZSBvblRvdWNoTW9kZWw6IGFueTtcbiAgQElucHV0KCkgZGF0ZVRvb2x0aXA6IHN0cmluZztcbiAgQElucHV0KCkgdGltZVRvb2x0aXA6IHN0cmluZztcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXA8RGF0ZVRpbWVGb3JtPih7XG4gICAgICBkYXRlVmFsdWU6IG5ldyBGb3JtQ29udHJvbDxEYXRlPih1bmRlZmluZWQsIHsgbm9uTnVsbGFibGU6IHRydWUsIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSB9KSxcbiAgICAgIHRpbWVWYWx1ZTogbmV3IEZvcm1Db250cm9sPHN0cmluZz4odW5kZWZpbmVkLCB7IG5vbk51bGxhYmxlOiB0cnVlLCB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5wYXR0ZXJuKHRpbWVSZWdleCksIFZhbGlkYXRvcnMucmVxdWlyZWRdIH0pXG4gICAgfSk7XG4gICAgdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlLmRhdGVWYWx1ZSB8fCAhdmFsdWUudGltZVZhbHVlKSB7XG4gICAgICAgICAgaWYgKHRoaXMub25DaGFuZ2VNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZU1vZGVsKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm9uVG91Y2hNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5vblRvdWNoTW9kZWwoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGVUaW1lVmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZS5kYXRlVmFsdWUpO1xuICAgICAgICBkYXRlVGltZVZhbHVlID0gRGF0ZUhlbHBlci5vZmZzZXREYXRlKGRhdGVUaW1lVmFsdWUsIC1kYXRlVGltZVZhbHVlLmdldFRpbWV6b25lT2Zmc2V0KCkpXG4gICAgICAgIGNvbnN0IHNwbGl0dGVkID0gdmFsdWUudGltZVZhbHVlLnNwbGl0KCc6Jyk7XG4gICAgICAgIGlmIChzcGxpdHRlZC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBkYXRlVGltZVZhbHVlLnNldFVUQ0hvdXJzKHBhcnNlSW50KHNwbGl0dGVkWzBdKSk7XG4gICAgICAgICAgZGF0ZVRpbWVWYWx1ZS5zZXRVVENNaW51dGVzKHBhcnNlSW50KHNwbGl0dGVkWzFdKSk7XG4gICAgICAgICAgZGF0ZVRpbWVWYWx1ZS5zZXRVVENTZWNvbmRzKDApO1xuICAgICAgICAgIGRhdGVUaW1lVmFsdWUuc2V0VVRDTWlsbGlzZWNvbmRzKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGVUaW1lVmFsdWUuc2V0VVRDSG91cnMoMCk7XG4gICAgICAgICAgZGF0ZVRpbWVWYWx1ZS5zZXRVVENNaW51dGVzKDApO1xuICAgICAgICAgIGRhdGVUaW1lVmFsdWUuc2V0VVRDU2Vjb25kcygwKTtcbiAgICAgICAgICBkYXRlVGltZVZhbHVlLnNldFVUQ01pbGxpc2Vjb25kcygwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbkNoYW5nZU1vZGVsKSB7XG4gICAgICAgICAgdGhpcy5vbkNoYW5nZU1vZGVsKGRhdGVUaW1lVmFsdWUuZ2V0VGltZSgpIC8gMTAwMC4wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vblRvdWNoTW9kZWwpIHtcbiAgICAgICAgICB0aGlzLm9uVG91Y2hNb2RlbCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAgIGlmICghb2JqKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgZGF0ZVZhbHVlOiB1bmRlZmluZWQsIHRpbWVWYWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgIH1cbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUob2JqICogMTAwMC4wKTtcbiAgICBjb25zdCBkYXRlVmFsdWUgPSBuZXcgRGF0ZShEYXRlLlVUQyhkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIGRhdGUuZ2V0VVRDTW9udGgoKSwgZGF0ZS5nZXRVVENEYXRlKCkpKTtcbiAgICBjb25zdCB1dGNIb3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCB1dGNNaW51dGVzID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgY29uc3QgdGltZVZhbHVlID0gYCR7KHV0Y0hvdXJzIDwgMTAgPyAnMCcgOiAnJykgKyB1dGNIb3Vyc306JHsodXRjTWludXRlcyA8IDEwID8gJzAnIDogJycpICsgdXRjTWludXRlc31gO1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyBkYXRlVmFsdWUsIHRpbWVWYWx1ZSB9LCB7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZU1vZGVsID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaE1vZGVsID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5lbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZXJyb3JzO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwib3V0ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50IGRhdGVcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIGNsYXNzPVwic21hbGwtaWNvbi1idXR0b25cIj5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVWYWx1ZVwiIFttYXREYXRlcGlja2VyXT1cImRhdGVwaWNrZXJcIlxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImRhdGVUb29sdGlwXCI+XG4gICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cImRhdGVwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjZGF0ZXBpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5kYXRlVmFsdWUuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgIHt7Rm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UoZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVWYWx1ZSl9fVxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCI+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRpbWVcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzLnRpbWVWYWx1ZVwiIFttYXRUb29sdGlwXT1cInRpbWVUb29sdGlwXCIgLz5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtR3JvdXAuY29udHJvbHMudGltZVZhbHVlLmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICB7e0Zvcm1IZWxwZXIuZ2V0RXJyb3JNZXNzYWdlKGZvcm1Hcm91cC5jb250cm9scy50aW1lVmFsdWUpfX1cbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/router";
|
|
5
|
-
import * as i2 from "../../../_services";
|
|
6
|
-
import * as i3 from "@angular/common";
|
|
7
|
-
import * as i4 from "@angular/material/button";
|
|
8
|
-
import * as i5 from "@angular/material/dialog";
|
|
9
|
-
export class DependeesDialogComponent {
|
|
10
|
-
constructor(data, router, publicApiService) {
|
|
11
|
-
this.data = data;
|
|
12
|
-
this.router = router;
|
|
13
|
-
this.publicApiService = publicApiService;
|
|
14
|
-
}
|
|
15
|
-
getDashboardUrl(settingId) {
|
|
16
|
-
const urlTree = this.router.createUrlTree(['v2', this.data.organizationId,
|
|
17
|
-
this.data.productId, this.data.configId, this.data.environmentId, settingId]);
|
|
18
|
-
return this.publicApiService.getDashboardBasePath() + this.router.serializeUrl(urlTree);
|
|
19
|
-
}
|
|
20
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DependeesDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.Router }, { token: i2.PublicApiService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
21
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DependeesDialogComponent, selector: "app-dependees-dialog", ngImport: i0, template: "<h1 mat-dialog-title>Prerequisite references</h1>\n<div mat-dialog-content>\n <p>\n <strong>{{data.name}}</strong> is the prerequisite of the following feature flags:\n </p>\n <ul *ngFor=\"let dependee of data.dependees\">\n <li><a [href]=\"getDashboardUrl(dependee.settingId)\" rel=\"noopener noreferrer\" target=\"_blank\">{{dependee.name}}\n ({{dependee.key}})</a></li>\n </ul>\n</div>\n\n<div mat-dialog-actions>\n <button type=\"button\" mat-stroked-button mat-dialog-close>Close</button>\n</div>", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i5.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i5.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i5.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i5.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }] }); }
|
|
22
|
-
}
|
|
23
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DependeesDialogComponent, decorators: [{
|
|
24
|
-
type: Component,
|
|
25
|
-
args: [{ selector: 'app-dependees-dialog', template: "<h1 mat-dialog-title>Prerequisite references</h1>\n<div mat-dialog-content>\n <p>\n <strong>{{data.name}}</strong> is the prerequisite of the following feature flags:\n </p>\n <ul *ngFor=\"let dependee of data.dependees\">\n <li><a [href]=\"getDashboardUrl(dependee.settingId)\" rel=\"noopener noreferrer\" target=\"_blank\">{{dependee.name}}\n ({{dependee.key}})</a></li>\n </ul>\n</div>\n\n<div mat-dialog-actions>\n <button type=\"button\" mat-stroked-button mat-dialog-close>Close</button>\n</div>" }]
|
|
26
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
27
|
-
type: Inject,
|
|
28
|
-
args: [MAT_DIALOG_DATA]
|
|
29
|
-
}] }, { type: i1.Router }, { type: i2.PublicApiService }] });
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwZW5kZWVzLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvdjIvZmVhdHVyZS1mbGFnL2RlcGVuZGVlcy1kaWFsb2cvZGVwZW5kZWVzLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvdjIvZmVhdHVyZS1mbGFnL2RlcGVuZGVlcy1kaWFsb2cvZGVwZW5kZWVzLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7QUFTM0QsTUFBTSxPQUFPLHdCQUF3QjtJQUVuQyxZQUNrQyxJQU8vQixFQUVPLE1BQWMsRUFDZCxnQkFBa0M7UUFWVixTQUFJLEdBQUosSUFBSSxDQU9uQztRQUVPLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQ3hDLENBQUM7SUFFTCxlQUFlLENBQUMsU0FBaUI7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDaEYsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRixDQUFDOytHQXBCVSx3QkFBd0Isa0JBR3pCLGVBQWU7bUdBSGQsd0JBQXdCLDREQ1ZyQyx5Z0JBYU07OzRGREhPLHdCQUF3QjtrQkFKcEMsU0FBUzsrQkFDRSxzQkFBc0I7OzBCQU03QixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IElEZXBlbmRlZVNldHRpbmcgfSBmcm9tICcuLi8uLi8uLi9fbW9kZWxzL3NldHRpbmctdmFsdWUtZm9ybWdyb3VwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBQdWJsaWNBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX3NlcnZpY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWRlcGVuZGVlcy1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVwZW5kZWVzLWRpYWxvZy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGVwZW5kZWVzRGlhbG9nQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IHtcbiAgICAgIGRlcGVuZGVlczogSURlcGVuZGVlU2V0dGluZ1tdLFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgb3JnYW5pemF0aW9uSWQ6IHN0cmluZyxcbiAgICAgIHByb2R1Y3RJZDogc3RyaW5nLFxuICAgICAgY29uZmlnSWQ6IHN0cmluZyxcbiAgICAgIGVudmlyb25tZW50SWQ6IHN0cmluZ1xuICAgIH0sXG5cbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcHVibGljQXBpU2VydmljZTogUHVibGljQXBpU2VydmljZVxuICApIHsgfVxuXG4gIGdldERhc2hib2FyZFVybChzZXR0aW5nSWQ6IG51bWJlcikge1xuICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFsndjInLCB0aGlzLmRhdGEub3JnYW5pemF0aW9uSWQsXG4gICAgICB0aGlzLmRhdGEucHJvZHVjdElkLCB0aGlzLmRhdGEuY29uZmlnSWQsIHRoaXMuZGF0YS5lbnZpcm9ubWVudElkLCBzZXR0aW5nSWRdKTtcbiAgICByZXR1cm4gdGhpcy5wdWJsaWNBcGlTZXJ2aWNlLmdldERhc2hib2FyZEJhc2VQYXRoKCkgKyB0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwodXJsVHJlZSk7XG4gIH1cbn1cbiIsIjxoMSBtYXQtZGlhbG9nLXRpdGxlPlByZXJlcXVpc2l0ZSByZWZlcmVuY2VzPC9oMT5cbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50PlxuICA8cD5cbiAgICA8c3Ryb25nPnt7ZGF0YS5uYW1lfX08L3N0cm9uZz4gaXMgdGhlIHByZXJlcXVpc2l0ZSBvZiB0aGUgZm9sbG93aW5nIGZlYXR1cmUgZmxhZ3M6XG4gIDwvcD5cbiAgPHVsICpuZ0Zvcj1cImxldCBkZXBlbmRlZSBvZiBkYXRhLmRlcGVuZGVlc1wiPlxuICAgIDxsaT48YSBbaHJlZl09XCJnZXREYXNoYm9hcmRVcmwoZGVwZW5kZWUuc2V0dGluZ0lkKVwiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIj57e2RlcGVuZGVlLm5hbWV9fVxuICAgICAgICAoe3tkZXBlbmRlZS5rZXl9fSk8L2E+PC9saT5cbiAgPC91bD5cbjwvZGl2PlxuXG48ZGl2IG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXN0cm9rZWQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+Q2xvc2U8L2J1dHRvbj5cbjwvZGl2PiJdfQ==
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import { moveItemInArray } from '@angular/cdk/drag-drop';
|
|
2
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
3
|
-
import { FormGroup, FormArray } from '@angular/forms';
|
|
4
|
-
import { UserComparator, SegmentComparator } from '../../../bootstrap';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../../../bootstrap";
|
|
7
|
-
import * as i2 from "@angular/common";
|
|
8
|
-
import * as i3 from "@angular/forms";
|
|
9
|
-
import * as i4 from "@angular/material/button";
|
|
10
|
-
import * as i5 from "@angular/material/icon";
|
|
11
|
-
import * as i6 from "@angular/material/tooltip";
|
|
12
|
-
import * as i7 from "@angular/material/chips";
|
|
13
|
-
import * as i8 from "@angular/cdk/drag-drop";
|
|
14
|
-
import * as i9 from "@angular/material/menu";
|
|
15
|
-
import * as i10 from "./feature-flag-value/feature-flag-value.component";
|
|
16
|
-
import * as i11 from "./targeting-rule/targeting-rule.component";
|
|
17
|
-
export class EvaluationFormulaComponent {
|
|
18
|
-
constructor(formGenerator) {
|
|
19
|
-
this.formGenerator = formGenerator;
|
|
20
|
-
this.createSegmentRequested = new EventEmitter();
|
|
21
|
-
this.manageSegmentsRequested = new EventEmitter();
|
|
22
|
-
this.addSegmentConditionRequestedWithoutSegments = new EventEmitter();
|
|
23
|
-
this.changePercentageEvaluationAttributeRequested = new EventEmitter();
|
|
24
|
-
this.subscriptionLimitReached = new EventEmitter();
|
|
25
|
-
this.prerequisiteConditionChanged = new EventEmitter();
|
|
26
|
-
this.recalcAddButtons = new EventEmitter();
|
|
27
|
-
}
|
|
28
|
-
addUserCondition() {
|
|
29
|
-
if (!this.checkFeatureFlagLimitations()) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
const formGroup = new FormGroup({
|
|
33
|
-
conditions: new FormArray([
|
|
34
|
-
this.formGenerator.generateConditionFormGroup({
|
|
35
|
-
userCondition: { comparisonAttribute: 'Identifier', comparator: UserComparator.SensitiveTextEquals, comparisonValue: { stringValue: '' } }
|
|
36
|
-
}, this.flagState.readOnly, this.flagState.prerequisiteSettings, this.featureFlagLimitations)
|
|
37
|
-
]),
|
|
38
|
-
value: this.formGenerator.generateDefaultValueFormGroup(this.flagState.settingValue.setting.settingType, this.flagState.readOnly, this.featureFlagLimitations)
|
|
39
|
-
});
|
|
40
|
-
this.addTargetingRuleFormGroup(formGroup);
|
|
41
|
-
formGroup.markAsDirty();
|
|
42
|
-
this.recalcAddButtons.emit();
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
addSegmentCondition() {
|
|
46
|
-
if (!this.checkFeatureFlagLimitations()) {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
if (this.segments.length === 0) {
|
|
50
|
-
this.addSegmentConditionRequestedWithoutSegments.emit();
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
const formGroup = new FormGroup({
|
|
54
|
-
conditions: new FormArray([
|
|
55
|
-
this.formGenerator.generateConditionFormGroup({
|
|
56
|
-
segmentCondition: { comparator: SegmentComparator.IsIn, segmentId: null }
|
|
57
|
-
}, this.flagState.readOnly, this.flagState.prerequisiteSettings, this.featureFlagLimitations)
|
|
58
|
-
]),
|
|
59
|
-
value: this.formGenerator.generateDefaultValueFormGroup(this.flagState.settingValue.setting.settingType, this.flagState.readOnly, this.featureFlagLimitations)
|
|
60
|
-
});
|
|
61
|
-
this.addTargetingRuleFormGroup(formGroup);
|
|
62
|
-
formGroup.markAsDirty();
|
|
63
|
-
this.recalcAddButtons.emit();
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
addPrerequisiteFlagCondition() {
|
|
67
|
-
if (!this.checkFeatureFlagLimitations()) {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
const formGroup = new FormGroup({
|
|
71
|
-
conditions: new FormArray([
|
|
72
|
-
new FormGroup({
|
|
73
|
-
prerequisiteFlagCondition: this.formGenerator.generateEmptyPrerequisiteFlagConditionFormGroup(this.featureFlagLimitations)
|
|
74
|
-
})
|
|
75
|
-
]),
|
|
76
|
-
value: this.formGenerator.generateDefaultValueFormGroup(this.flagState.settingValue.setting.settingType, this.flagState.readOnly, this.featureFlagLimitations)
|
|
77
|
-
});
|
|
78
|
-
this.addTargetingRuleFormGroup(formGroup);
|
|
79
|
-
formGroup.markAsDirty();
|
|
80
|
-
this.recalcAddButtons.emit();
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
addPercentageOptions() {
|
|
84
|
-
if (this.flagState.addButtonRenderState.hasPercentageOnlyRule) {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
if (!this.checkFeatureFlagLimitations()) {
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
const formGroup = this.formGenerator.generateTargetingRuleWithEmptyPercentageOptions(this.flagState.settingValue.setting.settingType, this.flagState.readOnly, this.flagState.prerequisiteSettings, this.featureFlagLimitations);
|
|
91
|
-
this.addTargetingRuleFormGroup(formGroup);
|
|
92
|
-
formGroup.markAsDirty();
|
|
93
|
-
this.recalcAddButtons.emit();
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
addTargetingRuleFormGroup(formGroup) {
|
|
97
|
-
if (this.flagState.addButtonRenderState.hasPercentageOnlyRule) {
|
|
98
|
-
this.formGroup.controls.targetingRules.insert(this.formGroup.controls.targetingRules.controls.length - 1, formGroup);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
this.formGroup.controls.targetingRules.push(formGroup);
|
|
102
|
-
}
|
|
103
|
-
this.recalcAddButtons.emit();
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
checkFeatureFlagLimitations() {
|
|
107
|
-
if (this.formGroup.controls.targetingRules.length >= this.featureFlagLimitations.maxTargetingRuleCount) {
|
|
108
|
-
this.subscriptionLimitReached.emit();
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
trackByIndex(index) {
|
|
114
|
-
return index;
|
|
115
|
-
}
|
|
116
|
-
onDrop(event) {
|
|
117
|
-
const targetingRules = this.formGroup.controls.targetingRules.controls;
|
|
118
|
-
moveItemInArray(targetingRules, event.previousIndex, event.currentIndex);
|
|
119
|
-
this.formGroup.markAsDirty();
|
|
120
|
-
this.recalcAddButtons.emit();
|
|
121
|
-
}
|
|
122
|
-
isDragDisabled(targetingRule) {
|
|
123
|
-
// If the last targeting rule has only percentage options, we should not allow moving anything before/after it.
|
|
124
|
-
return this.flagState.readOnly || this.formGenerator.isPercentageOnlyTargetingRule(targetingRule);
|
|
125
|
-
}
|
|
126
|
-
sortPredicate() {
|
|
127
|
-
return (index) => this.sortPredicateFunction(index);
|
|
128
|
-
}
|
|
129
|
-
sortPredicateFunction(index) {
|
|
130
|
-
// If the last targeting rule has only percentage options, we should not allow moving anything before/after it.
|
|
131
|
-
return index < this.formGroup.controls.targetingRules.controls.length - 1 ||
|
|
132
|
-
!this.formGenerator.isPercentageOnlyTargetingRule(this.formGroup.controls.targetingRules.controls[index]);
|
|
133
|
-
}
|
|
134
|
-
getChipText() {
|
|
135
|
-
if (this.formGroup.controls.targetingRules.controls.length > 0) {
|
|
136
|
-
if (this.flagState.addButtonRenderState.hasPercentageOnlyRule) {
|
|
137
|
-
return 'To unidentified:';
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
return 'To all others:';
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return 'To all users:';
|
|
144
|
-
}
|
|
145
|
-
getChipTooltip() {
|
|
146
|
-
if (this.formGroup.controls.targetingRules.controls.length > 0) {
|
|
147
|
-
if (this.flagState.addButtonRenderState.hasPercentageOnlyRule) {
|
|
148
|
-
return 'This fallback value will be served in case the user can\'t be identified.';
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
return 'This value will be served to all users who the above rules don\'t apply.';
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return '';
|
|
155
|
-
}
|
|
156
|
-
remove(index) {
|
|
157
|
-
const shouldEmitPrerequisiteChanged = this.formGroup.controls
|
|
158
|
-
.targetingRules.controls[index].controls
|
|
159
|
-
.conditions?.controls
|
|
160
|
-
.some(c => c.controls.prerequisiteFlagCondition);
|
|
161
|
-
this.formGroup.controls.targetingRules.removeAt(index);
|
|
162
|
-
this.formGroup.controls.targetingRules.markAsDirty();
|
|
163
|
-
this.recalcAddButtons.emit();
|
|
164
|
-
if (shouldEmitPrerequisiteChanged) {
|
|
165
|
-
this.recalcPrerequisiteReferences();
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
subscriptionLimitReachedCalled() {
|
|
169
|
-
this.subscriptionLimitReached.emit();
|
|
170
|
-
}
|
|
171
|
-
recalcPrerequisiteReferences() {
|
|
172
|
-
const prerequisiteIds = [];
|
|
173
|
-
for (const rule of this.formGroup.controls.targetingRules.controls) {
|
|
174
|
-
for (const condition of rule.controls.conditions.controls) {
|
|
175
|
-
if (condition.controls.prerequisiteFlagCondition) {
|
|
176
|
-
prerequisiteIds.push(condition.controls.prerequisiteFlagCondition.controls.prerequisiteSettingId.value);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
this.prerequisiteConditionChanged.emit({
|
|
181
|
-
settingId: this.flagState.settingValue.setting.settingId,
|
|
182
|
-
prerequisiteIds: prerequisiteIds
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EvaluationFormulaComponent, deps: [{ token: i1.FormGenerator }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
186
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: EvaluationFormulaComponent, selector: "app-evaluation-formula", inputs: { formGroup: "formGroup", segments: "segments", flagState: "flagState", showVariationId: "showVariationId", featureFlagLimitations: "featureFlagLimitations", canManageSegments: "canManageSegments", showPercentageEvaluationAttribute: "showPercentageEvaluationAttribute" }, outputs: { createSegmentRequested: "createSegmentRequested", manageSegmentsRequested: "manageSegmentsRequested", addSegmentConditionRequestedWithoutSegments: "addSegmentConditionRequestedWithoutSegments", changePercentageEvaluationAttributeRequested: "changePercentageEvaluationAttributeRequested", subscriptionLimitReached: "subscriptionLimitReached", prerequisiteConditionChanged: "prerequisiteConditionChanged", recalcAddButtons: "recalcAddButtons" }, ngImport: i0, template: "<div class=\"targeting-rule-outer\" *ngIf=\"flagState.addButtonRenderState.renderTopAddButtons && !flagState.readOnly\">\n <div class=\"grow vertical-center add-box pad-bottom left-align\">\n <div class=\"add-btn add-if\" [matMenuTriggerFor]=\"ormenu\" \n matTooltip=\"Add targeting rule\">+ IF</div>\n <div class=\"add-btn add-if pad-left\" (click)=\"addPercentageOptions()\" matTooltip=\"Target a percentage of users\" \n *ngIf=\"!flagState.addButtonRenderState.hasPercentageOnlyRule\">+ %</div>\n </div>\n</div>\n\n<div cdkDropList (cdkDropListDropped)=\"onDrop($event)\" [cdkDropListDisabled]=\"flagState.readOnly\" [cdkDropListSortPredicate]=\"sortPredicate()\">\n <div *ngFor=\"let targetingRule of formGroup.controls.targetingRules.controls; trackBy: trackByIndex; let i = index\">\n <div class=\"targeting-rule-outer grow\" cdkDrag [cdkDragDisabled]=\"isDragDisabled(targetingRule)\"\n [cdkDragData]=\"targetingRule\">\n <div class=\"drag-handle\">\n <div *ngIf=\"!isDragDisabled(targetingRule)\" cdkDragHandle matTooltip=\"Drag here to reorder\"\n matTooltipPosition=\"above\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n </div>\n <div class=\"white-box grow\">\n <app-targeting-rule class=\"grow\" [formGroup]=\"targetingRule\" [segments]=\"segments\"\n [flagState]=\"flagState\" [targetingRuleIndex]=\"i\"\n (removedAllRules)=\"remove(i)\" [featureFlagLimitations]=\"featureFlagLimitations\"\n (subscriptionLimitReached)=\"subscriptionLimitReachedCalled()\"\n [canManageSegments]=\"canManageSegments\" (createSegmentRequested)=\"createSegmentRequested.emit()\"\n (manageSegmentsRequested)=\"manageSegmentsRequested.emit()\"\n (addSegmentConditionRequestedWithoutSegments)=\"addSegmentConditionRequestedWithoutSegments.emit()\"\n [showPercentageEvaluationAttribute]=\"showPercentageEvaluationAttribute\"\n [percentageEvaluationAttribute]=\"formGroup.controls.percentageEvaluationAttribute.value\"\n (changePercentageEvaluationAttributeRequested)=\"changePercentageEvaluationAttributeRequested.emit()\"\n (prerequisiteConditionChanged)=\"recalcPrerequisiteReferences()\"></app-targeting-rule>\n <div class=\"delete\">\n <button type=\"button\" mat-icon-button matTooltip=\"Remove targeting rule\" (click)=\"remove(i)\"\n *ngIf=\"!flagState.readOnly\">\n <mat-icon>cancel</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <div class=\"targeting-rule-outer\" *ngIf=\"flagState.addButtonRenderState.addRuleButtonTracker[i]?.showAddRuleButtons && !flagState.readOnly\">\n <div class=\"grow vertical-center add-box pad-bottom pad-top center-shift\">\n <div class=\"add-btn add-if\" \n [matMenuTriggerFor]=\"ormenu\" \n matTooltip=\"Add targeting rule\" \n *ngIf=\"!flagState.readOnly\">+ OR</div>\n <div class=\"add-btn add-if pad-left\" (click)=\"addPercentageOptions()\" \n matTooltip=\"Target a percentage of users\" \n *ngIf=\"!flagState.addButtonRenderState.hasPercentageOnlyRule\">+ %</div>\n </div>\n </div>\n <div class=\"or-chip\" *ngIf=\"flagState.addButtonRenderState.addRuleButtonTracker[i]?.showOrChip\">\n <div class=\"chip-container\">\n <mat-chip-set>\n <mat-chip disabled>OR</mat-chip>\n </mat-chip-set>\n </div>\n </div>\n <div class=\"or-chip\" *ngIf=\"flagState.addButtonRenderState.addRuleButtonTracker[i]?.renderSeparationArea\"></div>\n </div>\n</div>\n\n<div class=\"targeting-rule-outer\">\n <div class=\"drag-handle\"></div>\n <div class=\"white-box grow side-padd vertical-center\">\n <div class=\"chip-container fixed-width\" [ngClass]=\"flagState.addButtonRenderState.hasPercentageOnlyRule ? 'fixed-width-wide' : ''\">\n <mat-chip-set matTooltipPosition=\"above\" [matTooltip]=\"getChipTooltip()\">\n <mat-chip disabled>{{getChipText()}}</mat-chip>\n </mat-chip-set>\n </div>\n <app-feature-flag-value class=\"value grow\" [flagState]=\"flagState\"\n tooltip=\"Served value\" [formGroup]=\"formGroup.controls.defaultValue\"\n [featureFlagLimitations]=\"featureFlagLimitations\"></app-feature-flag-value>\n </div>\n</div>\n\n<mat-menu #ormenu class=\"menu-long-text-or\">\n <a mat-menu-item (click)=\"addUserCondition()\"><mat-icon>track_changes</mat-icon>Add rule with user condition</a>\n <a mat-menu-item (click)=\"addSegmentCondition()\"><mat-icon>pie_chart</mat-icon>Add rule with segment condition</a>\n <div matTooltip=\"There's no other flag in the Config to select as a prerequisite.\"\n [matTooltipDisabled]=\"flagState.prerequisiteSettings.length > 0\">\n <a mat-menu-item (click)=\"addPrerequisiteFlagCondition()\" [disabled]=\"!flagState.prerequisiteSettings.length\">\n <mat-icon>account_tree</mat-icon>Add rule with flag condition (prerequisite)\n </a>\n </div>\n</mat-menu>", styles: ["html{--mdc-text-button-container-height: 28px;--mdc-filled-button-container-height: 28px;--mdc-protected-button-container-height: 28px;--mdc-outlined-button-container-height: 28px;--mat-text-button-touch-target-display: none;--mat-filled-button-touch-target-display: none;--mat-protected-button-touch-target-display: none;--mat-outlined-button-touch-target-display: none}html{--mat-icon-button-touch-target-display: none}.mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 32px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:4px}.cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}.or-chip{display:flex;justify-content:center;z-index:910;min-height:30px;margin:-11px 15px -9px 0}.or-chip .mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 24px}.or-chip .chip-container{z-index:910;align-self:center;margin-top:0}.targeting-rule-outer{display:flex;margin-right:20px}.targeting-rule-outer .drag-handle{align-self:center;cursor:move;cursor:grab;cursor:-moz-grab;cursor:-webkit-grab;min-width:16px;max-width:16px;color:gray}.targeting-rule-outer .drag-handle mat-icon{font-size:18px}.targeting-rule-outer .drag-handle:active{cursor:grabbing;cursor:-moz-grabbing;cursor:-webkit-grabbing}.targeting-rule-outer .white-box{background-color:#f2f4f8;display:flex;flex-wrap:wrap;border:1px solid #c9c9c9;padding:8px 0;position:relative}.targeting-rule-outer .white-box .delete{color:#b1b1b1;position:absolute;cursor:pointer;top:-16px;right:-16px;z-index:900}.targeting-rule-outer .white-box .delete mat-icon{font-size:20px;height:20px;width:20px;z-index:900;background-color:#f3f3f3;border-radius:50%}.targeting-rule-outer .white-box .chip-container{margin-top:4px}.targeting-rule-outer .vertical-center{align-items:center}.targeting-rule-outer .grow{flex-grow:1}.targeting-rule-outer .side-padd{padding-left:16px;padding-right:16px}.targeting-rule-outer .add-box{margin-left:16px;display:flex}.targeting-rule-outer .add-box .add-if{min-width:42px;padding:5px 2px 5px 0;justify-content:center;text-align:center;color:#8b8b8b;border:1px dashed rgb(168,168,168);background-color:#f2f4f8;border-radius:50px}.targeting-rule-outer .add-box .add-if:hover{background-color:#e5e8f0}.targeting-rule-outer .add-box .pad-left{margin-left:5px}.targeting-rule-outer .center-shift{margin-right:10px}.targeting-rule-outer .left-align{justify-content:left}.targeting-rule-outer .pad-bottom{margin-bottom:8px}.targeting-rule-outer .pad-top{margin-top:8px}\n", ".chip-container{display:flex;margin-top:2px;align-self:start}.chip-container.fixed-width{width:110px}.chip-container.fixed-width-wide{width:130px}.chip-container mat-chip-set{margin-top:2px;width:100%}.chip-container mat-chip-set mat-chip{width:100%;margin-top:0;margin-bottom:0;height:24px;font-size:12px;background-color:#d1e3fa;opacity:1}.chip-container .add-btn mat-chip{background-color:transparent;border:1px dashed #afaeae;color:#afaeae;cursor:pointer}.chip-container .enter-sign{color:#ccc;margin:6px 3px 0 8px}.chip-container .enter-sign mat-icon{font-size:16px;width:16px;height:16px}\n", ".add-btn{cursor:pointer;background-color:transparent;display:flex;font-size:10px;align-items:center;border:1px dashed rgb(168,168,168);color:#979797;border-radius:15px}.add-btn:hover{background-color:#ebebeb}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i7.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i7.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i8.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i10.FeatureFlagValueComponent, selector: "app-feature-flag-value", inputs: ["formGroup", "flagState", "featureFlagLimitations", "isPrerequisite", "tooltip"] }, { kind: "component", type: i11.TargetingRuleComponent, selector: "app-targeting-rule", inputs: ["formGroup", "segments", "flagState", "targetingRuleIndex", "featureFlagLimitations", "canManageSegments", "showPercentageEvaluationAttribute", "percentageEvaluationAttribute"], outputs: ["createSegmentRequested", "manageSegmentsRequested", "addSegmentConditionRequestedWithoutSegments", "removedAllRules", "subscriptionLimitReached", "changePercentageEvaluationAttributeRequested", "prerequisiteConditionChanged"] }] }); }
|
|
187
|
-
}
|
|
188
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EvaluationFormulaComponent, decorators: [{
|
|
189
|
-
type: Component,
|
|
190
|
-
args: [{ selector: 'app-evaluation-formula', template: "<div class=\"targeting-rule-outer\" *ngIf=\"flagState.addButtonRenderState.renderTopAddButtons && !flagState.readOnly\">\n <div class=\"grow vertical-center add-box pad-bottom left-align\">\n <div class=\"add-btn add-if\" [matMenuTriggerFor]=\"ormenu\" \n matTooltip=\"Add targeting rule\">+ IF</div>\n <div class=\"add-btn add-if pad-left\" (click)=\"addPercentageOptions()\" matTooltip=\"Target a percentage of users\" \n *ngIf=\"!flagState.addButtonRenderState.hasPercentageOnlyRule\">+ %</div>\n </div>\n</div>\n\n<div cdkDropList (cdkDropListDropped)=\"onDrop($event)\" [cdkDropListDisabled]=\"flagState.readOnly\" [cdkDropListSortPredicate]=\"sortPredicate()\">\n <div *ngFor=\"let targetingRule of formGroup.controls.targetingRules.controls; trackBy: trackByIndex; let i = index\">\n <div class=\"targeting-rule-outer grow\" cdkDrag [cdkDragDisabled]=\"isDragDisabled(targetingRule)\"\n [cdkDragData]=\"targetingRule\">\n <div class=\"drag-handle\">\n <div *ngIf=\"!isDragDisabled(targetingRule)\" cdkDragHandle matTooltip=\"Drag here to reorder\"\n matTooltipPosition=\"above\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n </div>\n <div class=\"white-box grow\">\n <app-targeting-rule class=\"grow\" [formGroup]=\"targetingRule\" [segments]=\"segments\"\n [flagState]=\"flagState\" [targetingRuleIndex]=\"i\"\n (removedAllRules)=\"remove(i)\" [featureFlagLimitations]=\"featureFlagLimitations\"\n (subscriptionLimitReached)=\"subscriptionLimitReachedCalled()\"\n [canManageSegments]=\"canManageSegments\" (createSegmentRequested)=\"createSegmentRequested.emit()\"\n (manageSegmentsRequested)=\"manageSegmentsRequested.emit()\"\n (addSegmentConditionRequestedWithoutSegments)=\"addSegmentConditionRequestedWithoutSegments.emit()\"\n [showPercentageEvaluationAttribute]=\"showPercentageEvaluationAttribute\"\n [percentageEvaluationAttribute]=\"formGroup.controls.percentageEvaluationAttribute.value\"\n (changePercentageEvaluationAttributeRequested)=\"changePercentageEvaluationAttributeRequested.emit()\"\n (prerequisiteConditionChanged)=\"recalcPrerequisiteReferences()\"></app-targeting-rule>\n <div class=\"delete\">\n <button type=\"button\" mat-icon-button matTooltip=\"Remove targeting rule\" (click)=\"remove(i)\"\n *ngIf=\"!flagState.readOnly\">\n <mat-icon>cancel</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <div class=\"targeting-rule-outer\" *ngIf=\"flagState.addButtonRenderState.addRuleButtonTracker[i]?.showAddRuleButtons && !flagState.readOnly\">\n <div class=\"grow vertical-center add-box pad-bottom pad-top center-shift\">\n <div class=\"add-btn add-if\" \n [matMenuTriggerFor]=\"ormenu\" \n matTooltip=\"Add targeting rule\" \n *ngIf=\"!flagState.readOnly\">+ OR</div>\n <div class=\"add-btn add-if pad-left\" (click)=\"addPercentageOptions()\" \n matTooltip=\"Target a percentage of users\" \n *ngIf=\"!flagState.addButtonRenderState.hasPercentageOnlyRule\">+ %</div>\n </div>\n </div>\n <div class=\"or-chip\" *ngIf=\"flagState.addButtonRenderState.addRuleButtonTracker[i]?.showOrChip\">\n <div class=\"chip-container\">\n <mat-chip-set>\n <mat-chip disabled>OR</mat-chip>\n </mat-chip-set>\n </div>\n </div>\n <div class=\"or-chip\" *ngIf=\"flagState.addButtonRenderState.addRuleButtonTracker[i]?.renderSeparationArea\"></div>\n </div>\n</div>\n\n<div class=\"targeting-rule-outer\">\n <div class=\"drag-handle\"></div>\n <div class=\"white-box grow side-padd vertical-center\">\n <div class=\"chip-container fixed-width\" [ngClass]=\"flagState.addButtonRenderState.hasPercentageOnlyRule ? 'fixed-width-wide' : ''\">\n <mat-chip-set matTooltipPosition=\"above\" [matTooltip]=\"getChipTooltip()\">\n <mat-chip disabled>{{getChipText()}}</mat-chip>\n </mat-chip-set>\n </div>\n <app-feature-flag-value class=\"value grow\" [flagState]=\"flagState\"\n tooltip=\"Served value\" [formGroup]=\"formGroup.controls.defaultValue\"\n [featureFlagLimitations]=\"featureFlagLimitations\"></app-feature-flag-value>\n </div>\n</div>\n\n<mat-menu #ormenu class=\"menu-long-text-or\">\n <a mat-menu-item (click)=\"addUserCondition()\"><mat-icon>track_changes</mat-icon>Add rule with user condition</a>\n <a mat-menu-item (click)=\"addSegmentCondition()\"><mat-icon>pie_chart</mat-icon>Add rule with segment condition</a>\n <div matTooltip=\"There's no other flag in the Config to select as a prerequisite.\"\n [matTooltipDisabled]=\"flagState.prerequisiteSettings.length > 0\">\n <a mat-menu-item (click)=\"addPrerequisiteFlagCondition()\" [disabled]=\"!flagState.prerequisiteSettings.length\">\n <mat-icon>account_tree</mat-icon>Add rule with flag condition (prerequisite)\n </a>\n </div>\n</mat-menu>", styles: ["html{--mdc-text-button-container-height: 28px;--mdc-filled-button-container-height: 28px;--mdc-protected-button-container-height: 28px;--mdc-outlined-button-container-height: 28px;--mat-text-button-touch-target-display: none;--mat-filled-button-touch-target-display: none;--mat-protected-button-touch-target-display: none;--mat-outlined-button-touch-target-display: none}html{--mat-icon-button-touch-target-display: none}.mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 32px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:4px}.cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}.or-chip{display:flex;justify-content:center;z-index:910;min-height:30px;margin:-11px 15px -9px 0}.or-chip .mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 24px}.or-chip .chip-container{z-index:910;align-self:center;margin-top:0}.targeting-rule-outer{display:flex;margin-right:20px}.targeting-rule-outer .drag-handle{align-self:center;cursor:move;cursor:grab;cursor:-moz-grab;cursor:-webkit-grab;min-width:16px;max-width:16px;color:gray}.targeting-rule-outer .drag-handle mat-icon{font-size:18px}.targeting-rule-outer .drag-handle:active{cursor:grabbing;cursor:-moz-grabbing;cursor:-webkit-grabbing}.targeting-rule-outer .white-box{background-color:#f2f4f8;display:flex;flex-wrap:wrap;border:1px solid #c9c9c9;padding:8px 0;position:relative}.targeting-rule-outer .white-box .delete{color:#b1b1b1;position:absolute;cursor:pointer;top:-16px;right:-16px;z-index:900}.targeting-rule-outer .white-box .delete mat-icon{font-size:20px;height:20px;width:20px;z-index:900;background-color:#f3f3f3;border-radius:50%}.targeting-rule-outer .white-box .chip-container{margin-top:4px}.targeting-rule-outer .vertical-center{align-items:center}.targeting-rule-outer .grow{flex-grow:1}.targeting-rule-outer .side-padd{padding-left:16px;padding-right:16px}.targeting-rule-outer .add-box{margin-left:16px;display:flex}.targeting-rule-outer .add-box .add-if{min-width:42px;padding:5px 2px 5px 0;justify-content:center;text-align:center;color:#8b8b8b;border:1px dashed rgb(168,168,168);background-color:#f2f4f8;border-radius:50px}.targeting-rule-outer .add-box .add-if:hover{background-color:#e5e8f0}.targeting-rule-outer .add-box .pad-left{margin-left:5px}.targeting-rule-outer .center-shift{margin-right:10px}.targeting-rule-outer .left-align{justify-content:left}.targeting-rule-outer .pad-bottom{margin-bottom:8px}.targeting-rule-outer .pad-top{margin-top:8px}\n", ".chip-container{display:flex;margin-top:2px;align-self:start}.chip-container.fixed-width{width:110px}.chip-container.fixed-width-wide{width:130px}.chip-container mat-chip-set{margin-top:2px;width:100%}.chip-container mat-chip-set mat-chip{width:100%;margin-top:0;margin-bottom:0;height:24px;font-size:12px;background-color:#d1e3fa;opacity:1}.chip-container .add-btn mat-chip{background-color:transparent;border:1px dashed #afaeae;color:#afaeae;cursor:pointer}.chip-container .enter-sign{color:#ccc;margin:6px 3px 0 8px}.chip-container .enter-sign mat-icon{font-size:16px;width:16px;height:16px}\n", ".add-btn{cursor:pointer;background-color:transparent;display:flex;font-size:10px;align-items:center;border:1px dashed rgb(168,168,168);color:#979797;border-radius:15px}.add-btn:hover{background-color:#ebebeb}\n"] }]
|
|
191
|
-
}], ctorParameters: () => [{ type: i1.FormGenerator }], propDecorators: { formGroup: [{
|
|
192
|
-
type: Input
|
|
193
|
-
}], segments: [{
|
|
194
|
-
type: Input
|
|
195
|
-
}], flagState: [{
|
|
196
|
-
type: Input
|
|
197
|
-
}], showVariationId: [{
|
|
198
|
-
type: Input
|
|
199
|
-
}], featureFlagLimitations: [{
|
|
200
|
-
type: Input
|
|
201
|
-
}], canManageSegments: [{
|
|
202
|
-
type: Input
|
|
203
|
-
}], showPercentageEvaluationAttribute: [{
|
|
204
|
-
type: Input
|
|
205
|
-
}], createSegmentRequested: [{
|
|
206
|
-
type: Output
|
|
207
|
-
}], manageSegmentsRequested: [{
|
|
208
|
-
type: Output
|
|
209
|
-
}], addSegmentConditionRequestedWithoutSegments: [{
|
|
210
|
-
type: Output
|
|
211
|
-
}], changePercentageEvaluationAttributeRequested: [{
|
|
212
|
-
type: Output
|
|
213
|
-
}], subscriptionLimitReached: [{
|
|
214
|
-
type: Output
|
|
215
|
-
}], prerequisiteConditionChanged: [{
|
|
216
|
-
type: Output
|
|
217
|
-
}], recalcAddButtons: [{
|
|
218
|
-
type: Output
|
|
219
|
-
}] } });
|
|
220
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGlvbi1mb3JtdWxhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi92Mi9mZWF0dXJlLWZsYWcvZXZhbHVhdGlvbi1mb3JtdWxhL2V2YWx1YXRpb24tZm9ybXVsYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvdjIvZmVhdHVyZS1mbGFnL2V2YWx1YXRpb24tZm9ybXVsYS9ldmFsdWF0aW9uLWZvcm11bGEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsY0FBYyxFQUFZLGlCQUFpQixFQUc1QyxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBVzVCLE1BQU0sT0FBTywwQkFBMEI7SUFrQnJDLFlBQW9CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBVHRDLDJCQUFzQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUMsNEJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3QyxnREFBMkMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pFLGlEQUE0QyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEUsNkJBQXdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM5QyxpQ0FBNEIsR0FBRyxJQUFJLFlBQVksRUFBd0Is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SSxTQUFTLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLENBQUM7b0JBQ2pELGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ3pHLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUM7WUFDckMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTO1lBQ3hELGVBQWUsRUFBRSxlQUFlO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBck1VLDBCQUEwQjttR0FBMUIsMEJBQTBCLDZ4QkNsQnZDLGc1S0FvRlc7OzRGRGxFRSwwQkFBMEI7a0JBVHRDLFNBQVM7K0JBQ0Usd0JBQXdCO2tGQVN6QixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUNBQWlDO3NCQUF6QyxLQUFLO2dCQUVJLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ0csMkNBQTJDO3NCQUFwRCxNQUFNO2dCQUNHLDRDQUE0QztzQkFBckQsTUFBTTtnQkFFRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csNEJBQTRCO3NCQUFyQyxNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIFVzZXJDb21wYXJhdG9yLCBJU2VnbWVudCwgU2VnbWVudENvbXBhcmF0b3IsXG4gIFVwZGF0ZVNldHRpbmdWYWx1ZUZvcm0sIFRhcmdldGluZ1J1bGVGb3JtLCBDb25kaXRpb25Gb3JtLFxuICBGb3JtR2VuZXJhdG9yLCBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucywgSVByZXJlcXVpc2l0ZUNoYW5nZWQsIElGbGFnU3RhdGVcbn0gZnJvbSAnLi4vLi4vLi4vYm9vdHN0cmFwJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWV2YWx1YXRpb24tZm9ybXVsYScsXG4gIHRlbXBsYXRlVXJsOiAnLi9ldmFsdWF0aW9uLWZvcm11bGEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi9ldmFsdWF0aW9uLWZvcm11bGEuY29tcG9uZW50LnNjc3MnLFxuICAgICcuL2NoaXBzLnNjc3MnLFxuICAgICcuL2FkZC1idG4uc2NzcydcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBFdmFsdWF0aW9uRm9ybXVsYUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGZvcm1Hcm91cDogRm9ybUdyb3VwPFVwZGF0ZVNldHRpbmdWYWx1ZUZvcm0+O1xuICBASW5wdXQoKSBzZWdtZW50czogSVNlZ21lbnRbXTtcbiAgQElucHV0KCkgZmxhZ1N0YXRlOiBJRmxhZ1N0YXRlO1xuICBASW5wdXQoKSBzaG93VmFyaWF0aW9uSWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGZlYXR1cmVGbGFnTGltaXRhdGlvbnM6IElGZWF0dXJlRmxhZ0xpbWl0YXRpb25zO1xuICBASW5wdXQoKSBjYW5NYW5hZ2VTZWdtZW50czogYm9vbGVhbjtcbiAgQElucHV0KCkgc2hvd1BlcmNlbnRhZ2VFdmFsdWF0aW9uQXR0cmlidXRlOiBib29sZWFuO1xuXG4gIEBPdXRwdXQoKSBjcmVhdGVTZWdtZW50UmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgbWFuYWdlU2VnbWVudHNSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBhZGRTZWdtZW50Q29uZGl0aW9uUmVxdWVzdGVkV2l0aG91dFNlZ21lbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY2hhbmdlUGVyY2VudGFnZUV2YWx1YXRpb25BdHRyaWJ1dGVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIHN1YnNjcmlwdGlvbkxpbWl0UmVhY2hlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHByZXJlcXVpc2l0ZUNvbmRpdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElQcmVyZXF1aXNpdGVDaGFuZ2VkPigpO1xuICBAT3V0cHV0KCkgcmVjYWxjQWRkQnV0dG9ucyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1HZW5lcmF0b3I6IEZvcm1HZW5lcmF0b3IpIHsgfVxuXG4gIGFkZFVzZXJDb25kaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrRmVhdHVyZUZsYWdMaW1pdGF0aW9ucygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cDxUYXJnZXRpbmdSdWxlRm9ybT4oe1xuICAgICAgY29uZGl0aW9uczogbmV3IEZvcm1BcnJheTxGb3JtR3JvdXA8Q29uZGl0aW9uRm9ybT4+KFtcbiAgICAgICAgdGhpcy5mb3JtR2VuZXJhdG9yLmdlbmVyYXRlQ29uZGl0aW9uRm9ybUdyb3VwKHtcbiAgICAgICAgICB1c2VyQ29uZGl0aW9uOiB7IGNvbXBhcmlzb25BdHRyaWJ1dGU6ICdJZGVudGlmaWVyJywgY29tcGFyYXRvcjogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dEVxdWFscywgY29tcGFyaXNvblZhbHVlOiB7IHN0cmluZ1ZhbHVlOiAnJyB9IH1cbiAgICAgICAgfSwgdGhpcy5mbGFnU3RhdGUucmVhZE9ubHksIHRoaXMuZmxhZ1N0YXRlLnByZXJlcXVpc2l0ZVNldHRpbmdzLCB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMpXG4gICAgICBdKSxcbiAgICAgIHZhbHVlOiB0aGlzLmZvcm1HZW5lcmF0b3IuZ2VuZXJhdGVEZWZhdWx0VmFsdWVGb3JtR3JvdXAodGhpcy5mbGFnU3RhdGUuc2V0dGluZ1ZhbHVlLnNldHRpbmcuc2V0dGluZ1R5cGUsIHRoaXMuZmxhZ1N0YXRlLnJlYWRPbmx5LCB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMpXG4gICAgfSk7XG4gICAgdGhpcy5hZGRUYXJnZXRpbmdSdWxlRm9ybUdyb3VwKGZvcm1Hcm91cCk7XG4gICAgZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5yZWNhbGNBZGRCdXR0b25zLmVtaXQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFkZFNlZ21lbnRDb25kaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrRmVhdHVyZUZsYWdMaW1pdGF0aW9ucygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmFkZFNlZ21lbnRDb25kaXRpb25SZXF1ZXN0ZWRXaXRob3V0U2VnbWVudHMuZW1pdCgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXA8VGFyZ2V0aW5nUnVsZUZvcm0+KHtcbiAgICAgIGNvbmRpdGlvbnM6IG5ldyBGb3JtQXJyYXk8Rm9ybUdyb3VwPENvbmRpdGlvbkZvcm0+PihbXG4gICAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5nZW5lcmF0ZUNvbmRpdGlvbkZvcm1Hcm91cCh7XG4gICAgICAgICAgc2VnbWVudENvbmRpdGlvbjogeyBjb21wYXJhdG9yOiBTZWdtZW50Q29tcGFyYXRvci5Jc0luLCBzZWdtZW50SWQ6IG51bGwgfVxuICAgICAgICB9LCB0aGlzLmZsYWdTdGF0ZS5yZWFkT25seSwgdGhpcy5mbGFnU3RhdGUucHJlcmVxdWlzaXRlU2V0dGluZ3MsIHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucylcbiAgICAgIF0pLFxuICAgICAgdmFsdWU6IHRoaXMuZm9ybUdlbmVyYXRvci5nZW5lcmF0ZURlZmF1bHRWYWx1ZUZvcm1Hcm91cCh0aGlzLmZsYWdTdGF0ZS5zZXR0aW5nVmFsdWUuc2V0dGluZy5zZXR0aW5nVHlwZSwgdGhpcy5mbGFnU3RhdGUucmVhZE9ubHksIHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucylcbiAgICB9KTtcbiAgICB0aGlzLmFkZFRhcmdldGluZ1J1bGVGb3JtR3JvdXAoZm9ybUdyb3VwKTtcbiAgICBmb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLnJlY2FsY0FkZEJ1dHRvbnMuZW1pdCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYWRkUHJlcmVxdWlzaXRlRmxhZ0NvbmRpdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tGZWF0dXJlRmxhZ0xpbWl0YXRpb25zKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwPFRhcmdldGluZ1J1bGVGb3JtPih7XG4gICAgICBjb25kaXRpb25zOiBuZXcgRm9ybUFycmF5PEZvcm1Hcm91cDxDb25kaXRpb25Gb3JtPj4oW1xuICAgICAgICBuZXcgRm9ybUdyb3VwPENvbmRpdGlvbkZvcm0+KHtcbiAgICAgICAgICBwcmVyZXF1aXNpdGVGbGFnQ29uZGl0aW9uOiB0aGlzLmZvcm1HZW5lcmF0b3IuZ2VuZXJhdGVFbXB0eVByZXJlcXVpc2l0ZUZsYWdDb25kaXRpb25Gb3JtR3JvdXAodGhpcy5mZWF0dXJlRmxhZ0xpbWl0YXRpb25zKVxuICAgICAgICB9KVxuICAgICAgXSksXG4gICAgICB2YWx1ZTogdGhpcy5mb3JtR2VuZXJhdG9yLmdlbmVyYXRlRGVmYXVsdFZhbHVlRm9ybUdyb3VwKHRoaXMuZmxhZ1N0YXRlLnNldHRpbmdWYWx1ZS5zZXR0aW5nLnNldHRpbmdUeXBlLCB0aGlzLmZsYWdTdGF0ZS5yZWFkT25seSwgdGhpcy5mZWF0dXJlRmxhZ0xpbWl0YXRpb25zKVxuICAgIH0pO1xuICAgIHRoaXMuYWRkVGFyZ2V0aW5nUnVsZUZvcm1Hcm91cChmb3JtR3JvdXApO1xuICAgIGZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMucmVjYWxjQWRkQnV0dG9ucy5lbWl0KCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhZGRQZXJjZW50YWdlT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5mbGFnU3RhdGUuYWRkQnV0dG9uUmVuZGVyU3RhdGUuaGFzUGVyY2VudGFnZU9ubHlSdWxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5jaGVja0ZlYXR1cmVGbGFnTGltaXRhdGlvbnMoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybUdlbmVyYXRvci5nZW5lcmF0ZVRhcmdldGluZ1J1bGVXaXRoRW1wdHlQZXJjZW50YWdlT3B0aW9ucyhcbiAgICAgIHRoaXMuZmxhZ1N0YXRlLnNldHRpbmdWYWx1ZS5zZXR0aW5nLnNldHRpbmdUeXBlLCB0aGlzLmZsYWdTdGF0ZS5yZWFkT25seSwgdGhpcy5mbGFnU3RhdGUucHJlcmVxdWlzaXRlU2V0dGluZ3MsIHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9uc1xuICAgIClcbiAgICB0aGlzLmFkZFRhcmdldGluZ1J1bGVGb3JtR3JvdXAoZm9ybUdyb3VwKTtcbiAgICBmb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLnJlY2FsY0FkZEJ1dHRvbnMuZW1pdCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYWRkVGFyZ2V0aW5nUnVsZUZvcm1Hcm91cChmb3JtR3JvdXA6IEZvcm1Hcm91cDxUYXJnZXRpbmdSdWxlRm9ybT4pIHtcbiAgICBpZiAodGhpcy5mbGFnU3RhdGUuYWRkQnV0dG9uUmVuZGVyU3RhdGUuaGFzUGVyY2VudGFnZU9ubHlSdWxlKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy50YXJnZXRpbmdSdWxlcy5pbnNlcnQodGhpcy5mb3JtR3JvdXAuY29udHJvbHMudGFyZ2V0aW5nUnVsZXMuY29udHJvbHMubGVuZ3RoIC0gMSwgZm9ybUdyb3VwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMudGFyZ2V0aW5nUnVsZXMucHVzaChmb3JtR3JvdXApO1xuICAgIH1cbiAgICB0aGlzLnJlY2FsY0FkZEJ1dHRvbnMuZW1pdCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2hlY2tGZWF0dXJlRmxhZ0xpbWl0YXRpb25zKCkge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cC5jb250cm9scy50YXJnZXRpbmdSdWxlcy5sZW5ndGggPj0gdGhpcy5mZWF0dXJlRmxhZ0xpbWl0YXRpb25zLm1heFRhcmdldGluZ1J1bGVDb3VudCkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25MaW1pdFJlYWNoZWQuZW1pdCgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPGFueT4pIHtcbiAgICBjb25zdCB0YXJnZXRpbmdSdWxlcyA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnRhcmdldGluZ1J1bGVzLmNvbnRyb2xzO1xuICAgIG1vdmVJdGVtSW5BcnJheSh0YXJnZXRpbmdSdWxlcywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMucmVjYWxjQWRkQnV0dG9ucy5lbWl0KCk7XG4gIH1cblxuICBpc0RyYWdEaXNhYmxlZCh0YXJnZXRpbmdSdWxlOiBGb3JtR3JvdXA8VGFyZ2V0aW5nUnVsZUZvcm0+KSB7XG4gICAgLy8gSWYgdGhlIGxhc3QgdGFyZ2V0aW5nIHJ1bGUgaGFzIG9ubHkgcGVyY2VudGFnZSBvcHRpb25zLCB3ZSBzaG91bGQgbm90IGFsbG93IG1vdmluZyBhbnl0aGluZyBiZWZvcmUvYWZ0ZXIgaXQuXG4gICAgcmV0dXJuIHRoaXMuZmxhZ1N0YXRlLnJlYWRPbmx5IHx8IHRoaXMuZm9ybUdlbmVyYXRvci5pc1BlcmNlbnRhZ2VPbmx5VGFyZ2V0aW5nUnVsZSh0YXJnZXRpbmdSdWxlKTtcbiAgfVxuXG4gIHNvcnRQcmVkaWNhdGUoKSB7XG4gICAgcmV0dXJuIChpbmRleDogbnVtYmVyKSA9PiB0aGlzLnNvcnRQcmVkaWNhdGVGdW5jdGlvbihpbmRleCk7XG4gIH1cblxuICBzb3J0UHJlZGljYXRlRnVuY3Rpb24oaW5kZXg6IG51bWJlcikge1xuICAgIC8vIElmIHRoZSBsYXN0IHRhcmdldGluZyBydWxlIGhhcyBvbmx5IHBlcmNlbnRhZ2Ugb3B0aW9ucywgd2Ugc2hvdWxkIG5vdCBhbGxvdyBtb3ZpbmcgYW55dGhpbmcgYmVmb3JlL2FmdGVyIGl0LlxuICAgIHJldHVybiBpbmRleCA8IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnRhcmdldGluZ1J1bGVzLmNvbnRyb2xzLmxlbmd0aCAtIDEgfHxcbiAgICAgICF0aGlzLmZvcm1HZW5lcmF0b3IuaXNQZXJjZW50YWdlT25seVRhcmdldGluZ1J1bGUodGhpcy5mb3JtR3JvdXAuY29udHJvbHMudGFyZ2V0aW5nUnVsZXMuY29udHJvbHNbaW5kZXhdKVxuICB9XG5cbiAgZ2V0Q2hpcFRleHQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAuY29udHJvbHMudGFyZ2V0aW5nUnVsZXMuY29udHJvbHMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHRoaXMuZmxhZ1N0YXRlLmFkZEJ1dHRvblJlbmRlclN0YXRlLmhhc1BlcmNlbnRhZ2VPbmx5UnVsZSkge1xuICAgICAgICByZXR1cm4gJ1RvIHVuaWRlbnRpZmllZDonO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICdUbyBhbGwgb3RoZXJzOic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICdUbyBhbGwgdXNlcnM6JztcbiAgfVxuXG4gIGdldENoaXBUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnRhcmdldGluZ1J1bGVzLmNvbnRyb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0aGlzLmZsYWdTdGF0ZS5hZGRCdXR0b25SZW5kZXJTdGF0ZS5oYXNQZXJjZW50YWdlT25seVJ1bGUpIHtcbiAgICAgICAgcmV0dXJuICdUaGlzIGZhbGxiYWNrIHZhbHVlIHdpbGwgYmUgc2VydmVkIGluIGNhc2UgdGhlIHVzZXIgY2FuXFwndCBiZSBpZGVudGlmaWVkLic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ1RoaXMgdmFsdWUgd2lsbCBiZSBzZXJ2ZWQgdG8gYWxsIHVzZXJzIHdobyB0aGUgYWJvdmUgcnVsZXMgZG9uXFwndCBhcHBseS4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJlbW92ZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvdWxkRW1pdFByZXJlcXVpc2l0ZUNoYW5nZWQgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1xuICAgICAgLnRhcmdldGluZ1J1bGVzLmNvbnRyb2xzW2luZGV4XS5jb250cm9sc1xuICAgICAgLmNvbmRpdGlvbnM/LmNvbnRyb2xzXG4gICAgICAuc29tZShjID0+IGMuY29udHJvbHMucHJlcmVxdWlzaXRlRmxhZ0NvbmRpdGlvbik7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMudGFyZ2V0aW5nUnVsZXMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnRhcmdldGluZ1J1bGVzLm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5yZWNhbGNBZGRCdXR0b25zLmVtaXQoKTtcbiAgICBpZiAoc2hvdWxkRW1pdFByZXJlcXVpc2l0ZUNoYW5nZWQpIHtcbiAgICAgIHRoaXMucmVjYWxjUHJlcmVxdWlzaXRlUmVmZXJlbmNlcygpO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmlwdGlvbkxpbWl0UmVhY2hlZENhbGxlZCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbkxpbWl0UmVhY2hlZC5lbWl0KCk7XG4gIH1cblxuICByZWNhbGNQcmVyZXF1aXNpdGVSZWZlcmVuY2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXJlcXVpc2l0ZUlkcyA9IFtdXG4gICAgZm9yIChjb25zdCBydWxlIG9mIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnRhcmdldGluZ1J1bGVzLmNvbnRyb2xzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBydWxlLmNvbnRyb2xzLmNvbmRpdGlvbnMuY29udHJvbHMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbi5jb250cm9scy5wcmVyZXF1aXNpdGVGbGFnQ29uZGl0aW9uKSB7XG4gICAgICAgICAgcHJlcmVxdWlzaXRlSWRzLnB1c2goY29uZGl0aW9uLmNvbnRyb2xzLnByZXJlcXVpc2l0ZUZsYWdDb25kaXRpb24uY29udHJvbHMucHJlcmVxdWlzaXRlU2V0dGluZ0lkLnZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucHJlcmVxdWlzaXRlQ29uZGl0aW9uQ2hhbmdlZC5lbWl0KHtcbiAgICAgIHNldHRpbmdJZDogdGhpcy5mbGFnU3RhdGUuc2V0dGluZ1ZhbHVlLnNldHRpbmcuc2V0dGluZ0lkLFxuICAgICAgcHJlcmVxdWlzaXRlSWRzOiBwcmVyZXF1aXNpdGVJZHNcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRhcmdldGluZy1ydWxlLW91dGVyXCIgKm5nSWY9XCJmbGFnU3RhdGUuYWRkQnV0dG9uUmVuZGVyU3RhdGUucmVuZGVyVG9wQWRkQnV0dG9ucyAmJiAhZmxhZ1N0YXRlLnJlYWRPbmx5XCI+XG4gICAgPGRpdiBjbGFzcz1cImdyb3cgdmVydGljYWwtY2VudGVyIGFkZC1ib3ggcGFkLWJvdHRvbSBsZWZ0LWFsaWduXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtYnRuIGFkZC1pZlwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJvcm1lbnVcIiBcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgdGFyZ2V0aW5nIHJ1bGVcIj4rIElGPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtYnRuIGFkZC1pZiBwYWQtbGVmdFwiIChjbGljayk9XCJhZGRQZXJjZW50YWdlT3B0aW9ucygpXCIgbWF0VG9vbHRpcD1cIlRhcmdldCBhIHBlcmNlbnRhZ2Ugb2YgdXNlcnNcIiBcbiAgICAgICAgICAgICpuZ0lmPVwiIWZsYWdTdGF0ZS5hZGRCdXR0b25SZW5kZXJTdGF0ZS5oYXNQZXJjZW50YWdlT25seVJ1bGVcIj4rICU8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wKCRldmVudClcIiBbY2RrRHJvcExpc3REaXNhYmxlZF09XCJmbGFnU3RhdGUucmVhZE9ubHlcIiBbY2RrRHJvcExpc3RTb3J0UHJlZGljYXRlXT1cInNvcnRQcmVkaWNhdGUoKVwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IHRhcmdldGluZ1J1bGUgb2YgZm9ybUdyb3VwLmNvbnRyb2xzLnRhcmdldGluZ1J1bGVzLmNvbnRyb2xzOyB0cmFja0J5OiB0cmFja0J5SW5kZXg7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhcmdldGluZy1ydWxlLW91dGVyIGdyb3dcIiBjZGtEcmFnIFtjZGtEcmFnRGlzYWJsZWRdPVwiaXNEcmFnRGlzYWJsZWQodGFyZ2V0aW5nUnVsZSlcIlxuICAgICAgICAgICAgW2Nka0RyYWdEYXRhXT1cInRhcmdldGluZ1J1bGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLWhhbmRsZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNEcmFnRGlzYWJsZWQodGFyZ2V0aW5nUnVsZSlcIiBjZGtEcmFnSGFuZGxlIG1hdFRvb2x0aXA9XCJEcmFnIGhlcmUgdG8gcmVvcmRlclwiXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aGl0ZS1ib3ggZ3Jvd1wiPlxuICAgICAgICAgICAgICAgIDxhcHAtdGFyZ2V0aW5nLXJ1bGUgY2xhc3M9XCJncm93XCIgW2Zvcm1Hcm91cF09XCJ0YXJnZXRpbmdSdWxlXCIgW3NlZ21lbnRzXT1cInNlZ21lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZsYWdTdGF0ZV09XCJmbGFnU3RhdGVcIiBbdGFyZ2V0aW5nUnVsZUluZGV4XT1cImlcIlxuICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZEFsbFJ1bGVzKT1cInJlbW92ZShpKVwiIFtmZWF0dXJlRmxhZ0xpbWl0YXRpb25zXT1cImZlYXR1cmVGbGFnTGltaXRhdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAoc3Vic2NyaXB0aW9uTGltaXRSZWFjaGVkKT1cInN1YnNjcmlwdGlvbkxpbWl0UmVhY2hlZENhbGxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Nhbk1hbmFnZVNlZ21lbnRzXT1cImNhbk1hbmFnZVNlZ21lbnRzXCIgKGNyZWF0ZVNlZ21lbnRSZXF1ZXN0ZWQpPVwiY3JlYXRlU2VnbWVudFJlcXVlc3RlZC5lbWl0KClcIlxuICAgICAgICAgICAgICAgICAgICAobWFuYWdlU2VnbWVudHNSZXF1ZXN0ZWQpPVwibWFuYWdlU2VnbWVudHNSZXF1ZXN0ZWQuZW1pdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgKGFkZFNlZ21lbnRDb25kaXRpb25SZXF1ZXN0ZWRXaXRob3V0U2VnbWVudHMpPVwiYWRkU2VnbWVudENvbmRpdGlvblJlcXVlc3RlZFdpdGhvdXRTZWdtZW50cy5lbWl0KClcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1BlcmNlbnRhZ2VFdmFsdWF0aW9uQXR0cmlidXRlXT1cInNob3dQZXJjZW50YWdlRXZhbHVhdGlvbkF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtwZXJjZW50YWdlRXZhbHVhdGlvbkF0dHJpYnV0ZV09XCJmb3JtR3JvdXAuY29udHJvbHMucGVyY2VudGFnZUV2YWx1YXRpb25BdHRyaWJ1dGUudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlUGVyY2VudGFnZUV2YWx1YXRpb25BdHRyaWJ1dGVSZXF1ZXN0ZWQpPVwiY2hhbmdlUGVyY2VudGFnZUV2YWx1YXRpb25BdHRyaWJ1dGVSZXF1ZXN0ZWQuZW1pdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgKHByZXJlcXVpc2l0ZUNvbmRpdGlvbkNoYW5nZWQpPVwicmVjYWxjUHJlcmVxdWlzaXRlUmVmZXJlbmNlcygpXCI+PC9hcHAtdGFyZ2V0aW5nLXJ1bGU+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIlJlbW92ZSB0YXJnZXRpbmcgcnVsZVwiIChjbGljayk9XCJyZW1vdmUoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZmxhZ1N0YXRlLnJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcnVsZS1vdXRlclwiICpuZ0lmPVwiZmxhZ1N0YXRlLmFkZEJ1dHRvblJlbmRlclN0YXRlLmFkZFJ1bGVCdXR0b25UcmFja2VyW2ldPy5zaG93QWRkUnVsZUJ1dHRvbnMgJiYgIWZsYWdTdGF0ZS5yZWFkT25seVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3cgdmVydGljYWwtY2VudGVyIGFkZC1ib3ggcGFkLWJvdHRvbSBwYWQtdG9wIGNlbnRlci1zaGlmdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtYnRuIGFkZC1pZlwiIFxuICAgICAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwib3JtZW51XCIgXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgdGFyZ2V0aW5nIHJ1bGVcIiBcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZmxhZ1N0YXRlLnJlYWRPbmx5XCI+KyBPUjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtYnRuIGFkZC1pZiBwYWQtbGVmdFwiIChjbGljayk9XCJhZGRQZXJjZW50YWdlT3B0aW9ucygpXCIgXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJUYXJnZXQgYSBwZXJjZW50YWdlIG9mIHVzZXJzXCIgXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZsYWdTdGF0ZS5hZGRCdXR0b25SZW5kZXJTdGF0ZS5oYXNQZXJjZW50YWdlT25seVJ1bGVcIj4rICU8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm9yLWNoaXBcIiAqbmdJZj1cImZsYWdTdGF0ZS5hZGRCdXR0b25SZW5kZXJTdGF0ZS5hZGRSdWxlQnV0dG9uVHJhY2tlcltpXT8uc2hvd09yQ2hpcFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGlwLXNldD5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGRpc2FibGVkPk9SPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICA8L21hdC1jaGlwLXNldD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm9yLWNoaXBcIiAqbmdJZj1cImZsYWdTdGF0ZS5hZGRCdXR0b25SZW5kZXJTdGF0ZS5hZGRSdWxlQnV0dG9uVHJhY2tlcltpXT8ucmVuZGVyU2VwYXJhdGlvbkFyZWFcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtb3V0ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJhZy1oYW5kbGVcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwid2hpdGUtYm94IGdyb3cgc2lkZS1wYWRkIHZlcnRpY2FsLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcC1jb250YWluZXIgZml4ZWQtd2lkdGhcIiBbbmdDbGFzc109XCJmbGFnU3RhdGUuYWRkQnV0dG9uUmVuZGVyU3RhdGUuaGFzUGVyY2VudGFnZU9ubHlSdWxlID8gJ2ZpeGVkLXdpZHRoLXdpZGUnIDogJydcIj5cbiAgICAgICAgICAgIDxtYXQtY2hpcC1zZXQgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBbbWF0VG9vbHRpcF09XCJnZXRDaGlwVG9vbHRpcCgpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGlwIGRpc2FibGVkPnt7Z2V0Q2hpcFRleHQoKX19PC9tYXQtY2hpcD5cbiAgICAgICAgICAgIDwvbWF0LWNoaXAtc2V0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGFwcC1mZWF0dXJlLWZsYWctdmFsdWUgY2xhc3M9XCJ2YWx1ZSBncm93XCIgW2ZsYWdTdGF0ZV09XCJmbGFnU3RhdGVcIlxuICAgICAgICAgICAgdG9vbHRpcD1cIlNlcnZlZCB2YWx1ZVwiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmRlZmF1bHRWYWx1ZVwiXG4gICAgICAgICAgICBbZmVhdHVyZUZsYWdMaW1pdGF0aW9uc109XCJmZWF0dXJlRmxhZ0xpbWl0YXRpb25zXCI+PC9hcHAtZmVhdHVyZS1mbGFnLXZhbHVlPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxtYXQtbWVudSAjb3JtZW51IGNsYXNzPVwibWVudS1sb25nLXRleHQtb3JcIj5cbiAgICA8YSBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhZGRVc2VyQ29uZGl0aW9uKClcIj48bWF0LWljb24+dHJhY2tfY2hhbmdlczwvbWF0LWljb24+QWRkIHJ1bGUgd2l0aCB1c2VyIGNvbmRpdGlvbjwvYT5cbiAgICA8YSBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhZGRTZWdtZW50Q29uZGl0aW9uKClcIj48bWF0LWljb24+cGllX2NoYXJ0PC9tYXQtaWNvbj5BZGQgcnVsZSB3aXRoIHNlZ21lbnQgY29uZGl0aW9uPC9hPlxuICAgIDxkaXYgbWF0VG9vbHRpcD1cIlRoZXJlJ3Mgbm8gb3RoZXIgZmxhZyBpbiB0aGUgQ29uZmlnIHRvIHNlbGVjdCBhcyBhIHByZXJlcXVpc2l0ZS5cIlxuICAgICAgICBbbWF0VG9vbHRpcERpc2FibGVkXT1cImZsYWdTdGF0ZS5wcmVyZXF1aXNpdGVTZXR0aW5ncy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxhIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFkZFByZXJlcXVpc2l0ZUZsYWdDb25kaXRpb24oKVwiIFtkaXNhYmxlZF09XCIhZmxhZ1N0YXRlLnByZXJlcXVpc2l0ZVNldHRpbmdzLmxlbmd0aFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmFjY291bnRfdHJlZTwvbWF0LWljb24+QWRkIHJ1bGUgd2l0aCBmbGFnIGNvbmRpdGlvbiAocHJlcmVxdWlzaXRlKVxuICAgICAgICA8L2E+XG4gICAgPC9kaXY+XG48L21hdC1tZW51PiJdfQ==
|