@patter/ngx-components 0.5.13 → 0.5.15

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.
@@ -77,7 +77,7 @@ export class PtrFormComponent {
77
77
  return false;
78
78
  }
79
79
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
80
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: PtrFormComponent, isStandalone: true, selector: "ptr-form", inputs: { config: "config", loading: "loading", error: "error" }, outputs: { formSubmit: "formSubmit", formGroupCreated: "formGroupCreated" }, ngImport: i0, template: "<div [class]=\"'gform_wrapper ' + config.formClass\">\r\n\r\n @if (error) {\r\n <div class=\"gform_validation_errors\">\r\n <h2 class=\"gform_submission_error hide_summary\">{{error}}</h2>\r\n </div>\r\n }\r\n\r\n @if (config.title) {\r\n <div class=\"gform_heading\">\r\n <h2 class=\"gform_title\">{{ config.title }}</h2>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <div class=\"gform_fields\">\r\n\r\n @for (field of config.fields; track field.name) {\r\n @if(isFieldVisible(field)) {\r\n\r\n <div class=\"gfield gfield--width-{{field.size}}\" [class.gform_hidden]=\"field.type === 'hidden'\"\r\n [class.gfield_error]=\"formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched\">\r\n\r\n @switch (field.type) {\r\n @case ('textarea') {\r\n <label class=\"gfield_label gform-field-label\" [for]=\"field.name\">{{ getFieldLabel(field) }}</label>\r\n @if(field.description){\r\n <div class=\"gfield_description\">{{field.description}}</div>\r\n }\r\n <div class=\"gfield--input-wrapper ginput_container\">\r\n <textarea [id]=\"field.name\" [formControlName]=\"field.name\" [attr.placeholder]=\"getFieldPlaceholder(field)\"></textarea>\r\n </div>\r\n }\r\n @case ('select') {\r\n <ptr-select [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [options]=\"field.options\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n @default {\r\n <ptr-input [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [type]=\"field.type\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [autocomplete]=\"field.autocomplete\" [searchFn]=\"field.searchFn\"\r\n [dialogHelpText]=\"field.dialogHelpText\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n }\r\n\r\n @if (formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n @if (formGroup.get(field.name)?.errors?.['required']) {\r\n This field is required.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['email']) {\r\n Please enter a valid email address.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['minlength']) {\r\n Minimum length is {{ formGroup.get(field.name)?.errors?.['minlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['maxlength']) {\r\n Maximum length is {{ formGroup.get(field.name)?.errors?.['maxlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['pattern']) {\r\n Please match the required format.\r\n }\r\n </div>\r\n }\r\n @if (field.validationMessages && formGroup.invalid && !formGroup.get(field.name)?.invalid &&\r\n formGroup.get(field.name)?.touched) {\r\n @for (error of formGroup.errors | keyvalue; track error) {\r\n @if (field.validationMessages[error.key]) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n {{ field.validationMessages[error.key] }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n @if(config.submitText){\r\n <div class=\"gform_footer\">\r\n <ptr-button buttonType=\"submit\" [isDisabled]=\"loading || !formGroup.valid\">{{config.submitText}}</ptr-button>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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: "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: "component", type: PtrButtonComponent, selector: "ptr-button", inputs: ["buttonStyle", "buttonType", "isDisabled", "hrefLink", "routerLinkValue", "extraClasses", "isSmallSize", "isIconButton", "ariaLabel"], outputs: ["clicked"] }, { kind: "component", type: PtrSelectComponent, selector: "ptr-select", inputs: ["options", "showSearch", "placeholder", "label", "description", "labelPosition"], outputs: ["selectionChange"] }, { kind: "component", type: PtrInputComponent, selector: "ptr-input", inputs: ["type", "label", "placeholder", "autocomplete", "description", "dialogHelpText", "searchFn", "labelPosition"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
80
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: PtrFormComponent, isStandalone: true, selector: "ptr-form", inputs: { config: "config", loading: "loading", error: "error" }, outputs: { formSubmit: "formSubmit", formGroupCreated: "formGroupCreated" }, ngImport: i0, template: "<div [class]=\"'gform_wrapper ' + config.formClass\">\r\n\r\n @if (error) {\r\n <div class=\"gform_validation_errors\">\r\n <h2 class=\"gform_submission_error hide_summary\">{{error}}</h2>\r\n </div>\r\n }\r\n\r\n @if (config.title) {\r\n <div class=\"gform_heading\">\r\n <h2 class=\"gform_title\">{{ config.title }}</h2>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <div class=\"gform_fields\">\r\n\r\n @for (field of config.fields; track field.name) {\r\n @if(isFieldVisible(field)) {\r\n\r\n <div class=\"gfield gfield--width-{{field.size}}\" [class.gform_hidden]=\"field.type === 'hidden'\"\r\n [class.gfield_error]=\"formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched\" [class.gfield--label-inline]=\"config.labelPosition === 'inline'\">\r\n\r\n @switch (field.type) {\r\n @case ('textarea') {\r\n <label class=\"gfield_label gform-field-label\" [for]=\"field.name\">{{ getFieldLabel(field) }}</label>\r\n @if(field.description){\r\n <div class=\"gfield_description\">{{field.description}}</div>\r\n }\r\n <div class=\"gfield--input-wrapper ginput_container\">\r\n <textarea [id]=\"field.name\" [formControlName]=\"field.name\" [attr.placeholder]=\"getFieldPlaceholder(field)\"></textarea>\r\n </div>\r\n }\r\n @case ('select') {\r\n <ptr-select [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [options]=\"field.options\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n @default {\r\n <ptr-input [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [type]=\"field.type\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [autocomplete]=\"field.autocomplete\" [searchFn]=\"field.searchFn\"\r\n [dialogHelpText]=\"field.dialogHelpText\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n }\r\n\r\n @if (formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n @if (formGroup.get(field.name)?.errors?.['required']) {\r\n This field is required.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['email']) {\r\n Please enter a valid email address.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['minlength']) {\r\n Minimum length is {{ formGroup.get(field.name)?.errors?.['minlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['maxlength']) {\r\n Maximum length is {{ formGroup.get(field.name)?.errors?.['maxlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['pattern']) {\r\n Please match the required format.\r\n }\r\n </div>\r\n }\r\n @if (field.validationMessages && formGroup.invalid && !formGroup.get(field.name)?.invalid &&\r\n formGroup.get(field.name)?.touched) {\r\n @for (error of formGroup.errors | keyvalue; track error) {\r\n @if (field.validationMessages[error.key]) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n {{ field.validationMessages[error.key] }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n @if(config.submitText){\r\n <div class=\"gform_footer\">\r\n <ptr-button buttonType=\"submit\" [isDisabled]=\"loading || !formGroup.valid\"\r\n [extraClasses]=\"config.submitFullWidth ? 'gform-button--width-full' : ''\">{{config.submitText}}</ptr-button>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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: "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: "component", type: PtrButtonComponent, selector: "ptr-button", inputs: ["buttonStyle", "buttonType", "isDisabled", "hrefLink", "routerLinkValue", "extraClasses", "isSmallSize", "isIconButton", "ariaLabel"], outputs: ["clicked"] }, { kind: "component", type: PtrSelectComponent, selector: "ptr-select", inputs: ["options", "showSearch", "placeholder", "label", "description", "labelPosition"], outputs: ["selectionChange"] }, { kind: "component", type: PtrInputComponent, selector: "ptr-input", inputs: ["type", "label", "placeholder", "autocomplete", "description", "dialogHelpText", "searchFn", "labelPosition"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
81
81
  }
82
82
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrFormComponent, decorators: [{
83
83
  type: Component,
@@ -87,7 +87,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
87
87
  PtrButtonComponent,
88
88
  PtrSelectComponent,
89
89
  PtrInputComponent
90
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"'gform_wrapper ' + config.formClass\">\r\n\r\n @if (error) {\r\n <div class=\"gform_validation_errors\">\r\n <h2 class=\"gform_submission_error hide_summary\">{{error}}</h2>\r\n </div>\r\n }\r\n\r\n @if (config.title) {\r\n <div class=\"gform_heading\">\r\n <h2 class=\"gform_title\">{{ config.title }}</h2>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <div class=\"gform_fields\">\r\n\r\n @for (field of config.fields; track field.name) {\r\n @if(isFieldVisible(field)) {\r\n\r\n <div class=\"gfield gfield--width-{{field.size}}\" [class.gform_hidden]=\"field.type === 'hidden'\"\r\n [class.gfield_error]=\"formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched\">\r\n\r\n @switch (field.type) {\r\n @case ('textarea') {\r\n <label class=\"gfield_label gform-field-label\" [for]=\"field.name\">{{ getFieldLabel(field) }}</label>\r\n @if(field.description){\r\n <div class=\"gfield_description\">{{field.description}}</div>\r\n }\r\n <div class=\"gfield--input-wrapper ginput_container\">\r\n <textarea [id]=\"field.name\" [formControlName]=\"field.name\" [attr.placeholder]=\"getFieldPlaceholder(field)\"></textarea>\r\n </div>\r\n }\r\n @case ('select') {\r\n <ptr-select [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [options]=\"field.options\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n @default {\r\n <ptr-input [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [type]=\"field.type\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [autocomplete]=\"field.autocomplete\" [searchFn]=\"field.searchFn\"\r\n [dialogHelpText]=\"field.dialogHelpText\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n }\r\n\r\n @if (formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n @if (formGroup.get(field.name)?.errors?.['required']) {\r\n This field is required.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['email']) {\r\n Please enter a valid email address.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['minlength']) {\r\n Minimum length is {{ formGroup.get(field.name)?.errors?.['minlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['maxlength']) {\r\n Maximum length is {{ formGroup.get(field.name)?.errors?.['maxlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['pattern']) {\r\n Please match the required format.\r\n }\r\n </div>\r\n }\r\n @if (field.validationMessages && formGroup.invalid && !formGroup.get(field.name)?.invalid &&\r\n formGroup.get(field.name)?.touched) {\r\n @for (error of formGroup.errors | keyvalue; track error) {\r\n @if (field.validationMessages[error.key]) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n {{ field.validationMessages[error.key] }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n @if(config.submitText){\r\n <div class=\"gform_footer\">\r\n <ptr-button buttonType=\"submit\" [isDisabled]=\"loading || !formGroup.valid\">{{config.submitText}}</ptr-button>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n" }]
90
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"'gform_wrapper ' + config.formClass\">\r\n\r\n @if (error) {\r\n <div class=\"gform_validation_errors\">\r\n <h2 class=\"gform_submission_error hide_summary\">{{error}}</h2>\r\n </div>\r\n }\r\n\r\n @if (config.title) {\r\n <div class=\"gform_heading\">\r\n <h2 class=\"gform_title\">{{ config.title }}</h2>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <div class=\"gform_fields\">\r\n\r\n @for (field of config.fields; track field.name) {\r\n @if(isFieldVisible(field)) {\r\n\r\n <div class=\"gfield gfield--width-{{field.size}}\" [class.gform_hidden]=\"field.type === 'hidden'\"\r\n [class.gfield_error]=\"formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched\" [class.gfield--label-inline]=\"config.labelPosition === 'inline'\">\r\n\r\n @switch (field.type) {\r\n @case ('textarea') {\r\n <label class=\"gfield_label gform-field-label\" [for]=\"field.name\">{{ getFieldLabel(field) }}</label>\r\n @if(field.description){\r\n <div class=\"gfield_description\">{{field.description}}</div>\r\n }\r\n <div class=\"gfield--input-wrapper ginput_container\">\r\n <textarea [id]=\"field.name\" [formControlName]=\"field.name\" [attr.placeholder]=\"getFieldPlaceholder(field)\"></textarea>\r\n </div>\r\n }\r\n @case ('select') {\r\n <ptr-select [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [options]=\"field.options\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n @default {\r\n <ptr-input [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [type]=\"field.type\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [autocomplete]=\"field.autocomplete\" [searchFn]=\"field.searchFn\"\r\n [dialogHelpText]=\"field.dialogHelpText\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n }\r\n\r\n @if (formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n @if (formGroup.get(field.name)?.errors?.['required']) {\r\n This field is required.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['email']) {\r\n Please enter a valid email address.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['minlength']) {\r\n Minimum length is {{ formGroup.get(field.name)?.errors?.['minlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['maxlength']) {\r\n Maximum length is {{ formGroup.get(field.name)?.errors?.['maxlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['pattern']) {\r\n Please match the required format.\r\n }\r\n </div>\r\n }\r\n @if (field.validationMessages && formGroup.invalid && !formGroup.get(field.name)?.invalid &&\r\n formGroup.get(field.name)?.touched) {\r\n @for (error of formGroup.errors | keyvalue; track error) {\r\n @if (field.validationMessages[error.key]) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n {{ field.validationMessages[error.key] }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n @if(config.submitText){\r\n <div class=\"gform_footer\">\r\n <ptr-button buttonType=\"submit\" [isDisabled]=\"loading || !formGroup.valid\"\r\n [extraClasses]=\"config.submitFullWidth ? 'gform-button--width-full' : ''\">{{config.submitText}}</ptr-button>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n" }]
91
91
  }], propDecorators: { config: [{
92
92
  type: Input
93
93
  }], loading: [{
@@ -99,4 +99,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
99
99
  }], formGroupCreated: [{
100
100
  type: Output
101
101
  }] } });
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXR0ZXIvbmd4LWNvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy9mb3JtL2Zvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF0dGVyL25neC1jb21wb25lbnRzL3NyYy9saWIvZm9ybXMvZm9ybS9mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0ksT0FBTyxFQUFFLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7O0FBaUJoRSxNQUFNLE9BQU8sZ0JBQWdCO0lBRWxCLE1BQU0sQ0FBaUI7SUFDdkIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQWtCLElBQUksQ0FBQztJQUVyQyw4REFBOEQ7SUFDcEQsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDckMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUUzRCxTQUFTLENBQWE7SUFFZCxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FB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IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFB0ckNvbmRpdGlvbmFsUnVsZSwgUHRyRm9ybUNvbmZpZywgUHRyRm9ybUZpZWxkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IFB0ckJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3B0ci1idXR0b24vcHRyLWJ1dHRvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQdHJTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vaW5wdXQvc2VsZWN0L3NlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgUHRySW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC9wdHItaW5wdXQvcHRyLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncHRyLWZvcm0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuXHJcbiAgICBQdHJCdXR0b25Db21wb25lbnQsXHJcblxyXG4gICAgUHRyU2VsZWN0Q29tcG9uZW50LFxyXG4gICAgUHRySW5wdXRDb21wb25lbnRcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHRyRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IFB0ckZvcm1Db25maWc7XHJcbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBmb3JtR3JvdXBDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XHJcblxyXG4gIGZvcm1Hcm91cCE6IEZvcm1Hcm91cDtcclxuXHJcbiAgcHJpdmF0ZSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XHJcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xyXG4gICAgdGhpcy5mb3JtR3JvdXBDcmVhdGVkLmVtaXQodGhpcy5mb3JtR3JvdXApO1xyXG4gICAgdGhpcy5zZXR1cENvbmRpdGlvbmFsTG9naWMoKTtcclxuICB9XHJcblxyXG4gIGJ1aWxkRm9ybSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGdyb3VwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgdGhpcy5jb25maWcuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBncm91cFtmaWVsZC5uYW1lXSA9IFtmaWVsZC52YWx1ZSB8fCAnJywgZmllbGQudmFsaWRhdG9ycyB8fCBbXV07XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoZ3JvdXAsIHRoaXMuY29uZmlnLmZvcm1WYWxpZGF0b3JzID8geyB2YWxpZGF0b3JzOiB0aGlzLmNvbmZpZy5mb3JtVmFsaWRhdG9ycyB9IDogbnVsbCk7XHJcbiAgfVxyXG5cclxuICBvblN1Ym1pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZvcm1Hcm91cC52YWxpZCkge1xyXG4gICAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdCh0aGlzLmZvcm1Hcm91cC52YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtR3JvdXAucmVzZXQoKTtcclxuICAgIHRoaXMuY29uZmlnLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKTtcclxuICAgICAgY29udHJvbD8uc2V0VmFsdWUoZmllbGQudmFsdWUgfHwgJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvLyBDb25kaXRpb25hbCBsb2dpY1xyXG4gIHNldHVwQ29uZGl0aW9uYWxMb2dpYygpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxyXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaXNGaWVsZFZpc2libGUoZmllbGQ6IFB0ckZvcm1GaWVsZCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFmaWVsZC5jb25kaXRpb25hbD8uc2hvd1doZW4pIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVDb25kaXRpb25hbFJ1bGVzKGZpZWxkLmNvbmRpdGlvbmFsLnNob3dXaGVuKSBhcyBib29sZWFuO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGRMYWJlbChmaWVsZDogUHRyRm9ybUZpZWxkKTogc3RyaW5nIHtcclxuICAgIGlmICghZmllbGQuY29uZGl0aW9uYWw/LmxhYmVsKSByZXR1cm4gZmllbGQubGFiZWw7XHJcbiAgICBjb25zdCBjb25kaXRpb25hbExhYmVsID0gdGhpcy5ldmFsdWF0ZUNvbmRpdGlvbmFsUnVsZXMoZmllbGQuY29uZGl0aW9uYWwubGFiZWwpO1xyXG4gICAgcmV0dXJuIGNvbmRpdGlvbmFsTGFiZWwgYXMgc3RyaW5nIHx8IGZpZWxkLmxhYmVsO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGRQbGFjZWhvbGRlcihmaWVsZDogUHRyRm9ybUZpZWxkKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIWZpZWxkLmNvbmRpdGlvbmFsPy5wbGFjZWhvbGRlcikgcmV0dXJuIGZpZWxkLnBsYWNlaG9sZGVyIHx8IG51bGw7XHJcbiAgICBjb25zdCBjb25kaXRpb25hbFBsYWNlaG9sZGVyID0gdGhpcy5ldmFsdWF0ZUNvbmRpdGlvbmFsUnVsZXMoZmllbGQuY29uZGl0aW9uYWwucGxhY2Vob2xkZXIpO1xyXG4gICAgcmV0dXJuIGNvbmRpdGlvbmFsUGxhY2Vob2xkZXIgYXMgc3RyaW5nIHx8IGZpZWxkLnBsYWNlaG9sZGVyIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV2YWx1YXRlQ29uZGl0aW9uYWxSdWxlcyhydWxlczogUHRyQ29uZGl0aW9uYWxSdWxlW10pOiBzdHJpbmcgfCBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xyXG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHJ1bGUuZmllbGQpPy52YWx1ZTtcclxuICAgICAgaWYgKGZpZWxkVmFsdWUgPT09IHJ1bGUudmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gcnVsZS5yZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgW2NsYXNzXT1cIidnZm9ybV93cmFwcGVyICcgKyBjb25maWcuZm9ybUNsYXNzXCI+XHJcblxyXG4gIEBpZiAoZXJyb3IpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJnZm9ybV92YWxpZGF0aW9uX2Vycm9yc1wiPlxyXG4gICAgICA8aDIgY2xhc3M9XCJnZm9ybV9zdWJtaXNzaW9uX2Vycm9yIGhpZGVfc3VtbWFyeVwiPnt7ZXJyb3J9fTwvaDI+XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcblxyXG4gIEBpZiAoY29uZmlnLnRpdGxlKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2Zvcm1faGVhZGluZ1wiPlxyXG4gICAgICA8aDIgY2xhc3M9XCJnZm9ybV90aXRsZVwiPnt7IGNvbmZpZy50aXRsZSB9fTwvaDI+XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcblxyXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2Zvcm1fZmllbGRzXCI+XHJcblxyXG4gICAgICBAZm9yIChmaWVsZCBvZiBjb25maWcuZmllbGRzOyB0cmFjayBmaWVsZC5uYW1lKSB7XHJcbiAgICAgICAgQGlmKGlzRmllbGRWaXNpYmxlKGZpZWxkKSkge1xyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2ZpZWxkIGdmaWVsZC0td2lkdGgte3tmaWVsZC5zaXplfX1cIiBbY2xhc3MuZ2Zvcm1faGlkZGVuXT1cImZpZWxkLnR5cGUgPT09ICdoaWRkZW4nXCJcclxuICAgICAgICAgIFtjbGFzcy5nZmllbGRfZXJyb3JdPVwiZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKT8uaW52YWxpZCAmJiBmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpPy50b3VjaGVkXCI+XHJcblxyXG4gICAgICAgICAgQHN3aXRjaCAoZmllbGQudHlwZSkge1xyXG4gICAgICAgICAgICBAY2FzZSAoJ3RleHRhcmVhJykge1xyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdmaWVsZF9sYWJlbCBnZm9ybS1maWVsZC1sYWJlbFwiIFtmb3JdPVwiZmllbGQubmFtZVwiPnt7IGdldEZpZWxkTGFiZWwoZmllbGQpIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICBAaWYoZmllbGQuZGVzY3JpcHRpb24pe1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdmaWVsZF9kZXNjcmlwdGlvblwiPnt7ZmllbGQuZGVzY3JpcHRpb259fTwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2ZpZWxkLS1pbnB1dC13cmFwcGVyIGdpbnB1dF9jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBbaWRdPVwiZmllbGQubmFtZVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiIFthdHRyLnBsYWNlaG9sZGVyXT1cImdldEZpZWxkUGxhY2Vob2xkZXIoZmllbGQpXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBAY2FzZSAoJ3NlbGVjdCcpIHtcclxuICAgICAgICAgICAgICA8cHRyLXNlbGVjdCBbbGFiZWxdPVwiZ2V0RmllbGRMYWJlbChmaWVsZClcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbb3B0aW9uc109XCJmaWVsZC5vcHRpb25zXCJcclxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRGaWVsZFBsYWNlaG9sZGVyKGZpZWxkKVwiIFtsYWJlbFBvc2l0aW9uXT1cImNvbmZpZy5sYWJlbFBvc2l0aW9uXCIgLz5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBAZGVmYXVsdCB7XHJcbiAgICAgICAgICAgIDxwdHItaW5wdXQgW2xhYmVsXT1cImdldEZpZWxkTGFiZWwoZmllbGQpXCIgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCIgW3R5cGVdPVwiZmllbGQudHlwZVwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldEZpZWxkUGxhY2Vob2xkZXIoZmllbGQpXCIgW2F1dG9jb21wbGV0ZV09XCJmaWVsZC5hdXRvY29tcGxldGVcIiBbc2VhcmNoRm5dPVwiZmllbGQuc2VhcmNoRm5cIlxyXG4gICAgICAgICAgICAgIFtkaWFsb2dIZWxwVGV4dF09XCJmaWVsZC5kaWFsb2dIZWxwVGV4dFwiIFtsYWJlbFBvc2l0aW9uXT1cImNvbmZpZy5sYWJlbFBvc2l0aW9uXCIgLz5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIEBpZiAoZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKT8uaW52YWxpZCAmJiBmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpPy50b3VjaGVkKSB7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZmllbGRfZGVzY3JpcHRpb24gdmFsaWRhdGlvbl9tZXNzYWdlIGdmaWVsZF92YWxpZGF0aW9uX21lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICBAaWYgKGZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSk/LmVycm9ycz8uWydyZXF1aXJlZCddKSB7XHJcbiAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKGZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSk/LmVycm9ycz8uWydlbWFpbCddKSB7XHJcbiAgICAgICAgICAgICAgICBQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKGZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSk/LmVycm9ycz8uWydtaW5sZW5ndGgnXSkge1xyXG4gICAgICAgICAgICAgICAgTWluaW11bSBsZW5ndGggaXMge3sgZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKT8uZXJyb3JzPy5bJ21pbmxlbmd0aCddLnJlcXVpcmVkTGVuZ3RoIH19IGNoYXJhY3RlcnMuXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIEBpZiAoZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKT8uZXJyb3JzPy5bJ21heGxlbmd0aCddKSB7XHJcbiAgICAgICAgICAgICAgICBNYXhpbXVtIGxlbmd0aCBpcyB7eyBmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpPy5lcnJvcnM/LlsnbWF4bGVuZ3RoJ10ucmVxdWlyZWRMZW5ndGggfX0gY2hhcmFjdGVycy5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgQGlmIChmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpPy5lcnJvcnM/LlsncGF0dGVybiddKSB7XHJcbiAgICAgICAgICAgICAgICBQbGVhc2UgbWF0Y2ggdGhlIHJlcXVpcmVkIGZvcm1hdC5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgQGlmIChmaWVsZC52YWxpZGF0aW9uTWVzc2FnZXMgJiYgZm9ybUdyb3VwLmludmFsaWQgJiYgIWZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSk/LmludmFsaWQgJiZcclxuICAgICAgICAgIGZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSk/LnRvdWNoZWQpIHtcclxuICAgICAgICAgICAgQGZvciAoZXJyb3Igb2YgZm9ybUdyb3VwLmVycm9ycyB8IGtleXZhbHVlOyB0cmFjayBlcnJvcikge1xyXG4gICAgICAgICAgICAgIEBpZiAoZmllbGQudmFsaWRhdGlvbk1lc3NhZ2VzW2Vycm9yLmtleV0pIHtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2ZpZWxkX2Rlc2NyaXB0aW9uIHZhbGlkYXRpb25fbWVzc2FnZSBnZmllbGRfdmFsaWRhdGlvbl9tZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBmaWVsZC52YWxpZGF0aW9uTWVzc2FnZXNbZXJyb3Iua2V5XSB9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmKGNvbmZpZy5zdWJtaXRUZXh0KXtcclxuICAgICAgPGRpdiBjbGFzcz1cImdmb3JtX2Zvb3RlclwiPlxyXG4gICAgICAgIDxwdHItYnV0dG9uIGJ1dHRvblR5cGU9XCJzdWJtaXRcIiBbaXNEaXNhYmxlZF09XCJsb2FkaW5nIHx8ICFmb3JtR3JvdXAudmFsaWRcIj57e2NvbmZpZy5zdWJtaXRUZXh0fX08L3B0ci1idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICA8L2Zvcm0+XHJcbjwvZGl2PlxyXG4iXX0=
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXR0ZXIvbmd4LWNvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy9mb3JtL2Zvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF0dGVyL25neC1jb21wb25lbnRzL3NyYy9saWIvZm9ybXMvZm9ybS9mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0ksT0FBTyxFQUFFLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7O0FBaUJoRSxNQUFNLE9BQU8sZ0JBQWdCO0lBRWxCLE1BQU0sQ0FBaUI7SUFDdkIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQWtCLElBQUksQ0FBQztJQUVyQyw4REFBOEQ7SUFDcEQsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDckMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUUzRCxTQUFTLENBQWE7SUFFZCxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FB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IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFB0ckNvbmRpdGlvbmFsUnVsZSwgUHRyRm9ybUNvbmZpZywgUHRyRm9ybUZpZWxkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IFB0ckJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3B0ci1idXR0b24vcHRyLWJ1dHRvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQdHJTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vaW5wdXQvc2VsZWN0L3NlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgUHRySW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC9wdHItaW5wdXQvcHRyLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncHRyLWZvcm0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuXHJcbiAgICBQdHJCdXR0b25Db21wb25lbnQsXHJcblxyXG4gICAgUHRyU2VsZWN0Q29tcG9uZW50LFxyXG4gICAgUHRySW5wdXRDb21wb25lbnRcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHRyRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IFB0ckZvcm1Db25maWc7XHJcbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBmb3JtR3JvdXBDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XHJcblxyXG4gIGZvcm1Hcm91cCE6IEZvcm1Hcm91cDtcclxuXHJcbiAgcHJpdmF0ZSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XHJcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xyXG4gICAgdGhpcy5mb3JtR3JvdXBDcmVhdGVkLmVtaXQodGhpcy5mb3JtR3JvdXApO1xyXG4gICAgdGhpcy5zZXR1cENvbmRpdGlvbmFsTG9naWMoKTtcclxuICB9XHJcblxyXG4gIGJ1aWxkRm9ybSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGdyb3VwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgdGhpcy5jb25maWcuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBncm91cFtmaWVsZC5uYW1lXSA9IFtmaWVsZC52YWx1ZSB8fCAnJywgZmllbGQudmFsaWRhdG9ycyB8fCBbXV07XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoZ3JvdXAsIHRoaXMuY29uZmlnLmZvcm1WYWxpZGF0b3JzID8geyB2YWxpZGF0b3JzOiB0aGlzLmNvbmZpZy5mb3JtVmFsaWRhdG9ycyB9IDogbnVsbCk7XHJcbiAgfVxyXG5cclxuICBvblN1Ym1pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZvcm1Hcm91cC52YWxpZCkge1xyXG4gICAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdCh0aGlzLmZvcm1Hcm91cC52YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtR3JvdXAucmVzZXQoKTtcclxuICAgIHRoaXMuY29uZmlnLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKTtcclxuICAgICAgY29udHJvbD8uc2V0VmFsdWUoZmllbGQudmFsdWUgfHwgJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvLyBDb25kaXRpb25hbCBsb2dpY1xyXG4gIHNldHVwQ29uZGl0aW9uYWxMb2dpYygpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxyXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaXNGaWVsZFZpc2libGUoZmllbGQ6IFB0ckZvcm1GaWVsZCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFmaWVsZC5jb25kaXRpb25hbD8uc2hvd1doZW4pIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVDb25kaXRpb25hbFJ1bGVzKGZpZWxkLmNvbmRpdGlvbmFsLnNob3dXaGVuKSBhcyBib29sZWFuO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGRMYWJlbChmaWVsZDogUHRyRm9ybUZpZWxkKTogc3RyaW5nIHtcclxuICAgIGlmICghZmllbGQuY29uZGl0aW9uYWw/LmxhYmVsKSByZXR1cm4gZmllbGQubGFiZWw7XHJcbiAgICBjb25zdCBjb25kaXRpb25hbExhYmVsID0gdGhpcy5ldmFsdWF0ZUNvbmRpdGlvbmFsUnVsZXMoZmllbGQuY29uZGl0aW9uYWwubGFiZWwpO1xyXG4gICAgcmV0dXJuIGNvbmRpdGlvbmFsTGFiZWwgYXMgc3RyaW5nIHx8IGZpZWxkLmxhYmVsO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGRQbGFjZWhvbGRlcihmaWVsZDogUHRyRm9ybUZpZWxkKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIWZpZWxkLmNvbmRpdGlvbmFsPy5wbGFjZWhvbGRlcikgcmV0dXJuIGZpZWxkLnBsYWNlaG9sZGVyIHx8IG51bGw7XHJcbiAgICBjb25zdCBjb25kaXRpb25hbFBsYWNlaG9sZGVyID0gdGhpcy5ldmFsdWF0ZUNvbmRpdGlvbmFsUnVsZXMoZmllbGQuY29uZGl0aW9uYWwucGxhY2Vob2xkZXIpO1xyXG4gICAgcmV0dXJuIGNvbmRpdGlvbmFsUGxhY2Vob2xkZXIgYXMgc3RyaW5nIHx8IGZpZWxkLnBsYWNlaG9sZGVyIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV2YWx1YXRlQ29uZGl0aW9uYWxSdWxlcyhydWxlczogUHRyQ29uZGl0aW9uYWxSdWxlW10pOiBzdHJpbmcgfCBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xyXG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHJ1bGUuZmllbGQpPy52YWx1ZTtcclxuICAgICAgaWYgKGZpZWxkVmFsdWUgPT09IHJ1bGUudmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gcnVsZS5yZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgW2NsYXNzXT1cIidnZm9ybV93cmFwcGVyICcgKyBjb25maWcuZm9ybUNsYXNzXCI+XHJcblxyXG4gIEBpZiAoZXJyb3IpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJnZm9ybV92YWxpZGF0aW9uX2Vycm9yc1wiPlxyXG4gICAgICA8aDIgY2xhc3M9XCJnZm9ybV9zdWJtaXNzaW9uX2Vycm9yIGhpZGVfc3VtbWFyeVwiPnt7ZXJyb3J9fTwvaDI+XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcblxyXG4gIEBpZiAoY29uZmlnLnRpdGxlKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2Zvcm1faGVhZGluZ1wiPlxyXG4gICAgICA8aDIgY2xhc3M9XCJnZm9ybV90aXRsZVwiPnt7IGNvbmZpZy50aXRsZSB9fTwvaDI+XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcblxyXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2Zvcm1fZmllbGRzXCI+XHJcblxyXG4gICAgICBAZm9yIChmaWVsZCBvZiBjb25maWcuZmllbGRzOyB0cmFjayBmaWVsZC5uYW1lKSB7XHJcbiAgICAgICAgQGlmKGlzRmllbGRWaXNpYmxlKGZpZWxkKSkge1xyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2ZpZWxkIGdmaWVsZC0td2lkdGgte3tmaWVsZC5zaXplfX1cIiBbY2xhc3MuZ2Zvcm1faGlkZGVuXT1cImZpZWxkLnR5cGUgPT09ICdoaWRkZW4nXCJcclxuICAgICAgICAgIFtjbGFzcy5nZmllbGRfZXJyb3JdPVwiZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKT8uaW52YWxpZCAmJiBmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpPy50b3VjaGVkXCIgW2NsYXNzLmdmaWVsZC0tbGFiZWwtaW5saW5lXT1cImNvbmZpZy5sYWJlbFBvc2l0aW9uID09PSAnaW5saW5lJ1wiPlxyXG5cclxuICAgICAgICAgIEBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcclxuICAgICAgICAgICAgQGNhc2UgKCd0ZXh0YXJlYScpIHtcclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnZmllbGRfbGFiZWwgZ2Zvcm0tZmllbGQtbGFiZWxcIiBbZm9yXT1cImZpZWxkLm5hbWVcIj57eyBnZXRGaWVsZExhYmVsKGZpZWxkKSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgQGlmKGZpZWxkLmRlc2NyaXB0aW9uKXtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZmllbGRfZGVzY3JpcHRpb25cIj57e2ZpZWxkLmRlc2NyaXB0aW9ufX08L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdmaWVsZC0taW5wdXQtd3JhcHBlciBnaW5wdXRfY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgW2lkXT1cImZpZWxkLm5hbWVcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbYXR0ci5wbGFjZWhvbGRlcl09XCJnZXRGaWVsZFBsYWNlaG9sZGVyKGZpZWxkKVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgQGNhc2UgKCdzZWxlY3QnKSB7XHJcbiAgICAgICAgICAgICAgPHB0ci1zZWxlY3QgW2xhYmVsXT1cImdldEZpZWxkTGFiZWwoZmllbGQpXCIgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5uYW1lXCIgW29wdGlvbnNdPVwiZmllbGQub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2V0RmllbGRQbGFjZWhvbGRlcihmaWVsZClcIiBbbGFiZWxQb3NpdGlvbl09XCJjb25maWcubGFiZWxQb3NpdGlvblwiIC8+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgQGRlZmF1bHQge1xyXG4gICAgICAgICAgICA8cHRyLWlucHV0IFtsYWJlbF09XCJnZXRGaWVsZExhYmVsKGZpZWxkKVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQubmFtZVwiIFt0eXBlXT1cImZpZWxkLnR5cGVcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRGaWVsZFBsYWNlaG9sZGVyKGZpZWxkKVwiIFthdXRvY29tcGxldGVdPVwiZmllbGQuYXV0b2NvbXBsZXRlXCIgW3NlYXJjaEZuXT1cImZpZWxkLnNlYXJjaEZuXCJcclxuICAgICAgICAgICAgICBbZGlhbG9nSGVscFRleHRdPVwiZmllbGQuZGlhbG9nSGVscFRleHRcIiBbbGFiZWxQb3NpdGlvbl09XCJjb25maWcubGFiZWxQb3NpdGlvblwiIC8+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBAaWYgKGZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSk/LmludmFsaWQgJiYgZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKT8udG91Y2hlZCkge1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2ZpZWxkX2Rlc2NyaXB0aW9uIHZhbGlkYXRpb25fbWVzc2FnZSBnZmllbGRfdmFsaWRhdGlvbl9tZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgQGlmIChmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpPy5lcnJvcnM/LlsncmVxdWlyZWQnXSkge1xyXG4gICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgQGlmIChmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpPy5lcnJvcnM/LlsnZW1haWwnXSkge1xyXG4gICAgICAgICAgICAgICAgUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgQGlmIChmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpPy5lcnJvcnM/LlsnbWlubGVuZ3RoJ10pIHtcclxuICAgICAgICAgICAgICAgIE1pbmltdW0gbGVuZ3RoIGlzIHt7IGZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSk/LmVycm9ycz8uWydtaW5sZW5ndGgnXS5yZXF1aXJlZExlbmd0aCB9fSBjaGFyYWN0ZXJzLlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKGZvcm1Hcm91cC5nZXQoZmllbGQubmFtZSk/LmVycm9ycz8uWydtYXhsZW5ndGgnXSkge1xyXG4gICAgICAgICAgICAgICAgTWF4aW11bSBsZW5ndGggaXMge3sgZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKT8uZXJyb3JzPy5bJ21heGxlbmd0aCddLnJlcXVpcmVkTGVuZ3RoIH19IGNoYXJhY3RlcnMuXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIEBpZiAoZm9ybUdyb3VwLmdldChmaWVsZC5uYW1lKT8uZXJyb3JzPy5bJ3BhdHRlcm4nXSkge1xyXG4gICAgICAgICAgICAgICAgUGxlYXNlIG1hdGNoIHRoZSByZXF1aXJlZCBmb3JtYXQuXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEBpZiAoZmllbGQudmFsaWRhdGlvbk1lc3NhZ2VzICYmIGZvcm1Hcm91cC5pbnZhbGlkICYmICFmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpPy5pbnZhbGlkICYmXHJcbiAgICAgICAgICBmb3JtR3JvdXAuZ2V0KGZpZWxkLm5hbWUpPy50b3VjaGVkKSB7XHJcbiAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZvcm1Hcm91cC5lcnJvcnMgfCBrZXl2YWx1ZTsgdHJhY2sgZXJyb3IpIHtcclxuICAgICAgICAgICAgICBAaWYgKGZpZWxkLnZhbGlkYXRpb25NZXNzYWdlc1tlcnJvci5rZXldKSB7XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdmaWVsZF9kZXNjcmlwdGlvbiB2YWxpZGF0aW9uX21lc3NhZ2UgZ2ZpZWxkX3ZhbGlkYXRpb25fbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAge3sgZmllbGQudmFsaWRhdGlvbk1lc3NhZ2VzW2Vycm9yLmtleV0gfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIEBpZihjb25maWcuc3VibWl0VGV4dCl7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJnZm9ybV9mb290ZXJcIj5cclxuICAgICAgICA8cHRyLWJ1dHRvbiBidXR0b25UeXBlPVwic3VibWl0XCIgW2lzRGlzYWJsZWRdPVwibG9hZGluZyB8fCAhZm9ybUdyb3VwLnZhbGlkXCJcclxuICAgICAgICAgIFtleHRyYUNsYXNzZXNdPVwiY29uZmlnLnN1Ym1pdEZ1bGxXaWR0aCA/ICdnZm9ybS1idXR0b24tLXdpZHRoLWZ1bGwnIDogJydcIj57e2NvbmZpZy5zdWJtaXRUZXh0fX08L3B0ci1idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICA8L2Zvcm0+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhdHRlci9uZ3gtY29tcG9uZW50cy9zcmMvbGliL2Zvcm1zL2ludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jVmFsaWRhdG9yRm4sIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQdHJDb25kaXRpb25hbFJ1bGUge1xyXG4gIGZpZWxkOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XHJcbiAgcmVzdWx0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHRyQ29uZGl0aW9uYWxDb25maWcge1xyXG4gIHNob3dXaGVuPzogUHRyQ29uZGl0aW9uYWxSdWxlW107XHJcbiAgbGFiZWw/OiBQdHJDb25kaXRpb25hbFJ1bGVbXTtcclxuICBwbGFjZWhvbGRlcj86IFB0ckNvbmRpdGlvbmFsUnVsZVtdO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQdHJPcHRpb24ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQdHJPcHRpb25Hcm91cCB7XHJcbiAgZ3JvdXBMYWJlbDogc3RyaW5nO1xyXG4gIG9wdGlvbnM6IFB0ck9wdGlvbltdO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBPcHRpb25JbnB1dHMgPSAoc3RyaW5nIHwgUHRyT3B0aW9uKVtdIHwgUHRyT3B0aW9uR3JvdXBbXTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHRyRm9ybUZpZWxkIHtcclxuICB0eXBlOiAndGV4dCcgfCAndGV4dGFyZWEnIHwgJ251bWJlcicgfCAnZW1haWwnIHwgJ3Bhc3N3b3JkJyB8ICdzZWFyY2gnIHwgJ3NlbGVjdCcgfCAnZGF0ZScgfCAnaGlkZGVuJztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICB2YWx1ZT86IHVua25vd247XHJcbiAgc2l6ZT86ICdmdWxsJyB8ICdoYWxmJyB8ICd0aGlyZCcgfCAnb25lLXNpeHRoJyB8ICdxdWFydGVyJyB8ICd0aHJlZS1xdWFydGVycycgfCAndHdvLXRoaXJkJztcclxuICBwbGFjZWhvbGRlcj86IHN0cmluZztcclxuICB2YWxpZGF0b3JzPzogVmFsaWRhdG9yRm5bXTtcclxuICBhdXRvY29tcGxldGU/OiBzdHJpbmc7XHJcbiAgYXN5bmNWYWxpZGF0b3JzPzogQXN5bmNWYWxpZGF0b3JGbltdO1xyXG4gIHZhbGlkYXRpb25NZXNzYWdlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcblxyXG4gIC8vIFNlbGVjdCBzcGVjaWZpY1xyXG4gIG9wdGlvbnM/OiBPcHRpb25JbnB1dHM7XHJcbiAgZGlhbG9nSGVscFRleHQ/OiBzdHJpbmc7XHJcblxyXG4gIC8vIEFzeW5jIHNlYXJjaFxyXG4gIHNlYXJjaEZuPzogKHRlcm06IHN0cmluZykgPT4gT2JzZXJ2YWJsZTxzdHJpbmdbXT47XHJcblxyXG4gIC8vIENvbmRpdGlvbmFsIGZpZWxkc1xyXG4gIGNvbmRpdGlvbmFsPzogUHRyQ29uZGl0aW9uYWxDb25maWc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHRyRm9ybUNvbmZpZyB7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgZmllbGRzOiBQdHJGb3JtRmllbGRbXTtcclxuICBmb3JtQ2xhc3M/OiBzdHJpbmc7XHJcbiAgZm9ybVZhbGlkYXRvcnM/OiBWYWxpZGF0b3JGbltdO1xyXG4gIHN1Ym1pdFRleHQ/OiBzdHJpbmc7XHJcbiAgbGFiZWxQb3NpdGlvbj86ICd0b3AnIHwgJ2lubGluZSc7XHJcbn1cclxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhdHRlci9uZ3gtY29tcG9uZW50cy9zcmMvbGliL2Zvcm1zL2ludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jVmFsaWRhdG9yRm4sIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQdHJDb25kaXRpb25hbFJ1bGUge1xyXG4gIGZpZWxkOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XHJcbiAgcmVzdWx0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHRyQ29uZGl0aW9uYWxDb25maWcge1xyXG4gIHNob3dXaGVuPzogUHRyQ29uZGl0aW9uYWxSdWxlW107XHJcbiAgbGFiZWw/OiBQdHJDb25kaXRpb25hbFJ1bGVbXTtcclxuICBwbGFjZWhvbGRlcj86IFB0ckNvbmRpdGlvbmFsUnVsZVtdO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQdHJPcHRpb24ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQdHJPcHRpb25Hcm91cCB7XHJcbiAgZ3JvdXBMYWJlbDogc3RyaW5nO1xyXG4gIG9wdGlvbnM6IFB0ck9wdGlvbltdO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBPcHRpb25JbnB1dHMgPSAoc3RyaW5nIHwgUHRyT3B0aW9uKVtdIHwgUHRyT3B0aW9uR3JvdXBbXTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHRyRm9ybUZpZWxkIHtcclxuICB0eXBlOiAndGV4dCcgfCAndGV4dGFyZWEnIHwgJ251bWJlcicgfCAnZW1haWwnIHwgJ3Bhc3N3b3JkJyB8ICdzZWFyY2gnIHwgJ3NlbGVjdCcgfCAnZGF0ZScgfCAnaGlkZGVuJztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICB2YWx1ZT86IHVua25vd247XHJcbiAgc2l6ZT86ICdmdWxsJyB8ICdoYWxmJyB8ICd0aGlyZCcgfCAnb25lLXNpeHRoJyB8ICdxdWFydGVyJyB8ICd0aHJlZS1xdWFydGVycycgfCAndHdvLXRoaXJkJztcclxuICBwbGFjZWhvbGRlcj86IHN0cmluZztcclxuICB2YWxpZGF0b3JzPzogVmFsaWRhdG9yRm5bXTtcclxuICBhdXRvY29tcGxldGU/OiBzdHJpbmc7XHJcbiAgYXN5bmNWYWxpZGF0b3JzPzogQXN5bmNWYWxpZGF0b3JGbltdO1xyXG4gIHZhbGlkYXRpb25NZXNzYWdlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcblxyXG4gIC8vIFNlbGVjdCBzcGVjaWZpY1xyXG4gIG9wdGlvbnM/OiBPcHRpb25JbnB1dHM7XHJcbiAgZGlhbG9nSGVscFRleHQ/OiBzdHJpbmc7XHJcblxyXG4gIC8vIEFzeW5jIHNlYXJjaFxyXG4gIHNlYXJjaEZuPzogKHRlcm06IHN0cmluZykgPT4gT2JzZXJ2YWJsZTxzdHJpbmdbXT47XHJcblxyXG4gIC8vIENvbmRpdGlvbmFsIGZpZWxkc1xyXG4gIGNvbmRpdGlvbmFsPzogUHRyQ29uZGl0aW9uYWxDb25maWc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHRyRm9ybUNvbmZpZyB7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgZmllbGRzOiBQdHJGb3JtRmllbGRbXTtcclxuICBmb3JtQ2xhc3M/OiBzdHJpbmc7XHJcbiAgZm9ybVZhbGlkYXRvcnM/OiBWYWxpZGF0b3JGbltdO1xyXG4gIHN1Ym1pdFRleHQ/OiBzdHJpbmc7XHJcbiAgc3VibWl0RnVsbFdpZHRoPzogYm9vbGVhbjtcclxuICBsYWJlbFBvc2l0aW9uPzogJ3RvcCcgfCAnaW5saW5lJztcclxufVxyXG4iXX0=
@@ -24,7 +24,8 @@ export class PtrBreadcrumbsComponent {
24
24
  routeUrl += `/${routeURL}`;
25
25
  }
