@c8y/ngx-components 1021.6.0 → 1021.7.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.
@@ -11,7 +11,19 @@ export declare class AddBrandingModalComponent {
11
11
  result: Promise<Partial<{
12
12
  brandingName: string;
13
13
  }>>;
14
- alreadyTakenMsg: "The provided name is already taken.";
14
+ messages: readonly [{
15
+ readonly name: "nameAlreadyTaken";
16
+ readonly text: "The provided name is already taken.";
17
+ }, {
18
+ readonly name: "onlyLowerCaseCharacters";
19
+ readonly text: "Only lower case characters are allowed.";
20
+ }, {
21
+ readonly name: "shouldStartWithLowerCaseLetterOrNumber";
22
+ readonly text: "Should start with a lower case letter or a number.";
23
+ }, {
24
+ readonly name: "invalidCharacters";
25
+ readonly text: "Invalid character \"{{ invalidCharacter }}\". Only a-z, 0-9 and - are allowed.";
26
+ }];
15
27
  private _resovle;
16
28
  private _reject;
17
29
  constructor(branding: StoreBrandingService, formBuilder: FormBuilder);
@@ -22,6 +34,7 @@ export declare class AddBrandingModalComponent {
22
34
  cancel(): void;
23
35
  save(): void;
24
36
  private ensureNotExistingName;
37
+ private ensureProperVariantName;
25
38
  static ɵfac: i0.ɵɵFactoryDeclaration<AddBrandingModalComponent, never>;
26
39
  static ɵcmp: i0.ɵɵComponentDeclaration<AddBrandingModalComponent, "c8y-add-branding-modal", never, { "duplicateBranding": { "alias": "duplicateBranding"; "required": false; }; }, {}, never, never, true, never>;
27
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"add-branding-modal.component.d.ts","sourceRoot":"","sources":["../../../../../branding/shared/lazy/add-branding-modal/add-branding-modal.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,EAEL,WAAW,EAIZ,MAAM,gBAAgB,CAAC;;AAIxB,qBAMa,yBAAyB;IAiBlC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,WAAW;IAjBZ,iBAAiB,UAAS;IACnC,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,OAAO,UAAQ;IAEf,MAAM;;QAGH;IAEH,eAAe,wCAAkD;IAEjE,OAAO,CAAC,QAAQ,CAA6D;IAC7E,OAAO,CAAC,OAAO,CAAyB;gBAG9B,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,EAAE,WAAW;IAM5B,2BAA2B;IAUjC,QAAQ;;;IASR,MAAM;IAIN,IAAI;IAIJ,OAAO,CAAC,qBAAqB;yCAnDlB,yBAAyB;2CAAzB,yBAAyB;CAiErC"}
1
+ {"version":3,"file":"add-branding-modal.component.d.ts","sourceRoot":"","sources":["../../../../../branding/shared/lazy/add-branding-modal/add-branding-modal.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,EAEL,WAAW,EAIZ,MAAM,gBAAgB,CAAC;;AAIxB,qBAMa,yBAAyB;IAkClC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,WAAW;IAlCZ,iBAAiB,UAAS;IACnC,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,OAAO,UAAQ;IAEf,MAAM;;QAGH;IAEH,QAAQ;;;;;;;;;;;;OAiBG;IAEX,OAAO,CAAC,QAAQ,CAA6D;IAC7E,OAAO,CAAC,OAAO,CAAyB;gBAG9B,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,EAAE,WAAW;IAM5B,2BAA2B;IAUjC,QAAQ;;;IASR,MAAM;IAIN,IAAI;IAIJ,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,uBAAuB;yCAnFpB,yBAAyB;2CAAzB,yBAAyB;CA8GrC"}
@@ -7,6 +7,7 @@ import * as i0 from "@angular/core";
7
7
  import * as i1 from "@c8y/ngx-components/branding/shared/data";
8
8
  import * as i2 from "@angular/forms";
9
9
  import * as i3 from "@c8y/ngx-components";
10
+ import * as i4 from "@angular/common";
10
11
  export class AddBrandingModalComponent {
11
12
  constructor(branding, formBuilder) {
12
13
  this.branding = branding;
@@ -18,7 +19,24 @@ export class AddBrandingModalComponent {
18
19
  this._resovle = resolve;
19
20
  this._reject = reject;
20
21
  });
21
- this.alreadyTakenMsg = gettext('The provided name is already taken.');
22
+ this.messages = [
23
+ {
24
+ name: 'nameAlreadyTaken',
25
+ text: gettext('The provided name is already taken.')
26
+ },
27
+ {
28
+ name: 'onlyLowerCaseCharacters',
29
+ text: gettext('Only lower case characters are allowed.')
30
+ },
31
+ {
32
+ name: 'shouldStartWithLowerCaseLetterOrNumber',
33
+ text: gettext('Should start with a lower case letter or a number.')
34
+ },
35
+ {
36
+ name: 'invalidCharacters',
37
+ text: gettext('Invalid character "{{ invalidCharacter }}". Only a-z, 0-9 and - are allowed.')
38
+ }
39
+ ];
22
40
  this.form = this.initForm();
23
41
  this.getExistingBrandingVersions();
24
42
  }
@@ -36,7 +54,7 @@ export class AddBrandingModalComponent {
36
54
  return this.formBuilder.group({
37
55
  brandingName: [
38
56
  '',
39
- [Validators.required, Validators.pattern(/^[a-z0-9]+$/), this.ensureNotExistingName()]
57
+ [Validators.required, this.ensureProperVariantName(), this.ensureNotExistingName()]
40
58
  ]
41
59
  });
42
60
  }
@@ -58,13 +76,39 @@ export class AddBrandingModalComponent {
58
76
  return null;
59
77
  };
60
78
  }
79
+ ensureProperVariantName() {
80
+ return (control) => {
81
+ if (typeof control.value === 'string') {
82
+ const value = control.value;
83
+ if (/[A-Z]/.test(value)) {
84
+ return {
85
+ onlyLowerCaseCharacters: {}
86
+ };
87
+ }
88
+ if (!/^[a-z0-9]+/.test(value)) {
89
+ return {
90
+ shouldStartWithLowerCaseLetterOrNumber: {}
91
+ };
92
+ }
93
+ const matches = /[^a-z0-9-]/.exec(value);
94
+ if (matches) {
95
+ return {
96
+ invalidCharacters: {
97
+ invalidCharacter: matches[0]
98
+ }
99
+ };
100
+ }
101
+ }
102
+ return null;
103
+ };
104
+ }
61
105
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AddBrandingModalComponent, deps: [{ token: i1.StoreBrandingService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
62
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AddBrandingModalComponent, isStandalone: true, selector: "c8y-add-branding-modal", inputs: { duplicateBranding: "duplicateBranding" }, ngImport: i0, template: "<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main_branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message\n name=\"nameAlreadyTaken\"\n [text]=\"alreadyTakenMsg | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i3.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i3.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
106
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AddBrandingModalComponent, isStandalone: true, selector: "c8y-add-branding-modal", inputs: { duplicateBranding: "duplicateBranding" }, ngImport: i0, template: "<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main-branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message *ngFor=\"let message of messages\"\n [name]=\"message.name\"\n [text]=\"message.text | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i3.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
63
107
  }
64
108
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AddBrandingModalComponent, decorators: [{
65
109
  type: Component,
66
- args: [{ selector: 'c8y-add-branding-modal', standalone: true, imports: [CoreModule, NgIf, ReactiveFormsModule], template: "<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main_branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message\n name=\"nameAlreadyTaken\"\n [text]=\"alreadyTakenMsg | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n" }]
110
+ args: [{ selector: 'c8y-add-branding-modal', standalone: true, imports: [CoreModule, NgIf, ReactiveFormsModule], template: "<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main-branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message *ngFor=\"let message of messages\"\n [name]=\"message.name\"\n [text]=\"message.text | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n" }]
67
111
  }], ctorParameters: () => [{ type: i1.StoreBrandingService }, { type: i2.FormBuilder }], propDecorators: { duplicateBranding: [{
68
112
  type: Input
69
113
  }] } });
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWJyYW5kaW5nLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2JyYW5kaW5nL3NoYXJlZC9sYXp5L2FkZC1icmFuZGluZy1tb2RhbC9hZGQtYnJhbmRpbmctbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vYnJhbmRpbmcvc2hhcmVkL2xhenkvYWRkLWJyYW5kaW5nLW1vZGFsL2FkZC1icmFuZGluZy1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBRUwsV0FBVyxFQUNYLG1CQUFtQixFQUVuQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFRdkMsTUFBTSxPQUFPLHlCQUF5QjtJQWdCcEMsWUFDVSxRQUE4QixFQUM5QixXQUF3QjtRQUR4QixhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUM5QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQWpCekIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRW5DLHNCQUFpQixHQUFhLEVBQUUsQ0FBQztRQUNqQyxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRWYsV0FBTSxHQUFHLElBQUksT0FBTyxDQUE0QyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNsRixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUVILG9CQUFlLEdBQUcsT0FBTyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFTL0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELEtBQUssQ0FBQywyQkFBMkI7UUFDL0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQzVCLFlBQVksRUFBRTtnQkFDWixFQUFFO2dCQUNGLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2FBQ3ZGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixPQUFPLENBQUMsT0FBd0IsRUFBRSxFQUFFO1lBQ2xDLElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDMUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLENBQ25ELENBQUM7Z0JBQ0YsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO29CQUNyQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQ2xDLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7SUFDSixDQUFDOzhHQWhFVSx5QkFBeUI7a0dBQXpCLHlCQUF5QixzSUNsQnRDLHdrQ0FvQ0EsMkNEcEJZLFVBQVUsaXlEQUFRLG1CQUFtQjs7MkZBRXBDLHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDRSx3QkFBd0IsY0FFdEIsSUFBSSxXQUNQLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQzttSEFHdkMsaUJBQWlCO3NCQUF6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmVCcmFuZGluZ1NlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2JyYW5kaW5nL3NoYXJlZC9kYXRhJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUJ1aWxkZXIsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvcmVNb2R1bGUsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYWRkLWJyYW5kaW5nLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1icmFuZGluZy1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb3JlTW9kdWxlLCBOZ0lmLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBBZGRCcmFuZGluZ01vZGFsQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZHVwbGljYXRlQnJhbmRpbmcgPSBmYWxzZTtcbiAgZm9ybTogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5pbml0Rm9ybT47XG4gIG5hbWVzQWxyZWFkeVRha2VuOiBzdHJpbmdbXSA9IFtdO1xuICBsb2FkaW5nID0gdHJ1ZTtcblxuICByZXN1bHQgPSBuZXcgUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmluaXRGb3JtPlsndmFsdWUnXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRoaXMuX3Jlc292bGUgPSByZXNvbHZlO1xuICAgIHRoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgfSk7XG5cbiAgYWxyZWFkeVRha2VuTXNnID0gZ2V0dGV4dCgnVGhlIHByb3ZpZGVkIG5hbWUgaXMgYWxyZWFkeSB0YWtlbi4nKTtcblxuICBwcml2YXRlIF9yZXNvdmxlOiAodmFsdWU6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuaW5pdEZvcm0+Wyd2YWx1ZSddKSA9PiB2b2lkO1xuICBwcml2YXRlIF9yZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBicmFuZGluZzogU3RvcmVCcmFuZGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXJcbiAgKSB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5pbml0Rm9ybSgpO1xuICAgIHRoaXMuZ2V0RXhpc3RpbmdCcmFuZGluZ1ZlcnNpb25zKCk7XG4gIH1cblxuICBhc3luYyBnZXRFeGlzdGluZ0JyYW5kaW5nVmVyc2lvbnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdmFyaWFudHMgfSA9IGF3YWl0IHRoaXMuYnJhbmRpbmcubG9hZEJyYW5kaW5nVmFyaWFudHMoKTtcbiAgICAgIHRoaXMubmFtZXNBbHJlYWR5VGFrZW4gPSB2YXJpYW50cy5tYXAodmFyaWFudCA9PiB2YXJpYW50LnZlcnNpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBpbml0Rm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBicmFuZGluZ05hbWU6IFtcbiAgICAgICAgJycsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4oL15bYS16MC05XSskLyksIHRoaXMuZW5zdXJlTm90RXhpc3RpbmdOYW1lKCldXG4gICAgICBdXG4gICAgfSk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5fcmVqZWN0KCk7XG4gIH1cblxuICBzYXZlKCkge1xuICAgIHRoaXMuX3Jlc292bGUodGhpcy5mb3JtLnZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTm90RXhpc3RpbmdOYW1lKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBjb250cm9sLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsb3dlcmNhc2VOYW1lID0gY29udHJvbC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBuYW1lQWxyZWFkeVRha2VuID0gdGhpcy5uYW1lc0FscmVhZHlUYWtlbi5zb21lKG5hbWUgPT5cbiAgICAgICAgICBuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChsb3dlcmNhc2VOYW1lICsgJy0nKVxuICAgICAgICApO1xuICAgICAgICBpZiAobmFtZUFscmVhZHlUYWtlbikge1xuICAgICAgICAgIHJldHVybiB7IG5hbWVBbHJlYWR5VGFrZW46IHt9IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cbn1cbiIsIjxjOHktbW9kYWxcbiAgW3RpdGxlXT1cImR1cGxpY2F0ZUJyYW5kaW5nID8gJ0R1cGxpY2F0ZSBCcmFuZGluZycgOiAnQ3JlYXRlIEJyYW5kaW5nJ1wiXG4gIFtoZWFkZXJDbGFzc2VzXT1cIidkaWFsb2ctaGVhZGVyJ1wiXG4gIChvbkRpc21pc3MpPVwiY2FuY2VsKClcIlxuICAob25DbG9zZSk9XCJzYXZlKClcIlxuICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCJcbiAgW2xhYmVsc109XCJ7IGNhbmNlbDogJ0NhbmNlbCcsIG9rOiAnU2F2ZScgfVwiXG4+XG48bmctY29udGFpbmVyIGM4eS1tb2RhbC10aXRsZT5cbiAgPHNwYW4gW2M4eUljb25dPVwiJ3BhbGV0dGUnXCI+PC9zcGFuPlxuPC9uZy1jb250YWluZXI+XG4gIDxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJwLTI0XCI+XG4gICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgPGxhYmVsXG4gICAgICAgIGZvcj1cImJyYW5kaW5nTmFtZVwiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBCcmFuZGluZyBuYW1lXG4gICAgICA8L2xhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgbmFtZT1cImJyYW5kaW5nTmFtZVwiXG4gICAgICAgIGlkPVwiYnJhbmRpbmdOYW1lXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJicmFuZGluZ05hbWVcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cInt7J2UuZy4ge3sgZXhhbXBsZSB9fScgfCB0cmFuc2xhdGUgOiB7IGV4YW1wbGU6ICdtYWluX2JyYW5kaW5nJyB9IH19XCJcbiAgICAgIC8+XG4gICAgICA8Yzh5LW1lc3NhZ2VzIFtoZWxwTWVzc2FnZV09XCInVXBwZXIgY2FzZSBsZXR0ZXJzIG5vdCBhbGxvd2VkJyB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICA8Yzh5LW1lc3NhZ2VcbiAgICAgICAgICBuYW1lPVwibmFtZUFscmVhZHlUYWtlblwiXG4gICAgICAgICAgW3RleHRdPVwiYWxyZWFkeVRha2VuTXNnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICA8L2Rpdj5cbjwvYzh5LW1vZGFsPlxuIl19
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWJyYW5kaW5nLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2JyYW5kaW5nL3NoYXJlZC9sYXp5L2FkZC1icmFuZGluZy1tb2RhbC9hZGQtYnJhbmRpbmctbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vYnJhbmRpbmcvc2hhcmVkL2xhenkvYWRkLWJyYW5kaW5nLW1vZGFsL2FkZC1icmFuZGluZy1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBRUwsV0FBVyxFQUNYLG1CQUFtQixFQUVuQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7O0FBUXZDLE1BQU0sT0FBTyx5QkFBeUI7SUFpQ3BDLFlBQ1UsUUFBOEIsRUFDOUIsV0FBd0I7UUFEeEIsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFsQ3pCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUVuQyxzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFDakMsWUFBTyxHQUFHLElBQUksQ0FBQztRQUVmLFdBQU0sR0FBRyxJQUFJLE9BQU8sQ0FBNEMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDbEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFF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LENBQUM7b0JBQzlCLE9BQU87d0JBQ0wsc0NBQXNDLEVBQUUsRUFBRTtxQkFDM0MsQ0FBQztnQkFDSixDQUFDO2dCQUVELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osT0FBTzt3QkFDTCxpQkFBaUIsRUFBRTs0QkFDakIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQzt5QkFDN0I7cUJBQ0YsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0E3R1UseUJBQXlCO2tHQUF6Qix5QkFBeUIsc0lDbEJ0QyxzbUNBb0NBLDJDRHBCWSxVQUFVLDg1REFBUSxtQkFBbUI7OzJGQUVwQyx5QkFBeUI7a0JBTnJDLFNBQVM7K0JBQ0Usd0JBQXdCLGNBRXRCLElBQUksV0FDUCxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUM7bUhBR3ZDLGlCQUFpQjtzQkFBekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlQnJhbmRpbmdTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9icmFuZGluZy9zaGFyZWQvZGF0YSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1CdWlsZGVyLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb3JlTW9kdWxlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWFkZC1icmFuZGluZy1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtYnJhbmRpbmctbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29yZU1vZHVsZSwgTmdJZiwgUmVhY3RpdmVGb3Jtc01vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgQWRkQnJhbmRpbmdNb2RhbENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGR1cGxpY2F0ZUJyYW5kaW5nID0gZmFsc2U7XG4gIGZvcm06IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuaW5pdEZvcm0+O1xuICBuYW1lc0FscmVhZHlUYWtlbjogc3RyaW5nW10gPSBbXTtcbiAgbG9hZGluZyA9IHRydWU7XG5cbiAgcmVzdWx0ID0gbmV3IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5pbml0Rm9ybT5bJ3ZhbHVlJ10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0aGlzLl9yZXNvdmxlID0gcmVzb2x2ZTtcbiAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gIH0pO1xuXG4gIG1lc3NhZ2VzID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICduYW1lQWxyZWFkeVRha2VuJyxcbiAgICAgIHRleHQ6IGdldHRleHQoJ1RoZSBwcm92aWRlZCBuYW1lIGlzIGFscmVhZHkgdGFrZW4uJylcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdvbmx5TG93ZXJDYXNlQ2hhcmFjdGVycycsXG4gICAgICB0ZXh0OiBnZXR0ZXh0KCdPbmx5IGxvd2VyIGNhc2UgY2hhcmFjdGVycyBhcmUgYWxsb3dlZC4nKVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3Nob3VsZFN0YXJ0V2l0aExvd2VyQ2FzZUxldHRlck9yTnVtYmVyJyxcbiAgICAgIHRleHQ6IGdldHRleHQoJ1Nob3VsZCBzdGFydCB3aXRoIGEgbG93ZXIgY2FzZSBsZXR0ZXIgb3IgYSBudW1iZXIuJylcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdpbnZhbGlkQ2hhcmFjdGVycycsXG4gICAgICB0ZXh0OiBnZXR0ZXh0KCdJbnZhbGlkIGNoYXJhY3RlciBcInt7IGludmFsaWRDaGFyYWN0ZXIgfX1cIi4gT25seSBhLXosIDAtOSBhbmQgLSBhcmUgYWxsb3dlZC4nKVxuICAgIH1cbiAgXSBhcyBjb25zdDtcblxuICBwcml2YXRlIF9yZXNvdmxlOiAodmFsdWU6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuaW5pdEZvcm0+Wyd2YWx1ZSddKSA9PiB2b2lkO1xuICBwcml2YXRlIF9yZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBicmFuZGluZzogU3RvcmVCcmFuZGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXJcbiAgKSB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5pbml0Rm9ybSgpO1xuICAgIHRoaXMuZ2V0RXhpc3RpbmdCcmFuZGluZ1ZlcnNpb25zKCk7XG4gIH1cblxuICBhc3luYyBnZXRFeGlzdGluZ0JyYW5kaW5nVmVyc2lvbnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdmFyaWFudHMgfSA9IGF3YWl0IHRoaXMuYnJhbmRpbmcubG9hZEJyYW5kaW5nVmFyaWFudHMoKTtcbiAgICAgIHRoaXMubmFtZXNBbHJlYWR5VGFrZW4gPSB2YXJpYW50cy5tYXAodmFyaWFudCA9PiB2YXJpYW50LnZlcnNpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBpbml0Rm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBicmFuZGluZ05hbWU6IFtcbiAgICAgICAgJycsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmVuc3VyZVByb3BlclZhcmlhbnROYW1lKCksIHRoaXMuZW5zdXJlTm90RXhpc3RpbmdOYW1lKCldXG4gICAgICBdXG4gICAgfSk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5fcmVqZWN0KCk7XG4gIH1cblxuICBzYXZlKCkge1xuICAgIHRoaXMuX3Jlc292bGUodGhpcy5mb3JtLnZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTm90RXhpc3RpbmdOYW1lKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBjb250cm9sLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBsb3dlcmNhc2VOYW1lID0gY29udHJvbC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBuYW1lQWxyZWFkeVRha2VuID0gdGhpcy5uYW1lc0FscmVhZHlUYWtlbi5zb21lKG5hbWUgPT5cbiAgICAgICAgICBuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChsb3dlcmNhc2VOYW1lICsgJy0nKVxuICAgICAgICApO1xuICAgICAgICBpZiAobmFtZUFscmVhZHlUYWtlbikge1xuICAgICAgICAgIHJldHVybiB7IG5hbWVBbHJlYWR5VGFrZW46IHt9IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVByb3BlclZhcmlhbnROYW1lKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBjb250cm9sLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGlmICgvW0EtWl0vLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9ubHlMb3dlckNhc2VDaGFyYWN0ZXJzOiB7fVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEvXlthLXowLTldKy8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2hvdWxkU3RhcnRXaXRoTG93ZXJDYXNlTGV0dGVyT3JOdW1iZXI6IHt9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSAvW15hLXowLTktXS8uZXhlYyh2YWx1ZSk7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGludmFsaWRDaGFyYWN0ZXJzOiB7XG4gICAgICAgICAgICAgIGludmFsaWRDaGFyYWN0ZXI6IG1hdGNoZXNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG59XG4iLCI8Yzh5LW1vZGFsXG4gIFt0aXRsZV09XCJkdXBsaWNhdGVCcmFuZGluZyA/ICdEdXBsaWNhdGUgQnJhbmRpbmcnIDogJ0NyZWF0ZSBCcmFuZGluZydcIlxuICBbaGVhZGVyQ2xhc3Nlc109XCInZGlhbG9nLWhlYWRlcidcIlxuICAob25EaXNtaXNzKT1cImNhbmNlbCgpXCJcbiAgKG9uQ2xvc2UpPVwic2F2ZSgpXCJcbiAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiXG4gIFtsYWJlbHNdPVwieyBjYW5jZWw6ICdDYW5jZWwnLCBvazogJ1NhdmUnIH1cIlxuPlxuPG5nLWNvbnRhaW5lciBjOHktbW9kYWwtdGl0bGU+XG4gIDxzcGFuIFtjOHlJY29uXT1cIidwYWxldHRlJ1wiPjwvc3Bhbj5cbjwvbmctY29udGFpbmVyPlxuICA8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwicC0yNFwiPlxuICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgIDxsYWJlbFxuICAgICAgICBmb3I9XCJicmFuZGluZ05hbWVcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgQnJhbmRpbmcgbmFtZVxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgIG5hbWU9XCJicmFuZGluZ05hbWVcIlxuICAgICAgICBpZD1cImJyYW5kaW5nTmFtZVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYnJhbmRpbmdOYW1lXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eydlLmcuIHt7IGV4YW1wbGUgfX0nIHwgdHJhbnNsYXRlIDogeyBleGFtcGxlOiAnbWFpbi1icmFuZGluZycgfSB9fVwiXG4gICAgICAvPlxuICAgICAgPGM4eS1tZXNzYWdlcyBbaGVscE1lc3NhZ2VdPVwiJ1VwcGVyIGNhc2UgbGV0dGVycyBub3QgYWxsb3dlZCcgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgPGM4eS1tZXNzYWdlICpuZ0Zvcj1cImxldCBtZXNzYWdlIG9mIG1lc3NhZ2VzXCJcbiAgICAgICAgICBbbmFtZV09XCJtZXNzYWdlLm5hbWVcIlxuICAgICAgICAgIFt0ZXh0XT1cIm1lc3NhZ2UudGV4dCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID48L2M4eS1tZXNzYWdlPlxuICAgICAgPC9jOHktbWVzc2FnZXM+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cbiAgPC9kaXY+XG48L2M4eS1tb2RhbD5cbiJdfQ==
@@ -5,6 +5,7 @@ import * as i2 from '@angular/forms';
5
5
  import { Validators, ReactiveFormsModule } from '@angular/forms';
6
6
  import * as i3 from '@c8y/ngx-components';
7
7
  import { gettext, CoreModule } from '@c8y/ngx-components';
8
+ import * as i4 from '@angular/common';
8
9
  import { NgIf } from '@angular/common';
9
10
  import * as i1$1 from 'ngx-bootstrap/modal';
10
11
 
@@ -19,7 +20,24 @@ class AddBrandingModalComponent {
19
20
  this._resovle = resolve;
20
21
  this._reject = reject;
21
22
  });
22
- this.alreadyTakenMsg = gettext('The provided name is already taken.');
23
+ this.messages = [
24
+ {
25
+ name: 'nameAlreadyTaken',
26
+ text: gettext('The provided name is already taken.')
27
+ },
28
+ {
29
+ name: 'onlyLowerCaseCharacters',
30
+ text: gettext('Only lower case characters are allowed.')
31
+ },
32
+ {
33
+ name: 'shouldStartWithLowerCaseLetterOrNumber',
34
+ text: gettext('Should start with a lower case letter or a number.')
35
+ },
36
+ {
37
+ name: 'invalidCharacters',
38
+ text: gettext('Invalid character "{{ invalidCharacter }}". Only a-z, 0-9 and - are allowed.')
39
+ }
40
+ ];
23
41
  this.form = this.initForm();
24
42
  this.getExistingBrandingVersions();
25
43
  }
@@ -37,7 +55,7 @@ class AddBrandingModalComponent {
37
55
  return this.formBuilder.group({
38
56
  brandingName: [
39
57
  '',
40
- [Validators.required, Validators.pattern(/^[a-z0-9]+$/), this.ensureNotExistingName()]
58
+ [Validators.required, this.ensureProperVariantName(), this.ensureNotExistingName()]
41
59
  ]
42
60
  });
43
61
  }