26
26
  const { label, url } = this.getLabelForRoute(child);
27
- if (label) {
27
+ // Skip if the label is undefined or empty and the path is empty
28
+ if (label && (!breadcrumbs.length || breadcrumbs[breadcrumbs.length - 1].label !== label)) {
28
29
  breadcrumbs.push({ label, url: url ?? routeUrl });
29
30
  }
30
31
  return this.createBreadcrumbs(child, routeUrl, breadcrumbs);
@@ -56,4 +57,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
56
57
  }], propDecorators: { showFirstSeparator: [{
57
58
  type: Input
58
59
  }] } });
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHRyLWJyZWFkY3J1bWJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhdHRlci9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3B0ci1icmVhZGNydW1icy9wdHItYnJlYWRjcnVtYnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF0dGVyL25neC1jb21wb25lbnRzL3NyYy9saWIvcHRyLWJyZWFkY3J1bWJzL3B0ci1icmVhZGNydW1icy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBVXBELE1BQU0sT0FBTyx1QkFBdUI7SUFFekIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBRTNCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV4QyxXQUFXLEdBQUcsUUFBUSxDQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3JCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsRUFDL0Msb0JBQW9CLEVBQUUsQ0FDdkIsQ0FDRixDQUFDO0lBRUYsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDMUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFFSyxpQkFBaUIsQ0FBQyxLQUFxQixFQUFFLFFBQVEsR0FBRyxFQUFFLEVBQUUsY0FBK0IsRUFBRTtRQUMvRixNQUFNLGFBQWEsR0FBcUIsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUN2RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUNELEtBQUssTUFBTSxLQUFLLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEMsTUFBTSxRQUFRLEdBQVcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuRixJQUFJLFFBQVEsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDcEIsUUFBUSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BELElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFxQjtRQUM1QyxNQUFNLG9CQUFvQixHQUF3QixFQUFFLENBQUM7UUFDckQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQW9DLENBQUM7UUFFOUYsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLElBQUksZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzNCLG9CQUFvQixDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7WUFDdEQsQ0FBQztZQUNELElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLG9CQUFvQixDQUFDLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEMsb0JBQW9CLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3BELENBQUM7UUFFRCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7dUdBdERVLHVCQUF1QjsyRkFBdkIsdUJBQXVCLGlJQ2JwQyxpcUJBZ0JBLG1oQ0RSWSxZQUFZOzsyRkFLWCx1QkFBdUI7a0JBUm5DLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUdOLHVCQUF1QixDQUFDLE1BQU07OEJBSXRDLGtCQUFrQjtzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEJyZWFkY3J1bWJSb3V0ZUluZm8sIFB0ckJyZWFkY3J1bWIgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3B0ci1icmVhZGNydW1icycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbUm91dGVyTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcHRyLWJyZWFkY3J1bWJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vcHRyLWJyZWFkY3J1bWJzLmNvbXBvbmVudC5zY3NzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHRyQnJlYWRjcnVtYnNDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSBzaG93Rmlyc3RTZXBhcmF0b3IgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByaXZhdGUgYWN0aXZhdGVkUm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xyXG5cclxuICBwcml2YXRlIHJvdXRlRXZlbnRzID0gdG9TaWduYWwoXHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcclxuICAgIClcclxuICApO1xyXG5cclxuICBicmVhZGNydW1icyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIHRoaXMucm91dGVFdmVudHMoKTtcclxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUJyZWFkY3J1bWJzKHRoaXMuYWN0aXZhdGVkUm91dGUucm9vdCk7XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQnJlYWRjcnVtYnMocm91dGU6IEFjdGl2YXRlZFJvdXRlLCByb3V0ZVVybCA9ICcnLCBicmVhZGNydW1iczogUHRyQnJlYWRjcnVtYltdID0gW10pOiBQdHJCcmVhZGNydW1iW10ge1xyXG4gICAgY29uc3Qgcm91dGVDaGlsZHJlbjogQWN0aXZhdGVkUm91dGVbXSA9IHJvdXRlLmNoaWxkcmVuO1xyXG4gICAgaWYgKHJvdXRlQ2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBicmVhZGNydW1icztcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm91dGVDaGlsZHJlbikge1xyXG4gICAgICBjb25zdCByb3V0ZVVSTDogc3RyaW5nID0gY2hpbGQuc25hcHNob3QudXJsLm1hcChzZWdtZW50ID0+IHNlZ21lbnQucGF0aCkuam9pbignLycpO1xyXG4gICAgICBpZiAocm91dGVVUkwgIT09ICcnKSB7XHJcbiAgICAgICAgcm91dGVVcmwgKz0gYC8ke3JvdXRlVVJMfWA7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgeyBsYWJlbCwgdXJsIH0gPSB0aGlzLmdldExhYmVsRm9yUm91dGUoY2hpbGQpO1xyXG4gICAgICBpZiAobGFiZWwpIHtcclxuICAgICAgICBicmVhZGNydW1icy5wdXNoKHsgbGFiZWwsIHVybDogdXJsID8/IHJvdXRlVXJsIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUJyZWFkY3J1bWJzKGNoaWxkLCByb3V0ZVVybCwgYnJlYWRjcnVtYnMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJyZWFkY3J1bWJzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMYWJlbEZvclJvdXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IEJyZWFkY3J1bWJSb3V0ZUluZm8ge1xyXG4gICAgY29uc3QgYnJlYWRjcnVtYlJldHVybkluZm86IEJyZWFkY3J1bWJSb3V0ZUluZm8gPSB7fTtcclxuICAgIGNvbnN0IGN1c3RvbUJyZWFkY3J1bWIgPSByb3V0ZS5zbmFwc2hvdC5kYXRhWydicmVhZGNydW1iJ10gYXMgQnJlYWRjcnVtYlJvdXRlSW5mbyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBpZiAoY3VzdG9tQnJlYWRjcnVtYikge1xyXG4gICAgICBpZiAoY3VzdG9tQnJlYWRjcnVtYi5sYWJlbCkge1xyXG4gICAgICAgIGJyZWFkY3J1bWJSZXR1cm5JbmZvLmxhYmVsID0gY3VzdG9tQnJlYWRjcnVtYi5sYWJlbDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY3VzdG9tQnJlYWRjcnVtYi51cmwpIHtcclxuICAgICAgICBicmVhZGNydW1iUmV0dXJuSW5mby51cmwgPSBjdXN0b21CcmVhZGNydW1iLnVybDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChyb3V0ZS5zbmFwc2hvdC50aXRsZSkge1xyXG4gICAgICBicmVhZGNydW1iUmV0dXJuSW5mby5sYWJlbCA9IHJvdXRlLnNuYXBzaG90LnRpdGxlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBicmVhZGNydW1iUmV0dXJuSW5mbztcclxuICB9XHJcblxyXG59XHJcbiIsIkBpZiAoYnJlYWRjcnVtYnMoKS5sZW5ndGggPiAwKSB7XG4gIDxuYXYgYXJpYS1sYWJlbD1cImJyZWFkY3J1bWJcIiBjbGFzcz1cImJyZWFkY3J1bWItd3JhcHBlclwiPlxuICAgIDxvbCBjbGFzcz1cImJyZWFkY3J1bWJcIiBbY2xhc3MuYnJlYWRjcnVtYi0tc2hvdy1maXJzdC1zZXBhcmF0b3JdPVwic2hvd0ZpcnN0U2VwYXJhdG9yXCI+XG4gICAgICBAZm9yIChicmVhZGNydW1iIG9mIGJyZWFkY3J1bWJzKCk7IHRyYWNrIGJyZWFkY3J1bWIubGFiZWw7IGxldCBsYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgPGxpIGNsYXNzPVwiYnJlYWRjcnVtYi1pdGVtXCIgW2NsYXNzLmJyZWFkY3J1bWItaXRlbS0tYWN0aXZlXT1cImxhc3RcIj5cbiAgICAgICAgICBAaWYgKCFsYXN0KSB7XG4gICAgICAgICAgICA8YSBjbGFzcz1cImJyZWFkY3J1bWItaXRlbS1sYWJlbFwiIFtyb3V0ZXJMaW5rXT1cImJyZWFkY3J1bWIudXJsXCI+e3sgYnJlYWRjcnVtYi5sYWJlbCB9fTwvYT5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChsYXN0KSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyZWFkY3J1bWItaXRlbS1sYWJlbFwiPnt7IGJyZWFkY3J1bWIubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgIDwvb2w+XG4gIDwvbmF2PlxufVxuIl19
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHRyLWJyZWFkY3J1bWJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhdHRlci9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3B0ci1icmVhZGNydW1icy9wdHItYnJlYWRjcnVtYnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF0dGVyL25neC1jb21wb25lbnRzL3NyYy9saWIvcHRyLWJyZWFkY3J1bWJzL3B0ci1icmVhZGNydW1icy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBVXBELE1BQU0sT0FBTyx1QkFBdUI7SUFFekIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBRTNCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV4QyxXQUFXLEdBQUcsUUFBUSxDQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3JCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsRUFDL0Msb0JBQW9CLEVBQUUsQ0FDdkIsQ0FDRixDQUFDO0lBRUYsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDMUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFFSyxpQkFBaUIsQ0FBQyxLQUFxQixFQUFFLFFBQVEsR0FBRyxFQUFFLEVBQUUsY0FBK0IsRUFBRTtRQUMvRixNQUFNLGFBQWEsR0FBcUIsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUN2RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUNELEtBQUssTUFBTSxLQUFLLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEMsTUFBTSxRQUFRLEdBQVcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuRixJQUFJLFFBQVEsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDcEIsUUFBUSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXBELGdFQUFnRTtZQUNoRSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDMUYsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFxQjtRQUM1QyxNQUFNLG9CQUFvQixHQUF3QixFQUFFLENBQUM7UUFDckQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQW9DLENBQUM7UUFFOUYsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLElBQUksZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzNCLG9CQUFvQixDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7WUFDdEQsQ0FBQztZQUNELElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLG9CQUFvQixDQUFDLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEMsb0JBQW9CLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3BELENBQUM7UUFFRCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7dUdBekRVLHVCQUF1QjsyRkFBdkIsdUJBQXVCLGlJQ2JwQyxpcUJBZ0JBLG1oQ0RSWSxZQUFZOzsyRkFLWCx1QkFBdUI7a0JBUm5DLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUdOLHVCQUF1QixDQUFDLE1BQU07OEJBSXRDLGtCQUFrQjtzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEJyZWFkY3J1bWJSb3V0ZUluZm8sIFB0ckJyZWFkY3J1bWIgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3B0ci1icmVhZGNydW1icycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbUm91dGVyTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcHRyLWJyZWFkY3J1bWJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vcHRyLWJyZWFkY3J1bWJzLmNvbXBvbmVudC5zY3NzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHRyQnJlYWRjcnVtYnNDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSBzaG93Rmlyc3RTZXBhcmF0b3IgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByaXZhdGUgYWN0aXZhdGVkUm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xyXG5cclxuICBwcml2YXRlIHJvdXRlRXZlbnRzID0gdG9TaWduYWwoXHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcclxuICAgIClcclxuICApO1xyXG5cclxuICBicmVhZGNydW1icyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIHRoaXMucm91dGVFdmVudHMoKTtcclxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUJyZWFkY3J1bWJzKHRoaXMuYWN0aXZhdGVkUm91dGUucm9vdCk7XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQnJlYWRjcnVtYnMocm91dGU6IEFjdGl2YXRlZFJvdXRlLCByb3V0ZVVybCA9ICcnLCBicmVhZGNydW1iczogUHRyQnJlYWRjcnVtYltdID0gW10pOiBQdHJCcmVhZGNydW1iW10ge1xyXG4gICAgY29uc3Qgcm91dGVDaGlsZHJlbjogQWN0aXZhdGVkUm91dGVbXSA9IHJvdXRlLmNoaWxkcmVuO1xyXG4gICAgaWYgKHJvdXRlQ2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBicmVhZGNydW1icztcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm91dGVDaGlsZHJlbikge1xyXG4gICAgICBjb25zdCByb3V0ZVVSTDogc3RyaW5nID0gY2hpbGQuc25hcHNob3QudXJsLm1hcChzZWdtZW50ID0+IHNlZ21lbnQucGF0aCkuam9pbignLycpO1xyXG4gICAgICBpZiAocm91dGVVUkwgIT09ICcnKSB7XHJcbiAgICAgICAgcm91dGVVcmwgKz0gYC8ke3JvdXRlVVJMfWA7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgeyBsYWJlbCwgdXJsIH0gPSB0aGlzLmdldExhYmVsRm9yUm91dGUoY2hpbGQpO1xyXG5cclxuICAgICAgLy8gU2tpcCBpZiB0aGUgbGFiZWwgaXMgdW5kZWZpbmVkIG9yIGVtcHR5IGFuZCB0aGUgcGF0aCBpcyBlbXB0eVxyXG4gICAgICBpZiAobGFiZWwgJiYgKCFicmVhZGNydW1icy5sZW5ndGggfHwgYnJlYWRjcnVtYnNbYnJlYWRjcnVtYnMubGVuZ3RoIC0gMV0ubGFiZWwgIT09IGxhYmVsKSkge1xyXG4gICAgICAgIGJyZWFkY3J1bWJzLnB1c2goeyBsYWJlbCwgdXJsOiB1cmwgPz8gcm91dGVVcmwgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUJyZWFkY3J1bWJzKGNoaWxkLCByb3V0ZVVybCwgYnJlYWRjcnVtYnMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJyZWFkY3J1bWJzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMYWJlbEZvclJvdXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IEJyZWFkY3J1bWJSb3V0ZUluZm8ge1xyXG4gICAgY29uc3QgYnJlYWRjcnVtYlJldHVybkluZm86IEJyZWFkY3J1bWJSb3V0ZUluZm8gPSB7fTtcclxuICAgIGNvbnN0IGN1c3RvbUJyZWFkY3J1bWIgPSByb3V0ZS5zbmFwc2hvdC5kYXRhWydicmVhZGNydW1iJ10gYXMgQnJlYWRjcnVtYlJvdXRlSW5mbyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBpZiAoY3VzdG9tQnJlYWRjcnVtYikge1xyXG4gICAgICBpZiAoY3VzdG9tQnJlYWRjcnVtYi5sYWJlbCkge1xyXG4gICAgICAgIGJyZWFkY3J1bWJSZXR1cm5JbmZvLmxhYmVsID0gY3VzdG9tQnJlYWRjcnVtYi5sYWJlbDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY3VzdG9tQnJlYWRjcnVtYi51cmwpIHtcclxuICAgICAgICBicmVhZGNydW1iUmV0dXJuSW5mby51cmwgPSBjdXN0b21CcmVhZGNydW1iLnVybDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChyb3V0ZS5zbmFwc2hvdC50aXRsZSkge1xyXG4gICAgICBicmVhZGNydW1iUmV0dXJuSW5mby5sYWJlbCA9IHJvdXRlLnNuYXBzaG90LnRpdGxlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBicmVhZGNydW1iUmV0dXJuSW5mbztcclxuICB9XHJcblxyXG59XHJcbiIsIkBpZiAoYnJlYWRjcnVtYnMoKS5sZW5ndGggPiAwKSB7XG4gIDxuYXYgYXJpYS1sYWJlbD1cImJyZWFkY3J1bWJcIiBjbGFzcz1cImJyZWFkY3J1bWItd3JhcHBlclwiPlxuICAgIDxvbCBjbGFzcz1cImJyZWFkY3J1bWJcIiBbY2xhc3MuYnJlYWRjcnVtYi0tc2hvdy1maXJzdC1zZXBhcmF0b3JdPVwic2hvd0ZpcnN0U2VwYXJhdG9yXCI+XG4gICAgICBAZm9yIChicmVhZGNydW1iIG9mIGJyZWFkY3J1bWJzKCk7IHRyYWNrIGJyZWFkY3J1bWIubGFiZWw7IGxldCBsYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgPGxpIGNsYXNzPVwiYnJlYWRjcnVtYi1pdGVtXCIgW2NsYXNzLmJyZWFkY3J1bWItaXRlbS0tYWN0aXZlXT1cImxhc3RcIj5cbiAgICAgICAgICBAaWYgKCFsYXN0KSB7XG4gICAgICAgICAgICA8YSBjbGFzcz1cImJyZWFkY3J1bWItaXRlbS1sYWJlbFwiIFtyb3V0ZXJMaW5rXT1cImJyZWFkY3J1bWIudXJsXCI+e3sgYnJlYWRjcnVtYi5sYWJlbCB9fTwvYT5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChsYXN0KSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyZWFkY3J1bWItaXRlbS1sYWJlbFwiPnt7IGJyZWFkY3J1bWIubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgIDwvb2w+XG4gIDwvbmF2PlxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhdHRlci9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3B0ci10b2FzdGVyL2ludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgUHRyVG9hc3Qge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIHR5cGU6ICdzdWNjZXNzJyB8ICdlcnJvcicgfCAnaW5mbycgfCAnd2FybmluZyc7XHJcbn1cclxuIl19
@@ -0,0 +1,15 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
+ import { PtrToasterService } from '../ptr-toaster.service';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ export class PtrToasterComponent {
7
+ toasterService = inject(PtrToasterService);
8
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrToasterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: PtrToasterComponent, isStandalone: true, selector: "ptr-toaster", ngImport: i0, template: "<div class=\"toaster-container\" aria-live=\"polite\" aria-atomic=\"true\">\r\n @for (toast of toasterService.getToasts()(); track toast.id) {\r\n <div class=\"toast\" [ngClass]=\"toast.type\" role=\"alert\">\r\n <span>{{toast.message}}</span>\r\n <button (click)=\"toasterService.remove(toast.id)\" aria-label=\"Close\"><span>&times;</span></button>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".toaster-container{position:fixed;top:20px;right:20px;z-index:1000}.toast{padding:10px 20px;margin-bottom:10px;border-radius:calc(var(--wp--custom--default-border-radius) / 2);color:#fff;display:flex;justify-content:space-between;align-items:center;gap:1rem}.success{background-color:var(--wp--preset--color--primary, #28a745)}.error{background-color:var(--wp--custom--color--error, #dc3545)}.info{background-color:var(--wp--preset--color--secondary, #17a2b8)}.warning{background-color:var(--wp--preset--color--secondary, #ffc107)}button{background:none;border:none;color:inherit;font-size:2em;cursor:pointer;font-family:monospace}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrToasterComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: 'ptr-toaster', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"toaster-container\" aria-live=\"polite\" aria-atomic=\"true\">\r\n @for (toast of toasterService.getToasts()(); track toast.id) {\r\n <div class=\"toast\" [ngClass]=\"toast.type\" role=\"alert\">\r\n <span>{{toast.message}}</span>\r\n <button (click)=\"toasterService.remove(toast.id)\" aria-label=\"Close\"><span>&times;</span></button>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".toaster-container{position:fixed;top:20px;right:20px;z-index:1000}.toast{padding:10px 20px;margin-bottom:10px;border-radius:calc(var(--wp--custom--default-border-radius) / 2);color:#fff;display:flex;justify-content:space-between;align-items:center;gap:1rem}.success{background-color:var(--wp--preset--color--primary, #28a745)}.error{background-color:var(--wp--custom--color--error, #dc3545)}.info{background-color:var(--wp--preset--color--secondary, #17a2b8)}.warning{background-color:var(--wp--preset--color--secondary, #ffc107)}button{background:none;border:none;color:inherit;font-size:2em;cursor:pointer;font-family:monospace}\n"] }]
14
+ }] });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHRyLXRvYXN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF0dGVyL25neC1jb21wb25lbnRzL3NyYy9saWIvcHRyLXRvYXN0ZXIvcHRyLXRvYXN0ZXIvcHRyLXRvYXN0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF0dGVyL25neC1jb21wb25lbnRzL3NyYy9saWIvcHRyLXRvYXN0ZXIvcHRyLXRvYXN0ZXIvcHRyLXRvYXN0ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFVM0QsTUFBTSxPQUFPLG1CQUFtQjtJQUNwQixjQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7dUdBRDFDLG1CQUFtQjsyRkFBbkIsbUJBQW1CLHVFQ1poQyx5WUFRQSxrckJERFksWUFBWTs7MkZBS1gsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLGFBQWEsY0FDWCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBR04sdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQdHJUb2FzdGVyU2VydmljZSB9IGZyb20gJy4uL3B0ci10b2FzdGVyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdwdHItdG9hc3RlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcHRyLXRvYXN0ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9wdHItdG9hc3Rlci5jb21wb25lbnQuc2NzcycsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFB0clRvYXN0ZXJDb21wb25lbnQge1xyXG4gIHByb3RlY3RlZCB0b2FzdGVyU2VydmljZSA9IGluamVjdChQdHJUb2FzdGVyU2VydmljZSk7XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInRvYXN0ZXItY29udGFpbmVyXCIgYXJpYS1saXZlPVwicG9saXRlXCIgYXJpYS1hdG9taWM9XCJ0cnVlXCI+XHJcbiAgQGZvciAodG9hc3Qgb2YgdG9hc3RlclNlcnZpY2UuZ2V0VG9hc3RzKCkoKTsgdHJhY2sgdG9hc3QuaWQpIHtcclxuICA8ZGl2IGNsYXNzPVwidG9hc3RcIiBbbmdDbGFzc109XCJ0b2FzdC50eXBlXCIgcm9sZT1cImFsZXJ0XCI+XHJcbiAgICA8c3Bhbj57e3RvYXN0Lm1lc3NhZ2V9fTwvc3Bhbj5cclxuICAgIDxidXR0b24gKGNsaWNrKT1cInRvYXN0ZXJTZXJ2aWNlLnJlbW92ZSh0b2FzdC5pZClcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48c3Bhbj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,52 @@
1
+ import { ApplicationRef, createComponent, DestroyRef, EnvironmentInjector, inject, Injectable, Injector, signal } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { timer } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ export class PtrToasterService {
6
+ destroyRef = inject(DestroyRef);
7
+ injector = inject(Injector);
8
+ environmentInjector = inject(EnvironmentInjector);
9
+ appRef = inject(ApplicationRef);
10
+ toasts = signal([]);
11
+ counter = 0;
12
+ toasterComponentRef = null;
13
+ constructor() {
14
+ this.injectToasterComponent();
15
+ }
16
+ injectToasterComponent() {
17
+ if (this.toasterComponentRef) {
18
+ return;
19
+ }
20
+ import('./ptr-toaster/ptr-toaster.component').then(module => {
21
+ this.toasterComponentRef = createComponent(module.PtrToasterComponent, {
22
+ environmentInjector: this.environmentInjector,
23
+ elementInjector: this.injector
24
+ });
25
+ const domElem = this.toasterComponentRef.location.nativeElement;
26
+ document.body.appendChild(domElem);
27
+ this.appRef.attachView(this.toasterComponentRef.hostView);
28
+ });
29
+ }
30
+ getToasts() {
31
+ return this.toasts.asReadonly();
32
+ }
33
+ show(message, type = 'info') {
34
+ const id = this.counter++;
35
+ this.toasts.update(toasts => [...toasts, { id, message, type }]);
36
+ timer(10000)
37
+ .pipe(takeUntilDestroyed(this.destroyRef))
38
+ .subscribe(() => this.remove(id));
39
+ }
40
+ remove(id) {
41
+ this.toasts.update(toasts => toasts.filter(t => t.id !== id));
42
+ }
43
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrToasterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
44
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrToasterService, providedIn: 'root' });
45
+ }
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrToasterService, decorators: [{
47
+ type: Injectable,
48
+ args: [{
49
+ providedIn: 'root'
50
+ }]
51
+ }], ctorParameters: () => [] });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHRyLXRvYXN0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhdHRlci9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3B0ci10b2FzdGVyL3B0ci10b2FzdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBZ0IsZUFBZSxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckosT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFNN0IsTUFBTSxPQUFPLGlCQUFpQjtJQUVwQixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVoQyxNQUFNLEdBQUcsTUFBTSxDQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDWixtQkFBbUIsR0FBaUMsSUFBSSxDQUFDO0lBRWpFO1FBQ0UsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFO2dCQUNyRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO2dCQUM3QyxlQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDL0IsQ0FBQyxDQUFDO1lBRUgsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDaEUsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVNLElBQUksQ0FBQyxPQUFlLEVBQUUsT0FBeUIsTUFBTTtRQUMxRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFakUsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUNULElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sTUFBTSxDQUFDLEVBQVU7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7dUdBL0NVLGlCQUFpQjsyR0FBakIsaUJBQWlCLGNBRmhCLE1BQU07OzJGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBsaWNhdGlvblJlZiwgQ29tcG9uZW50UmVmLCBjcmVhdGVDb21wb25lbnQsIERlc3Ryb3lSZWYsIEVudmlyb25tZW50SW5qZWN0b3IsIGluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcbmltcG9ydCB7IHRpbWVyIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFB0clRvYXN0IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFB0clRvYXN0ZXJTZXJ2aWNlIHtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xyXG4gIHByaXZhdGUgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xyXG4gIHByaXZhdGUgZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcclxuICBwcml2YXRlIGFwcFJlZiA9IGluamVjdChBcHBsaWNhdGlvblJlZik7XHJcblxyXG4gIHByaXZhdGUgdG9hc3RzID0gc2lnbmFsPFB0clRvYXN0W10+KFtdKTtcclxuICBwcml2YXRlIGNvdW50ZXIgPSAwO1xyXG4gIHByaXZhdGUgdG9hc3RlckNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5pbmplY3RUb2FzdGVyQ29tcG9uZW50KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluamVjdFRvYXN0ZXJDb21wb25lbnQoKSB7XHJcbiAgICBpZiAodGhpcy50b2FzdGVyQ29tcG9uZW50UmVmKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpbXBvcnQoJy4vcHRyLXRvYXN0ZXIvcHRyLXRvYXN0ZXIuY29tcG9uZW50JykudGhlbihtb2R1bGUgPT4ge1xyXG4gICAgICB0aGlzLnRvYXN0ZXJDb21wb25lbnRSZWYgPSBjcmVhdGVDb21wb25lbnQobW9kdWxlLlB0clRvYXN0ZXJDb21wb25lbnQsIHtcclxuICAgICAgICBlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmVudmlyb25tZW50SW5qZWN0b3IsXHJcbiAgICAgICAgZWxlbWVudEluamVjdG9yOiB0aGlzLmluamVjdG9yXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgZG9tRWxlbSA9IHRoaXMudG9hc3RlckNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvbUVsZW0pO1xyXG4gICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KHRoaXMudG9hc3RlckNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUb2FzdHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50b2FzdHMuYXNSZWFkb25seSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3cobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBQdHJUb2FzdFsndHlwZSddID0gJ2luZm8nKSB7XHJcbiAgICBjb25zdCBpZCA9IHRoaXMuY291bnRlcisrO1xyXG4gICAgdGhpcy50b2FzdHMudXBkYXRlKHRvYXN0cyA9PiBbLi4udG9hc3RzLCB7IGlkLCBtZXNzYWdlLCB0eXBlIH1dKTtcclxuXHJcbiAgICB0aW1lcigxMDAwMClcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZW1vdmUoaWQpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmUoaWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy50b2FzdHMudXBkYXRlKHRvYXN0cyA9PiB0b2FzdHMuZmlsdGVyKHQgPT4gdC5pZCAhPT0gaWQpKTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -17,4 +17,6 @@ export { PtrTooltipComponent } from './lib/dialog/ptr-tooltip/ptr-tooltip.compon
17
17
  export { PtrBreadcrumbsComponent } from './lib/ptr-breadcrumbs/ptr-breadcrumbs.component';
18
18
  export { PtrTabsComponent } from './lib/components/tabs/ptr-tabs/ptr-tabs.component';
19
19
  export { PtrTabComponent } from './lib/components/tabs/ptr-tab/ptr-tab.component';
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3BhdHRlci9uZ3gtY29tcG9uZW50cy9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsMkJBQTJCLENBQUM7QUFFMUMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUVwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM3RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUU3RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUVyRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUcxRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygbmd4LWNvbXBvbmVudHNcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tZW51L21lbnUuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Zvcm1zL2ludGVyZmFjZXMnO1xyXG5leHBvcnQgeyBQdHJGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvZm9ybXMvZm9ybS9mb3JtLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFB0clNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4vbGliL2Zvcm1zL2lucHV0L3NlbGVjdC9zZWxlY3QuY29tcG9uZW50JztcclxuZXhwb3J0IHsgUHRySW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2xpYi9mb3Jtcy9pbnB1dC9wdHItaW5wdXQvcHRyLWlucHV0LmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgeyBQdHJUaXRsZUNvbXBvbmVudCB9IGZyb20gJy4vbGliL3B0ci10aXRsZS9wdHItdGl0bGUuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCB7IFB0ckxvYWRpbmdTcGlubmVyQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvbG9hZGluZy1zcGlubmVyL2xvYWRpbmctc3Bpbm5lci5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBQdHJMb2FkaW5nU3Bpbm5lckRpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2xvYWRpbmctc3Bpbm5lci9sb2FkaW5nLXNwaW5uZXIuZGlyZWN0aXZlJztcclxuXHJcbmV4cG9ydCB7IFB0ckxvYWRpbmdTZXJ2aWNlIH0gZnJvbSAnLi9saWIvc2VydmljZXMvbG9hZGluZy5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCB7IFB0ckJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vbGliL3B0ci1idXR0b24vcHRyLWJ1dHRvbi5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IHsgUHRyRGlhbG9nU2VydmljZSB9IGZyb20gJy4vbGliL2RpYWxvZy9wdHItZGlhbG9nLnNlcnZpY2UnO1xyXG5leHBvcnQgeyBQdHJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2xpYi9kaWFsb2cvcHRyLWRpYWxvZy9wdHItZGlhbG9nLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFB0clRvb2x0aXBDb21wb25lbnQgfSBmcm9tICcuL2xpYi9kaWFsb2cvcHRyLXRvb2x0aXAvcHRyLXRvb2x0aXAuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCB7IFB0ckJyZWFkY3J1bWJzQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvcHRyLWJyZWFkY3J1bWJzL3B0ci1icmVhZGNydW1icy5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBQdHJCcmVhZGNydW1iIH0gZnJvbSAnLi9saWIvcHRyLWJyZWFkY3J1bWJzL2ludGVyZmFjZXMnO1xyXG5cclxuZXhwb3J0IHsgUHRyVGFic0NvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvdGFicy9wdHItdGFicy9wdHItdGFicy5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBQdHJUYWJDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL3RhYnMvcHRyLXRhYi9wdHItdGFiLmNvbXBvbmVudCc7XHJcbiJdfQ==
20
+ export { PtrToasterService } from './lib/ptr-toaster/ptr-toaster.service';
21
+ export { PtrToasterComponent } from './lib/ptr-toaster/ptr-toaster/ptr-toaster.component';
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3BhdHRlci9uZ3gtY29tcG9uZW50cy9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsMkJBQTJCLENBQUM7QUFFMUMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUVwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM3RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUU3RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUVyRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUcxRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFFbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scURBQXFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygbmd4LWNvbXBvbmVudHNcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tZW51L21lbnUuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Zvcm1zL2ludGVyZmFjZXMnO1xyXG5leHBvcnQgeyBQdHJGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvZm9ybXMvZm9ybS9mb3JtLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFB0clNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4vbGliL2Zvcm1zL2lucHV0L3NlbGVjdC9zZWxlY3QuY29tcG9uZW50JztcclxuZXhwb3J0IHsgUHRySW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2xpYi9mb3Jtcy9pbnB1dC9wdHItaW5wdXQvcHRyLWlucHV0LmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgeyBQdHJUaXRsZUNvbXBvbmVudCB9IGZyb20gJy4vbGliL3B0ci10aXRsZS9wdHItdGl0bGUuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCB7IFB0ckxvYWRpbmdTcGlubmVyQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvbG9hZGluZy1zcGlubmVyL2xvYWRpbmctc3Bpbm5lci5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBQdHJMb2FkaW5nU3Bpbm5lckRpcmVjdGl2ZSB9IGZyb20gJy4vbGliL2xvYWRpbmctc3Bpbm5lci9sb2FkaW5nLXNwaW5uZXIuZGlyZWN0aXZlJztcclxuXHJcbmV4cG9ydCB7IFB0ckxvYWRpbmdTZXJ2aWNlIH0gZnJvbSAnLi9saWIvc2VydmljZXMvbG9hZGluZy5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCB7IFB0ckJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vbGliL3B0ci1idXR0b24vcHRyLWJ1dHRvbi5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IHsgUHRyRGlhbG9nU2VydmljZSB9IGZyb20gJy4vbGliL2RpYWxvZy9wdHItZGlhbG9nLnNlcnZpY2UnO1xyXG5leHBvcnQgeyBQdHJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2xpYi9kaWFsb2cvcHRyLWRpYWxvZy9wdHItZGlhbG9nLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFB0clRvb2x0aXBDb21wb25lbnQgfSBmcm9tICcuL2xpYi9kaWFsb2cvcHRyLXRvb2x0aXAvcHRyLXRvb2x0aXAuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCB7IFB0ckJyZWFkY3J1bWJzQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvcHRyLWJyZWFkY3J1bWJzL3B0ci1icmVhZGNydW1icy5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBQdHJCcmVhZGNydW1iIH0gZnJvbSAnLi9saWIvcHRyLWJyZWFkY3J1bWJzL2ludGVyZmFjZXMnO1xyXG5cclxuZXhwb3J0IHsgUHRyVGFic0NvbXBvbmVudCB9IGZyb20gJy4vbGliL2NvbXBvbmVudHMvdGFicy9wdHItdGFicy9wdHItdGFicy5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBQdHJUYWJDb21wb25lbnQgfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL3RhYnMvcHRyLXRhYi9wdHItdGFiLmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgeyBQdHJUb2FzdGVyU2VydmljZSB9IGZyb20gJy4vbGliL3B0ci10b2FzdGVyL3B0ci10b2FzdGVyLnNlcnZpY2UnO1xyXG5leHBvcnQgeyBQdHJUb2FzdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvcHRyLXRvYXN0ZXIvcHRyLXRvYXN0ZXIvcHRyLXRvYXN0ZXIuY29tcG9uZW50JztcclxuZXhwb3J0IHsgUHRyVG9hc3QgfSBmcm9tICcuL2xpYi9wdHItdG9hc3Rlci9pbnRlcmZhY2VzJztcclxuIl19
@@ -1,12 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, ChangeDetectionStrategy, Input, signal, EventEmitter, computed, HostBinding, Output, ViewChild, forwardRef, HostListener, inject, ChangeDetectorRef, DestroyRef, ElementRef, ViewContainerRef, Renderer2, Directive, Injectable, createComponent, effect, ContentChildren, ViewChildren } from '@angular/core';
2
+ import { Component, ChangeDetectionStrategy, Input, signal, EventEmitter, computed, HostBinding, Output, ViewChild, forwardRef, HostListener, inject, ChangeDetectorRef, DestroyRef, ElementRef, ViewContainerRef, Renderer2, Directive, Injectable, createComponent, effect, ContentChildren, ViewChildren, Injector, EnvironmentInjector, ApplicationRef } from '@angular/core';
3
3
  import * as i1 from '@angular/router';