@@ -59,12 +77,38 @@ class AddBrandingModalComponent {
59
77
  return null;
60
78
  };
61
79
  }
80
+ ensureProperVariantName() {
81
+ return (control) => {
82
+ if (typeof control.value === 'string') {
83
+ const value = control.value;
84
+ if (/[A-Z]/.test(value)) {
85
+ return {
86
+ onlyLowerCaseCharacters: {}
87
+ };
88
+ }
89
+ if (!/^[a-z0-9]+/.test(value)) {
90
+ return {
91
+ shouldStartWithLowerCaseLetterOrNumber: {}
92
+ };
93
+ }
94
+ const matches = /[^a-z0-9-]/.exec(value);
95
+ if (matches) {
96
+ return {
97
+ invalidCharacters: {
98
+ invalidCharacter: matches[0]
99
+ }
100
+ };
101
+ }
102
+ }
103
+ return null;
104
+ };
105
+ }
62
106
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AddBrandingModalComponent, deps: [{ token: i1.StoreBrandingService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
63
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AddBrandingModalComponent, isStandalone: true, selector: "c8y-add-branding-modal", inputs: { duplicateBranding: "duplicateBranding" }, ngImport: i0, template: "<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main_branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message\n name=\"nameAlreadyTaken\"\n [text]=\"alreadyTakenMsg | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i3.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i3.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
107
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AddBrandingModalComponent, isStandalone: true, selector: "c8y-add-branding-modal", inputs: { duplicateBranding: "duplicateBranding" }, ngImport: i0, template: "<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main-branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message *ngFor=\"let message of messages\"\n [name]=\"message.name\"\n [text]=\"message.text | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i3.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i3.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i3.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
64
108
  }
65
109
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AddBrandingModalComponent, decorators: [{
66
110
  type: Component,
67
- args: [{ selector: 'c8y-add-branding-modal', standalone: true, imports: [CoreModule, NgIf, ReactiveFormsModule], template: "<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main_branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message\n name=\"nameAlreadyTaken\"\n [text]=\"alreadyTakenMsg | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n" }]
111
+ args: [{ selector: 'c8y-add-branding-modal', standalone: true, imports: [CoreModule, NgIf, ReactiveFormsModule], template: "<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main-branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message *ngFor=\"let message of messages\"\n [name]=\"message.name\"\n [text]=\"message.text | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n" }]
68
112
  }], ctorParameters: () => [{ type: i1.StoreBrandingService }, { type: i2.FormBuilder }], propDecorators: { duplicateBranding: [{
69
113
  type: Input
70
114
  }] } });
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs","sources":["../../branding/shared/lazy/add-branding-modal/add-branding-modal.component.ts","../../branding/shared/lazy/add-branding-modal/add-branding-modal.component.html","../../branding/shared/lazy/add-branding-modal/add-branding-modal.service.ts","../../branding/shared/lazy/add-branding-modal/c8y-ngx-components-branding-shared-lazy-add-branding-modal.ts"],"sourcesContent":["import { Component, Input } from '@angular/core';\nimport { StoreBrandingService } from '@c8y/ngx-components/branding/shared/data';\nimport {\n AbstractControl,\n FormBuilder,\n ReactiveFormsModule,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport { CoreModule, gettext } from '@c8y/ngx-components';\nimport { NgIf } from '@angular/common';\n\n@Component({\n selector: 'c8y-add-branding-modal',\n templateUrl: './add-branding-modal.component.html',\n standalone: true,\n imports: [CoreModule, NgIf, ReactiveFormsModule]\n})\nexport class AddBrandingModalComponent {\n @Input() duplicateBranding = false;\n form: ReturnType<typeof this.initForm>;\n namesAlreadyTaken: string[] = [];\n loading = true;\n\n result = new Promise<ReturnType<typeof this.initForm>['value']>((resolve, reject) => {\n this._resovle = resolve;\n this._reject = reject;\n });\n\n alreadyTakenMsg = gettext('The provided name is already taken.');\n\n private _resovle: (value: ReturnType<typeof this.initForm>['value']) => void;\n private _reject: (reason?: any) => void;\n\n constructor(\n private branding: StoreBrandingService,\n private formBuilder: FormBuilder\n ) {\n this.form = this.initForm();\n this.getExistingBrandingVersions();\n }\n\n async getExistingBrandingVersions() {\n try {\n const { variants } = await this.branding.loadBrandingVariants();\n this.namesAlreadyTaken = variants.map(variant => variant.version);\n } catch (e) {\n console.warn(e);\n }\n this.loading = false;\n }\n\n initForm() {\n return this.formBuilder.group({\n brandingName: [\n '',\n [Validators.required, Validators.pattern(/^[a-z0-9]+$/), this.ensureNotExistingName()]\n ]\n });\n }\n\n cancel() {\n this._reject();\n }\n\n save() {\n this._resovle(this.form.value);\n }\n\n private ensureNotExistingName(): ValidatorFn {\n return (control: AbstractControl) => {\n if (typeof control.value === 'string') {\n const lowercaseName = control.value.toLowerCase();\n const nameAlreadyTaken = this.namesAlreadyTaken.some(name =>\n name.toLowerCase().startsWith(lowercaseName + '-')\n );\n if (nameAlreadyTaken) {\n return { nameAlreadyTaken: {} };\n }\n }\n return null;\n };\n }\n}\n","<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main_branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message\n name=\"nameAlreadyTaken\"\n [text]=\"alreadyTakenMsg | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n","import { Injectable } from '@angular/core';\nimport { AddBrandingModalComponent } from './add-branding-modal.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AddBrandingModalService {\n constructor(private modal: BsModalService) {}\n\n async openAddBrandingModal() {\n let versionDetails: Awaited<AddBrandingModalComponent['result']>;\n try {\n const modalRef = this.modal.show(AddBrandingModalComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n ignoreBackdropClick: true,\n keyboard: false\n });\n versionDetails = await modalRef.content.result;\n } catch (e) {\n // modal closed\n return;\n }\n\n return versionDetails;\n }\n\n async openDuplicateBrandingModal() {\n let versionDetails: Awaited<AddBrandingModalComponent['result']>;\n try {\n const modalRef = this.modal.show(AddBrandingModalComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n initialState: { duplicateBranding: true },\n ignoreBackdropClick: true,\n keyboard: false\n });\n versionDetails = await modalRef.content.result;\n } catch (e) {\n // modal closed\n return;\n }\n\n return versionDetails;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":";;;;;;;;;;MAkBa,yBAAyB,CAAA;IAgBpC,WACU,CAAA,QAA8B,EAC9B,WAAwB,EAAA;QADxB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAsB;QAC9B,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QAjBzB,IAAiB,CAAA,iBAAA,GAAG,KAAK,CAAC;QAEnC,IAAiB,CAAA,iBAAA,GAAa,EAAE,CAAC;QACjC,IAAO,CAAA,OAAA,GAAG,IAAI,CAAC;QAEf,IAAM,CAAA,MAAA,GAAG,IAAI,OAAO,CAA4C,CAAC,OAAO,EAAE,MAAM,KAAI;AAClF,YAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;AACxB,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;AACxB,SAAC,CAAC,CAAC;AAEH,QAAA,IAAA,CAAA,eAAe,GAAG,OAAO,CAAC,qCAAqC,CAAC,CAAC;AAS/D,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,2BAA2B,EAAE,CAAC;KACpC;AAED,IAAA,MAAM,2BAA2B,GAAA;AAC/B,QAAA,IAAI;YACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;AAChE,YAAA,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;SACnE;QAAC,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;AACD,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;KACtB;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC5B,YAAA,YAAY,EAAE;gBACZ,EAAE;AACF,gBAAA,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC;AACvF,aAAA;AACF,SAAA,CAAC,CAAC;KACJ;IAED,MAAM,GAAA;QACJ,IAAI,CAAC,OAAO,EAAE,CAAC;KAChB;IAED,IAAI,GAAA;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAChC;IAEO,qBAAqB,GAAA;QAC3B,OAAO,CAAC,OAAwB,KAAI;AAClC,YAAA,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE;gBACrC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,IACvD,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,aAAa,GAAG,GAAG,CAAC,CACnD,CAAC;gBACF,IAAI,gBAAgB,EAAE;AACpB,oBAAA,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;iBACjC;aACF;AACD,YAAA,OAAO,IAAI,CAAC;AACd,SAAC,CAAC;KACH;8GAhEU,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EClBtC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,wkCAoCA,EDpBY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,UAAU,iyDAAQ,mBAAmB,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAEpC,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EAEtB,IAAI,EACP,OAAA,EAAA,CAAC,UAAU,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,wkCAAA,EAAA,CAAA;mHAGvC,iBAAiB,EAAA,CAAA;sBAAzB,KAAK;;;MEZK,uBAAuB,CAAA;AAClC,IAAA,WAAA,CAAoB,KAAqB,EAAA;QAArB,IAAK,CAAA,KAAA,GAAL,KAAK,CAAgB;KAAI;AAE7C,IAAA,MAAM,oBAAoB,GAAA;AACxB,QAAA,IAAI,cAA4D,CAAC;AACjE,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC1D,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,eAAe,EAAE,YAAY;AAC7B,gBAAA,cAAc,EAAE,aAAa;AAC7B,gBAAA,mBAAmB,EAAE,IAAI;AACzB,gBAAA,QAAQ,EAAE,KAAK;AAChB,aAAA,CAAC,CAAC;AACH,YAAA,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;SAChD;QAAC,OAAO,CAAC,EAAE;;YAEV,OAAO;SACR;AAED,QAAA,OAAO,cAAc,CAAC;KACvB;AAED,IAAA,MAAM,0BAA0B,GAAA;AAC9B,QAAA,IAAI,cAA4D,CAAC;AACjE,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC1D,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,eAAe,EAAE,YAAY;AAC7B,gBAAA,cAAc,EAAE,aAAa;AAC7B,gBAAA,YAAY,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE;AACzC,gBAAA,mBAAmB,EAAE,IAAI;AACzB,gBAAA,QAAQ,EAAE,KAAK;AAChB,aAAA,CAAC,CAAC;AACH,YAAA,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;SAChD;QAAC,OAAO,CAAC,EAAE;;YAEV,OAAO;SACR;AAED,QAAA,OAAO,cAAc,CAAC;KACvB;8GAxCU,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACND;;AAEG;;;;"}
1
+ {"version":3,"file":"c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs","sources":["../../branding/shared/lazy/add-branding-modal/add-branding-modal.component.ts","../../branding/shared/lazy/add-branding-modal/add-branding-modal.component.html","../../branding/shared/lazy/add-branding-modal/add-branding-modal.service.ts","../../branding/shared/lazy/add-branding-modal/c8y-ngx-components-branding-shared-lazy-add-branding-modal.ts"],"sourcesContent":["import { Component, Input } from '@angular/core';\nimport { StoreBrandingService } from '@c8y/ngx-components/branding/shared/data';\nimport {\n AbstractControl,\n FormBuilder,\n ReactiveFormsModule,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport { CoreModule, gettext } from '@c8y/ngx-components';\nimport { NgIf } from '@angular/common';\n\n@Component({\n selector: 'c8y-add-branding-modal',\n templateUrl: './add-branding-modal.component.html',\n standalone: true,\n imports: [CoreModule, NgIf, ReactiveFormsModule]\n})\nexport class AddBrandingModalComponent {\n @Input() duplicateBranding = false;\n form: ReturnType<typeof this.initForm>;\n namesAlreadyTaken: string[] = [];\n loading = true;\n\n result = new Promise<ReturnType<typeof this.initForm>['value']>((resolve, reject) => {\n this._resovle = resolve;\n this._reject = reject;\n });\n\n messages = [\n {\n name: 'nameAlreadyTaken',\n text: gettext('The provided name is already taken.')\n },\n {\n name: 'onlyLowerCaseCharacters',\n text: gettext('Only lower case characters are allowed.')\n },\n {\n name: 'shouldStartWithLowerCaseLetterOrNumber',\n text: gettext('Should start with a lower case letter or a number.')\n },\n {\n name: 'invalidCharacters',\n text: gettext('Invalid character \"{{ invalidCharacter }}\". Only a-z, 0-9 and - are allowed.')\n }\n ] as const;\n\n private _resovle: (value: ReturnType<typeof this.initForm>['value']) => void;\n private _reject: (reason?: any) => void;\n\n constructor(\n private branding: StoreBrandingService,\n private formBuilder: FormBuilder\n ) {\n this.form = this.initForm();\n this.getExistingBrandingVersions();\n }\n\n async getExistingBrandingVersions() {\n try {\n const { variants } = await this.branding.loadBrandingVariants();\n this.namesAlreadyTaken = variants.map(variant => variant.version);\n } catch (e) {\n console.warn(e);\n }\n this.loading = false;\n }\n\n initForm() {\n return this.formBuilder.group({\n brandingName: [\n '',\n [Validators.required, this.ensureProperVariantName(), this.ensureNotExistingName()]\n ]\n });\n }\n\n cancel() {\n this._reject();\n }\n\n save() {\n this._resovle(this.form.value);\n }\n\n private ensureNotExistingName(): ValidatorFn {\n return (control: AbstractControl) => {\n if (typeof control.value === 'string') {\n const lowercaseName = control.value.toLowerCase();\n const nameAlreadyTaken = this.namesAlreadyTaken.some(name =>\n name.toLowerCase().startsWith(lowercaseName + '-')\n );\n if (nameAlreadyTaken) {\n return { nameAlreadyTaken: {} };\n }\n }\n return null;\n };\n }\n\n private ensureProperVariantName(): ValidatorFn {\n return (control: AbstractControl) => {\n if (typeof control.value === 'string') {\n const value = control.value;\n if (/[A-Z]/.test(value)) {\n return {\n onlyLowerCaseCharacters: {}\n };\n }\n if (!/^[a-z0-9]+/.test(value)) {\n return {\n shouldStartWithLowerCaseLetterOrNumber: {}\n };\n }\n\n const matches = /[^a-z0-9-]/.exec(value);\n if (matches) {\n return {\n invalidCharacters: {\n invalidCharacter: matches[0]\n }\n };\n }\n }\n return null;\n };\n }\n}\n","<c8y-modal\n [title]=\"duplicateBranding ? 'Duplicate Branding' : 'Create Branding'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [disabled]=\"form.invalid\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n<ng-container c8y-modal-title>\n <span [c8yIcon]=\"'palette'\"></span>\n</ng-container>\n <div [formGroup]=\"form\" class=\"p-24\">\n <c8y-form-group>\n <label\n for=\"brandingName\"\n translate\n >\n Branding name\n </label>\n <input\n class=\"form-control\"\n name=\"brandingName\"\n id=\"brandingName\"\n type=\"text\"\n formControlName=\"brandingName\"\n placeholder=\"{{'e.g. {{ example }}' | translate : { example: 'main-branding' } }}\"\n />\n <c8y-messages [helpMessage]=\"'Upper case letters not allowed' | translate\">\n <c8y-message *ngFor=\"let message of messages\"\n [name]=\"message.name\"\n [text]=\"message.text | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n</c8y-modal>\n","import { Injectable } from '@angular/core';\nimport { AddBrandingModalComponent } from './add-branding-modal.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AddBrandingModalService {\n constructor(private modal: BsModalService) {}\n\n async openAddBrandingModal() {\n let versionDetails: Awaited<AddBrandingModalComponent['result']>;\n try {\n const modalRef = this.modal.show(AddBrandingModalComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n ignoreBackdropClick: true,\n keyboard: false\n });\n versionDetails = await modalRef.content.result;\n } catch (e) {\n // modal closed\n return;\n }\n\n return versionDetails;\n }\n\n async openDuplicateBrandingModal() {\n let versionDetails: Awaited<AddBrandingModalComponent['result']>;\n try {\n const modalRef = this.modal.show(AddBrandingModalComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n initialState: { duplicateBranding: true },\n ignoreBackdropClick: true,\n keyboard: false\n });\n versionDetails = await modalRef.content.result;\n } catch (e) {\n // modal closed\n return;\n }\n\n return versionDetails;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
package/locales/de.po CHANGED
@@ -2045,9 +2045,6 @@ msgstr "Autodiscovery wird ausgeführt."
2045
2045
  msgid "Autodiscovery request"
2046
2046
  msgstr "Autodiscovery-Anfrage"
2047
2047
 
2048
- msgid "Set the required interval automatically"
2049
- msgstr "Automatische Einstellung des erforderlichen Intervalls"
2050
-
2051
2048
  msgid "Automatically scrolls to the latest value"
2052
2049
  msgstr "Scrollt automatisch zum letzten Wert"
2053
2050
 
@@ -2910,29 +2907,29 @@ msgstr "Kinder"
2910
2907
  msgid ""
2911
2908
  "Choose how to select a date range, the available options are:\n"
2912
2909
  " <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n"
2910
+ " <li><b>Dashboard time range:</b> restricts date selection to the global dashboard configuration only</li>\n"
2913
2911
  " <li><b>Widget configuration:</b> restricts the date selection only to the widget configuration</li>\n"
2914
2912
  " <li><b>Widget and widget configuration:</b> restricts the date selection to the widget view and widget configuration only</li>\n"
2915
- " <li><b>Dashboard time range:</b> restricts date selection to the global dashboard configuration only</li>\n"
2916
2913
  " </ul>"
2917
2914
  msgstr ""
2918
2915
  "Wählen Sie die passende Möglichkeit für den Datumsbereich aus. Die verfügbaren Optionen sind:\n"
2919
2916
  " <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n"
2917
+ " <li><b>Dashboard-Zeitbereich:</b> Beschränkt auf die globale Dashboard-Konfiguration.</li>\n"
2920
2918
  " <li><b>Widget-Konfiguration:</b> Beschränkt auf die Widget-Konfiguration.</li>\n"
2921
2919
  " <li><b>Widget und Widget-Konfiguration:</b> Beschränkt auf die Widget-Ansicht und die Widget-Konfiguration.</li>\n"
2922
- " <li><b>Dashboard-Zeitbereich:</b> Beschränkt auf die globale Dashboard-Konfiguration.</li>\n"
2923
2920
  " </ul>"
2924
2921
 
2925
2922
  msgid ""
2926
2923
  "Choose how to select a date range, the available options are:\n"
2927
2924
  " <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n"
2928
- " <li><b>Widget:</b> restricts the date selection to the widget view only</li>\n"
2929
2925
  " <li><b>Dashboard time range:</b> restricts date selection to the global dashboard configuration only</li>\n"
2926
+ " <li><b>Widget:</b> restricts the date selection to the widget view only</li>\n"
2930
2927
  " </ul>"
2931
2928
  msgstr ""
2932
2929
  "Wählen Sie die passende Möglichkeit für den Datumsbereich aus. Die verfügbaren Optionen sind:\n"
2933
2930
  " <ul class=\"m-l-0 p-l-8 m-t-8 m-b-0\">\n"
2934
- " <li><b>Widget:</b> Beschränkt auf die Widget-Ansicht.</li>\n"
2935
2931
  " <li><b>Dashboard-Zeitbereich:</b> Beschränkt auf die globale Dashboard-Konfiguration.</li>\n"
2932
+ " <li><b>Widget:</b> Beschränkt auf die Widget-Ansicht.</li>\n"
2936
2933
  " </ul>"
2937
2934
 
2938
2935
  msgid "Circular $refs."
@@ -6534,9 +6531,6 @@ msgstr "Filter"
6534
6531
  msgid "Filter by configuration type"
6535
6532
  msgstr "Nach Konfigurationstypen filtern"
6536
6533
 
6537
- msgid "Filter by configuration type"
6538
- msgstr "Nach Konfigurationstypen filtern"
6539
-
6540
6534
  msgid "Filter by creation time"
6541
6535
  msgstr "Nach Erstellungszeitpunkt filtern"
6542
6536
 
@@ -8283,6 +8277,9 @@ msgstr "Ungültige SVG-Datei"
8283
8277
  msgid "Invalid browse path."
8284
8278
  msgstr "Ungültiger Suchpfad."
8285
8279
 
8280
+ msgid "Invalid character \"{{ invalidCharacter }}\". Only a-z, 0-9 and - are allowed."
8281
+ msgstr "Ungültiges Zeichen \"{{ invalidCharacter }}\". Nur a-z, 0-9 und - sind erlaubt."
8282
+
8286
8283
  msgid "Invalid code"
8287
8284
  msgstr "Ungültiger Code"
8288
8285
 
@@ -9845,9 +9842,6 @@ msgstr "Kein Alarm ausgewählt"
9845
9842
  msgid "No alarms selected."
9846
9843
  msgstr "Keine Alarme ausgewählt."
9847
9844
 
9848
- msgid "No alarms selected."
9849
- msgstr "Keine Alarme ausgewählt."
9850
-
9851
9845
  msgid "No alarms to display."
9852
9846
  msgstr "Keine Alarme anzuzeigen."
9853
9847
 
@@ -9996,9 +9990,6 @@ msgstr ""
9996
9990
  msgid "No device profile selected"
9997
9991
  msgstr "Kein Geräteprofil ausgewählt"
9998
9992
 
9999
- msgid "No device profiles available."
10000
- msgstr "Keine passenden Geräteprofile verfügbar."
10001
-
10002
9993
  msgid "No device profiles found. Create a new device profile via the LoRa platform."
10003
9994
  msgstr "Kein Geräteprofil gefunden. Erstellen Sie ein neues Geräteprofil über die LoRa-Plattform."
10004
9995
 
@@ -10832,6 +10823,9 @@ msgstr "Nur die letzte Plugin-Version"
10832
10823
  msgid "Only letters, digits and underscore allowed."
10833
10824
  msgstr "Nur Buchstaben, Zahlen und Unterstriche zulässig."
10834
10825
 
10826
+ msgid "Only lower case characters are allowed."
10827
+ msgstr "Es sind nur Kleinbuchstaben erlaubt."
10828
+
10835
10829
  msgid "Only lowercase letters, digits and hyphens allowed in the first part of the URI. Must start with a letter; hyphens only allowed in the middle. Must be a valid URI."
10836
10830
  msgstr "Im ersten Teil des URI sind nur Kleinbuchstaben, Ziffern und Bindestriche zulässig. Muss mit einem Buchstaben beginnen; Bindestriche nur in der Mitte erlaubt. Muss eine gültiger URI sein."
10837
10831
 
@@ -14022,6 +14016,9 @@ msgstr "Anfrageintervall für Systemressourcenmessungen konfigurieren (in Sekund
14022
14016
  msgid "Set temperature threshold"
14023
14017
  msgstr "Schwellenwert für Temperatur konfigurieren"
14024
14018
 
14019
+ msgid "Set the required interval automatically"
14020
+ msgstr "Automatische Einstellung des erforderlichen Intervalls"
14021
+
14025
14022
  msgid "Set to \"{{ packageAvailability }}\""
14026
14023
  msgstr "Auf \"{{ packageAvailability }}\" setzen"
14027
14024
 
@@ -14124,6 +14121,9 @@ msgstr "Darf maximal {{ maxLength }} Zeichen enthalten."
14124
14121
  msgid "Should have at most {{ requiredLength }} characters."
14125
14122
  msgstr "Darf maximal {{ requiredLength }} Zeichen enthalten."
14126
14123
 
14124
+ msgid "Should start with a lower case letter or a number."
14125
+ msgstr "Sollte mit einem Kleinbuchstaben oder einer Nummer beginnen."
14126
+
14127
14127
  msgid "Show"
14128
14128
  msgstr "Anzeigen"
14129
14129
 
@@ -14474,8 +14474,8 @@ msgstr "SmartREST-Template"
14474
14474
  msgid "Smartbox Commands"
14475
14475
  msgstr "Smartbox-Kommandos"
14476
14476
 
14477
- msgid "Smartphone registered."
14478
- msgstr "Smartphone registriert."
14477
+ msgid "Smartphone registered"
14478
+ msgstr "Smartphone registriert"
14479
14479
 
14480
14480
  msgid "Smartphone sensors"
14481
14481
  msgstr "Smartphone-Sensoren"