4
4
  import { RouterModule, RouterLink, Router, ActivatedRoute, TitleStrategy, NavigationEnd } from '@angular/router';
5
5
  import * as i1$1 from '@angular/common';
6
6
  import { CommonModule } from '@angular/common';
7
7
  import * as i1$2 from '@angular/forms';
8
8
  import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormBuilder } from '@angular/forms';
9
- import { Subject, debounceTime, distinctUntilChanged, switchMap, of, filter, startWith, map } from 'rxjs';
9
+ import { Subject, debounceTime, distinctUntilChanged, switchMap, of, filter, startWith, map, timer } from 'rxjs';
10
10
  import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
11
11
 
12
12
  class PtrMenuComponent {
@@ -644,7 +644,7 @@ class PtrFormComponent {
644
644
  return false;
645
645
  }
646
646
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
647
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: PtrFormComponent, isStandalone: true, selector: "ptr-form", inputs: { config: "config", loading: "loading", error: "error" }, outputs: { formSubmit: "formSubmit", formGroupCreated: "formGroupCreated" }, ngImport: i0, template: "<div [class]=\"'gform_wrapper ' + config.formClass\">\r\n\r\n @if (error) {\r\n <div class=\"gform_validation_errors\">\r\n <h2 class=\"gform_submission_error hide_summary\">{{error}}</h2>\r\n </div>\r\n }\r\n\r\n @if (config.title) {\r\n <div class=\"gform_heading\">\r\n <h2 class=\"gform_title\">{{ config.title }}</h2>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <div class=\"gform_fields\">\r\n\r\n @for (field of config.fields; track field.name) {\r\n @if(isFieldVisible(field)) {\r\n\r\n <div class=\"gfield gfield--width-{{field.size}}\" [class.gform_hidden]=\"field.type === 'hidden'\"\r\n [class.gfield_error]=\"formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched\">\r\n\r\n @switch (field.type) {\r\n @case ('textarea') {\r\n <label class=\"gfield_label gform-field-label\" [for]=\"field.name\">{{ getFieldLabel(field) }}</label>\r\n @if(field.description){\r\n <div class=\"gfield_description\">{{field.description}}</div>\r\n }\r\n <div class=\"gfield--input-wrapper ginput_container\">\r\n <textarea [id]=\"field.name\" [formControlName]=\"field.name\" [attr.placeholder]=\"getFieldPlaceholder(field)\"></textarea>\r\n </div>\r\n }\r\n @case ('select') {\r\n <ptr-select [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [options]=\"field.options\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n @default {\r\n <ptr-input [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [type]=\"field.type\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [autocomplete]=\"field.autocomplete\" [searchFn]=\"field.searchFn\"\r\n [dialogHelpText]=\"field.dialogHelpText\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n }\r\n\r\n @if (formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n @if (formGroup.get(field.name)?.errors?.['required']) {\r\n This field is required.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['email']) {\r\n Please enter a valid email address.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['minlength']) {\r\n Minimum length is {{ formGroup.get(field.name)?.errors?.['minlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['maxlength']) {\r\n Maximum length is {{ formGroup.get(field.name)?.errors?.['maxlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['pattern']) {\r\n Please match the required format.\r\n }\r\n </div>\r\n }\r\n @if (field.validationMessages && formGroup.invalid && !formGroup.get(field.name)?.invalid &&\r\n formGroup.get(field.name)?.touched) {\r\n @for (error of formGroup.errors | keyvalue; track error) {\r\n @if (field.validationMessages[error.key]) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n {{ field.validationMessages[error.key] }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n @if(config.submitText){\r\n <div class=\"gform_footer\">\r\n <ptr-button buttonType=\"submit\" [isDisabled]=\"loading || !formGroup.valid\">{{config.submitText}}</ptr-button>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.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: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: PtrButtonComponent, selector: "ptr-button", inputs: ["buttonStyle", "buttonType", "isDisabled", "hrefLink", "routerLinkValue", "extraClasses", "isSmallSize", "isIconButton", "ariaLabel"], outputs: ["clicked"] }, { kind: "component", type: PtrSelectComponent, selector: "ptr-select", inputs: ["options", "showSearch", "placeholder", "label", "description", "labelPosition"], outputs: ["selectionChange"] }, { kind: "component", type: PtrInputComponent, selector: "ptr-input", inputs: ["type", "label", "placeholder", "autocomplete", "description", "dialogHelpText", "searchFn", "labelPosition"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
647
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: PtrFormComponent, isStandalone: true, selector: "ptr-form", inputs: { config: "config", loading: "loading", error: "error" }, outputs: { formSubmit: "formSubmit", formGroupCreated: "formGroupCreated" }, ngImport: i0, template: "<div [class]=\"'gform_wrapper ' + config.formClass\">\r\n\r\n @if (error) {\r\n <div class=\"gform_validation_errors\">\r\n <h2 class=\"gform_submission_error hide_summary\">{{error}}</h2>\r\n </div>\r\n }\r\n\r\n @if (config.title) {\r\n <div class=\"gform_heading\">\r\n <h2 class=\"gform_title\">{{ config.title }}</h2>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <div class=\"gform_fields\">\r\n\r\n @for (field of config.fields; track field.name) {\r\n @if(isFieldVisible(field)) {\r\n\r\n <div class=\"gfield gfield--width-{{field.size}}\" [class.gform_hidden]=\"field.type === 'hidden'\"\r\n [class.gfield_error]=\"formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched\" [class.gfield--label-inline]=\"config.labelPosition === 'inline'\">\r\n\r\n @switch (field.type) {\r\n @case ('textarea') {\r\n <label class=\"gfield_label gform-field-label\" [for]=\"field.name\">{{ getFieldLabel(field) }}</label>\r\n @if(field.description){\r\n <div class=\"gfield_description\">{{field.description}}</div>\r\n }\r\n <div class=\"gfield--input-wrapper ginput_container\">\r\n <textarea [id]=\"field.name\" [formControlName]=\"field.name\" [attr.placeholder]=\"getFieldPlaceholder(field)\"></textarea>\r\n </div>\r\n }\r\n @case ('select') {\r\n <ptr-select [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [options]=\"field.options\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n @default {\r\n <ptr-input [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [type]=\"field.type\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [autocomplete]=\"field.autocomplete\" [searchFn]=\"field.searchFn\"\r\n [dialogHelpText]=\"field.dialogHelpText\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n }\r\n\r\n @if (formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n @if (formGroup.get(field.name)?.errors?.['required']) {\r\n This field is required.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['email']) {\r\n Please enter a valid email address.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['minlength']) {\r\n Minimum length is {{ formGroup.get(field.name)?.errors?.['minlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['maxlength']) {\r\n Maximum length is {{ formGroup.get(field.name)?.errors?.['maxlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['pattern']) {\r\n Please match the required format.\r\n }\r\n </div>\r\n }\r\n @if (field.validationMessages && formGroup.invalid && !formGroup.get(field.name)?.invalid &&\r\n formGroup.get(field.name)?.touched) {\r\n @for (error of formGroup.errors | keyvalue; track error) {\r\n @if (field.validationMessages[error.key]) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n {{ field.validationMessages[error.key] }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n @if(config.submitText){\r\n <div class=\"gform_footer\">\r\n <ptr-button buttonType=\"submit\" [isDisabled]=\"loading || !formGroup.valid\"\r\n [extraClasses]=\"config.submitFullWidth ? 'gform-button--width-full' : ''\">{{config.submitText}}</ptr-button>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.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: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: PtrButtonComponent, selector: "ptr-button", inputs: ["buttonStyle", "buttonType", "isDisabled", "hrefLink", "routerLinkValue", "extraClasses", "isSmallSize", "isIconButton", "ariaLabel"], outputs: ["clicked"] }, { kind: "component", type: PtrSelectComponent, selector: "ptr-select", inputs: ["options", "showSearch", "placeholder", "label", "description", "labelPosition"], outputs: ["selectionChange"] }, { kind: "component", type: PtrInputComponent, selector: "ptr-input", inputs: ["type", "label", "placeholder", "autocomplete", "description", "dialogHelpText", "searchFn", "labelPosition"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
648
648
  }
649
649
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrFormComponent, decorators: [{
650
650
  type: Component,
@@ -654,7 +654,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
654
654
  PtrButtonComponent,
655
655
  PtrSelectComponent,
656
656
  PtrInputComponent
657
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"'gform_wrapper ' + config.formClass\">\r\n\r\n @if (error) {\r\n <div class=\"gform_validation_errors\">\r\n <h2 class=\"gform_submission_error hide_summary\">{{error}}</h2>\r\n </div>\r\n }\r\n\r\n @if (config.title) {\r\n <div class=\"gform_heading\">\r\n <h2 class=\"gform_title\">{{ config.title }}</h2>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <div class=\"gform_fields\">\r\n\r\n @for (field of config.fields; track field.name) {\r\n @if(isFieldVisible(field)) {\r\n\r\n <div class=\"gfield gfield--width-{{field.size}}\" [class.gform_hidden]=\"field.type === 'hidden'\"\r\n [class.gfield_error]=\"formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched\">\r\n\r\n @switch (field.type) {\r\n @case ('textarea') {\r\n <label class=\"gfield_label gform-field-label\" [for]=\"field.name\">{{ getFieldLabel(field) }}</label>\r\n @if(field.description){\r\n <div class=\"gfield_description\">{{field.description}}</div>\r\n }\r\n <div class=\"gfield--input-wrapper ginput_container\">\r\n <textarea [id]=\"field.name\" [formControlName]=\"field.name\" [attr.placeholder]=\"getFieldPlaceholder(field)\"></textarea>\r\n </div>\r\n }\r\n @case ('select') {\r\n <ptr-select [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [options]=\"field.options\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n @default {\r\n <ptr-input [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [type]=\"field.type\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [autocomplete]=\"field.autocomplete\" [searchFn]=\"field.searchFn\"\r\n [dialogHelpText]=\"field.dialogHelpText\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n }\r\n\r\n @if (formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n @if (formGroup.get(field.name)?.errors?.['required']) {\r\n This field is required.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['email']) {\r\n Please enter a valid email address.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['minlength']) {\r\n Minimum length is {{ formGroup.get(field.name)?.errors?.['minlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['maxlength']) {\r\n Maximum length is {{ formGroup.get(field.name)?.errors?.['maxlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['pattern']) {\r\n Please match the required format.\r\n }\r\n </div>\r\n }\r\n @if (field.validationMessages && formGroup.invalid && !formGroup.get(field.name)?.invalid &&\r\n formGroup.get(field.name)?.touched) {\r\n @for (error of formGroup.errors | keyvalue; track error) {\r\n @if (field.validationMessages[error.key]) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n {{ field.validationMessages[error.key] }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n @if(config.submitText){\r\n <div class=\"gform_footer\">\r\n <ptr-button buttonType=\"submit\" [isDisabled]=\"loading || !formGroup.valid\">{{config.submitText}}</ptr-button>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n" }]
657
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"'gform_wrapper ' + config.formClass\">\r\n\r\n @if (error) {\r\n <div class=\"gform_validation_errors\">\r\n <h2 class=\"gform_submission_error hide_summary\">{{error}}</h2>\r\n </div>\r\n }\r\n\r\n @if (config.title) {\r\n <div class=\"gform_heading\">\r\n <h2 class=\"gform_title\">{{ config.title }}</h2>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <div class=\"gform_fields\">\r\n\r\n @for (field of config.fields; track field.name) {\r\n @if(isFieldVisible(field)) {\r\n\r\n <div class=\"gfield gfield--width-{{field.size}}\" [class.gform_hidden]=\"field.type === 'hidden'\"\r\n [class.gfield_error]=\"formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched\" [class.gfield--label-inline]=\"config.labelPosition === 'inline'\">\r\n\r\n @switch (field.type) {\r\n @case ('textarea') {\r\n <label class=\"gfield_label gform-field-label\" [for]=\"field.name\">{{ getFieldLabel(field) }}</label>\r\n @if(field.description){\r\n <div class=\"gfield_description\">{{field.description}}</div>\r\n }\r\n <div class=\"gfield--input-wrapper ginput_container\">\r\n <textarea [id]=\"field.name\" [formControlName]=\"field.name\" [attr.placeholder]=\"getFieldPlaceholder(field)\"></textarea>\r\n </div>\r\n }\r\n @case ('select') {\r\n <ptr-select [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [options]=\"field.options\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n @default {\r\n <ptr-input [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [type]=\"field.type\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [autocomplete]=\"field.autocomplete\" [searchFn]=\"field.searchFn\"\r\n [dialogHelpText]=\"field.dialogHelpText\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n }\r\n\r\n @if (formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n @if (formGroup.get(field.name)?.errors?.['required']) {\r\n This field is required.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['email']) {\r\n Please enter a valid email address.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['minlength']) {\r\n Minimum length is {{ formGroup.get(field.name)?.errors?.['minlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['maxlength']) {\r\n Maximum length is {{ formGroup.get(field.name)?.errors?.['maxlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['pattern']) {\r\n Please match the required format.\r\n }\r\n </div>\r\n }\r\n @if (field.validationMessages && formGroup.invalid && !formGroup.get(field.name)?.invalid &&\r\n formGroup.get(field.name)?.touched) {\r\n @for (error of formGroup.errors | keyvalue; track error) {\r\n @if (field.validationMessages[error.key]) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n {{ field.validationMessages[error.key] }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n @if(config.submitText){\r\n <div class=\"gform_footer\">\r\n <ptr-button buttonType=\"submit\" [isDisabled]=\"loading || !formGroup.valid\"\r\n [extraClasses]=\"config.submitFullWidth ? 'gform-button--width-full' : ''\">{{config.submitText}}</ptr-button>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n" }]
658
658
  }], propDecorators: { config: [{
659
659
  type: Input
660
660
  }], loading: [{
@@ -1021,7 +1021,8 @@ class PtrBreadcrumbsComponent {
1021
1021
  routeUrl += `/${routeURL}`;
1022
1022
  }
1023
1023
  const { label, url } = this.getLabelForRoute(child);
1024
- if (label) {
1024
+ // Skip if the label is undefined or empty and the path is empty
1025
+ if (label && (!breadcrumbs.length || breadcrumbs[breadcrumbs.length - 1].label !== label)) {
1025
1026
  breadcrumbs.push({ label, url: url ?? routeUrl });
1026
1027
  }
1027
1028
  return this.createBreadcrumbs(child, routeUrl, breadcrumbs);
@@ -1139,6 +1140,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
1139
1140
  args: ['tabButton']
1140
1141
  }] } });
1141
1142
 
1143
+ class PtrToasterService {
1144
+ destroyRef = inject(DestroyRef);
1145
+ injector = inject(Injector);
1146
+ environmentInjector = inject(EnvironmentInjector);
1147
+ appRef = inject(ApplicationRef);
1148
+ toasts = signal([]);
1149
+ counter = 0;
1150
+ toasterComponentRef = null;
1151
+ constructor() {
1152
+ this.injectToasterComponent();
1153
+ }
1154
+ injectToasterComponent() {
1155
+ if (this.toasterComponentRef) {
1156
+ return;
1157
+ }
1158
+ Promise.resolve().then(function () { return ptrToaster_component; }).then(module => {
1159
+ this.toasterComponentRef = createComponent(module.PtrToasterComponent, {
1160
+ environmentInjector: this.environmentInjector,
1161
+ elementInjector: this.injector
1162
+ });
1163
+ const domElem = this.toasterComponentRef.location.nativeElement;
1164
+ document.body.appendChild(domElem);
1165
+ this.appRef.attachView(this.toasterComponentRef.hostView);
1166
+ });
1167
+ }
1168
+ getToasts() {
1169
+ return this.toasts.asReadonly();
1170
+ }
1171
+ show(message, type = 'info') {
1172
+ const id = this.counter++;
1173
+ this.toasts.update(toasts => [...toasts, { id, message, type }]);
1174
+ timer(10000)
1175
+ .pipe(takeUntilDestroyed(this.destroyRef))
1176
+ .subscribe(() => this.remove(id));
1177
+ }
1178
+ remove(id) {
1179
+ this.toasts.update(toasts => toasts.filter(t => t.id !== id));
1180
+ }
1181
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrToasterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1182
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrToasterService, providedIn: 'root' });
1183
+ }
1184
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrToasterService, decorators: [{
1185
+ type: Injectable,
1186
+ args: [{
1187
+ providedIn: 'root'
1188
+ }]
1189
+ }], ctorParameters: () => [] });
1190
+
1191
+ class PtrToasterComponent {
1192
+ toasterService = inject(PtrToasterService);
1193
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrToasterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1194
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: PtrToasterComponent, isStandalone: true, selector: "ptr-toaster", ngImport: i0, template: "<div class=\"toaster-container\" aria-live=\"polite\" aria-atomic=\"true\">\r\n @for (toast of toasterService.getToasts()(); track toast.id) {\r\n <div class=\"toast\" [ngClass]=\"toast.type\" role=\"alert\">\r\n <span>{{toast.message}}</span>\r\n <button (click)=\"toasterService.remove(toast.id)\" aria-label=\"Close\"><span>&times;</span></button>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".toaster-container{position:fixed;top:20px;right:20px;z-index:1000}.toast{padding:10px 20px;margin-bottom:10px;border-radius:calc(var(--wp--custom--default-border-radius) / 2);color:#fff;display:flex;justify-content:space-between;align-items:center;gap:1rem}.success{background-color:var(--wp--preset--color--primary, #28a745)}.error{background-color:var(--wp--custom--color--error, #dc3545)}.info{background-color:var(--wp--preset--color--secondary, #17a2b8)}.warning{background-color:var(--wp--preset--color--secondary, #ffc107)}button{background:none;border:none;color:inherit;font-size:2em;cursor:pointer;font-family:monospace}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1195
+ }
1196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: PtrToasterComponent, decorators: [{
1197
+ type: Component,
1198
+ args: [{ selector: 'ptr-toaster', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"toaster-container\" aria-live=\"polite\" aria-atomic=\"true\">\r\n @for (toast of toasterService.getToasts()(); track toast.id) {\r\n <div class=\"toast\" [ngClass]=\"toast.type\" role=\"alert\">\r\n <span>{{toast.message}}</span>\r\n <button (click)=\"toasterService.remove(toast.id)\" aria-label=\"Close\"><span>&times;</span></button>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".toaster-container{position:fixed;top:20px;right:20px;z-index:1000}.toast{padding:10px 20px;margin-bottom:10px;border-radius:calc(var(--wp--custom--default-border-radius) / 2);color:#fff;display:flex;justify-content:space-between;align-items:center;gap:1rem}.success{background-color:var(--wp--preset--color--primary, #28a745)}.error{background-color:var(--wp--custom--color--error, #dc3545)}.info{background-color:var(--wp--preset--color--secondary, #17a2b8)}.warning{background-color:var(--wp--preset--color--secondary, #ffc107)}button{background:none;border:none;color:inherit;font-size:2em;cursor:pointer;font-family:monospace}\n"] }]
1199
+ }] });
1200
+
1201
+ var ptrToaster_component = /*#__PURE__*/Object.freeze({
1202
+ __proto__: null,
1203
+ PtrToasterComponent: PtrToasterComponent
1204
+ });
1205
+
1142
1206
  /*
1143
1207
  * Public API Surface of ngx-components
1144
1208
  */
@@ -1147,5 +1211,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
1147
1211
  * Generated bundle index. Do not edit.
1148
1212
  */
1149
1213
 
1150
- export { PtrBreadcrumbsComponent, PtrButtonComponent, PtrDialogComponent, PtrDialogService, PtrFormComponent, PtrInputComponent, PtrLoadingService, PtrLoadingSpinnerComponent, PtrLoadingSpinnerDirective, PtrMenuComponent, PtrSelectComponent, PtrTabComponent, PtrTabsComponent, PtrTitleComponent, PtrTooltipComponent };
1214
+ export { PtrBreadcrumbsComponent, PtrButtonComponent, PtrDialogComponent, PtrDialogService, PtrFormComponent, PtrInputComponent, PtrLoadingService, PtrLoadingSpinnerComponent, PtrLoadingSpinnerDirective, PtrMenuComponent, PtrSelectComponent, PtrTabComponent, PtrTabsComponent, PtrTitleComponent, PtrToasterComponent, PtrToasterService, PtrTooltipComponent };
1151
1215
  //# sourceMappingURL=patter-ngx-components.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"patter-ngx-components.mjs","sources":["../../../../projects/patter/ngx-components/src/lib/menu/menu.component.ts","../../../../projects/patter/ngx-components/src/lib/menu/menu.component.html","../../../../projects/patter/ngx-components/src/lib/ptr-button/ptr-button.component.ts","../../../../projects/patter/ngx-components/src/lib/ptr-button/ptr-button.component.html","../../../../projects/patter/ngx-components/src/lib/forms/shared/ptr-dialog-list/ptr-dialog-list.component.ts","../../../../projects/patter/ngx-components/src/lib/forms/shared/ptr-dialog-list/ptr-dialog-list.component.html","../../../../projects/patter/ngx-components/src/lib/forms/input/select/select.component.ts","../../../../projects/patter/ngx-components/src/lib/forms/input/select/select.component.html","../../../../projects/patter/ngx-components/src/lib/forms/input/ptr-input/ptr-input.component.ts","../../../../projects/patter/ngx-components/src/lib/forms/input/ptr-input/ptr-input.component.html","../../../../projects/patter/ngx-components/src/lib/forms/form/form.component.ts","../../../../projects/patter/ngx-components/src/lib/forms/form/form.component.html","../../../../projects/patter/ngx-components/src/lib/ptr-title/ptr-title.component.ts","../../../../projects/patter/ngx-components/src/lib/ptr-title/ptr-title.component.html","../../../../projects/patter/ngx-components/src/lib/loading-spinner/loading-spinner.component.ts","../../../../projects/patter/ngx-components/src/lib/loading-spinner/loading-spinner.directive.ts","../../../../projects/patter/ngx-components/src/lib/services/loading.service.ts","../../../../projects/patter/ngx-components/src/lib/dialog/ptr-dialog/ptr-dialog.component.ts","../../../../projects/patter/ngx-components/src/lib/dialog/ptr-dialog/ptr-dialog.component.html","../../../../projects/patter/ngx-components/src/lib/dialog/ptr-dialog.service.ts","../../../../projects/patter/ngx-components/src/lib/dialog/ptr-tooltip/ptr-tooltip.component.ts","../../../../projects/patter/ngx-components/src/lib/dialog/ptr-tooltip/ptr-tooltip.component.html","../../../../projects/patter/ngx-components/src/lib/ptr-breadcrumbs/ptr-breadcrumbs.component.ts","../../../../projects/patter/ngx-components/src/lib/ptr-breadcrumbs/ptr-breadcrumbs.component.html","../../../../projects/patter/ngx-components/src/lib/components/tabs/ptr-tab/ptr-tab.component.ts","../../../../projects/patter/ngx-components/src/lib/components/tabs/ptr-tabs/ptr-tabs.component.ts","../../../../projects/patter/ngx-components/src/lib/components/tabs/ptr-tabs/ptr-tabs.component.html","../../../../projects/patter/ngx-components/src/public-api.ts","../../../../projects/patter/ngx-components/src/patter-ngx-components.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\n\r\nexport interface PtrMenuItem {\r\n label: string;\r\n link?: string;\r\n children?: PtrMenuItem[];\r\n}\r\n\r\n@Component({\r\n selector: 'ptr-menu',\r\n standalone: true,\r\n imports: [RouterModule],\r\n templateUrl: './menu.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./menu.component.scss']\r\n})\r\nexport class PtrMenuComponent {\r\n\r\n @Input() menuItems: PtrMenuItem[] = [];\r\n\r\n}\r\n","<nav class=\"ptr-menu\">\n <ul class=\"menu\">\n @for (item of menuItems; track item.label) {\n <li class=\"menu-item\" routerLinkActive=\"current_page_item\" [routerLinkActiveOptions]=\"{exact: true}\">\n <a [routerLink]=\"item.link || '#'\">{{item.label}}</a>\n </li>\n }\n </ul>\n</nav>\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, computed, EventEmitter, HostBinding, Input, Output, signal } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\n\r\ntype ButtonStyle = 'normal' | 'error' | 'secondary' | 'icon';\r\n\r\n@Component({\r\n selector: 'ptr-button',\r\n standalone: true,\r\n imports: [CommonModule, RouterLink],\r\n templateUrl: './ptr-button.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrButtonComponent {\r\n\r\n @HostBinding('class') get hostClasses() {\r\n const hostClass = [];\r\n if (this.style() === 'secondary') {\r\n hostClass.push('is-style-outline');\r\n }\r\n if (this.style() === 'error') {\r\n hostClass.push('is-style-error-button');\r\n }\r\n if (this.style() === 'icon') {\r\n hostClass.push('is-style-icon-button');\r\n }\r\n if (this.smallSize()) {\r\n hostClass.push('is-style-smaller-element');\r\n }\r\n return hostClass.join(' ');\r\n }\r\n\r\n style = signal<ButtonStyle>('normal');\r\n type = signal<'button' | 'submit' | 'reset'>('button');\r\n disabled = signal(false);\r\n href = signal<string | null>(null);\r\n routerLink = signal<string | (string|number)[] | null>(null);\r\n additionalClasses = signal('');\r\n smallSize = signal(false);\r\n\r\n @Input() set buttonStyle(value: ButtonStyle) {\r\n this.style.set(value);\r\n }\r\n\r\n @Input() set buttonType(value: 'button' | 'submit' | 'reset') {\r\n this.type.set(value);\r\n }\r\n\r\n @Input() set isDisabled(value: boolean) {\r\n this.disabled.set(value);\r\n }\r\n\r\n @Input() set hrefLink(value: string | null) {\r\n this.href.set(value);\r\n }\r\n\r\n @Input() set routerLinkValue(value: string | (string|number)[] | null) {\r\n this.routerLink.set(value);\r\n }\r\n\r\n @Input() set extraClasses(value: string) {\r\n this.additionalClasses.set(value);\r\n }\r\n\r\n @Input() set isSmallSize(value: boolean) {\r\n if (value) {\r\n this.smallSize.set(true);\r\n }\r\n }\r\n\r\n @Input() set isIconButton(value: boolean) {\r\n if (value) {\r\n this.style.set('icon');\r\n }\r\n }\r\n\r\n @Input() ariaLabel? = '';\r\n\r\n @Output() clicked = new EventEmitter<Event>();\r\n\r\n isLink = computed(() => !!this.href() || !!this.routerLink());\r\n\r\n buttonClasses = computed(() => {\r\n const classes = ['wp-block-button__link'];\r\n\r\n if (this.style() !== 'normal') {\r\n classes.push(`wp-block-button__link--${this.style()}`);\r\n }\r\n\r\n if (this.disabled() && this.isLink()) {\r\n classes.push('disabled');\r\n }\r\n\r\n if (this.additionalClasses()) {\r\n classes.push(this.additionalClasses());\r\n }\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n onClick(event: Event): void {\r\n if (this.disabled()) {\r\n event.preventDefault();\r\n return;\r\n }\r\n this.clicked.emit(event);\r\n }\r\n\r\n}\r\n","<ng-template #contentTpl>\r\n <ng-content></ng-content>\r\n</ng-template>\r\n\r\n@if (isLink()) {\r\n<a [attr.href]=\"href()\" [routerLink]=\"routerLink()\" [class]=\"buttonClasses()\" [attr.disabled]=\"disabled() ? '' : null\"\r\n (click)=\"onClick($event)\" [attr.aria-label]=\"ariaLabel ?? null\">\r\n <ng-container [ngTemplateOutlet]=\"contentTpl\"></ng-container>\r\n</a>\r\n} @else {\r\n<button [type]=\"type()\" [class]=\"buttonClasses()\" [disabled]=\"disabled()\" (click)=\"onClick($event)\"\r\n [attr.aria-label]=\"ariaLabel ?? null\">\r\n <ng-container [ngTemplateOutlet]=\"contentTpl\"></ng-container>\r\n</button>\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, ElementRef, EventEmitter, Input, Output, signal, ViewChild } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { PtrOption, PtrOptionGroup } from '../../interfaces';\r\n\r\ninterface ProcessedOption {\r\n type: 'option' | 'group';\r\n label: string;\r\n value?: string;\r\n options?: ProcessedOption[];\r\n}\r\n\r\n@Component({\r\n selector: 'ptr-dialog-list',\r\n standalone: true,\r\n imports: [\r\n FormsModule\r\n ],\r\n templateUrl: './ptr-dialog-list.component.html',\r\n styleUrls: ['./ptr-dialog-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrDialogListComponent {\r\n\r\n @Input() set options(value: (PtrOption | PtrOptionGroup | string)[] | undefined) {\r\n this._options.set(this.processOptions(value));\r\n }\r\n @Input() showSearch = false;\r\n @Input() searchPlaceholder = 'Search...';\r\n @Input() dialogTitle? = '';\r\n\r\n @Output() selectionChange = new EventEmitter<string | null>();\r\n @Output() dialogClosed = new EventEmitter<void>();\r\n @Output() searchTermChanged = new EventEmitter<string>();\r\n\r\n @ViewChild('dialog') dialog!: ElementRef<HTMLDialogElement>;\r\n\r\n private _options = signal<ProcessedOption[]>([]);\r\n value = signal<string | null>(null);\r\n searchTerm = signal('');\r\n highlightedIndex = signal(-1);\r\n isOpen = signal(false);\r\n private componentId = Math.random().toString(36).substring(2);\r\n listId = `${this.componentId}-list`;\r\n\r\n filteredOptions = computed(() => {\r\n const term = this.searchTerm().toLowerCase();\r\n return this._options().flatMap(item => {\r\n if (item.type === 'group') {\r\n const filteredOptions = item.options!.filter(option =>\r\n option.label.toLowerCase().includes(term)\r\n );\r\n return filteredOptions.length > 0 ? [{ ...item, options: filteredOptions }] : [];\r\n } else {\r\n return item.label.toLowerCase().includes(term) ? [item] : [];\r\n }\r\n });\r\n });\r\n\r\n openDialog() {\r\n this.dialog.nativeElement.show();\r\n this.adjustDialogPosition();\r\n this.isOpen.set(true);\r\n }\r\n\r\n openDialogSilent() {\r\n this.dialog.nativeElement.setAttribute('open', 'true');\r\n this.adjustDialogPosition();\r\n this.isOpen.set(true);\r\n }\r\n\r\n closeDialog() {\r\n this.dialog.nativeElement.close();\r\n this.isOpen.set(false);\r\n this.searchTerm.set('');\r\n this.highlightedIndex.set(-1);\r\n this.dialogClosed.emit();\r\n this.resetDialogPosition();\r\n }\r\n\r\n updateSearchTerm(term: string) {\r\n this.searchTerm.set(term);\r\n this.highlightedIndex.set(-1);\r\n this.searchTermChanged.emit(term);\r\n }\r\n\r\n onDialogKeyDown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n this.closeDialog();\r\n event.preventDefault();\r\n }\r\n\r\n // When there is no search input and there are options, move input into the first option\r\n if (!this.showSearch && this.filteredOptions().length > 0 && this.highlightedIndex() === -1) {\r\n if (event.key === 'Tab' || event.key === 'ArrowDown') {\r\n this.highlightedIndex.update(i => Math.min(i + 1, this.getTotalOptionsCount() - 1));\r\n this.focusOption();\r\n event.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n onInputKeyDown(event: KeyboardEvent) {\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n this.highlightedIndex.update(i => Math.min(i + 1, this.getTotalOptionsCount() - 1));\r\n this.focusOption();\r\n event.preventDefault();\r\n break;\r\n case 'Escape':\r\n this.closeDialog();\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n onOptionKeyDown(event: KeyboardEvent, optionValue: string) {\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n this.highlightedIndex.update(i => Math.min(i + 1, this.getTotalOptionsCount() - 1));\r\n this.focusOption();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowUp':\r\n this.highlightedIndex.update(i => Math.max(i - 1, -1));\r\n this.focusOption();\r\n event.preventDefault();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n this.selectOption(optionValue);\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n focusOption() {\r\n if (this.highlightedIndex() >= 0) {\r\n const options = this.dialog.nativeElement.querySelectorAll('li[role=\"option\"]');\r\n (options[this.highlightedIndex()] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n selectOption(optionValue: string) {\r\n this.value.set(optionValue);\r\n this.selectionChange.emit(optionValue);\r\n this.closeDialog();\r\n }\r\n\r\n private getTotalOptionsCount(): number {\r\n return this.filteredOptions().reduce((count, item) => {\r\n if (item.type === 'group') {\r\n return count + item.options!.length;\r\n }\r\n return count + 1;\r\n }, 0);\r\n }\r\n\r\n private processOptions(options: (PtrOption | PtrOptionGroup | string)[] | undefined): ProcessedOption[] {\r\n if (!options) return [];\r\n return options.map(option => {\r\n if (typeof option === 'string') {\r\n return {\r\n type: 'option',\r\n label: option,\r\n value: option\r\n };\r\n } else if ('groupLabel' in option) {\r\n return {\r\n type: 'group',\r\n label: option.groupLabel,\r\n options: option.options.map(subOption => ({\r\n type: 'option',\r\n label: typeof subOption === 'string' ? subOption : subOption.label,\r\n value: typeof subOption === 'string' ? subOption : subOption.value\r\n }))\r\n };\r\n } else {\r\n return {\r\n type: 'option',\r\n label: option.label,\r\n value: option.value\r\n };\r\n }\r\n });\r\n }\r\n\r\n adjustDialogPosition() {\r\n const dialogRect = this.dialog.nativeElement.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n const spaceBelow = viewportHeight - dialogRect.bottom;\r\n if (spaceBelow > 0) {\r\n this.dialog.nativeElement.style.top = '100%';\r\n } else {\r\n this.dialog.nativeElement.style.bottom = '100%';\r\n }\r\n }\r\n\r\n resetDialogPosition() {\r\n this.dialog.nativeElement.style.top = '';\r\n this.dialog.nativeElement.style.bottom = '';\r\n }\r\n\r\n}\r\n","<dialog #dialog class=\"ptr-dialog-list\" (keydown)=\"onDialogKeyDown($event)\" [attr.aria-label]=\"'Options'\">\r\n\r\n @if(dialogTitle) {\r\n <p class=\"dialog-title\">{{dialogTitle}}</p>\r\n }\r\n\r\n @if (showSearch) {\r\n <div>\r\n <input #searchInput [ngModel]=\"searchTerm()\" (ngModelChange)=\"updateSearchTerm($event)\"\r\n [attr.aria-expanded]=\"isOpen()\" [attr.aria-owns]=\"listId\" (keydown)=\"onInputKeyDown($event)\"\r\n [attr.aria-autocomplete]=\"'list'\" role=\"combobox\" [attr.aria-controls]=\"listId\" [placeholder]=\"searchPlaceholder\"\r\n class=\"search-input\">\r\n </div>\r\n }\r\n\r\n <ul [attr.id]=\"listId\" role=\"listbox\" class=\"option-list\">\r\n @for (item of filteredOptions(); track item.label) {\r\n @if (item.type === 'option') {\r\n <li role=\"option\" [attr.id]=\"item.value\" [attr.aria-selected]=\"item.value === value()\"\r\n [class.selected]=\"item.value === value()\" [class.highlighted]=\"item === filteredOptions()[highlightedIndex()]\"\r\n (click)=\"selectOption(item.value!)\" (keydown)=\"onOptionKeyDown($event, item.value!)\"\r\n [attr.tabindex]=\"item === filteredOptions()[highlightedIndex()] ? 0 : -1\">\r\n {{ item.label }}\r\n </li>\r\n } @else {\r\n <li role=\"group\" [attr.aria-label]=\"item.label\">\r\n {{ item.label }}\r\n </li>\r\n @for (option of item.options!; track option.value) {\r\n <li role=\"option\" [attr.id]=\"option.value\" [attr.aria-selected]=\"option.value === value()\"\r\n [class.selected]=\"option.value === value()\" [class.highlighted]=\"option === filteredOptions()[highlightedIndex()]\"\r\n (click)=\"selectOption(option.value!)\" (keydown)=\"onOptionKeyDown($event, option.value!)\"\r\n [attr.tabindex]=\"option === filteredOptions()[highlightedIndex()] ? 0 : -1\">\r\n {{ option.label }}\r\n </li>\r\n }\r\n }\r\n }\r\n </ul>\r\n\r\n</dialog>\r\n","/* eslint-disable @typescript-eslint/no-empty-function */\r\nimport { ChangeDetectionStrategy, Component, computed, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, signal, ViewChild } from '@angular/core';\r\nimport { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\r\nimport { PtrOption, PtrOptionGroup } from '../../interfaces';\r\nimport { PtrDialogListComponent } from '../../shared/ptr-dialog-list/ptr-dialog-list.component';\r\n\r\n@Component({\r\n selector: 'ptr-select',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n PtrDialogListComponent\r\n ],\r\n templateUrl: './select.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./select.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PtrSelectComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class PtrSelectComponent {\r\n\r\n @Input() options: (PtrOption | PtrOptionGroup | string)[] | undefined;\r\n @Input() showSearch = true;\r\n @Input() placeholder?: string | null = 'Select an option';\r\n @Input() label? = '';\r\n @Input() description? = '';\r\n @Input() labelPosition?: 'top' | 'inline' = 'top';\r\n\r\n @Output() selectionChange = new EventEmitter<string | null>();\r\n\r\n @ViewChild('selectButton') selectButton!: ElementRef<HTMLButtonElement>;\r\n @ViewChild('dialogList') dialogList!: PtrDialogListComponent;\r\n\r\n value = signal<string | null>(null);\r\n\r\n displayValue = computed(() => {\r\n const currentValue = this.value();\r\n if (currentValue === null) return null;\r\n const allOptions = this.flattenOptions(this.options);\r\n const selectedOption = allOptions?.find(option => option.value === currentValue);\r\n return selectedOption ? selectedOption.label : null;\r\n });\r\n\r\n effectivePlaceholder = computed(() => {\r\n return this.placeholder ?? 'Select an option';\r\n });\r\n\r\n private componentId = Math.random().toString(36).substring(2);\r\n labelId = `${this.componentId}-label`;\r\n inputId = `${this.componentId}-input`;\r\n\r\n onChange: (value: string | null) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (!this.dialogList.dialog.nativeElement.contains(event.target as Node) &&\r\n !(event.target as HTMLElement).closest('.select-button') &&\r\n this.dialogList.isOpen()) {\r\n this.dialogList.closeDialog();\r\n }\r\n }\r\n\r\n toggleDialog() {\r\n if (this.dialogList.isOpen()) {\r\n this.dialogList.closeDialog();\r\n } else {\r\n this.dialogList.openDialog();\r\n }\r\n }\r\n\r\n onOptionSelected(optionValue: string | null) {\r\n this.value.set(optionValue);\r\n this.onChange(optionValue);\r\n this.onTouched();\r\n this.selectionChange.emit(optionValue);\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n if (this.selectButton?.nativeElement) {\r\n this.selectButton.nativeElement.disabled = isDisabled;\r\n }\r\n }\r\n\r\n private flattenOptions(options: (PtrOption | PtrOptionGroup | string)[] | undefined): PtrOption[] {\r\n if (!options) return [];\r\n\r\n return options.flatMap(option => {\r\n if (typeof option === 'string') {\r\n return { value: option, label: option };\r\n } else if ('groupLabel' in option) {\r\n return option.options;\r\n } else {\r\n return option;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","<label class=\"gfield_label gform-field-label\" [attr.for]=\"inputId\"\r\n [class.gfield--input-wrapper--label-inline]=\"labelPosition === 'inline'\">{{ label }}</label>\r\n@if(description){\r\n<div class=\"gfield_description\">{{description}}</div>\r\n}\r\n<div class=\"gfield--input-wrapper ginput_container\"\r\n [class.gfield--input-wrapper--label-inline]=\"labelPosition === 'inline'\">\r\n\r\n <button #selectButton type=\"button\" class=\"select-button\" [attr.id]=\"inputId\" [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-expanded]=\"dialogList.isOpen()\" [attr.aria-labelledby]=\"labelId\" (click)=\"toggleDialog()\">\r\n <span [attr.id]=\"labelId\">@if (displayValue(); as dValue) { {{dValue}} } @else { {{effectivePlaceholder()}} }</span>\r\n </button>\r\n\r\n @if (labelPosition === 'inline') {\r\n <fieldset aria-hidden=\"true\" class=\"input-fieldset\">\r\n <legend class=\"input-legend gfield_label gform-field-label gform-field-label--hidden\">\r\n <span>{{label}}</span>\r\n </legend>\r\n </fieldset>\r\n }\r\n\r\n <ptr-dialog-list #dialogList [options]=\"options\" (selectionChange)=\"onOptionSelected($event)\"\r\n [showSearch]=\"showSearch\" />\r\n\r\n</div>\r\n","/* eslint-disable @typescript-eslint/no-empty-function */\r\nimport { ChangeDetectionStrategy, Component, ElementRef, forwardRef, HostListener, Input, OnInit, signal, ViewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\r\nimport { PtrDialogListComponent } from '../../shared/ptr-dialog-list/ptr-dialog-list.component';\r\nimport { debounceTime, distinctUntilChanged, Observable, of, Subject, switchMap } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ptr-input',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n PtrDialogListComponent\r\n ],\r\n templateUrl: './ptr-input.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PtrInputComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class PtrInputComponent implements ControlValueAccessor, OnInit {\r\n\r\n @Input() type: 'text' | 'number' | 'email' | 'password' | 'search' | 'hidden' | 'date' = 'text';\r\n @Input() label = '';\r\n @Input() placeholder?: string | null = '';\r\n @Input() autocomplete? = '';\r\n @Input() description? = '';\r\n @Input() dialogHelpText? = '';\r\n @Input() searchFn?: (term: string) => Observable<string[]>;\r\n @Input() labelPosition?: 'top' | 'inline' = 'top';\r\n\r\n @ViewChild('input') input!: ElementRef<HTMLInputElement>;\r\n @ViewChild('dialogList') dialogList!: PtrDialogListComponent;\r\n\r\n private componentId = Math.random().toString(36).substring(2);\r\n private minChars = 3;\r\n private searchTerms = new Subject<string>();\r\n private hasSelectedOption = false;\r\n\r\n inputId = `${this.componentId}-input`;\r\n inputValue = signal('');\r\n searchResultOptions = signal<string[]>([]);\r\n onChange: (value: string) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (this.searchFn) {\r\n if (!this.dialogList?.dialog.nativeElement.contains(event.target as Node) && this.dialogList?.isOpen()) {\r\n this.dialogList.closeDialog();\r\n }\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setupSearch();\r\n }\r\n\r\n private setupSearch() {\r\n if (this.searchFn) {\r\n this.searchTerms.pipe(\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n switchMap(term => term.length >= this.minChars ? this.searchFn!(term) : of([]))\r\n ).subscribe(results => {\r\n this.searchResultOptions.set(results);\r\n if (results.length > 0 && this.dialogList) {\r\n this.dialogList.openDialogSilent();\r\n } else {\r\n this.dialogList.closeDialog();\r\n }\r\n });\r\n }\r\n }\r\n\r\n onInputChange(value: string) {\r\n this.inputValue.set(value);\r\n this.onChange(value);\r\n if (!this.hasSelectedOption && this.searchFn && value.length >= this.minChars) {\r\n this.searchTerms.next(value);\r\n }\r\n this.hasSelectedOption = false;\r\n }\r\n\r\n onOptionSelected(optionValue: string | null) {\r\n this.hasSelectedOption = true;\r\n\r\n this.inputValue.set(optionValue ?? '');\r\n this.onChange(optionValue ?? '');\r\n if (this.dialogList) {\r\n this.dialogList.closeDialog();\r\n }\r\n }\r\n\r\n onFocus() {\r\n if (this.searchResultOptions().length > 0 && this.dialogList && !this.hasSelectedOption) {\r\n this.dialogList.openDialogSilent();\r\n }\r\n }\r\n\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.inputValue.set(value ?? '');\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n if (this.input?.nativeElement) {\r\n this.input.nativeElement.disabled = isDisabled;\r\n }\r\n }\r\n\r\n}\r\n","<label class=\"gfield_label gform-field-label\" [attr.for]=\"inputId\"\r\n [class.gfield--input-wrapper--label-inline]=\"labelPosition === 'inline'\">{{ label }}</label>\r\n@if(description){\r\n <div class=\"gfield_description\">{{description}}</div>\r\n}\r\n<div class=\"gfield--input-wrapper ginput_container\"\r\n [class.gfield--input-wrapper--label-inline]=\"labelPosition === 'inline'\">\r\n\r\n <input #input [id]=\"inputId\" [type]=\"type\" [attr.autocomplete]=\"autocomplete || null\"\r\n [attr.placeholder]=\"placeholder || null\" [ngModel]=\"inputValue()\" (ngModelChange)=\"onInputChange($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" />\r\n\r\n @if (labelPosition === 'inline') {\r\n <fieldset aria-hidden=\"true\" class=\"input-fieldset\">\r\n <legend class=\"input-legend gfield_label gform-field-label gform-field-label--hidden\">\r\n <span>{{label}}</span>\r\n </legend>\r\n </fieldset>\r\n }\r\n\r\n @if (searchFn) {\r\n <ptr-dialog-list #dialogList [options]=\"searchResultOptions()\" (selectionChange)=\"onOptionSelected($event)\"\r\n [dialogTitle]=\"dialogHelpText\" />\r\n }\r\n\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, EventEmitter, inject, Input, OnInit, Output } from '@angular/core';\r\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { PtrConditionalRule, PtrFormConfig, PtrFormField } from '../interfaces';\r\nimport { PtrButtonComponent } from '../../ptr-button/ptr-button.component';\r\nimport { PtrSelectComponent } from \"../input/select/select.component\";\r\nimport { PtrInputComponent } from '../input/ptr-input/ptr-input.component';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n@Component({\r\n selector: 'ptr-form',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n\r\n PtrButtonComponent,\r\n\r\n PtrSelectComponent,\r\n PtrInputComponent\r\n ],\r\n templateUrl: './form.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrFormComponent implements OnInit {\r\n\r\n @Input() config!: PtrFormConfig;\r\n @Input() loading = false;\r\n @Input() error: string | null = null;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n @Output() formSubmit = new EventEmitter<any>();\r\n @Output() formGroupCreated = new EventEmitter<FormGroup>();\r\n\r\n formGroup!: FormGroup;\r\n\r\n private fb = inject(FormBuilder);\r\n private cdr = inject(ChangeDetectorRef);\r\n private destroyRef = inject(DestroyRef);\r\n\r\n ngOnInit(): void {\r\n this.buildForm();\r\n this.formGroupCreated.emit(this.formGroup);\r\n this.setupConditionalLogic();\r\n }\r\n\r\n buildForm(): void {\r\n const group: Record<string, unknown> = {};\r\n this.config.fields.forEach(field => {\r\n group[field.name] = [field.value || '', field.validators || []];\r\n });\r\n\r\n this.formGroup = this.fb.group(group, this.config.formValidators ? { validators: this.config.formValidators } : null);\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.formGroup.valid) {\r\n this.formSubmit.emit(this.formGroup.value);\r\n }\r\n }\r\n\r\n public resetForm(): void {\r\n this.formGroup.reset();\r\n this.config.fields.forEach(field => {\r\n const control = this.formGroup.get(field.name);\r\n control?.setValue(field.value || '', { emitEvent: false });\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // Conditional logic\r\n setupConditionalLogic(): void {\r\n this.formGroup.valueChanges.pipe(\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe(() => {\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n isFieldVisible(field: PtrFormField): boolean {\r\n if (!field.conditional?.showWhen) return true;\r\n return this.evaluateConditionalRules(field.conditional.showWhen) as boolean;\r\n }\r\n\r\n getFieldLabel(field: PtrFormField): string {\r\n if (!field.conditional?.label) return field.label;\r\n const conditionalLabel = this.evaluateConditionalRules(field.conditional.label);\r\n return conditionalLabel as string || field.label;\r\n }\r\n\r\n getFieldPlaceholder(field: PtrFormField): string | null {\r\n if (!field.conditional?.placeholder) return field.placeholder || null;\r\n const conditionalPlaceholder = this.evaluateConditionalRules(field.conditional.placeholder);\r\n return conditionalPlaceholder as string || field.placeholder || null;\r\n }\r\n\r\n private evaluateConditionalRules(rules: PtrConditionalRule[]): string | boolean {\r\n for (const rule of rules) {\r\n const fieldValue = this.formGroup.get(rule.field)?.value;\r\n if (fieldValue === rule.value) {\r\n return rule.result;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n}\r\n","<div [class]=\"'gform_wrapper ' + config.formClass\">\r\n\r\n @if (error) {\r\n <div class=\"gform_validation_errors\">\r\n <h2 class=\"gform_submission_error hide_summary\">{{error}}</h2>\r\n </div>\r\n }\r\n\r\n @if (config.title) {\r\n <div class=\"gform_heading\">\r\n <h2 class=\"gform_title\">{{ config.title }}</h2>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <div class=\"gform_fields\">\r\n\r\n @for (field of config.fields; track field.name) {\r\n @if(isFieldVisible(field)) {\r\n\r\n <div class=\"gfield gfield--width-{{field.size}}\" [class.gform_hidden]=\"field.type === 'hidden'\"\r\n [class.gfield_error]=\"formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched\">\r\n\r\n @switch (field.type) {\r\n @case ('textarea') {\r\n <label class=\"gfield_label gform-field-label\" [for]=\"field.name\">{{ getFieldLabel(field) }}</label>\r\n @if(field.description){\r\n <div class=\"gfield_description\">{{field.description}}</div>\r\n }\r\n <div class=\"gfield--input-wrapper ginput_container\">\r\n <textarea [id]=\"field.name\" [formControlName]=\"field.name\" [attr.placeholder]=\"getFieldPlaceholder(field)\"></textarea>\r\n </div>\r\n }\r\n @case ('select') {\r\n <ptr-select [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [options]=\"field.options\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n @default {\r\n <ptr-input [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [type]=\"field.type\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [autocomplete]=\"field.autocomplete\" [searchFn]=\"field.searchFn\"\r\n [dialogHelpText]=\"field.dialogHelpText\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n }\r\n\r\n @if (formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n @if (formGroup.get(field.name)?.errors?.['required']) {\r\n This field is required.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['email']) {\r\n Please enter a valid email address.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['minlength']) {\r\n Minimum length is {{ formGroup.get(field.name)?.errors?.['minlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['maxlength']) {\r\n Maximum length is {{ formGroup.get(field.name)?.errors?.['maxlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['pattern']) {\r\n Please match the required format.\r\n }\r\n </div>\r\n }\r\n @if (field.validationMessages && formGroup.invalid && !formGroup.get(field.name)?.invalid &&\r\n formGroup.get(field.name)?.touched) {\r\n @for (error of formGroup.errors | keyvalue; track error) {\r\n @if (field.validationMessages[error.key]) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n {{ field.validationMessages[error.key] }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n @if(config.submitText){\r\n <div class=\"gform_footer\">\r\n <ptr-button buttonType=\"submit\" [isDisabled]=\"loading || !formGroup.valid\">{{config.submitText}}</ptr-button>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, inject, Input, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, NavigationEnd, Router, TitleStrategy } from '@angular/router';\r\nimport { filter, map, Observable, startWith } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'ptr-title',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ptr-title.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrTitleComponent implements OnInit {\r\n\r\n @Input() styleClass = 'entry-title';\r\n @Input() wrapperStyleClass = '';\r\n @Input() screenReaderOnly = false;\r\n\r\n private router = inject(Router);\r\n private activatedRoute = inject(ActivatedRoute);\r\n private titleStrategy = inject(TitleStrategy);\r\n\r\n displayTitle$!: Observable<string>;\r\n hideTitle$!: Observable<boolean>;\r\n\r\n ngOnInit() {\r\n const routeEvents$ = this.router.events.pipe(\r\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\r\n startWith(null),\r\n map(() => this.getRoute(this.activatedRoute))\r\n );\r\n\r\n this.hideTitle$ = routeEvents$.pipe(\r\n map(route => !!route.snapshot.data['hideTitle'])\r\n );\r\n\r\n this.displayTitle$ = routeEvents$.pipe(\r\n map(route => {\r\n if (route.snapshot.data['hideTitle']) {\r\n return '';\r\n }\r\n // Check for a custom display title in the route data\r\n const customDisplayTitle = route.snapshot.data['displayTitle'];\r\n if (customDisplayTitle) {\r\n return customDisplayTitle;\r\n }\r\n // If no custom display title, use the resolved title from TitleStrategy\r\n const resolvedTitle = this.titleStrategy.getResolvedTitleForRoute(route.snapshot) || '';\r\n return resolvedTitle;\r\n // Remove any common suffix (checking for both ' | ' and ' - ' separators)\r\n // return this.removeCommonSuffix(resolvedTitle);\r\n })\r\n );\r\n }\r\n\r\n private getRoute(route: ActivatedRoute): ActivatedRoute {\r\n while (route.firstChild) {\r\n route = route.firstChild;\r\n }\r\n return route;\r\n }\r\n\r\n}\r\n","@if ((hideTitle$|async) === false) {\r\n @if(wrapperStyleClass) {\r\n <header [class]=\"wrapperStyleClass\" [class.screen-reader-text]=\"screenReaderOnly\">\r\n <h1 [class]=\"styleClass\">{{displayTitle$|async}}</h1>\r\n </header>\r\n } @else {\r\n <h1 [class]=\"styleClass\" [class.screen-reader-text]=\"screenReaderOnly\">{{displayTitle$|async}}</h1>\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ptr-loading-spinner',\r\n standalone: true,\r\n imports: [],\r\n template: `<div class=\"vdx-progress-spinner\"></div>`,\r\n styleUrls: [\"./loading-spinner.component.scss\"],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrLoadingSpinnerComponent { }\r\n","import { ComponentRef, Directive, ElementRef, HostBinding, inject, Input, OnDestroy, Renderer2, ViewContainerRef } from '@angular/core';\r\nimport { PtrLoadingSpinnerComponent } from './loading-spinner.component';\r\n\r\n@Directive({\r\n selector: '[ptrLoadingSpinner]',\r\n standalone: true\r\n})\r\nexport class PtrLoadingSpinnerDirective implements OnDestroy {\r\n\r\n private targetEl = inject(ElementRef);\r\n private viewContainerRef = inject(ViewContainerRef);\r\n private renderer = inject(Renderer2);\r\n\r\n private spinnerInstance?: ComponentRef<PtrLoadingSpinnerComponent>;\r\n private overlay?: HTMLElement;\r\n\r\n @HostBinding('style.position') hostPosition = 'relative';\r\n\r\n @Input({ required: true }) set ptrLoadingSpinner(loading: boolean) {\r\n if (loading) {\r\n this.addBlurEffect();\r\n this.addOverlay();\r\n this.addProgressSpinnerComponent();\r\n } else {\r\n this.removeBlurEffect();\r\n this.removeOverlay();\r\n this.removeProgressSpinnerComponent();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.spinnerInstance?.destroy();\r\n this.removeBlurEffect();\r\n }\r\n\r\n private addProgressSpinnerComponent(): void {\r\n this.spinnerInstance = this.viewContainerRef.createComponent(PtrLoadingSpinnerComponent);\r\n this.overlay?.appendChild(this.spinnerInstance.location.nativeElement);\r\n }\r\n\r\n private removeProgressSpinnerComponent(): void {\r\n this.spinnerInstance?.destroy();\r\n }\r\n\r\n private addOverlay(): void {\r\n this.overlay = this.renderer.createElement('div');\r\n this.renderer.setStyle(this.overlay, 'display', 'flex');\r\n this.renderer.setStyle(this.overlay, 'justify-content', 'center');\r\n this.renderer.setStyle(this.overlay, 'align-items', 'center');\r\n this.renderer.setStyle(this.overlay, 'position', 'absolute');\r\n this.renderer.setStyle(this.overlay, 'top', '0');\r\n this.renderer.setStyle(this.overlay, 'left', '0');\r\n this.renderer.setStyle(this.overlay, 'width', '100%');\r\n this.renderer.setStyle(this.overlay, 'height', '100%');\r\n\r\n this.renderer.appendChild(this.targetEl.nativeElement, this.overlay);\r\n }\r\n\r\n private removeOverlay(): void {\r\n if (this.overlay) {\r\n this.renderer.removeChild(this.targetEl.nativeElement, this.overlay);\r\n this.overlay = undefined;\r\n }\r\n }\r\n\r\n private addBlurEffect(): void {\r\n const style = this.renderer.createElement('style');\r\n const blurRule = `\r\n .ptr-loading-blur > *:not(:last-child) {\r\n filter: blur(2px);\r\n transition: filter 0.3s ease;\r\n }\r\n `;\r\n this.renderer.appendChild(style, this.renderer.createText(blurRule));\r\n this.renderer.appendChild(document.head, style);\r\n this.renderer.addClass(this.targetEl.nativeElement, 'ptr-loading-blur');\r\n }\r\n\r\n private removeBlurEffect(): void {\r\n this.renderer.removeClass(this.targetEl.nativeElement, 'ptr-loading-blur');\r\n }\r\n\r\n}\r\n","import { computed, Injectable, signal, Signal } from '@angular/core';\r\n\r\n/**\r\n * Optimized Async Loading Service using Angular Signals\r\n * Supports global loading state and named loading areas with auto-cleanup\r\n *\r\n * To use as a non-singleton service, add to providers array in @Component decorator:\r\n * @Component({\r\n * selector: 'app-example',\r\n * templateUrl: './example.component.html',\r\n * providers: [PtrLoadingService]\r\n * })\r\n *\r\n * Usage:\r\n * Set loading: this.loadingService.setLoading(true)\r\n * - Set loading: this.loadingService.setLoading(true, 'areaName')\r\n * \r\n * - Get loading (template): {{ loadingService.isLoading()() }}\r\n * - Get loading (template): {{ loadingService.isLoading('areaName')() }}\r\n * \r\n * - Get loading (component): this.loadingService.isLoading()()\r\n * - Get loading (component): this.loadingService.isLoading('areaName')()\r\n * \r\n * - React to loading changes: effect(() => console.log('Loading:', this.loadingService.isLoading('areaName')()))\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PtrLoadingService {\r\n\r\n private globalTaskCount = signal(0);\r\n private loadingAreas = new Map<string, ReturnType<typeof signal<number>>>();\r\n\r\n isLoading(area?: string): Signal<boolean> {\r\n if (!area) {\r\n return computed(() => this.globalTaskCount() > 0);\r\n }\r\n\r\n return computed(() => {\r\n const areaSignal = this.loadingAreas.get(area);\r\n return areaSignal ? areaSignal() > 0 : false;\r\n });\r\n }\r\n\r\n setLoading(value: boolean, area?: string): void {\r\n if (!area) {\r\n this.updateTaskCount(this.globalTaskCount, value);\r\n } else {\r\n this.updateNamedAreaLoading(area, value);\r\n }\r\n }\r\n\r\n resetLoading(area?: string): void {\r\n if (!area) {\r\n this.globalTaskCount.set(0);\r\n } else if (this.loadingAreas.has(area)) {\r\n this.loadingAreas.get(area)!.set(0);\r\n this.loadingAreas.delete(area);\r\n }\r\n }\r\n\r\n private updateNamedAreaLoading(area: string, increment: boolean): void {\r\n let areaSignal = this.loadingAreas.get(area);\r\n if (!areaSignal && increment) {\r\n areaSignal = signal(0);\r\n this.loadingAreas.set(area, areaSignal);\r\n }\r\n\r\n if (areaSignal) {\r\n areaSignal.update(count => {\r\n const newCount = increment ? count + 1 : Math.max(0, count - 1);\r\n if (newCount === 0) {\r\n this.loadingAreas.delete(area);\r\n }\r\n return newCount;\r\n });\r\n }\r\n }\r\n\r\n private updateTaskCount(taskCount: ReturnType<typeof signal<number>>, increment: boolean): void {\r\n taskCount.update(count => increment ? count + 1 : Math.max(0, count - 1));\r\n }\r\n\r\n}\r\n","import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, ViewChild, AfterViewInit } from '@angular/core';\r\nimport { PtrButtonComponent } from '../../ptr-button/ptr-button.component';\r\n\r\n@Component({\r\n selector: 'ptr-dialog',\r\n standalone: true,\r\n imports: [\r\n PtrButtonComponent\r\n ],\r\n templateUrl: './ptr-dialog.component.html',\r\n styleUrls: [\"./ptr-dialog.component.scss\"],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrDialogComponent implements AfterViewInit {\r\n\r\n @ViewChild('dialogElement') dialogElement!: ElementRef<HTMLDialogElement>;\r\n\r\n @Input() title = '';\r\n @Input() message = '';\r\n @Input() buttonText = 'Confirm';\r\n @Input() buttonStyle: 'normal' | 'error' | 'secondary' = 'normal';\r\n\r\n @Output() closed = new EventEmitter<boolean | null>();\r\n\r\n ngAfterViewInit() {\r\n this.dialogElement.nativeElement.showModal();\r\n }\r\n\r\n close() {\r\n this.dialogElement.nativeElement.close();\r\n }\r\n\r\n confirm() {\r\n this.closed.emit(true);\r\n this.close();\r\n }\r\n\r\n onClose() {\r\n this.closed.emit(null);\r\n }\r\n\r\n}\r\n","<dialog #dialogElement class=\"ptr-modal\" (close)=\"onClose()\">\r\n <div class=\"ptr-modal__content\">\r\n\r\n <div class=\"ptr-modal__header\">\r\n <h2 class=\"ptr-modal__title\">{{title}}</h2>\r\n <button class=\"ptr-modal__close\" (click)=\"close()\" aria-label=\"Close dialog\">&times;</button>\r\n </div>\r\n\r\n <p>{{ message }}</p>\r\n <div class=\"ptr-modal__actions\">\r\n <ptr-button buttonStyle=\"secondary\" (clicked)=\"close()\" [isSmallSize]=\"true\">Cancel</ptr-button>\r\n <ptr-button class=\"ml-auto\" [buttonStyle]=\"buttonStyle\" (clicked)=\"confirm()\"\r\n [isSmallSize]=\"true\">{{buttonText}}</ptr-button>\r\n </div>\r\n\r\n </div>\r\n</dialog>\r\n","import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, Injectable } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { PtrDialogComponent } from './ptr-dialog/ptr-dialog.component';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PtrDialogService {\r\n\r\n private dialogComponentRef: ComponentRef<PtrDialogComponent> | null = null;\r\n\r\n constructor(\r\n private appRef: ApplicationRef,\r\n private injector: EnvironmentInjector\r\n ) { }\r\n\r\n open(options: {\r\n message: string;\r\n buttonText?: string;\r\n buttonStyle?: 'normal' | 'error' | 'secondary';\r\n }): Observable<boolean> {\r\n const dialogResult$ = new Subject<boolean>();\r\n\r\n this.dialogComponentRef = createComponent(PtrDialogComponent, {\r\n environmentInjector: this.injector,\r\n });\r\n\r\n const { instance } = this.dialogComponentRef;\r\n\r\n instance.message = options.message;\r\n instance.buttonText = options.buttonText || 'Confirm';\r\n instance.buttonStyle = options.buttonStyle || 'normal';\r\n\r\n instance.closed.subscribe((result: boolean | null) => {\r\n this.removeDialog();\r\n dialogResult$.next(result ?? false);\r\n dialogResult$.complete();\r\n });\r\n\r\n document.body.appendChild(this.dialogComponentRef.location.nativeElement);\r\n this.appRef.attachView(this.dialogComponentRef.hostView);\r\n\r\n return dialogResult$.asObservable();\r\n }\r\n\r\n private removeDialog() {\r\n if (this.dialogComponentRef) {\r\n this.appRef.detachView(this.dialogComponentRef.hostView);\r\n this.dialogComponentRef.destroy();\r\n this.dialogComponentRef = null;\r\n }\r\n }\r\n\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { ChangeDetectionStrategy, Component, ElementRef, Input, ViewChild } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ptr-tooltip',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './ptr-tooltip.component.html',\r\n styleUrls: [\"./ptr-tooltip.component.scss\"],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrTooltipComponent {\r\n\r\n @Input() content = '';\r\n\r\n @ViewChild('tooltipDialog') tooltipDialog!: ElementRef<HTMLDialogElement>;\r\n\r\n private tooltipTimer: any;\r\n\r\n showTooltip() {\r\n clearTimeout(this.tooltipTimer);\r\n this.tooltipTimer = setTimeout(() => {\r\n this.tooltipDialog.nativeElement.show();\r\n }, 200); // Small delay to prevent flickering on quick mouse movements\r\n }\r\n\r\n hideTooltip() {\r\n clearTimeout(this.tooltipTimer);\r\n this.tooltipTimer = setTimeout(() => {\r\n this.tooltipDialog.nativeElement.close();\r\n }, 200); // Small delay to allow moving mouse to tooltip\r\n }\r\n\r\n}\r\n","<span (mouseenter)=\"showTooltip()\" (mouseleave)=\"hideTooltip()\" class=\"tooltip-trigger\">\r\n <ng-content></ng-content>\r\n</span>\r\n<dialog #tooltipDialog class=\"ptr-tooltip\">\r\n <div class=\"ptr-tooltip__content\">{{ content }}</div>\r\n</dialog>","import { ChangeDetectionStrategy, Component, computed, inject, Input } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { ActivatedRoute, NavigationEnd, Router, RouterModule } from '@angular/router';\r\nimport { filter, distinctUntilChanged } from 'rxjs';\r\nimport { BreadcrumbRouteInfo, PtrBreadcrumb } from './interfaces';\r\n@Component({\r\n selector: 'ptr-breadcrumbs',\r\n standalone: true,\r\n imports: [RouterModule],\r\n templateUrl: './ptr-breadcrumbs.component.html',\r\n styleUrl: './ptr-breadcrumbs.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrBreadcrumbsComponent {\r\n\r\n @Input() showFirstSeparator = true;\r\n\r\n private router = inject(Router);\r\n private activatedRoute = inject(ActivatedRoute);\r\n\r\n private routeEvents = toSignal(\r\n this.router.events.pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n distinctUntilChanged()\r\n )\r\n );\r\n\r\n breadcrumbs = computed(() => {\r\n this.routeEvents();\r\n return this.createBreadcrumbs(this.activatedRoute.root);\r\n });\r\n\r\n private createBreadcrumbs(route: ActivatedRoute, routeUrl = '', breadcrumbs: PtrBreadcrumb[] = []): PtrBreadcrumb[] {\r\n const routeChildren: ActivatedRoute[] = route.children;\r\n if (routeChildren.length === 0) {\r\n return breadcrumbs;\r\n }\r\n for (const child of routeChildren) {\r\n const routeURL: string = child.snapshot.url.map(segment => segment.path).join('/');\r\n if (routeURL !== '') {\r\n routeUrl += `/${routeURL}`;\r\n }\r\n const { label, url } = this.getLabelForRoute(child);\r\n if (label) {\r\n breadcrumbs.push({ label, url: url ?? routeUrl });\r\n }\r\n return this.createBreadcrumbs(child, routeUrl, breadcrumbs);\r\n }\r\n return breadcrumbs;\r\n }\r\n\r\n private getLabelForRoute(route: ActivatedRoute): BreadcrumbRouteInfo {\r\n const breadcrumbReturnInfo: BreadcrumbRouteInfo = {};\r\n const customBreadcrumb = route.snapshot.data['breadcrumb'] as BreadcrumbRouteInfo | undefined;\r\n\r\n if (customBreadcrumb) {\r\n if (customBreadcrumb.label) {\r\n breadcrumbReturnInfo.label = customBreadcrumb.label;\r\n }\r\n if (customBreadcrumb.url) {\r\n breadcrumbReturnInfo.url = customBreadcrumb.url;\r\n }\r\n } else if (route.snapshot.title) {\r\n breadcrumbReturnInfo.label = route.snapshot.title;\r\n }\r\n\r\n return breadcrumbReturnInfo;\r\n }\r\n\r\n}\r\n","@if (breadcrumbs().length > 0) {\n <nav aria-label=\"breadcrumb\" class=\"breadcrumb-wrapper\">\n <ol class=\"breadcrumb\" [class.breadcrumb--show-first-separator]=\"showFirstSeparator\">\n @for (breadcrumb of breadcrumbs(); track breadcrumb.label; let last = $last) {\n <li class=\"breadcrumb-item\" [class.breadcrumb-item--active]=\"last\">\n @if (!last) {\n <a class=\"breadcrumb-item-label\" [routerLink]=\"breadcrumb.url\">{{ breadcrumb.label }}</a>\n }\n @if (last) {\n <span class=\"breadcrumb-item-label\">{{ breadcrumb.label }}</span>\n }\n </li>\n }\n </ol>\n </nav>\n}\n","import { ChangeDetectionStrategy, Component, Input, signal } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ptr-tab',\r\n standalone: true,\r\n template: '@if(active()){<ng-content></ng-content>}',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrTabComponent {\r\n @Input() label!: string;\r\n @Input() link?: string;\r\n\r\n active = signal(false);\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, ChangeDetectionStrategy, Component, ContentChildren, DestroyRef, effect, ElementRef, inject, QueryList, signal, ViewChildren } from '@angular/core';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { PtrTabComponent } from '../ptr-tab/ptr-tab.component';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n\r\n@Component({\r\n selector: 'ptr-tabs',\r\n standalone: true,\r\n imports: [CommonModule, RouterModule],\r\n templateUrl: './ptr-tabs.component.html',\r\n styleUrl: './ptr-tabs.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrTabsComponent implements AfterViewInit {\r\n\r\n @ContentChildren(PtrTabComponent) tabComponents!: QueryList<PtrTabComponent>;\r\n @ViewChildren('tabButton') buttons!: QueryList<ElementRef>;\r\n\r\n private router = inject(Router);\r\n private destroyRef = inject(DestroyRef);\r\n\r\n tabs = signal<PtrTabComponent[]>([]);\r\n activeTabIndex = signal(0);\r\n useLinks = signal(false);\r\n sliderPosition = signal({ transform: 'translateX(0)', width: '0' });\r\n\r\n constructor() {\r\n effect(() => {\r\n const activeTab = this.tabs().find(tab => tab.active());\r\n if (activeTab?.link) {\r\n this.router.navigate([activeTab.link]);\r\n }\r\n this.updateSliderPosition();\r\n }, { allowSignalWrites: true });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.tabComponents.changes\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.updateTabs();\r\n });\r\n this.updateTabs();\r\n }\r\n\r\n updateTabs() {\r\n this.tabs.set(this.tabComponents.toArray());\r\n this.useLinks.set(this.tabs().some(tab => !!tab.link));\r\n if (this.tabs().length > 0 && !this.tabs().some(tab => tab.active())) {\r\n this.selectTab(0);\r\n } else {\r\n this.updateSliderPosition();\r\n }\r\n }\r\n\r\n selectTab(index: number) {\r\n this.tabs().forEach((tab, i) => tab.active.set(i === index));\r\n this.activeTabIndex.set(index);\r\n }\r\n\r\n updateSliderPosition() {\r\n const activeButton = this.buttons?.get(this.activeTabIndex())?.nativeElement;\r\n if (activeButton) {\r\n const { offsetLeft, offsetWidth } = activeButton;\r\n this.sliderPosition.set({\r\n transform: `translateX(${offsetLeft}px)`,\r\n width: `${offsetWidth}px`\r\n });\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"tabs-container\" role=\"tablist\">\r\n @for (tab of tabs(); track $index; let i = $index) {\r\n <button #tabButton [attr.role]=\"tab.link ? 'link' : 'tab'\" [attr.aria-selected]=\"tab.active()\"\r\n [class.active]=\"tab.active()\" (click)=\"selectTab(i)\" [routerLink]=\"tab.link\">{{tab.label}}</button>\r\n }\r\n\r\n <div class=\"slider\" [style.transform]=\"sliderPosition().transform\" [style.width]=\"sliderPosition().width\"></div>\r\n</div>\r\n\r\n@if (!useLinks()) {\r\n<div class=\"tab-content\">\r\n <ng-content></ng-content>\r\n</div>\r\n}\r\n","/*\r\n * Public API Surface of ngx-components\r\n */\r\n\r\nexport * from './lib/menu/menu.component';\r\n\r\nexport * from './lib/forms/interfaces';\r\nexport { PtrFormComponent } from './lib/forms/form/form.component';\r\nexport { PtrSelectComponent } from './lib/forms/input/select/select.component';\r\nexport { PtrInputComponent } from './lib/forms/input/ptr-input/ptr-input.component';\r\n\r\nexport { PtrTitleComponent } from './lib/ptr-title/ptr-title.component';\r\n\r\nexport { PtrLoadingSpinnerComponent } from './lib/loading-spinner/loading-spinner.component';\r\nexport { PtrLoadingSpinnerDirective } from './lib/loading-spinner/loading-spinner.directive';\r\n\r\nexport { PtrLoadingService } from './lib/services/loading.service';\r\n\r\nexport { PtrButtonComponent } from './lib/ptr-button/ptr-button.component';\r\n\r\nexport { PtrDialogService } from './lib/dialog/ptr-dialog.service';\r\nexport { PtrDialogComponent } from './lib/dialog/ptr-dialog/ptr-dialog.component';\r\nexport { PtrTooltipComponent } from './lib/dialog/ptr-tooltip/ptr-tooltip.component';\r\n\r\nexport { PtrBreadcrumbsComponent } from './lib/ptr-breadcrumbs/ptr-breadcrumbs.component';\r\nexport { PtrBreadcrumb } from './lib/ptr-breadcrumbs/interfaces';\r\n\r\nexport { PtrTabsComponent } from './lib/components/tabs/ptr-tabs/ptr-tabs.component';\r\nexport { PtrTabComponent } from './lib/components/tabs/ptr-tab/ptr-tab.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"patter-ngx-components.mjs","sources":["../../../../projects/patter/ngx-components/src/lib/menu/menu.component.ts","../../../../projects/patter/ngx-components/src/lib/menu/menu.component.html","../../../../projects/patter/ngx-components/src/lib/ptr-button/ptr-button.component.ts","../../../../projects/patter/ngx-components/src/lib/ptr-button/ptr-button.component.html","../../../../projects/patter/ngx-components/src/lib/forms/shared/ptr-dialog-list/ptr-dialog-list.component.ts","../../../../projects/patter/ngx-components/src/lib/forms/shared/ptr-dialog-list/ptr-dialog-list.component.html","../../../../projects/patter/ngx-components/src/lib/forms/input/select/select.component.ts","../../../../projects/patter/ngx-components/src/lib/forms/input/select/select.component.html","../../../../projects/patter/ngx-components/src/lib/forms/input/ptr-input/ptr-input.component.ts","../../../../projects/patter/ngx-components/src/lib/forms/input/ptr-input/ptr-input.component.html","../../../../projects/patter/ngx-components/src/lib/forms/form/form.component.ts","../../../../projects/patter/ngx-components/src/lib/forms/form/form.component.html","../../../../projects/patter/ngx-components/src/lib/ptr-title/ptr-title.component.ts","../../../../projects/patter/ngx-components/src/lib/ptr-title/ptr-title.component.html","../../../../projects/patter/ngx-components/src/lib/loading-spinner/loading-spinner.component.ts","../../../../projects/patter/ngx-components/src/lib/loading-spinner/loading-spinner.directive.ts","../../../../projects/patter/ngx-components/src/lib/services/loading.service.ts","../../../../projects/patter/ngx-components/src/lib/dialog/ptr-dialog/ptr-dialog.component.ts","../../../../projects/patter/ngx-components/src/lib/dialog/ptr-dialog/ptr-dialog.component.html","../../../../projects/patter/ngx-components/src/lib/dialog/ptr-dialog.service.ts","../../../../projects/patter/ngx-components/src/lib/dialog/ptr-tooltip/ptr-tooltip.component.ts","../../../../projects/patter/ngx-components/src/lib/dialog/ptr-tooltip/ptr-tooltip.component.html","../../../../projects/patter/ngx-components/src/lib/ptr-breadcrumbs/ptr-breadcrumbs.component.ts","../../../../projects/patter/ngx-components/src/lib/ptr-breadcrumbs/ptr-breadcrumbs.component.html","../../../../projects/patter/ngx-components/src/lib/components/tabs/ptr-tab/ptr-tab.component.ts","../../../../projects/patter/ngx-components/src/lib/components/tabs/ptr-tabs/ptr-tabs.component.ts","../../../../projects/patter/ngx-components/src/lib/components/tabs/ptr-tabs/ptr-tabs.component.html","../../../../projects/patter/ngx-components/src/lib/ptr-toaster/ptr-toaster.service.ts","../../../../projects/patter/ngx-components/src/lib/ptr-toaster/ptr-toaster/ptr-toaster.component.ts","../../../../projects/patter/ngx-components/src/lib/ptr-toaster/ptr-toaster/ptr-toaster.component.html","../../../../projects/patter/ngx-components/src/public-api.ts","../../../../projects/patter/ngx-components/src/patter-ngx-components.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\n\r\nexport interface PtrMenuItem {\r\n label: string;\r\n link?: string;\r\n children?: PtrMenuItem[];\r\n}\r\n\r\n@Component({\r\n selector: 'ptr-menu',\r\n standalone: true,\r\n imports: [RouterModule],\r\n templateUrl: './menu.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./menu.component.scss']\r\n})\r\nexport class PtrMenuComponent {\r\n\r\n @Input() menuItems: PtrMenuItem[] = [];\r\n\r\n}\r\n","<nav class=\"ptr-menu\">\n <ul class=\"menu\">\n @for (item of menuItems; track item.label) {\n <li class=\"menu-item\" routerLinkActive=\"current_page_item\" [routerLinkActiveOptions]=\"{exact: true}\">\n <a [routerLink]=\"item.link || '#'\">{{item.label}}</a>\n </li>\n }\n </ul>\n</nav>\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, computed, EventEmitter, HostBinding, Input, Output, signal } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\n\r\ntype ButtonStyle = 'normal' | 'error' | 'secondary' | 'icon';\r\n\r\n@Component({\r\n selector: 'ptr-button',\r\n standalone: true,\r\n imports: [CommonModule, RouterLink],\r\n templateUrl: './ptr-button.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrButtonComponent {\r\n\r\n @HostBinding('class') get hostClasses() {\r\n const hostClass = [];\r\n if (this.style() === 'secondary') {\r\n hostClass.push('is-style-outline');\r\n }\r\n if (this.style() === 'error') {\r\n hostClass.push('is-style-error-button');\r\n }\r\n if (this.style() === 'icon') {\r\n hostClass.push('is-style-icon-button');\r\n }\r\n if (this.smallSize()) {\r\n hostClass.push('is-style-smaller-element');\r\n }\r\n return hostClass.join(' ');\r\n }\r\n\r\n style = signal<ButtonStyle>('normal');\r\n type = signal<'button' | 'submit' | 'reset'>('button');\r\n disabled = signal(false);\r\n href = signal<string | null>(null);\r\n routerLink = signal<string | (string|number)[] | null>(null);\r\n additionalClasses = signal('');\r\n smallSize = signal(false);\r\n\r\n @Input() set buttonStyle(value: ButtonStyle) {\r\n this.style.set(value);\r\n }\r\n\r\n @Input() set buttonType(value: 'button' | 'submit' | 'reset') {\r\n this.type.set(value);\r\n }\r\n\r\n @Input() set isDisabled(value: boolean) {\r\n this.disabled.set(value);\r\n }\r\n\r\n @Input() set hrefLink(value: string | null) {\r\n this.href.set(value);\r\n }\r\n\r\n @Input() set routerLinkValue(value: string | (string|number)[] | null) {\r\n this.routerLink.set(value);\r\n }\r\n\r\n @Input() set extraClasses(value: string) {\r\n this.additionalClasses.set(value);\r\n }\r\n\r\n @Input() set isSmallSize(value: boolean) {\r\n if (value) {\r\n this.smallSize.set(true);\r\n }\r\n }\r\n\r\n @Input() set isIconButton(value: boolean) {\r\n if (value) {\r\n this.style.set('icon');\r\n }\r\n }\r\n\r\n @Input() ariaLabel? = '';\r\n\r\n @Output() clicked = new EventEmitter<Event>();\r\n\r\n isLink = computed(() => !!this.href() || !!this.routerLink());\r\n\r\n buttonClasses = computed(() => {\r\n const classes = ['wp-block-button__link'];\r\n\r\n if (this.style() !== 'normal') {\r\n classes.push(`wp-block-button__link--${this.style()}`);\r\n }\r\n\r\n if (this.disabled() && this.isLink()) {\r\n classes.push('disabled');\r\n }\r\n\r\n if (this.additionalClasses()) {\r\n classes.push(this.additionalClasses());\r\n }\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n onClick(event: Event): void {\r\n if (this.disabled()) {\r\n event.preventDefault();\r\n return;\r\n }\r\n this.clicked.emit(event);\r\n }\r\n\r\n}\r\n","<ng-template #contentTpl>\r\n <ng-content></ng-content>\r\n</ng-template>\r\n\r\n@if (isLink()) {\r\n<a [attr.href]=\"href()\" [routerLink]=\"routerLink()\" [class]=\"buttonClasses()\" [attr.disabled]=\"disabled() ? '' : null\"\r\n (click)=\"onClick($event)\" [attr.aria-label]=\"ariaLabel ?? null\">\r\n <ng-container [ngTemplateOutlet]=\"contentTpl\"></ng-container>\r\n</a>\r\n} @else {\r\n<button [type]=\"type()\" [class]=\"buttonClasses()\" [disabled]=\"disabled()\" (click)=\"onClick($event)\"\r\n [attr.aria-label]=\"ariaLabel ?? null\">\r\n <ng-container [ngTemplateOutlet]=\"contentTpl\"></ng-container>\r\n</button>\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, ElementRef, EventEmitter, Input, Output, signal, ViewChild } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { PtrOption, PtrOptionGroup } from '../../interfaces';\r\n\r\ninterface ProcessedOption {\r\n type: 'option' | 'group';\r\n label: string;\r\n value?: string;\r\n options?: ProcessedOption[];\r\n}\r\n\r\n@Component({\r\n selector: 'ptr-dialog-list',\r\n standalone: true,\r\n imports: [\r\n FormsModule\r\n ],\r\n templateUrl: './ptr-dialog-list.component.html',\r\n styleUrls: ['./ptr-dialog-list.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrDialogListComponent {\r\n\r\n @Input() set options(value: (PtrOption | PtrOptionGroup | string)[] | undefined) {\r\n this._options.set(this.processOptions(value));\r\n }\r\n @Input() showSearch = false;\r\n @Input() searchPlaceholder = 'Search...';\r\n @Input() dialogTitle? = '';\r\n\r\n @Output() selectionChange = new EventEmitter<string | null>();\r\n @Output() dialogClosed = new EventEmitter<void>();\r\n @Output() searchTermChanged = new EventEmitter<string>();\r\n\r\n @ViewChild('dialog') dialog!: ElementRef<HTMLDialogElement>;\r\n\r\n private _options = signal<ProcessedOption[]>([]);\r\n value = signal<string | null>(null);\r\n searchTerm = signal('');\r\n highlightedIndex = signal(-1);\r\n isOpen = signal(false);\r\n private componentId = Math.random().toString(36).substring(2);\r\n listId = `${this.componentId}-list`;\r\n\r\n filteredOptions = computed(() => {\r\n const term = this.searchTerm().toLowerCase();\r\n return this._options().flatMap(item => {\r\n if (item.type === 'group') {\r\n const filteredOptions = item.options!.filter(option =>\r\n option.label.toLowerCase().includes(term)\r\n );\r\n return filteredOptions.length > 0 ? [{ ...item, options: filteredOptions }] : [];\r\n } else {\r\n return item.label.toLowerCase().includes(term) ? [item] : [];\r\n }\r\n });\r\n });\r\n\r\n openDialog() {\r\n this.dialog.nativeElement.show();\r\n this.adjustDialogPosition();\r\n this.isOpen.set(true);\r\n }\r\n\r\n openDialogSilent() {\r\n this.dialog.nativeElement.setAttribute('open', 'true');\r\n this.adjustDialogPosition();\r\n this.isOpen.set(true);\r\n }\r\n\r\n closeDialog() {\r\n this.dialog.nativeElement.close();\r\n this.isOpen.set(false);\r\n this.searchTerm.set('');\r\n this.highlightedIndex.set(-1);\r\n this.dialogClosed.emit();\r\n this.resetDialogPosition();\r\n }\r\n\r\n updateSearchTerm(term: string) {\r\n this.searchTerm.set(term);\r\n this.highlightedIndex.set(-1);\r\n this.searchTermChanged.emit(term);\r\n }\r\n\r\n onDialogKeyDown(event: KeyboardEvent) {\r\n if (event.key === 'Escape') {\r\n this.closeDialog();\r\n event.preventDefault();\r\n }\r\n\r\n // When there is no search input and there are options, move input into the first option\r\n if (!this.showSearch && this.filteredOptions().length > 0 && this.highlightedIndex() === -1) {\r\n if (event.key === 'Tab' || event.key === 'ArrowDown') {\r\n this.highlightedIndex.update(i => Math.min(i + 1, this.getTotalOptionsCount() - 1));\r\n this.focusOption();\r\n event.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n onInputKeyDown(event: KeyboardEvent) {\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n this.highlightedIndex.update(i => Math.min(i + 1, this.getTotalOptionsCount() - 1));\r\n this.focusOption();\r\n event.preventDefault();\r\n break;\r\n case 'Escape':\r\n this.closeDialog();\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n onOptionKeyDown(event: KeyboardEvent, optionValue: string) {\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n this.highlightedIndex.update(i => Math.min(i + 1, this.getTotalOptionsCount() - 1));\r\n this.focusOption();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowUp':\r\n this.highlightedIndex.update(i => Math.max(i - 1, -1));\r\n this.focusOption();\r\n event.preventDefault();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n this.selectOption(optionValue);\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n focusOption() {\r\n if (this.highlightedIndex() >= 0) {\r\n const options = this.dialog.nativeElement.querySelectorAll('li[role=\"option\"]');\r\n (options[this.highlightedIndex()] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n selectOption(optionValue: string) {\r\n this.value.set(optionValue);\r\n this.selectionChange.emit(optionValue);\r\n this.closeDialog();\r\n }\r\n\r\n private getTotalOptionsCount(): number {\r\n return this.filteredOptions().reduce((count, item) => {\r\n if (item.type === 'group') {\r\n return count + item.options!.length;\r\n }\r\n return count + 1;\r\n }, 0);\r\n }\r\n\r\n private processOptions(options: (PtrOption | PtrOptionGroup | string)[] | undefined): ProcessedOption[] {\r\n if (!options) return [];\r\n return options.map(option => {\r\n if (typeof option === 'string') {\r\n return {\r\n type: 'option',\r\n label: option,\r\n value: option\r\n };\r\n } else if ('groupLabel' in option) {\r\n return {\r\n type: 'group',\r\n label: option.groupLabel,\r\n options: option.options.map(subOption => ({\r\n type: 'option',\r\n label: typeof subOption === 'string' ? subOption : subOption.label,\r\n value: typeof subOption === 'string' ? subOption : subOption.value\r\n }))\r\n };\r\n } else {\r\n return {\r\n type: 'option',\r\n label: option.label,\r\n value: option.value\r\n };\r\n }\r\n });\r\n }\r\n\r\n adjustDialogPosition() {\r\n const dialogRect = this.dialog.nativeElement.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n const spaceBelow = viewportHeight - dialogRect.bottom;\r\n if (spaceBelow > 0) {\r\n this.dialog.nativeElement.style.top = '100%';\r\n } else {\r\n this.dialog.nativeElement.style.bottom = '100%';\r\n }\r\n }\r\n\r\n resetDialogPosition() {\r\n this.dialog.nativeElement.style.top = '';\r\n this.dialog.nativeElement.style.bottom = '';\r\n }\r\n\r\n}\r\n","<dialog #dialog class=\"ptr-dialog-list\" (keydown)=\"onDialogKeyDown($event)\" [attr.aria-label]=\"'Options'\">\r\n\r\n @if(dialogTitle) {\r\n <p class=\"dialog-title\">{{dialogTitle}}</p>\r\n }\r\n\r\n @if (showSearch) {\r\n <div>\r\n <input #searchInput [ngModel]=\"searchTerm()\" (ngModelChange)=\"updateSearchTerm($event)\"\r\n [attr.aria-expanded]=\"isOpen()\" [attr.aria-owns]=\"listId\" (keydown)=\"onInputKeyDown($event)\"\r\n [attr.aria-autocomplete]=\"'list'\" role=\"combobox\" [attr.aria-controls]=\"listId\" [placeholder]=\"searchPlaceholder\"\r\n class=\"search-input\">\r\n </div>\r\n }\r\n\r\n <ul [attr.id]=\"listId\" role=\"listbox\" class=\"option-list\">\r\n @for (item of filteredOptions(); track item.label) {\r\n @if (item.type === 'option') {\r\n <li role=\"option\" [attr.id]=\"item.value\" [attr.aria-selected]=\"item.value === value()\"\r\n [class.selected]=\"item.value === value()\" [class.highlighted]=\"item === filteredOptions()[highlightedIndex()]\"\r\n (click)=\"selectOption(item.value!)\" (keydown)=\"onOptionKeyDown($event, item.value!)\"\r\n [attr.tabindex]=\"item === filteredOptions()[highlightedIndex()] ? 0 : -1\">\r\n {{ item.label }}\r\n </li>\r\n } @else {\r\n <li role=\"group\" [attr.aria-label]=\"item.label\">\r\n {{ item.label }}\r\n </li>\r\n @for (option of item.options!; track option.value) {\r\n <li role=\"option\" [attr.id]=\"option.value\" [attr.aria-selected]=\"option.value === value()\"\r\n [class.selected]=\"option.value === value()\" [class.highlighted]=\"option === filteredOptions()[highlightedIndex()]\"\r\n (click)=\"selectOption(option.value!)\" (keydown)=\"onOptionKeyDown($event, option.value!)\"\r\n [attr.tabindex]=\"option === filteredOptions()[highlightedIndex()] ? 0 : -1\">\r\n {{ option.label }}\r\n </li>\r\n }\r\n }\r\n }\r\n </ul>\r\n\r\n</dialog>\r\n","/* eslint-disable @typescript-eslint/no-empty-function */\r\nimport { ChangeDetectionStrategy, Component, computed, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, signal, ViewChild } from '@angular/core';\r\nimport { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\r\nimport { PtrOption, PtrOptionGroup } from '../../interfaces';\r\nimport { PtrDialogListComponent } from '../../shared/ptr-dialog-list/ptr-dialog-list.component';\r\n\r\n@Component({\r\n selector: 'ptr-select',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n PtrDialogListComponent\r\n ],\r\n templateUrl: './select.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./select.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PtrSelectComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class PtrSelectComponent {\r\n\r\n @Input() options: (PtrOption | PtrOptionGroup | string)[] | undefined;\r\n @Input() showSearch = true;\r\n @Input() placeholder?: string | null = 'Select an option';\r\n @Input() label? = '';\r\n @Input() description? = '';\r\n @Input() labelPosition?: 'top' | 'inline' = 'top';\r\n\r\n @Output() selectionChange = new EventEmitter<string | null>();\r\n\r\n @ViewChild('selectButton') selectButton!: ElementRef<HTMLButtonElement>;\r\n @ViewChild('dialogList') dialogList!: PtrDialogListComponent;\r\n\r\n value = signal<string | null>(null);\r\n\r\n displayValue = computed(() => {\r\n const currentValue = this.value();\r\n if (currentValue === null) return null;\r\n const allOptions = this.flattenOptions(this.options);\r\n const selectedOption = allOptions?.find(option => option.value === currentValue);\r\n return selectedOption ? selectedOption.label : null;\r\n });\r\n\r\n effectivePlaceholder = computed(() => {\r\n return this.placeholder ?? 'Select an option';\r\n });\r\n\r\n private componentId = Math.random().toString(36).substring(2);\r\n labelId = `${this.componentId}-label`;\r\n inputId = `${this.componentId}-input`;\r\n\r\n onChange: (value: string | null) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (!this.dialogList.dialog.nativeElement.contains(event.target as Node) &&\r\n !(event.target as HTMLElement).closest('.select-button') &&\r\n this.dialogList.isOpen()) {\r\n this.dialogList.closeDialog();\r\n }\r\n }\r\n\r\n toggleDialog() {\r\n if (this.dialogList.isOpen()) {\r\n this.dialogList.closeDialog();\r\n } else {\r\n this.dialogList.openDialog();\r\n }\r\n }\r\n\r\n onOptionSelected(optionValue: string | null) {\r\n this.value.set(optionValue);\r\n this.onChange(optionValue);\r\n this.onTouched();\r\n this.selectionChange.emit(optionValue);\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n if (this.selectButton?.nativeElement) {\r\n this.selectButton.nativeElement.disabled = isDisabled;\r\n }\r\n }\r\n\r\n private flattenOptions(options: (PtrOption | PtrOptionGroup | string)[] | undefined): PtrOption[] {\r\n if (!options) return [];\r\n\r\n return options.flatMap(option => {\r\n if (typeof option === 'string') {\r\n return { value: option, label: option };\r\n } else if ('groupLabel' in option) {\r\n return option.options;\r\n } else {\r\n return option;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","<label class=\"gfield_label gform-field-label\" [attr.for]=\"inputId\"\r\n [class.gfield--input-wrapper--label-inline]=\"labelPosition === 'inline'\">{{ label }}</label>\r\n@if(description){\r\n<div class=\"gfield_description\">{{description}}</div>\r\n}\r\n<div class=\"gfield--input-wrapper ginput_container\"\r\n [class.gfield--input-wrapper--label-inline]=\"labelPosition === 'inline'\">\r\n\r\n <button #selectButton type=\"button\" class=\"select-button\" [attr.id]=\"inputId\" [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-expanded]=\"dialogList.isOpen()\" [attr.aria-labelledby]=\"labelId\" (click)=\"toggleDialog()\">\r\n <span [attr.id]=\"labelId\">@if (displayValue(); as dValue) { {{dValue}} } @else { {{effectivePlaceholder()}} }</span>\r\n </button>\r\n\r\n @if (labelPosition === 'inline') {\r\n <fieldset aria-hidden=\"true\" class=\"input-fieldset\">\r\n <legend class=\"input-legend gfield_label gform-field-label gform-field-label--hidden\">\r\n <span>{{label}}</span>\r\n </legend>\r\n </fieldset>\r\n }\r\n\r\n <ptr-dialog-list #dialogList [options]=\"options\" (selectionChange)=\"onOptionSelected($event)\"\r\n [showSearch]=\"showSearch\" />\r\n\r\n</div>\r\n","/* eslint-disable @typescript-eslint/no-empty-function */\r\nimport { ChangeDetectionStrategy, Component, ElementRef, forwardRef, HostListener, Input, OnInit, signal, ViewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\r\nimport { PtrDialogListComponent } from '../../shared/ptr-dialog-list/ptr-dialog-list.component';\r\nimport { debounceTime, distinctUntilChanged, Observable, of, Subject, switchMap } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ptr-input',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n PtrDialogListComponent\r\n ],\r\n templateUrl: './ptr-input.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PtrInputComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class PtrInputComponent implements ControlValueAccessor, OnInit {\r\n\r\n @Input() type: 'text' | 'number' | 'email' | 'password' | 'search' | 'hidden' | 'date' = 'text';\r\n @Input() label = '';\r\n @Input() placeholder?: string | null = '';\r\n @Input() autocomplete? = '';\r\n @Input() description? = '';\r\n @Input() dialogHelpText? = '';\r\n @Input() searchFn?: (term: string) => Observable<string[]>;\r\n @Input() labelPosition?: 'top' | 'inline' = 'top';\r\n\r\n @ViewChild('input') input!: ElementRef<HTMLInputElement>;\r\n @ViewChild('dialogList') dialogList!: PtrDialogListComponent;\r\n\r\n private componentId = Math.random().toString(36).substring(2);\r\n private minChars = 3;\r\n private searchTerms = new Subject<string>();\r\n private hasSelectedOption = false;\r\n\r\n inputId = `${this.componentId}-input`;\r\n inputValue = signal('');\r\n searchResultOptions = signal<string[]>([]);\r\n onChange: (value: string) => void = () => { };\r\n onTouched: () => void = () => { };\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (this.searchFn) {\r\n if (!this.dialogList?.dialog.nativeElement.contains(event.target as Node) && this.dialogList?.isOpen()) {\r\n this.dialogList.closeDialog();\r\n }\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setupSearch();\r\n }\r\n\r\n private setupSearch() {\r\n if (this.searchFn) {\r\n this.searchTerms.pipe(\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n switchMap(term => term.length >= this.minChars ? this.searchFn!(term) : of([]))\r\n ).subscribe(results => {\r\n this.searchResultOptions.set(results);\r\n if (results.length > 0 && this.dialogList) {\r\n this.dialogList.openDialogSilent();\r\n } else {\r\n this.dialogList.closeDialog();\r\n }\r\n });\r\n }\r\n }\r\n\r\n onInputChange(value: string) {\r\n this.inputValue.set(value);\r\n this.onChange(value);\r\n if (!this.hasSelectedOption && this.searchFn && value.length >= this.minChars) {\r\n this.searchTerms.next(value);\r\n }\r\n this.hasSelectedOption = false;\r\n }\r\n\r\n onOptionSelected(optionValue: string | null) {\r\n this.hasSelectedOption = true;\r\n\r\n this.inputValue.set(optionValue ?? '');\r\n this.onChange(optionValue ?? '');\r\n if (this.dialogList) {\r\n this.dialogList.closeDialog();\r\n }\r\n }\r\n\r\n onFocus() {\r\n if (this.searchResultOptions().length > 0 && this.dialogList && !this.hasSelectedOption) {\r\n this.dialogList.openDialogSilent();\r\n }\r\n }\r\n\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.inputValue.set(value ?? '');\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n if (this.input?.nativeElement) {\r\n this.input.nativeElement.disabled = isDisabled;\r\n }\r\n }\r\n\r\n}\r\n","<label class=\"gfield_label gform-field-label\" [attr.for]=\"inputId\"\r\n [class.gfield--input-wrapper--label-inline]=\"labelPosition === 'inline'\">{{ label }}</label>\r\n@if(description){\r\n <div class=\"gfield_description\">{{description}}</div>\r\n}\r\n<div class=\"gfield--input-wrapper ginput_container\"\r\n [class.gfield--input-wrapper--label-inline]=\"labelPosition === 'inline'\">\r\n\r\n <input #input [id]=\"inputId\" [type]=\"type\" [attr.autocomplete]=\"autocomplete || null\"\r\n [attr.placeholder]=\"placeholder || null\" [ngModel]=\"inputValue()\" (ngModelChange)=\"onInputChange($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" />\r\n\r\n @if (labelPosition === 'inline') {\r\n <fieldset aria-hidden=\"true\" class=\"input-fieldset\">\r\n <legend class=\"input-legend gfield_label gform-field-label gform-field-label--hidden\">\r\n <span>{{label}}</span>\r\n </legend>\r\n </fieldset>\r\n }\r\n\r\n @if (searchFn) {\r\n <ptr-dialog-list #dialogList [options]=\"searchResultOptions()\" (selectionChange)=\"onOptionSelected($event)\"\r\n [dialogTitle]=\"dialogHelpText\" />\r\n }\r\n\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, EventEmitter, inject, Input, OnInit, Output } from '@angular/core';\r\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { PtrConditionalRule, PtrFormConfig, PtrFormField } from '../interfaces';\r\nimport { PtrButtonComponent } from '../../ptr-button/ptr-button.component';\r\nimport { PtrSelectComponent } from \"../input/select/select.component\";\r\nimport { PtrInputComponent } from '../input/ptr-input/ptr-input.component';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n@Component({\r\n selector: 'ptr-form',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n\r\n PtrButtonComponent,\r\n\r\n PtrSelectComponent,\r\n PtrInputComponent\r\n ],\r\n templateUrl: './form.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrFormComponent implements OnInit {\r\n\r\n @Input() config!: PtrFormConfig;\r\n @Input() loading = false;\r\n @Input() error: string | null = null;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n @Output() formSubmit = new EventEmitter<any>();\r\n @Output() formGroupCreated = new EventEmitter<FormGroup>();\r\n\r\n formGroup!: FormGroup;\r\n\r\n private fb = inject(FormBuilder);\r\n private cdr = inject(ChangeDetectorRef);\r\n private destroyRef = inject(DestroyRef);\r\n\r\n ngOnInit(): void {\r\n this.buildForm();\r\n this.formGroupCreated.emit(this.formGroup);\r\n this.setupConditionalLogic();\r\n }\r\n\r\n buildForm(): void {\r\n const group: Record<string, unknown> = {};\r\n this.config.fields.forEach(field => {\r\n group[field.name] = [field.value || '', field.validators || []];\r\n });\r\n\r\n this.formGroup = this.fb.group(group, this.config.formValidators ? { validators: this.config.formValidators } : null);\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.formGroup.valid) {\r\n this.formSubmit.emit(this.formGroup.value);\r\n }\r\n }\r\n\r\n public resetForm(): void {\r\n this.formGroup.reset();\r\n this.config.fields.forEach(field => {\r\n const control = this.formGroup.get(field.name);\r\n control?.setValue(field.value || '', { emitEvent: false });\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // Conditional logic\r\n setupConditionalLogic(): void {\r\n this.formGroup.valueChanges.pipe(\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe(() => {\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n isFieldVisible(field: PtrFormField): boolean {\r\n if (!field.conditional?.showWhen) return true;\r\n return this.evaluateConditionalRules(field.conditional.showWhen) as boolean;\r\n }\r\n\r\n getFieldLabel(field: PtrFormField): string {\r\n if (!field.conditional?.label) return field.label;\r\n const conditionalLabel = this.evaluateConditionalRules(field.conditional.label);\r\n return conditionalLabel as string || field.label;\r\n }\r\n\r\n getFieldPlaceholder(field: PtrFormField): string | null {\r\n if (!field.conditional?.placeholder) return field.placeholder || null;\r\n const conditionalPlaceholder = this.evaluateConditionalRules(field.conditional.placeholder);\r\n return conditionalPlaceholder as string || field.placeholder || null;\r\n }\r\n\r\n private evaluateConditionalRules(rules: PtrConditionalRule[]): string | boolean {\r\n for (const rule of rules) {\r\n const fieldValue = this.formGroup.get(rule.field)?.value;\r\n if (fieldValue === rule.value) {\r\n return rule.result;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n}\r\n","<div [class]=\"'gform_wrapper ' + config.formClass\">\r\n\r\n @if (error) {\r\n <div class=\"gform_validation_errors\">\r\n <h2 class=\"gform_submission_error hide_summary\">{{error}}</h2>\r\n </div>\r\n }\r\n\r\n @if (config.title) {\r\n <div class=\"gform_heading\">\r\n <h2 class=\"gform_title\">{{ config.title }}</h2>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <div class=\"gform_fields\">\r\n\r\n @for (field of config.fields; track field.name) {\r\n @if(isFieldVisible(field)) {\r\n\r\n <div class=\"gfield gfield--width-{{field.size}}\" [class.gform_hidden]=\"field.type === 'hidden'\"\r\n [class.gfield_error]=\"formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched\" [class.gfield--label-inline]=\"config.labelPosition === 'inline'\">\r\n\r\n @switch (field.type) {\r\n @case ('textarea') {\r\n <label class=\"gfield_label gform-field-label\" [for]=\"field.name\">{{ getFieldLabel(field) }}</label>\r\n @if(field.description){\r\n <div class=\"gfield_description\">{{field.description}}</div>\r\n }\r\n <div class=\"gfield--input-wrapper ginput_container\">\r\n <textarea [id]=\"field.name\" [formControlName]=\"field.name\" [attr.placeholder]=\"getFieldPlaceholder(field)\"></textarea>\r\n </div>\r\n }\r\n @case ('select') {\r\n <ptr-select [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [options]=\"field.options\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n @default {\r\n <ptr-input [label]=\"getFieldLabel(field)\" [formControlName]=\"field.name\" [type]=\"field.type\"\r\n [placeholder]=\"getFieldPlaceholder(field)\" [autocomplete]=\"field.autocomplete\" [searchFn]=\"field.searchFn\"\r\n [dialogHelpText]=\"field.dialogHelpText\" [labelPosition]=\"config.labelPosition\" />\r\n }\r\n }\r\n\r\n @if (formGroup.get(field.name)?.invalid && formGroup.get(field.name)?.touched) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n @if (formGroup.get(field.name)?.errors?.['required']) {\r\n This field is required.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['email']) {\r\n Please enter a valid email address.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['minlength']) {\r\n Minimum length is {{ formGroup.get(field.name)?.errors?.['minlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['maxlength']) {\r\n Maximum length is {{ formGroup.get(field.name)?.errors?.['maxlength'].requiredLength }} characters.\r\n }\r\n @if (formGroup.get(field.name)?.errors?.['pattern']) {\r\n Please match the required format.\r\n }\r\n </div>\r\n }\r\n @if (field.validationMessages && formGroup.invalid && !formGroup.get(field.name)?.invalid &&\r\n formGroup.get(field.name)?.touched) {\r\n @for (error of formGroup.errors | keyvalue; track error) {\r\n @if (field.validationMessages[error.key]) {\r\n <div class=\"gfield_description validation_message gfield_validation_message\">\r\n {{ field.validationMessages[error.key] }}\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n @if(config.submitText){\r\n <div class=\"gform_footer\">\r\n <ptr-button buttonType=\"submit\" [isDisabled]=\"loading || !formGroup.valid\"\r\n [extraClasses]=\"config.submitFullWidth ? 'gform-button--width-full' : ''\">{{config.submitText}}</ptr-button>\r\n </div>\r\n }\r\n\r\n </form>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, inject, Input, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, NavigationEnd, Router, TitleStrategy } from '@angular/router';\r\nimport { filter, map, Observable, startWith } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'ptr-title',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ptr-title.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrTitleComponent implements OnInit {\r\n\r\n @Input() styleClass = 'entry-title';\r\n @Input() wrapperStyleClass = '';\r\n @Input() screenReaderOnly = false;\r\n\r\n private router = inject(Router);\r\n private activatedRoute = inject(ActivatedRoute);\r\n private titleStrategy = inject(TitleStrategy);\r\n\r\n displayTitle$!: Observable<string>;\r\n hideTitle$!: Observable<boolean>;\r\n\r\n ngOnInit() {\r\n const routeEvents$ = this.router.events.pipe(\r\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\r\n startWith(null),\r\n map(() => this.getRoute(this.activatedRoute))\r\n );\r\n\r\n this.hideTitle$ = routeEvents$.pipe(\r\n map(route => !!route.snapshot.data['hideTitle'])\r\n );\r\n\r\n this.displayTitle$ = routeEvents$.pipe(\r\n map(route => {\r\n if (route.snapshot.data['hideTitle']) {\r\n return '';\r\n }\r\n // Check for a custom display title in the route data\r\n const customDisplayTitle = route.snapshot.data['displayTitle'];\r\n if (customDisplayTitle) {\r\n return customDisplayTitle;\r\n }\r\n // If no custom display title, use the resolved title from TitleStrategy\r\n const resolvedTitle = this.titleStrategy.getResolvedTitleForRoute(route.snapshot) || '';\r\n return resolvedTitle;\r\n // Remove any common suffix (checking for both ' | ' and ' - ' separators)\r\n // return this.removeCommonSuffix(resolvedTitle);\r\n })\r\n );\r\n }\r\n\r\n private getRoute(route: ActivatedRoute): ActivatedRoute {\r\n while (route.firstChild) {\r\n route = route.firstChild;\r\n }\r\n return route;\r\n }\r\n\r\n}\r\n","@if ((hideTitle$|async) === false) {\r\n @if(wrapperStyleClass) {\r\n <header [class]=\"wrapperStyleClass\" [class.screen-reader-text]=\"screenReaderOnly\">\r\n <h1 [class]=\"styleClass\">{{displayTitle$|async}}</h1>\r\n </header>\r\n } @else {\r\n <h1 [class]=\"styleClass\" [class.screen-reader-text]=\"screenReaderOnly\">{{displayTitle$|async}}</h1>\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ptr-loading-spinner',\r\n standalone: true,\r\n imports: [],\r\n template: `<div class=\"vdx-progress-spinner\"></div>`,\r\n styleUrls: [\"./loading-spinner.component.scss\"],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrLoadingSpinnerComponent { }\r\n","import { ComponentRef, Directive, ElementRef, HostBinding, inject, Input, OnDestroy, Renderer2, ViewContainerRef } from '@angular/core';\r\nimport { PtrLoadingSpinnerComponent } from './loading-spinner.component';\r\n\r\n@Directive({\r\n selector: '[ptrLoadingSpinner]',\r\n standalone: true\r\n})\r\nexport class PtrLoadingSpinnerDirective implements OnDestroy {\r\n\r\n private targetEl = inject(ElementRef);\r\n private viewContainerRef = inject(ViewContainerRef);\r\n private renderer = inject(Renderer2);\r\n\r\n private spinnerInstance?: ComponentRef<PtrLoadingSpinnerComponent>;\r\n private overlay?: HTMLElement;\r\n\r\n @HostBinding('style.position') hostPosition = 'relative';\r\n\r\n @Input({ required: true }) set ptrLoadingSpinner(loading: boolean) {\r\n if (loading) {\r\n this.addBlurEffect();\r\n this.addOverlay();\r\n this.addProgressSpinnerComponent();\r\n } else {\r\n this.removeBlurEffect();\r\n this.removeOverlay();\r\n this.removeProgressSpinnerComponent();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.spinnerInstance?.destroy();\r\n this.removeBlurEffect();\r\n }\r\n\r\n private addProgressSpinnerComponent(): void {\r\n this.spinnerInstance = this.viewContainerRef.createComponent(PtrLoadingSpinnerComponent);\r\n this.overlay?.appendChild(this.spinnerInstance.location.nativeElement);\r\n }\r\n\r\n private removeProgressSpinnerComponent(): void {\r\n this.spinnerInstance?.destroy();\r\n }\r\n\r\n private addOverlay(): void {\r\n this.overlay = this.renderer.createElement('div');\r\n this.renderer.setStyle(this.overlay, 'display', 'flex');\r\n this.renderer.setStyle(this.overlay, 'justify-content', 'center');\r\n this.renderer.setStyle(this.overlay, 'align-items', 'center');\r\n this.renderer.setStyle(this.overlay, 'position', 'absolute');\r\n this.renderer.setStyle(this.overlay, 'top', '0');\r\n this.renderer.setStyle(this.overlay, 'left', '0');\r\n this.renderer.setStyle(this.overlay, 'width', '100%');\r\n this.renderer.setStyle(this.overlay, 'height', '100%');\r\n\r\n this.renderer.appendChild(this.targetEl.nativeElement, this.overlay);\r\n }\r\n\r\n private removeOverlay(): void {\r\n if (this.overlay) {\r\n this.renderer.removeChild(this.targetEl.nativeElement, this.overlay);\r\n this.overlay = undefined;\r\n }\r\n }\r\n\r\n private addBlurEffect(): void {\r\n const style = this.renderer.createElement('style');\r\n const blurRule = `\r\n .ptr-loading-blur > *:not(:last-child) {\r\n filter: blur(2px);\r\n transition: filter 0.3s ease;\r\n }\r\n `;\r\n this.renderer.appendChild(style, this.renderer.createText(blurRule));\r\n this.renderer.appendChild(document.head, style);\r\n this.renderer.addClass(this.targetEl.nativeElement, 'ptr-loading-blur');\r\n }\r\n\r\n private removeBlurEffect(): void {\r\n this.renderer.removeClass(this.targetEl.nativeElement, 'ptr-loading-blur');\r\n }\r\n\r\n}\r\n","import { computed, Injectable, signal, Signal } from '@angular/core';\r\n\r\n/**\r\n * Optimized Async Loading Service using Angular Signals\r\n * Supports global loading state and named loading areas with auto-cleanup\r\n *\r\n * To use as a non-singleton service, add to providers array in @Component decorator:\r\n * @Component({\r\n * selector: 'app-example',\r\n * templateUrl: './example.component.html',\r\n * providers: [PtrLoadingService]\r\n * })\r\n *\r\n * Usage:\r\n * Set loading: this.loadingService.setLoading(true)\r\n * - Set loading: this.loadingService.setLoading(true, 'areaName')\r\n * \r\n * - Get loading (template): {{ loadingService.isLoading()() }}\r\n * - Get loading (template): {{ loadingService.isLoading('areaName')() }}\r\n * \r\n * - Get loading (component): this.loadingService.isLoading()()\r\n * - Get loading (component): this.loadingService.isLoading('areaName')()\r\n * \r\n * - React to loading changes: effect(() => console.log('Loading:', this.loadingService.isLoading('areaName')()))\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PtrLoadingService {\r\n\r\n private globalTaskCount = signal(0);\r\n private loadingAreas = new Map<string, ReturnType<typeof signal<number>>>();\r\n\r\n isLoading(area?: string): Signal<boolean> {\r\n if (!area) {\r\n return computed(() => this.globalTaskCount() > 0);\r\n }\r\n\r\n return computed(() => {\r\n const areaSignal = this.loadingAreas.get(area);\r\n return areaSignal ? areaSignal() > 0 : false;\r\n });\r\n }\r\n\r\n setLoading(value: boolean, area?: string): void {\r\n if (!area) {\r\n this.updateTaskCount(this.globalTaskCount, value);\r\n } else {\r\n this.updateNamedAreaLoading(area, value);\r\n }\r\n }\r\n\r\n resetLoading(area?: string): void {\r\n if (!area) {\r\n this.globalTaskCount.set(0);\r\n } else if (this.loadingAreas.has(area)) {\r\n this.loadingAreas.get(area)!.set(0);\r\n this.loadingAreas.delete(area);\r\n }\r\n }\r\n\r\n private updateNamedAreaLoading(area: string, increment: boolean): void {\r\n let areaSignal = this.loadingAreas.get(area);\r\n if (!areaSignal && increment) {\r\n areaSignal = signal(0);\r\n this.loadingAreas.set(area, areaSignal);\r\n }\r\n\r\n if (areaSignal) {\r\n areaSignal.update(count => {\r\n const newCount = increment ? count + 1 : Math.max(0, count - 1);\r\n if (newCount === 0) {\r\n this.loadingAreas.delete(area);\r\n }\r\n return newCount;\r\n });\r\n }\r\n }\r\n\r\n private updateTaskCount(taskCount: ReturnType<typeof signal<number>>, increment: boolean): void {\r\n taskCount.update(count => increment ? count + 1 : Math.max(0, count - 1));\r\n }\r\n\r\n}\r\n","import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, ViewChild, AfterViewInit } from '@angular/core';\r\nimport { PtrButtonComponent } from '../../ptr-button/ptr-button.component';\r\n\r\n@Component({\r\n selector: 'ptr-dialog',\r\n standalone: true,\r\n imports: [\r\n PtrButtonComponent\r\n ],\r\n templateUrl: './ptr-dialog.component.html',\r\n styleUrls: [\"./ptr-dialog.component.scss\"],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrDialogComponent implements AfterViewInit {\r\n\r\n @ViewChild('dialogElement') dialogElement!: ElementRef<HTMLDialogElement>;\r\n\r\n @Input() title = '';\r\n @Input() message = '';\r\n @Input() buttonText = 'Confirm';\r\n @Input() buttonStyle: 'normal' | 'error' | 'secondary' = 'normal';\r\n\r\n @Output() closed = new EventEmitter<boolean | null>();\r\n\r\n ngAfterViewInit() {\r\n this.dialogElement.nativeElement.showModal();\r\n }\r\n\r\n close() {\r\n this.dialogElement.nativeElement.close();\r\n }\r\n\r\n confirm() {\r\n this.closed.emit(true);\r\n this.close();\r\n }\r\n\r\n onClose() {\r\n this.closed.emit(null);\r\n }\r\n\r\n}\r\n","<dialog #dialogElement class=\"ptr-modal\" (close)=\"onClose()\">\r\n <div class=\"ptr-modal__content\">\r\n\r\n <div class=\"ptr-modal__header\">\r\n <h2 class=\"ptr-modal__title\">{{title}}</h2>\r\n <button class=\"ptr-modal__close\" (click)=\"close()\" aria-label=\"Close dialog\">&times;</button>\r\n </div>\r\n\r\n <p>{{ message }}</p>\r\n <div class=\"ptr-modal__actions\">\r\n <ptr-button buttonStyle=\"secondary\" (clicked)=\"close()\" [isSmallSize]=\"true\">Cancel</ptr-button>\r\n <ptr-button class=\"ml-auto\" [buttonStyle]=\"buttonStyle\" (clicked)=\"confirm()\"\r\n [isSmallSize]=\"true\">{{buttonText}}</ptr-button>\r\n </div>\r\n\r\n </div>\r\n</dialog>\r\n","import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, Injectable } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { PtrDialogComponent } from './ptr-dialog/ptr-dialog.component';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PtrDialogService {\r\n\r\n private dialogComponentRef: ComponentRef<PtrDialogComponent> | null = null;\r\n\r\n constructor(\r\n private appRef: ApplicationRef,\r\n private injector: EnvironmentInjector\r\n ) { }\r\n\r\n open(options: {\r\n message: string;\r\n buttonText?: string;\r\n buttonStyle?: 'normal' | 'error' | 'secondary';\r\n }): Observable<boolean> {\r\n const dialogResult$ = new Subject<boolean>();\r\n\r\n this.dialogComponentRef = createComponent(PtrDialogComponent, {\r\n environmentInjector: this.injector,\r\n });\r\n\r\n const { instance } = this.dialogComponentRef;\r\n\r\n instance.message = options.message;\r\n instance.buttonText = options.buttonText || 'Confirm';\r\n instance.buttonStyle = options.buttonStyle || 'normal';\r\n\r\n instance.closed.subscribe((result: boolean | null) => {\r\n this.removeDialog();\r\n dialogResult$.next(result ?? false);\r\n dialogResult$.complete();\r\n });\r\n\r\n document.body.appendChild(this.dialogComponentRef.location.nativeElement);\r\n this.appRef.attachView(this.dialogComponentRef.hostView);\r\n\r\n return dialogResult$.asObservable();\r\n }\r\n\r\n private removeDialog() {\r\n if (this.dialogComponentRef) {\r\n this.appRef.detachView(this.dialogComponentRef.hostView);\r\n this.dialogComponentRef.destroy();\r\n this.dialogComponentRef = null;\r\n }\r\n }\r\n\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { ChangeDetectionStrategy, Component, ElementRef, Input, ViewChild } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ptr-tooltip',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './ptr-tooltip.component.html',\r\n styleUrls: [\"./ptr-tooltip.component.scss\"],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrTooltipComponent {\r\n\r\n @Input() content = '';\r\n\r\n @ViewChild('tooltipDialog') tooltipDialog!: ElementRef<HTMLDialogElement>;\r\n\r\n private tooltipTimer: any;\r\n\r\n showTooltip() {\r\n clearTimeout(this.tooltipTimer);\r\n this.tooltipTimer = setTimeout(() => {\r\n this.tooltipDialog.nativeElement.show();\r\n }, 200); // Small delay to prevent flickering on quick mouse movements\r\n }\r\n\r\n hideTooltip() {\r\n clearTimeout(this.tooltipTimer);\r\n this.tooltipTimer = setTimeout(() => {\r\n this.tooltipDialog.nativeElement.close();\r\n }, 200); // Small delay to allow moving mouse to tooltip\r\n }\r\n\r\n}\r\n","<span (mouseenter)=\"showTooltip()\" (mouseleave)=\"hideTooltip()\" class=\"tooltip-trigger\">\r\n <ng-content></ng-content>\r\n</span>\r\n<dialog #tooltipDialog class=\"ptr-tooltip\">\r\n <div class=\"ptr-tooltip__content\">{{ content }}</div>\r\n</dialog>","import { ChangeDetectionStrategy, Component, computed, inject, Input } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { ActivatedRoute, NavigationEnd, Router, RouterModule } from '@angular/router';\r\nimport { filter, distinctUntilChanged } from 'rxjs';\r\nimport { BreadcrumbRouteInfo, PtrBreadcrumb } from './interfaces';\r\n@Component({\r\n selector: 'ptr-breadcrumbs',\r\n standalone: true,\r\n imports: [RouterModule],\r\n templateUrl: './ptr-breadcrumbs.component.html',\r\n styleUrl: './ptr-breadcrumbs.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrBreadcrumbsComponent {\r\n\r\n @Input() showFirstSeparator = true;\r\n\r\n private router = inject(Router);\r\n private activatedRoute = inject(ActivatedRoute);\r\n\r\n private routeEvents = toSignal(\r\n this.router.events.pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n distinctUntilChanged()\r\n )\r\n );\r\n\r\n breadcrumbs = computed(() => {\r\n this.routeEvents();\r\n return this.createBreadcrumbs(this.activatedRoute.root);\r\n });\r\n\r\n private createBreadcrumbs(route: ActivatedRoute, routeUrl = '', breadcrumbs: PtrBreadcrumb[] = []): PtrBreadcrumb[] {\r\n const routeChildren: ActivatedRoute[] = route.children;\r\n if (routeChildren.length === 0) {\r\n return breadcrumbs;\r\n }\r\n for (const child of routeChildren) {\r\n const routeURL: string = child.snapshot.url.map(segment => segment.path).join('/');\r\n if (routeURL !== '') {\r\n routeUrl += `/${routeURL}`;\r\n }\r\n const { label, url } = this.getLabelForRoute(child);\r\n\r\n // Skip if the label is undefined or empty and the path is empty\r\n if (label && (!breadcrumbs.length || breadcrumbs[breadcrumbs.length - 1].label !== label)) {\r\n breadcrumbs.push({ label, url: url ?? routeUrl });\r\n }\r\n\r\n return this.createBreadcrumbs(child, routeUrl, breadcrumbs);\r\n }\r\n return breadcrumbs;\r\n }\r\n\r\n private getLabelForRoute(route: ActivatedRoute): BreadcrumbRouteInfo {\r\n const breadcrumbReturnInfo: BreadcrumbRouteInfo = {};\r\n const customBreadcrumb = route.snapshot.data['breadcrumb'] as BreadcrumbRouteInfo | undefined;\r\n\r\n if (customBreadcrumb) {\r\n if (customBreadcrumb.label) {\r\n breadcrumbReturnInfo.label = customBreadcrumb.label;\r\n }\r\n if (customBreadcrumb.url) {\r\n breadcrumbReturnInfo.url = customBreadcrumb.url;\r\n }\r\n } else if (route.snapshot.title) {\r\n breadcrumbReturnInfo.label = route.snapshot.title;\r\n }\r\n\r\n return breadcrumbReturnInfo;\r\n }\r\n\r\n}\r\n","@if (breadcrumbs().length > 0) {\n <nav aria-label=\"breadcrumb\" class=\"breadcrumb-wrapper\">\n <ol class=\"breadcrumb\" [class.breadcrumb--show-first-separator]=\"showFirstSeparator\">\n @for (breadcrumb of breadcrumbs(); track breadcrumb.label; let last = $last) {\n <li class=\"breadcrumb-item\" [class.breadcrumb-item--active]=\"last\">\n @if (!last) {\n <a class=\"breadcrumb-item-label\" [routerLink]=\"breadcrumb.url\">{{ breadcrumb.label }}</a>\n }\n @if (last) {\n <span class=\"breadcrumb-item-label\">{{ breadcrumb.label }}</span>\n }\n </li>\n }\n </ol>\n </nav>\n}\n","import { ChangeDetectionStrategy, Component, Input, signal } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ptr-tab',\r\n standalone: true,\r\n template: '@if(active()){<ng-content></ng-content>}',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrTabComponent {\r\n @Input() label!: string;\r\n @Input() link?: string;\r\n\r\n active = signal(false);\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, ChangeDetectionStrategy, Component, ContentChildren, DestroyRef, effect, ElementRef, inject, QueryList, signal, ViewChildren } from '@angular/core';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { PtrTabComponent } from '../ptr-tab/ptr-tab.component';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n\r\n@Component({\r\n selector: 'ptr-tabs',\r\n standalone: true,\r\n imports: [CommonModule, RouterModule],\r\n templateUrl: './ptr-tabs.component.html',\r\n styleUrl: './ptr-tabs.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrTabsComponent implements AfterViewInit {\r\n\r\n @ContentChildren(PtrTabComponent) tabComponents!: QueryList<PtrTabComponent>;\r\n @ViewChildren('tabButton') buttons!: QueryList<ElementRef>;\r\n\r\n private router = inject(Router);\r\n private destroyRef = inject(DestroyRef);\r\n\r\n tabs = signal<PtrTabComponent[]>([]);\r\n activeTabIndex = signal(0);\r\n useLinks = signal(false);\r\n sliderPosition = signal({ transform: 'translateX(0)', width: '0' });\r\n\r\n constructor() {\r\n effect(() => {\r\n const activeTab = this.tabs().find(tab => tab.active());\r\n if (activeTab?.link) {\r\n this.router.navigate([activeTab.link]);\r\n }\r\n this.updateSliderPosition();\r\n }, { allowSignalWrites: true });\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.tabComponents.changes\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.updateTabs();\r\n });\r\n this.updateTabs();\r\n }\r\n\r\n updateTabs() {\r\n this.tabs.set(this.tabComponents.toArray());\r\n this.useLinks.set(this.tabs().some(tab => !!tab.link));\r\n if (this.tabs().length > 0 && !this.tabs().some(tab => tab.active())) {\r\n this.selectTab(0);\r\n } else {\r\n this.updateSliderPosition();\r\n }\r\n }\r\n\r\n selectTab(index: number) {\r\n this.tabs().forEach((tab, i) => tab.active.set(i === index));\r\n this.activeTabIndex.set(index);\r\n }\r\n\r\n updateSliderPosition() {\r\n const activeButton = this.buttons?.get(this.activeTabIndex())?.nativeElement;\r\n if (activeButton) {\r\n const { offsetLeft, offsetWidth } = activeButton;\r\n this.sliderPosition.set({\r\n transform: `translateX(${offsetLeft}px)`,\r\n width: `${offsetWidth}px`\r\n });\r\n }\r\n }\r\n\r\n}\r\n","<div class=\"tabs-container\" role=\"tablist\">\r\n @for (tab of tabs(); track $index; let i = $index) {\r\n <button #tabButton [attr.role]=\"tab.link ? 'link' : 'tab'\" [attr.aria-selected]=\"tab.active()\"\r\n [class.active]=\"tab.active()\" (click)=\"selectTab(i)\" [routerLink]=\"tab.link\">{{tab.label}}</button>\r\n }\r\n\r\n <div class=\"slider\" [style.transform]=\"sliderPosition().transform\" [style.width]=\"sliderPosition().width\"></div>\r\n</div>\r\n\r\n@if (!useLinks()) {\r\n<div class=\"tab-content\">\r\n <ng-content></ng-content>\r\n</div>\r\n}\r\n","import { ApplicationRef, ComponentRef, createComponent, DestroyRef, EnvironmentInjector, inject, Injectable, Injector, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { timer } from 'rxjs';\r\nimport { PtrToast } from './interfaces';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PtrToasterService {\r\n\r\n private destroyRef = inject(DestroyRef);\r\n private injector = inject(Injector);\r\n private environmentInjector = inject(EnvironmentInjector);\r\n private appRef = inject(ApplicationRef);\r\n\r\n private toasts = signal<PtrToast[]>([]);\r\n private counter = 0;\r\n private toasterComponentRef: ComponentRef<unknown> | null = null;\r\n\r\n constructor() {\r\n this.injectToasterComponent();\r\n }\r\n\r\n private injectToasterComponent() {\r\n if (this.toasterComponentRef) {\r\n return;\r\n }\r\n\r\n import('./ptr-toaster/ptr-toaster.component').then(module => {\r\n this.toasterComponentRef = createComponent(module.PtrToasterComponent, {\r\n environmentInjector: this.environmentInjector,\r\n elementInjector: this.injector\r\n });\r\n\r\n const domElem = this.toasterComponentRef.location.nativeElement;\r\n document.body.appendChild(domElem);\r\n this.appRef.attachView(this.toasterComponentRef.hostView);\r\n });\r\n }\r\n\r\n public getToasts() {\r\n return this.toasts.asReadonly();\r\n }\r\n\r\n public show(message: string, type: PtrToast['type'] = 'info') {\r\n const id = this.counter++;\r\n this.toasts.update(toasts => [...toasts, { id, message, type }]);\r\n\r\n timer(10000)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.remove(id));\r\n }\r\n\r\n public remove(id: number) {\r\n this.toasts.update(toasts => toasts.filter(t => t.id !== id));\r\n }\r\n\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { PtrToasterService } from '../ptr-toaster.service';\r\n\r\n@Component({\r\n selector: 'ptr-toaster',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ptr-toaster.component.html',\r\n styleUrl: './ptr-toaster.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PtrToasterComponent {\r\n protected toasterService = inject(PtrToasterService);\r\n}\r\n","<div class=\"toaster-container\" aria-live=\"polite\" aria-atomic=\"true\">\r\n @for (toast of toasterService.getToasts()(); track toast.id) {\r\n <div class=\"toast\" [ngClass]=\"toast.type\" role=\"alert\">\r\n <span>{{toast.message}}</span>\r\n <button (click)=\"toasterService.remove(toast.id)\" aria-label=\"Close\"><span>&times;</span></button>\r\n </div>\r\n }\r\n</div>\r\n","/*\r\n * Public API Surface of ngx-components\r\n */\r\n\r\nexport * from './lib/menu/menu.component';\r\n\r\nexport * from './lib/forms/interfaces';\r\nexport { PtrFormComponent } from './lib/forms/form/form.component';\r\nexport { PtrSelectComponent } from './lib/forms/input/select/select.component';\r\nexport { PtrInputComponent } from './lib/forms/input/ptr-input/ptr-input.component';\r\n\r\nexport { PtrTitleComponent } from './lib/ptr-title/ptr-title.component';\r\n\r\nexport { PtrLoadingSpinnerComponent } from './lib/loading-spinner/loading-spinner.component';\r\nexport { PtrLoadingSpinnerDirective } from './lib/loading-spinner/loading-spinner.directive';\r\n\r\nexport { PtrLoadingService } from './lib/services/loading.service';\r\n\r\nexport { PtrButtonComponent } from './lib/ptr-button/ptr-button.component';\r\n\r\nexport { PtrDialogService } from './lib/dialog/ptr-dialog.service';\r\nexport { PtrDialogComponent } from './lib/dialog/ptr-dialog/ptr-dialog.component';\r\nexport { PtrTooltipComponent } from './lib/dialog/ptr-tooltip/ptr-tooltip.component';\r\n\r\nexport { PtrBreadcrumbsComponent } from './lib/ptr-breadcrumbs/ptr-breadcrumbs.component';\r\nexport { PtrBreadcrumb } from './lib/ptr-breadcrumbs/interfaces';\r\n\r\nexport { PtrTabsComponent } from './lib/components/tabs/ptr-tabs/ptr-tabs.component';\r\nexport { PtrTabComponent } from './lib/components/tabs/ptr-tab/ptr-tab.component';\r\n\r\nexport { PtrToasterService } from './lib/ptr-toaster/ptr-toaster.service';\r\nexport { PtrToasterComponent } from './lib/ptr-toaster/ptr-toaster/ptr-toaster.component';\r\nexport { PtrToast } from './lib/ptr-toaster/interfaces';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}
@@ -42,5 +42,6 @@ export interface PtrFormConfig {
42
42
  formClass?: string;
43
43
  formValidators?: ValidatorFn[];
44
44
  submitText?: string;
45
+ submitFullWidth?: boolean;
45
46
  labelPosition?: 'top' | 'inline';
46
47
  }
@@ -0,0 +1,5 @@
1
+ export interface PtrToast {
2
+ id: number;
3
+ message: string;
4
+ type: 'success' | 'error' | 'info' | 'warning';
5
+ }
@@ -0,0 +1,7 @@
1
+ import { PtrToasterService } from '../ptr-toaster.service';
2
+ import * as i0 from "@angular/core";
3
+ export declare class PtrToasterComponent {
4
+ protected toasterService: PtrToasterService;
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<PtrToasterComponent, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<PtrToasterComponent, "ptr-toaster", never, {}, {}, never, never, true, never>;
7
+ }
@@ -0,0 +1,18 @@
1
+ import { PtrToast } from './interfaces';
2
+ import * as i0 from "@angular/core";
3
+ export declare class PtrToasterService {
4
+ private destroyRef;
5
+ private injector;
6
+ private environmentInjector;
7
+ private appRef;
8
+ private toasts;
9
+ private counter;
10
+ private toasterComponentRef;
11
+ constructor();
12
+ private injectToasterComponent;
13
+ getToasts(): import("@angular/core").Signal<PtrToast[]>;
14
+ show(message: string, type?: PtrToast['type']): void;
15
+ remove(id: number): void;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<PtrToasterService, never>;
17
+ static ɵprov: i0.ɵɵInjectableDeclaration<PtrToasterService>;
18
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patter/ngx-components",
3
- "version": "0.5.13",
3
+ "version": "0.5.15",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^18.2.0",
6
6
  "@angular/core": "^18.2.0"
package/public-api.d.ts CHANGED
@@ -15,3 +15,6 @@ export { PtrBreadcrumbsComponent } from './lib/ptr-breadcrumbs/ptr-breadcrumbs.c
15
15
  export { PtrBreadcrumb } from './lib/ptr-breadcrumbs/interfaces';
16
16
  export { PtrTabsComponent } from './lib/components/tabs/ptr-tabs/ptr-tabs.component';
17
17
  export { PtrTabComponent } from './lib/components/tabs/ptr-tab/ptr-tab.component';
18
+ export { PtrToasterService } from './lib/ptr-toaster/ptr-toaster.service';
19
+ export { PtrToasterComponent } from './lib/ptr-toaster/ptr-toaster/ptr-toaster.component';
20
+ export { PtrToast } from './lib/ptr-toaster/interfaces';