ng-prime-tools 1.0.41 → 1.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,22 +1,26 @@
1
+ // ng-prime-tools/projects/ng-prime-tools/src/lib/pt-dropdown/pt-dropdown.component.ts
1
2
  import { Component, Input } from '@angular/core';
2
3
  import { FormControl, Validators } from '@angular/forms';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "@angular/common";
5
6
  import * as i2 from "@angular/forms";
6
7
  import * as i3 from "primeng/dropdown";
8
+ import * as i4 from "primeng/api";
7
9
  export class PTDropdownComponent {
8
10
  ngOnInit() {
9
11
  this.setupControl();
10
12
  }
13
+ // -------------------------------------------------------------------
14
+ // 🔧 Control & validation
15
+ // -------------------------------------------------------------------
11
16
  setupControl() {
12
17
  let control = this.formGroup.get(this.formField.name);
13
18
  if (!control) {
14
- control = new FormControl(this.formField.value || null);
19
+ control = new FormControl(this.formField.value ?? null);
15
20
  this.formGroup.addControl(this.formField.name, control);
16
21
  }
17
22
  const validators = this.getValidators();
18
23
  control.setValidators(validators);
19
- // Manage the disabled state using form control
20
24
  setTimeout(() => {
21
25
  if (this.formField.disabled !== undefined) {
22
26
  if (this.formField.disabled) {
@@ -43,15 +47,121 @@ export class PTDropdownComponent {
43
47
  }
44
48
  return '';
45
49
  }
50
+ // -------------------------------------------------------------------
51
+ // 🎨 Icon helpers
52
+ // -------------------------------------------------------------------
53
+ /**
54
+ * Résout l’icône à utiliser pour une option :
55
+ * 1) option.iconStyle | option.iconImageStyle
56
+ * 2) option.icon
57
+ * 3) formField.icon (fallback global)
58
+ */
59
+ getResolvedIcon(option) {
60
+ const source = option?.iconStyle ||
61
+ option?.iconImageStyle ||
62
+ option?.icon ||
63
+ this.formField.icon;
64
+ if (!source) {
65
+ return { type: 'none' };
66
+ }
67
+ // 1) Image icon (IconImageStyle)
68
+ if (this.isIconImageStyle(source)) {
69
+ const img = source;
70
+ return {
71
+ type: 'image',
72
+ imageUrl: img.url,
73
+ imageStyle: this.buildImageStyle(img),
74
+ };
75
+ }
76
+ // 2) Font icon full style (IconStyle)
77
+ if (this.isIconStyle(source)) {
78
+ const style = source;
79
+ return {
80
+ type: 'font',
81
+ fontIconClass: style.code, // ex: 'pi pi-flag' or 'fa fa-flag'
82
+ fontIconStyle: this.buildFontIconStyle(style),
83
+ };
84
+ }
85
+ // 3) Simple string of classes (PrimeNG / Font Awesome)
86
+ if (typeof source === 'string') {
87
+ return {
88
+ type: 'font',
89
+ fontIconClass: source,
90
+ fontIconStyle: {},
91
+ };
92
+ }
93
+ return { type: 'none' };
94
+ }
95
+ isIconStyle(value) {
96
+ return !!value && typeof value === 'object' && 'code' in value;
97
+ }
98
+ isIconImageStyle(value) {
99
+ return !!value && typeof value === 'object' && 'url' in value;
100
+ }
101
+ buildFontIconStyle(icon) {
102
+ const styles = {};
103
+ if (icon.color) {
104
+ styles.color = icon.color;
105
+ }
106
+ if (icon.fontSize) {
107
+ styles['font-size'] = icon.fontSize;
108
+ }
109
+ if (icon.backgroundColor) {
110
+ styles['background-color'] = icon.backgroundColor;
111
+ styles.padding = styles.padding ?? '0.15rem 0.3rem';
112
+ }
113
+ if (icon.shape === 'circular') {
114
+ styles['border-radius'] = '50%';
115
+ }
116
+ else if (icon.shape === 'rounded-square') {
117
+ styles['border-radius'] = '6px';
118
+ }
119
+ return styles;
120
+ }
121
+ buildImageStyle(icon) {
122
+ const styles = {};
123
+ if (icon.width)
124
+ styles.width = icon.width;
125
+ if (icon.height)
126
+ styles.height = icon.height;
127
+ if (icon.marginLeft)
128
+ styles['margin-left'] = icon.marginLeft;
129
+ if (icon.marginRight)
130
+ styles['margin-right'] = icon.marginRight;
131
+ if (icon.marginTop)
132
+ styles['margin-top'] = icon.marginTop;
133
+ if (icon.marginBottom)
134
+ styles['margin-bottom'] = icon.marginBottom;
135
+ if (icon.shape === 'circular') {
136
+ styles['border-radius'] = '50%';
137
+ }
138
+ else if (icon.shape === 'rounded-square') {
139
+ styles['border-radius'] = '6px';
140
+ }
141
+ return styles;
142
+ }
143
+ getIconPosition(option) {
144
+ const src = option?.iconStyle ||
145
+ option?.iconImageStyle ||
146
+ option?.icon ||
147
+ this.formField.icon;
148
+ if (this.isIconStyle(src) && src.position) {
149
+ return src.position;
150
+ }
151
+ if (this.isIconImageStyle(src) && src.position) {
152
+ return src.position;
153
+ }
154
+ return 'left';
155
+ }
46
156
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
47
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTDropdownComponent, selector: "pt-dropdown", inputs: { formGroup: "formGroup", formField: "formField" }, ngImport: i0, template: "<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{ width: formField.width || '100%' }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n <p-dropdown\n [formControlName]=\"formField.name\"\n [options]=\"formField.options\"\n [placeholder]=\"formField.placeholder || 'Select an option'\"\n optionLabel=\"label\"\n ></p-dropdown>\n <div\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n >\n <small class=\"p-error\">{{ getErrorMessage() }}</small>\n </div>\n</div>\n", styles: [".form-field{margin-bottom:1rem}.form-field label{display:block;margin-bottom:.5rem;font-weight:700}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { 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: i3.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }] }); }
157
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTDropdownComponent, selector: "pt-dropdown", inputs: { formGroup: "formGroup", formField: "formField" }, ngImport: i0, template: "<!-- ng-prime-tools/projects/ng-prime-tools/src/lib/pt-dropdown/pt-dropdown.component.html -->\n<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{ width: formField.width || '100%' }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n\n <p-dropdown\n [formControlName]=\"formField.name\"\n [options]=\"formField.options\"\n [placeholder]=\"formField.placeholder || 'Select an option'\"\n optionLabel=\"label\"\n >\n <!-- Selected value template -->\n <ng-template pTemplate=\"selectedItem\" let-option>\n <ng-container *ngIf=\"option; else placeholderTpl\">\n <div class=\"pt-dropdown-item\">\n <ng-container *ngIf=\"getResolvedIcon(option) as iconMeta\">\n <!-- IMAGE ICON -->\n <img\n *ngIf=\"iconMeta.type === 'image'\"\n [src]=\"iconMeta.imageUrl\"\n [ngStyle]=\"iconMeta.imageStyle\"\n class=\"pt-dropdown-icon-image\"\n />\n\n <!-- FONT ICON (PrimeNG / FontAwesome) -->\n <i\n *ngIf=\"iconMeta.type === 'font'\"\n [ngClass]=\"iconMeta.fontIconClass\"\n [ngStyle]=\"iconMeta.fontIconStyle\"\n class=\"pt-dropdown-icon-font\"\n ></i>\n </ng-container>\n\n <span class=\"pt-dropdown-label\">{{ option.label }}</span>\n </div>\n </ng-container>\n </ng-template>\n\n <!-- Placeholder when no value selected -->\n <ng-template #placeholderTpl>\n <span>{{ formField.placeholder || \"Select an option\" }}</span>\n </ng-template>\n\n <!-- Items template -->\n <ng-template pTemplate=\"item\" let-option>\n <div class=\"pt-dropdown-item\">\n <ng-container *ngIf=\"getResolvedIcon(option) as iconMeta\">\n <img\n *ngIf=\"iconMeta.type === 'image'\"\n [src]=\"iconMeta.imageUrl\"\n [ngStyle]=\"iconMeta.imageStyle\"\n class=\"pt-dropdown-icon-image\"\n />\n\n <i\n *ngIf=\"iconMeta.type === 'font'\"\n [ngClass]=\"iconMeta.fontIconClass\"\n [ngStyle]=\"iconMeta.fontIconStyle\"\n class=\"pt-dropdown-icon-font\"\n ></i>\n </ng-container>\n\n <span class=\"pt-dropdown-label\">{{ option.label }}</span>\n </div>\n </ng-template>\n </p-dropdown>\n\n <div\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n >\n <small class=\"p-error\">{{ getErrorMessage() }}</small>\n </div>\n</div>\n", styles: [".form-field{display:flex;flex-direction:column;gap:.25rem}.pt-dropdown-item{display:flex;align-items:center;gap:.5rem}.pt-dropdown-icon-image{object-fit:cover}.pt-dropdown-icon-font{display:inline-flex;align-items:center;justify-content:center}.pt-dropdown-label{display:inline-block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { 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: i3.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }] }); }
48
158
  }
49
159
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTDropdownComponent, decorators: [{
50
160
  type: Component,
51
- args: [{ selector: 'pt-dropdown', template: "<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{ width: formField.width || '100%' }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n <p-dropdown\n [formControlName]=\"formField.name\"\n [options]=\"formField.options\"\n [placeholder]=\"formField.placeholder || 'Select an option'\"\n optionLabel=\"label\"\n ></p-dropdown>\n <div\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n >\n <small class=\"p-error\">{{ getErrorMessage() }}</small>\n </div>\n</div>\n", styles: [".form-field{margin-bottom:1rem}.form-field label{display:block;margin-bottom:.5rem;font-weight:700}\n"] }]
161
+ args: [{ selector: 'pt-dropdown', template: "<!-- ng-prime-tools/projects/ng-prime-tools/src/lib/pt-dropdown/pt-dropdown.component.html -->\n<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{ width: formField.width || '100%' }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n\n <p-dropdown\n [formControlName]=\"formField.name\"\n [options]=\"formField.options\"\n [placeholder]=\"formField.placeholder || 'Select an option'\"\n optionLabel=\"label\"\n >\n <!-- Selected value template -->\n <ng-template pTemplate=\"selectedItem\" let-option>\n <ng-container *ngIf=\"option; else placeholderTpl\">\n <div class=\"pt-dropdown-item\">\n <ng-container *ngIf=\"getResolvedIcon(option) as iconMeta\">\n <!-- IMAGE ICON -->\n <img\n *ngIf=\"iconMeta.type === 'image'\"\n [src]=\"iconMeta.imageUrl\"\n [ngStyle]=\"iconMeta.imageStyle\"\n class=\"pt-dropdown-icon-image\"\n />\n\n <!-- FONT ICON (PrimeNG / FontAwesome) -->\n <i\n *ngIf=\"iconMeta.type === 'font'\"\n [ngClass]=\"iconMeta.fontIconClass\"\n [ngStyle]=\"iconMeta.fontIconStyle\"\n class=\"pt-dropdown-icon-font\"\n ></i>\n </ng-container>\n\n <span class=\"pt-dropdown-label\">{{ option.label }}</span>\n </div>\n </ng-container>\n </ng-template>\n\n <!-- Placeholder when no value selected -->\n <ng-template #placeholderTpl>\n <span>{{ formField.placeholder || \"Select an option\" }}</span>\n </ng-template>\n\n <!-- Items template -->\n <ng-template pTemplate=\"item\" let-option>\n <div class=\"pt-dropdown-item\">\n <ng-container *ngIf=\"getResolvedIcon(option) as iconMeta\">\n <img\n *ngIf=\"iconMeta.type === 'image'\"\n [src]=\"iconMeta.imageUrl\"\n [ngStyle]=\"iconMeta.imageStyle\"\n class=\"pt-dropdown-icon-image\"\n />\n\n <i\n *ngIf=\"iconMeta.type === 'font'\"\n [ngClass]=\"iconMeta.fontIconClass\"\n [ngStyle]=\"iconMeta.fontIconStyle\"\n class=\"pt-dropdown-icon-font\"\n ></i>\n </ng-container>\n\n <span class=\"pt-dropdown-label\">{{ option.label }}</span>\n </div>\n </ng-template>\n </p-dropdown>\n\n <div\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n >\n <small class=\"p-error\">{{ getErrorMessage() }}</small>\n </div>\n</div>\n", styles: [".form-field{display:flex;flex-direction:column;gap:.25rem}.pt-dropdown-item{display:flex;align-items:center;gap:.5rem}.pt-dropdown-icon-image{object-fit:cover}.pt-dropdown-icon-font{display:inline-flex;align-items:center;justify-content:center}.pt-dropdown-label{display:inline-block}\n"] }]
52
162
  }], propDecorators: { formGroup: [{
53
163
  type: Input
54
164
  }], formField: [{
55
165
  type: Input
56
166
  }] } });
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcHJpbWUtdG9vbHMvc3JjL2xpYi9wdC1kcm9wZG93bi9wdC1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWRyb3Bkb3duL3B0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBYSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBUXBFLE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFnQixDQUFDO1FBRXJFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbEMsK0NBQStDO1FBQy9DLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzVCLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDeEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxhQUFhO1FBQ25CLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUIsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLGNBQWMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDOytHQS9DVSxtQkFBbUI7bUdBQW5CLG1CQUFtQiwrR0NUaEMsdW5CQXNCQTs7NEZEYmEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGFBQWE7OEJBS2QsU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRm9ybURyb3Bkb3duRmllbGQgfSBmcm9tICcuLi9tb2RlbHMvZm9ybS1kcm9wLWRvd24tZmllbGQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwdC1kcm9wZG93bicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wdC1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3B0LWRyb3Bkb3duLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUFREcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGZvcm1Hcm91cCE6IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgZm9ybUZpZWxkITogRm9ybURyb3Bkb3duRmllbGQ7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXR1cENvbnRyb2woKTtcbiAgfVxuXG4gIHNldHVwQ29udHJvbCgpIHtcbiAgICBsZXQgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmdldCh0aGlzLmZvcm1GaWVsZC5uYW1lKSBhcyBGb3JtQ29udHJvbDtcblxuICAgIGlmICghY29udHJvbCkge1xuICAgICAgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCh0aGlzLmZvcm1GaWVsZC52YWx1ZSB8fCBudWxsKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmFkZENvbnRyb2wodGhpcy5mb3JtRmllbGQubmFtZSwgY29udHJvbCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuZ2V0VmFsaWRhdG9ycygpO1xuICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcblxuICAgIC8vIE1hbmFnZSB0aGUgZGlzYWJsZWQgc3RhdGUgdXNpbmcgZm9ybSBjb250cm9sXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5mb3JtRmllbGQuZGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodGhpcy5mb3JtRmllbGQuZGlzYWJsZWQpIHtcbiAgICAgICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWYWxpZGF0b3JzKCkge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICBpZiAodGhpcy5mb3JtRmllbGQucmVxdWlyZWQpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHRoaXMuZm9ybUZpZWxkLm5hbWUpO1xuICAgIGlmIChjb250cm9sPy5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybUZpZWxkLmVycm9yVGV4dCB8fCBgJHt0aGlzLmZvcm1GaWVsZC5sYWJlbH0gaXMgcmVxdWlyZWRgO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cbiIsIjxkaXZcbiAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICBjbGFzcz1cImZvcm0tZmllbGRcIlxuICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBmb3JtRmllbGQud2lkdGggfHwgJzEwMCUnIH1cIlxuICAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCJcbj5cbiAgPGxhYmVsICpuZ0lmPVwiZm9ybUZpZWxkLmxhYmVsXCI+e3sgZm9ybUZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgPHAtZHJvcGRvd25cbiAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZvcm1GaWVsZC5uYW1lXCJcbiAgICBbb3B0aW9uc109XCJmb3JtRmllbGQub3B0aW9uc1wiXG4gICAgW3BsYWNlaG9sZGVyXT1cImZvcm1GaWVsZC5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGFuIG9wdGlvbidcIlxuICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICA+PC9wLWRyb3Bkb3duPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJcbiAgICAgIGZvcm1Hcm91cC5nZXQoZm9ybUZpZWxkLm5hbWUpPy5pbnZhbGlkICYmXG4gICAgICBmb3JtR3JvdXAuZ2V0KGZvcm1GaWVsZC5uYW1lKT8udG91Y2hlZFxuICAgIFwiXG4gID5cbiAgICA8c21hbGwgY2xhc3M9XCJwLWVycm9yXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCkgfX08L3NtYWxsPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcHJpbWUtdG9vbHMvc3JjL2xpYi9wdC1kcm9wZG93bi9wdC1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWRyb3Bkb3duL3B0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNGQUFzRjtBQUN0RixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQWEsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFVcEUsTUFBTSxPQUFPLG1CQUFtQjtJQUk5QixRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsMEJBQTBCO0lBQzFCLHNFQUFzRTtJQUM5RCxZQUFZO1FBQ2xCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFnQixDQUFDO1FBRXJFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbEMsVUFBVSxD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QWdCLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9DLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUN0QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzsrR0E5S1UsbUJBQW1CO21HQUFuQixtQkFBbUIsK0dDWmhDLDRsRkFnRkE7OzRGRHBFYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsYUFBYTs4QkFLZCxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBuZy1wcmltZS10b29scy9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWRyb3Bkb3duL3B0LWRyb3Bkb3duLmNvbXBvbmVudC50c1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRm9ybURyb3Bkb3duRmllbGQgfSBmcm9tICcuLi9tb2RlbHMvZm9ybS1kcm9wLWRvd24tZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgSWNvblN0eWxlIH0gZnJvbSAnLi4vbW9kZWxzL2ljb24tc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgSWNvbkltYWdlU3R5bGUgfSBmcm9tICcuLi9tb2RlbHMvaWNvbi1pbWFnZS1zdHlsZS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3B0LWRyb3Bkb3duJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3B0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHQtZHJvcGRvd24uY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQVERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBmb3JtRmllbGQhOiBGb3JtRHJvcGRvd25GaWVsZDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldHVwQ29udHJvbCgpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyDwn5SnIENvbnRyb2wgJiB2YWxpZGF0aW9uXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSBzZXR1cENvbnRyb2woKTogdm9pZCB7XG4gICAgbGV0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQodGhpcy5mb3JtRmllbGQubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG5cbiAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgIGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGhpcy5mb3JtRmllbGQudmFsdWUgPz8gbnVsbCk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5hZGRDb250cm9sKHRoaXMuZm9ybUZpZWxkLm5hbWUsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLmdldFZhbGlkYXRvcnMoKTtcbiAgICBjb250cm9sLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmZvcm1GaWVsZC5kaXNhYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1GaWVsZC5kaXNhYmxlZCkge1xuICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFZhbGlkYXRvcnMoKSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IFtdO1xuICAgIGlmICh0aGlzLmZvcm1GaWVsZC5yZXF1aXJlZCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxuXG4gIGdldEVycm9yTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQodGhpcy5mb3JtRmllbGQubmFtZSk7XG4gICAgaWYgKGNvbnRyb2w/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtRmllbGQuZXJyb3JUZXh0IHx8IGAke3RoaXMuZm9ybUZpZWxkLmxhYmVsfSBpcyByZXF1aXJlZGA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8g8J+OqCBJY29uIGhlbHBlcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBSw6lzb3V0IGzigJlpY8O0bmUgw6AgdXRpbGlzZXIgcG91ciB1bmUgb3B0aW9uIDpcbiAgICogMSkgb3B0aW9uLmljb25TdHlsZSB8IG9wdGlvbi5pY29uSW1hZ2VTdHlsZVxuICAgKiAyKSBvcHRpb24uaWNvblxuICAgKiAzKSBmb3JtRmllbGQuaWNvbiAoZmFsbGJhY2sgZ2xvYmFsKVxuICAgKi9cbiAgZ2V0UmVzb2x2ZWRJY29uKG9wdGlvbjogYW55KToge1xuICAgIHR5cGU6ICdub25lJyB8ICdmb250JyB8ICdpbWFnZSc7XG4gICAgZm9udEljb25DbGFzcz86IHN0cmluZztcbiAgICBmb250SWNvblN0eWxlPzogeyBbazogc3RyaW5nXTogYW55IH07XG4gICAgaW1hZ2VVcmw/OiBzdHJpbmc7XG4gICAgaW1hZ2VTdHlsZT86IHsgW2s6IHN0cmluZ106IGFueSB9O1xuICB9IHtcbiAgICBjb25zdCBzb3VyY2UgPVxuICAgICAgb3B0aW9uPy5pY29uU3R5bGUgfHxcbiAgICAgIG9wdGlvbj8uaWNvbkltYWdlU3R5bGUgfHxcbiAgICAgIG9wdGlvbj8uaWNvbiB8fFxuICAgICAgdGhpcy5mb3JtRmllbGQuaWNvbjtcblxuICAgIGlmICghc291cmNlKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAnbm9uZScgfTtcbiAgICB9XG5cbiAgICAvLyAxKSBJbWFnZSBpY29uIChJY29uSW1hZ2VTdHlsZSlcbiAgICBpZiAodGhpcy5pc0ljb25JbWFnZVN0eWxlKHNvdXJjZSkpIHtcbiAgICAgIGNvbnN0IGltZyA9IHNvdXJjZSBhcyBJY29uSW1hZ2VTdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgIGltYWdlVXJsOiBpbWcudXJsLFxuICAgICAgICBpbWFnZVN0eWxlOiB0aGlzLmJ1aWxkSW1hZ2VTdHlsZShpbWcpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAyKSBGb250IGljb24gZnVsbCBzdHlsZSAoSWNvblN0eWxlKVxuICAgIGlmICh0aGlzLmlzSWNvblN0eWxlKHNvdXJjZSkpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gc291cmNlIGFzIEljb25TdHlsZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdmb250JyxcbiAgICAgICAgZm9udEljb25DbGFzczogc3R5bGUuY29kZSwgLy8gZXg6ICdwaSBwaS1mbGFnJyBvciAnZmEgZmEtZmxhZydcbiAgICAgICAgZm9udEljb25TdHlsZTogdGhpcy5idWlsZEZvbnRJY29uU3R5bGUoc3R5bGUpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAzKSBTaW1wbGUgc3RyaW5nIG9mIGNsYXNzZXMgKFByaW1lTkcgLyBGb250IEF3ZXNvbWUpXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZm9udCcsXG4gICAgICAgIGZvbnRJY29uQ2xhc3M6IHNvdXJjZSxcbiAgICAgICAgZm9udEljb25TdHlsZToge30sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHR5cGU6ICdub25lJyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ljb25TdHlsZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgSWNvblN0eWxlIHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJY29uSW1hZ2VTdHlsZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgSWNvbkltYWdlU3R5bGUge1xuICAgIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ3VybCcgaW4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9udEljb25TdHlsZShpY29uOiBJY29uU3R5bGUpOiB7IFtrOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3Qgc3R5bGVzOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gICAgaWYgKGljb24uY29sb3IpIHtcbiAgICAgIHN0eWxlcy5jb2xvciA9IGljb24uY29sb3I7XG4gICAgfVxuICAgIGlmIChpY29uLmZvbnRTaXplKSB7XG4gICAgICBzdHlsZXNbJ2ZvbnQtc2l6ZSddID0gaWNvbi5mb250U2l6ZTtcbiAgICB9XG4gICAgaWYgKGljb24uYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBzdHlsZXNbJ2JhY2tncm91bmQtY29sb3InXSA9IGljb24uYmFja2dyb3VuZENvbG9yO1xuICAgICAgc3R5bGVzLnBhZGRpbmcgPSBzdHlsZXMucGFkZGluZyA/PyAnMC4xNXJlbSAwLjNyZW0nO1xuICAgIH1cblxuICAgIGlmIChpY29uLnNoYXBlID09PSAnY2lyY3VsYXInKSB7XG4gICAgICBzdHlsZXNbJ2JvcmRlci1yYWRpdXMnXSA9ICc1MCUnO1xuICAgIH0gZWxzZSBpZiAoaWNvbi5zaGFwZSA9PT0gJ3JvdW5kZWQtc3F1YXJlJykge1xuICAgICAgc3R5bGVzWydib3JkZXItcmFkaXVzJ10gPSAnNnB4JztcbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEltYWdlU3R5bGUoaWNvbjogSWNvbkltYWdlU3R5bGUpOiB7IFtrOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3Qgc3R5bGVzOiB7IFtrOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gICAgaWYgKGljb24ud2lkdGgpIHN0eWxlcy53aWR0aCA9IGljb24ud2lkdGg7XG4gICAgaWYgKGljb24uaGVpZ2h0KSBzdHlsZXMuaGVpZ2h0ID0gaWNvbi5oZWlnaHQ7XG4gICAgaWYgKGljb24ubWFyZ2luTGVmdCkgc3R5bGVzWydtYXJnaW4tbGVmdCddID0gaWNvbi5tYXJnaW5MZWZ0O1xuICAgIGlmIChpY29uLm1hcmdpblJpZ2h0KSBzdHlsZXNbJ21hcmdpbi1yaWdodCddID0gaWNvbi5tYXJnaW5SaWdodDtcbiAgICBpZiAoaWNvbi5tYXJnaW5Ub3ApIHN0eWxlc1snbWFyZ2luLXRvcCddID0gaWNvbi5tYXJnaW5Ub3A7XG4gICAgaWYgKGljb24ubWFyZ2luQm90dG9tKSBzdHlsZXNbJ21hcmdpbi1ib3R0b20nXSA9IGljb24ubWFyZ2luQm90dG9tO1xuXG4gICAgaWYgKGljb24uc2hhcGUgPT09ICdjaXJjdWxhcicpIHtcbiAgICAgIHN0eWxlc1snYm9yZGVyLXJhZGl1cyddID0gJzUwJSc7XG4gICAgfSBlbHNlIGlmIChpY29uLnNoYXBlID09PSAncm91bmRlZC1zcXVhcmUnKSB7XG4gICAgICBzdHlsZXNbJ2JvcmRlci1yYWRpdXMnXSA9ICc2cHgnO1xuICAgIH1cblxuICAgIHJldHVybiBzdHlsZXM7XG4gIH1cblxuICBnZXRJY29uUG9zaXRpb24ob3B0aW9uOiBhbnkpOiAnbGVmdCcgfCAncmlnaHQnIHtcbiAgICBjb25zdCBzcmMgPVxuICAgICAgb3B0aW9uPy5pY29uU3R5bGUgfHxcbiAgICAgIG9wdGlvbj8uaWNvbkltYWdlU3R5bGUgfHxcbiAgICAgIG9wdGlvbj8uaWNvbiB8fFxuICAgICAgdGhpcy5mb3JtRmllbGQuaWNvbjtcblxuICAgIGlmICh0aGlzLmlzSWNvblN0eWxlKHNyYykgJiYgc3JjLnBvc2l0aW9uKSB7XG4gICAgICByZXR1cm4gc3JjLnBvc2l0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0ljb25JbWFnZVN0eWxlKHNyYykgJiYgc3JjLnBvc2l0aW9uKSB7XG4gICAgICByZXR1cm4gc3JjLnBvc2l0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gJ2xlZnQnO1xuICB9XG59XG4iLCI8IS0tIG5nLXByaW1lLXRvb2xzL3Byb2plY3RzL25nLXByaW1lLXRvb2xzL3NyYy9saWIvcHQtZHJvcGRvd24vcHQtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwgLS0+XG48ZGl2XG4gIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgY2xhc3M9XCJmb3JtLWZpZWxkXCJcbiAgW25nU3R5bGVdPVwieyB3aWR0aDogZm9ybUZpZWxkLndpZHRoIHx8ICcxMDAlJyB9XCJcbiAgKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiXG4+XG4gIDxsYWJlbCAqbmdJZj1cImZvcm1GaWVsZC5sYWJlbFwiPnt7IGZvcm1GaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG5cbiAgPHAtZHJvcGRvd25cbiAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZvcm1GaWVsZC5uYW1lXCJcbiAgICBbb3B0aW9uc109XCJmb3JtRmllbGQub3B0aW9uc1wiXG4gICAgW3BsYWNlaG9sZGVyXT1cImZvcm1GaWVsZC5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGFuIG9wdGlvbidcIlxuICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICA+XG4gICAgPCEtLSBTZWxlY3RlZCB2YWx1ZSB0ZW1wbGF0ZSAtLT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwic2VsZWN0ZWRJdGVtXCIgbGV0LW9wdGlvbj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb247IGVsc2UgcGxhY2Vob2xkZXJUcGxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInB0LWRyb3Bkb3duLWl0ZW1cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0UmVzb2x2ZWRJY29uKG9wdGlvbikgYXMgaWNvbk1ldGFcIj5cbiAgICAgICAgICAgIDwhLS0gSU1BR0UgSUNPTiAtLT5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgKm5nSWY9XCJpY29uTWV0YS50eXBlID09PSAnaW1hZ2UnXCJcbiAgICAgICAgICAgICAgW3NyY109XCJpY29uTWV0YS5pbWFnZVVybFwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImljb25NZXRhLmltYWdlU3R5bGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cInB0LWRyb3Bkb3duLWljb24taW1hZ2VcIlxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPCEtLSBGT05UIElDT04gKFByaW1lTkcgLyBGb250QXdlc29tZSkgLS0+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAqbmdJZj1cImljb25NZXRhLnR5cGUgPT09ICdmb250J1wiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImljb25NZXRhLmZvbnRJY29uQ2xhc3NcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJpY29uTWV0YS5mb250SWNvblN0eWxlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwdC1kcm9wZG93bi1pY29uLWZvbnRcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHQtZHJvcGRvd24tbGFiZWxcIj57eyBvcHRpb24ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gUGxhY2Vob2xkZXIgd2hlbiBubyB2YWx1ZSBzZWxlY3RlZCAtLT5cbiAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVHBsPlxuICAgICAgPHNwYW4+e3sgZm9ybUZpZWxkLnBsYWNlaG9sZGVyIHx8IFwiU2VsZWN0IGFuIG9wdGlvblwiIH19PC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIEl0ZW1zIHRlbXBsYXRlIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LW9wdGlvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwdC1kcm9wZG93bi1pdGVtXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRSZXNvbHZlZEljb24ob3B0aW9uKSBhcyBpY29uTWV0YVwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICpuZ0lmPVwiaWNvbk1ldGEudHlwZSA9PT0gJ2ltYWdlJ1wiXG4gICAgICAgICAgICBbc3JjXT1cImljb25NZXRhLmltYWdlVXJsXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImljb25NZXRhLmltYWdlU3R5bGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJwdC1kcm9wZG93bi1pY29uLWltYWdlXCJcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPGlcbiAgICAgICAgICAgICpuZ0lmPVwiaWNvbk1ldGEudHlwZSA9PT0gJ2ZvbnQnXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImljb25NZXRhLmZvbnRJY29uQ2xhc3NcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiaWNvbk1ldGEuZm9udEljb25TdHlsZVwiXG4gICAgICAgICAgICBjbGFzcz1cInB0LWRyb3Bkb3duLWljb24tZm9udFwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwdC1kcm9wZG93bi1sYWJlbFwiPnt7IG9wdGlvbi5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvcC1kcm9wZG93bj5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJcbiAgICAgIGZvcm1Hcm91cC5nZXQoZm9ybUZpZWxkLm5hbWUpPy5pbnZhbGlkICYmXG4gICAgICBmb3JtR3JvdXAuZ2V0KGZvcm1GaWVsZC5uYW1lKT8udG91Y2hlZFxuICAgIFwiXG4gID5cbiAgICA8c21hbGwgY2xhc3M9XCJwLWVycm9yXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCkgfX08L3NtYWxsPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -35,7 +35,6 @@ export class PTLoginPageComponent {
35
35
  };
36
36
  }
37
37
  onLoginSubmit(loginModel) {
38
- console.log('Login Submitted:', loginModel);
39
38
  this.loginSubmit.emit(loginModel);
40
39
  }
41
40
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTLoginPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -51,4 +50,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
51
50
  }], loginSubmit: [{
52
51
  type: Output
53
52
  }] } });
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtbG9naW4tcGFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWxvZ2luLXBhZ2UvcHQtbG9naW4tcGFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWxvZ2luLXBhZ2UvcHQtbG9naW4tcGFnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQVEvRSxNQUFNLE9BQU8sb0JBQW9CO0lBTGpDO1FBT1csc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUN2QyxnQkFBVyxHQUNuQixJQUFJLFlBQVksRUFBYyxDQUFDO1FBRXpCLHNCQUFpQixHQUFlO1lBQ3RDLFlBQVksRUFBRSxHQUFHO1lBQ2pCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsS0FBSyxFQUFFLE1BQU07WUFDYixNQUFNLEVBQUUsTUFBTTtZQUNkLFFBQVEsRUFBRSxJQUFJO1lBQ2QsWUFBWSxFQUFFLFFBQVE7WUFDdEIsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQixDQUFDO0tBa0NIO0lBaENDLFFBQVE7UUFDTixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQ3hELElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQ3RDLENBQUM7UUFFRixtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDdEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQ3BDLENBQUM7UUFFRixvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRU8sYUFBYSxDQUFDLE1BQW1CO1FBQ3ZDLE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQyxpQkFBaUI7WUFDekIsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7U0FDbEIsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhLENBQUMsVUFBc0I7UUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQyxDQUFDOytHQS9DVSxvQkFBb0I7bUdBQXBCLG9CQUFvQixzTENSakMsaS9DQWlEQTs7NEZEekNhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxlQUFlOzhCQUtoQixlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9naW5Nb2RlbCwgTG9naW5QYWdlQ29uZmlnLCBDYXJkQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHQtbG9naW4tcGFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wdC1sb2dpbi1wYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHQtbG9naW4tcGFnZS5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBUTG9naW5QYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgbG9naW5QYWdlQ29uZmlnITogTG9naW5QYWdlQ29uZmlnO1xuICBASW5wdXQoKSBsb2dpbkVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBPdXRwdXQoKSBsb2dpblN1Ym1pdDogRXZlbnRFbWl0dGVyPExvZ2luTW9kZWw+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPExvZ2luTW9kZWw+KCk7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0Q2FyZENvbmZpZzogQ2FyZENvbmZpZyA9IHtcbiAgICBib3JkZXJSYWRpdXM6ICcwJyxcbiAgICBtYXJnaW46ICcwJyxcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIGhlaWdodDogJzEwMCUnLFxuICAgIG5vQm9yZGVyOiB0cnVlLFxuICAgIGFsaWduQ29udGVudDogJ2NlbnRlcicsXG4gICAgYWxpZ25Cb2R5Q29udGVudDogJ2NlbnRlcicsXG4gIH07XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseURlZmF1bHRDb25maWdzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RGVmYXVsdENvbmZpZ3MoKTogdm9pZCB7XG4gICAgLy8gQXBwbHkgZGVmYXVsdHMgdG8gY2VudGVyQ2FyZENvbmZpZ1xuICAgIHRoaXMubG9naW5QYWdlQ29uZmlnLmNlbnRlckNhcmRDb25maWcgPSB0aGlzLmFwcGx5RGVmYXVsdHMoXG4gICAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy5jZW50ZXJDYXJkQ29uZmlnXG4gICAgKTtcblxuICAgIC8vIEFwcGx5IGRlZmF1bHRzIHRvIGxlZnRDYXJkQ29uZmlnXG4gICAgdGhpcy5sb2dpblBhZ2VDb25maWcubGVmdENhcmRDb25maWcgPSB0aGlzLmFwcGx5RGVmYXVsdHMoXG4gICAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy5sZWZ0Q2FyZENvbmZpZ1xuICAgICk7XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0cyB0byByaWdodENhcmRDb25maWdcbiAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy5yaWdodENhcmRDb25maWcgPSB0aGlzLmFwcGx5RGVmYXVsdHMoXG4gICAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy5yaWdodENhcmRDb25maWdcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHRzKGNvbmZpZz86IENhcmRDb25maWcpOiBDYXJkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5kZWZhdWx0Q2FyZENvbmZpZyxcbiAgICAgIC4uLihjb25maWcgfHwge30pLFxuICAgIH07XG4gIH1cblxuICBvbkxvZ2luU3VibWl0KGxvZ2luTW9kZWw6IExvZ2luTW9kZWwpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnTG9naW4gU3VibWl0dGVkOicsIGxvZ2luTW9kZWwpO1xuICAgIHRoaXMubG9naW5TdWJtaXQuZW1pdChsb2dpbk1vZGVsKTtcbiAgfVxufVxuIiwiPCEtLSBDZW50ZXIgUG9zaXRpb24gLS0+XG48bmctY29udGFpbmVyPlxuICA8ZGl2ICpuZ0lmPVwibG9naW5QYWdlQ29uZmlnLnBvc2l0aW9uID09PSAnY2VudGVyJ1wiIGNsYXNzPVwiY2VudGVyLWNvbnRhaW5lclwiPlxuICAgIDxwdC1jYXJkXG4gICAgICAqbmdJZj1cImxvZ2luUGFnZUNvbmZpZy5jZW50ZXJDYXJkQ29uZmlnXCJcbiAgICAgIFtjb25maWddPVwibG9naW5QYWdlQ29uZmlnLmNlbnRlckNhcmRDb25maWdcIlxuICAgID5cbiAgICAgIDxwdC1sb2dpbi1jYXJkXG4gICAgICAgIFtsb2dpbkVycm9yTWVzc2FnZV09XCJsb2dpbkVycm9yTWVzc2FnZVwiXG4gICAgICAgIFtsb2dpblBhZ2VDb25maWddPVwibG9naW5QYWdlQ29uZmlnXCJcbiAgICAgICAgKGxvZ2luU3VibWl0KT1cIm9uTG9naW5TdWJtaXQoJGV2ZW50KVwiXG4gICAgICA+PC9wdC1sb2dpbi1jYXJkPlxuICAgIDwvcHQtY2FyZD5cbiAgPC9kaXY+XG4gIDwhLS0gTGVmdCBhbmQgUmlnaHQgUG9zaXRpb25zIC0tPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJcbiAgICAgIGxvZ2luUGFnZUNvbmZpZy5wb3NpdGlvbiA9PT0gJ2xlZnQnIHx8XG4gICAgICBsb2dpblBhZ2VDb25maWcucG9zaXRpb24gPT09ICdyaWdodCdcbiAgICBcIlxuICAgIGNsYXNzPVwibGVmdC1yaWdodC1jb250YWluZXJcIlxuICA+XG4gICAgPCEtLSBMZWZ0IENhcmQgLS0+XG4gICAgPHB0LWNhcmRcbiAgICAgICpuZ0lmPVwibG9naW5QYWdlQ29uZmlnLmxlZnRDYXJkQ29uZmlnXCJcbiAgICAgIFtjb25maWddPVwibG9naW5QYWdlQ29uZmlnLmxlZnRDYXJkQ29uZmlnXCJcbiAgICA+XG4gICAgICA8cHQtbG9naW4tY2FyZFxuICAgICAgICAqbmdJZj1cImxvZ2luUGFnZUNvbmZpZy5wb3NpdGlvbiA9PT0gJ2xlZnQnXCJcbiAgICAgICAgW2xvZ2luRXJyb3JNZXNzYWdlXT1cImxvZ2luRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgW2xvZ2luUGFnZUNvbmZpZ109XCJsb2dpblBhZ2VDb25maWdcIlxuICAgICAgICAobG9naW5TdWJtaXQpPVwib25Mb2dpblN1Ym1pdCgkZXZlbnQpXCJcbiAgICAgID48L3B0LWxvZ2luLWNhcmQ+XG4gICAgPC9wdC1jYXJkPlxuXG4gICAgPCEtLSBSaWdodCBDYXJkIC0tPlxuICAgIDxwdC1jYXJkXG4gICAgICAqbmdJZj1cImxvZ2luUGFnZUNvbmZpZy5yaWdodENhcmRDb25maWdcIlxuICAgICAgW2NvbmZpZ109XCJsb2dpblBhZ2VDb25maWcucmlnaHRDYXJkQ29uZmlnXCJcbiAgICA+XG4gICAgICA8cHQtbG9naW4tY2FyZFxuICAgICAgICAqbmdJZj1cImxvZ2luUGFnZUNvbmZpZy5wb3NpdGlvbiA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgIFtsb2dpbkVycm9yTWVzc2FnZV09XCJsb2dpbkVycm9yTWVzc2FnZVwiXG4gICAgICAgIFtsb2dpblBhZ2VDb25maWddPVwibG9naW5QYWdlQ29uZmlnXCJcbiAgICAgICAgKGxvZ2luU3VibWl0KT1cIm9uTG9naW5TdWJtaXQoJGV2ZW50KVwiXG4gICAgICA+PC9wdC1sb2dpbi1jYXJkPlxuICAgIDwvcHQtY2FyZD5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtbG9naW4tcGFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWxvZ2luLXBhZ2UvcHQtbG9naW4tcGFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWxvZ2luLXBhZ2UvcHQtbG9naW4tcGFnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQVEvRSxNQUFNLE9BQU8sb0JBQW9CO0lBTGpDO1FBT1csc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUN2QyxnQkFBVyxHQUNuQixJQUFJLFlBQVksRUFBYyxDQUFDO1FBRXpCLHNCQUFpQixHQUFlO1lBQ3RDLFlBQVksRUFBRSxHQUFHO1lBQ2pCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsS0FBSyxFQUFFLE1BQU07WUFDYixNQUFNLEVBQUUsTUFBTTtZQUNkLFFBQVEsRUFBRSxJQUFJO1lBQ2QsWUFBWSxFQUFFLFFBQVE7WUFDdEIsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQixDQUFDO0tBaUNIO0lBL0JDLFFBQVE7UUFDTixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQ3hELElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQ3RDLENBQUM7UUFFRixtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDdEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQ3BDLENBQUM7UUFFRixvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRU8sYUFBYSxDQUFDLE1BQW1CO1FBQ3ZDLE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQyxpQkFBaUI7WUFDekIsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7U0FDbEIsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhLENBQUMsVUFBc0I7UUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsQ0FBQzsrR0E5Q1Usb0JBQW9CO21HQUFwQixvQkFBb0Isc0xDUmpDLGkvQ0FpREE7OzRGRHpDYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsZUFBZTs4QkFLaEIsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExvZ2luTW9kZWwsIExvZ2luUGFnZUNvbmZpZywgQ2FyZENvbmZpZyB9IGZyb20gJy4uL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3B0LWxvZ2luLXBhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHQtbG9naW4tcGFnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3B0LWxvZ2luLXBhZ2UuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQVExvZ2luUGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGxvZ2luUGFnZUNvbmZpZyE6IExvZ2luUGFnZUNvbmZpZztcbiAgQElucHV0KCkgbG9naW5FcnJvck1lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBAT3V0cHV0KCkgbG9naW5TdWJtaXQ6IEV2ZW50RW1pdHRlcjxMb2dpbk1vZGVsPiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxMb2dpbk1vZGVsPigpO1xuXG4gIHByaXZhdGUgZGVmYXVsdENhcmRDb25maWc6IENhcmRDb25maWcgPSB7XG4gICAgYm9yZGVyUmFkaXVzOiAnMCcsXG4gICAgbWFyZ2luOiAnMCcsXG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICBub0JvcmRlcjogdHJ1ZSxcbiAgICBhbGlnbkNvbnRlbnQ6ICdjZW50ZXInLFxuICAgIGFsaWduQm9keUNvbnRlbnQ6ICdjZW50ZXInLFxuICB9O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlEZWZhdWx0Q29uZmlncygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHRDb25maWdzKCk6IHZvaWQge1xuICAgIC8vIEFwcGx5IGRlZmF1bHRzIHRvIGNlbnRlckNhcmRDb25maWdcbiAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy5jZW50ZXJDYXJkQ29uZmlnID0gdGhpcy5hcHBseURlZmF1bHRzKFxuICAgICAgdGhpcy5sb2dpblBhZ2VDb25maWcuY2VudGVyQ2FyZENvbmZpZ1xuICAgICk7XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0cyB0byBsZWZ0Q2FyZENvbmZpZ1xuICAgIHRoaXMubG9naW5QYWdlQ29uZmlnLmxlZnRDYXJkQ29uZmlnID0gdGhpcy5hcHBseURlZmF1bHRzKFxuICAgICAgdGhpcy5sb2dpblBhZ2VDb25maWcubGVmdENhcmRDb25maWdcbiAgICApO1xuXG4gICAgLy8gQXBwbHkgZGVmYXVsdHMgdG8gcmlnaHRDYXJkQ29uZmlnXG4gICAgdGhpcy5sb2dpblBhZ2VDb25maWcucmlnaHRDYXJkQ29uZmlnID0gdGhpcy5hcHBseURlZmF1bHRzKFxuICAgICAgdGhpcy5sb2dpblBhZ2VDb25maWcucmlnaHRDYXJkQ29uZmlnXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlEZWZhdWx0cyhjb25maWc/OiBDYXJkQ29uZmlnKTogQ2FyZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZGVmYXVsdENhcmRDb25maWcsXG4gICAgICAuLi4oY29uZmlnIHx8IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgb25Mb2dpblN1Ym1pdChsb2dpbk1vZGVsOiBMb2dpbk1vZGVsKTogdm9pZCB7XG4gICAgdGhpcy5sb2dpblN1Ym1pdC5lbWl0KGxvZ2luTW9kZWwpO1xuICB9XG59XG4iLCI8IS0tIENlbnRlciBQb3NpdGlvbiAtLT5cbjxuZy1jb250YWluZXI+XG4gIDxkaXYgKm5nSWY9XCJsb2dpblBhZ2VDb25maWcucG9zaXRpb24gPT09ICdjZW50ZXInXCIgY2xhc3M9XCJjZW50ZXItY29udGFpbmVyXCI+XG4gICAgPHB0LWNhcmRcbiAgICAgICpuZ0lmPVwibG9naW5QYWdlQ29uZmlnLmNlbnRlckNhcmRDb25maWdcIlxuICAgICAgW2NvbmZpZ109XCJsb2dpblBhZ2VDb25maWcuY2VudGVyQ2FyZENvbmZpZ1wiXG4gICAgPlxuICAgICAgPHB0LWxvZ2luLWNhcmRcbiAgICAgICAgW2xvZ2luRXJyb3JNZXNzYWdlXT1cImxvZ2luRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgW2xvZ2luUGFnZUNvbmZpZ109XCJsb2dpblBhZ2VDb25maWdcIlxuICAgICAgICAobG9naW5TdWJtaXQpPVwib25Mb2dpblN1Ym1pdCgkZXZlbnQpXCJcbiAgICAgID48L3B0LWxvZ2luLWNhcmQ+XG4gICAgPC9wdC1jYXJkPlxuICA8L2Rpdj5cbiAgPCEtLSBMZWZ0IGFuZCBSaWdodCBQb3NpdGlvbnMgLS0+XG4gIDxkaXZcbiAgICAqbmdJZj1cIlxuICAgICAgbG9naW5QYWdlQ29uZmlnLnBvc2l0aW9uID09PSAnbGVmdCcgfHxcbiAgICAgIGxvZ2luUGFnZUNvbmZpZy5wb3NpdGlvbiA9PT0gJ3JpZ2h0J1xuICAgIFwiXG4gICAgY2xhc3M9XCJsZWZ0LXJpZ2h0LWNvbnRhaW5lclwiXG4gID5cbiAgICA8IS0tIExlZnQgQ2FyZCAtLT5cbiAgICA8cHQtY2FyZFxuICAgICAgKm5nSWY9XCJsb2dpblBhZ2VDb25maWcubGVmdENhcmRDb25maWdcIlxuICAgICAgW2NvbmZpZ109XCJsb2dpblBhZ2VDb25maWcubGVmdENhcmRDb25maWdcIlxuICAgID5cbiAgICAgIDxwdC1sb2dpbi1jYXJkXG4gICAgICAgICpuZ0lmPVwibG9naW5QYWdlQ29uZmlnLnBvc2l0aW9uID09PSAnbGVmdCdcIlxuICAgICAgICBbbG9naW5FcnJvck1lc3NhZ2VdPVwibG9naW5FcnJvck1lc3NhZ2VcIlxuICAgICAgICBbbG9naW5QYWdlQ29uZmlnXT1cImxvZ2luUGFnZUNvbmZpZ1wiXG4gICAgICAgIChsb2dpblN1Ym1pdCk9XCJvbkxvZ2luU3VibWl0KCRldmVudClcIlxuICAgICAgPjwvcHQtbG9naW4tY2FyZD5cbiAgICA8L3B0LWNhcmQ+XG5cbiAgICA8IS0tIFJpZ2h0IENhcmQgLS0+XG4gICAgPHB0LWNhcmRcbiAgICAgICpuZ0lmPVwibG9naW5QYWdlQ29uZmlnLnJpZ2h0Q2FyZENvbmZpZ1wiXG4gICAgICBbY29uZmlnXT1cImxvZ2luUGFnZUNvbmZpZy5yaWdodENhcmRDb25maWdcIlxuICAgID5cbiAgICAgIDxwdC1sb2dpbi1jYXJkXG4gICAgICAgICpuZ0lmPVwibG9naW5QYWdlQ29uZmlnLnBvc2l0aW9uID09PSAncmlnaHQnXCJcbiAgICAgICAgW2xvZ2luRXJyb3JNZXNzYWdlXT1cImxvZ2luRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgW2xvZ2luUGFnZUNvbmZpZ109XCJsb2dpblBhZ2VDb25maWdcIlxuICAgICAgICAobG9naW5TdWJtaXQpPVwib25Mb2dpblN1Ym1pdCgkZXZlbnQpXCJcbiAgICAgID48L3B0LWxvZ2luLWNhcmQ+XG4gICAgPC9wdC1jYXJkPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
@@ -213,8 +213,6 @@ class PTAdvancedPrimeTableComponent {
213
213
  this.globalFilterFields = [];
214
214
  }
215
215
  ngOnInit() {
216
- console.log('PTAdvancedPrimeTable columns:', this.columns);
217
- console.log('PTAdvancedPrimeTable totalRecords input:', this.totalRecords);
218
216
  this.hasGroupedColumns = this.columns.some((col) => col.children && col.children.length > 0);
219
217
  this.globalFilterFields = this.columns
220
218
  .filter((col) => col.code !== undefined && col.isFilter !== false)
@@ -2038,19 +2036,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
2038
2036
  type: Input
2039
2037
  }] } });
2040
2038
 
2039
+ // ng-prime-tools/projects/ng-prime-tools/src/lib/pt-dropdown/pt-dropdown.component.ts
2041
2040
  class PTDropdownComponent {
2042
2041
  ngOnInit() {
2043
2042
  this.setupControl();
2044
2043
  }
2044
+ // -------------------------------------------------------------------
2045
+ // 🔧 Control & validation
2046
+ // -------------------------------------------------------------------
2045
2047
  setupControl() {
2046
2048
  let control = this.formGroup.get(this.formField.name);
2047
2049
  if (!control) {
2048
- control = new FormControl(this.formField.value || null);
2050
+ control = new FormControl(this.formField.value ?? null);
2049
2051
  this.formGroup.addControl(this.formField.name, control);
2050
2052
  }
2051
2053
  const validators = this.getValidators();
2052
2054
  control.setValidators(validators);
2053
- // Manage the disabled state using form control
2054
2055
  setTimeout(() => {
2055
2056
  if (this.formField.disabled !== undefined) {
2056
2057
  if (this.formField.disabled) {
@@ -2077,12 +2078,118 @@ class PTDropdownComponent {
2077
2078
  }
2078
2079
  return '';
2079
2080
  }
2081
+ // -------------------------------------------------------------------
2082
+ // 🎨 Icon helpers
2083
+ // -------------------------------------------------------------------
2084
+ /**
2085
+ * Résout l’icône à utiliser pour une option :
2086
+ * 1) option.iconStyle | option.iconImageStyle
2087
+ * 2) option.icon
2088
+ * 3) formField.icon (fallback global)
2089
+ */
2090
+ getResolvedIcon(option) {
2091
+ const source = option?.iconStyle ||
2092
+ option?.iconImageStyle ||
2093
+ option?.icon ||
2094
+ this.formField.icon;
2095
+ if (!source) {
2096
+ return { type: 'none' };
2097
+ }
2098
+ // 1) Image icon (IconImageStyle)
2099
+ if (this.isIconImageStyle(source)) {
2100
+ const img = source;
2101
+ return {
2102
+ type: 'image',
2103
+ imageUrl: img.url,
2104
+ imageStyle: this.buildImageStyle(img),
2105
+ };
2106
+ }
2107
+ // 2) Font icon full style (IconStyle)
2108
+ if (this.isIconStyle(source)) {
2109
+ const style = source;
2110
+ return {
2111
+ type: 'font',
2112
+ fontIconClass: style.code, // ex: 'pi pi-flag' or 'fa fa-flag'
2113
+ fontIconStyle: this.buildFontIconStyle(style),
2114
+ };
2115
+ }
2116
+ // 3) Simple string of classes (PrimeNG / Font Awesome)
2117
+ if (typeof source === 'string') {
2118
+ return {
2119
+ type: 'font',
2120
+ fontIconClass: source,
2121
+ fontIconStyle: {},
2122
+ };
2123
+ }
2124
+ return { type: 'none' };
2125
+ }
2126
+ isIconStyle(value) {
2127
+ return !!value && typeof value === 'object' && 'code' in value;
2128
+ }
2129
+ isIconImageStyle(value) {
2130
+ return !!value && typeof value === 'object' && 'url' in value;
2131
+ }
2132
+ buildFontIconStyle(icon) {
2133
+ const styles = {};
2134
+ if (icon.color) {
2135
+ styles.color = icon.color;
2136
+ }
2137
+ if (icon.fontSize) {
2138
+ styles['font-size'] = icon.fontSize;
2139
+ }
2140
+ if (icon.backgroundColor) {
2141
+ styles['background-color'] = icon.backgroundColor;
2142
+ styles.padding = styles.padding ?? '0.15rem 0.3rem';
2143
+ }
2144
+ if (icon.shape === 'circular') {
2145
+ styles['border-radius'] = '50%';
2146
+ }
2147
+ else if (icon.shape === 'rounded-square') {
2148
+ styles['border-radius'] = '6px';
2149
+ }
2150
+ return styles;
2151
+ }
2152
+ buildImageStyle(icon) {
2153
+ const styles = {};
2154
+ if (icon.width)
2155
+ styles.width = icon.width;
2156
+ if (icon.height)
2157
+ styles.height = icon.height;
2158
+ if (icon.marginLeft)
2159
+ styles['margin-left'] = icon.marginLeft;
2160
+ if (icon.marginRight)
2161
+ styles['margin-right'] = icon.marginRight;
2162
+ if (icon.marginTop)
2163
+ styles['margin-top'] = icon.marginTop;
2164
+ if (icon.marginBottom)
2165
+ styles['margin-bottom'] = icon.marginBottom;
2166
+ if (icon.shape === 'circular') {
2167
+ styles['border-radius'] = '50%';
2168
+ }
2169
+ else if (icon.shape === 'rounded-square') {
2170
+ styles['border-radius'] = '6px';
2171
+ }
2172
+ return styles;
2173
+ }
2174
+ getIconPosition(option) {
2175
+ const src = option?.iconStyle ||
2176
+ option?.iconImageStyle ||
2177
+ option?.icon ||
2178
+ this.formField.icon;
2179
+ if (this.isIconStyle(src) && src.position) {
2180
+ return src.position;
2181
+ }
2182
+ if (this.isIconImageStyle(src) && src.position) {
2183
+ return src.position;
2184
+ }
2185
+ return 'left';
2186
+ }
2080
2187
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2081
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTDropdownComponent, selector: "pt-dropdown", inputs: { formGroup: "formGroup", formField: "formField" }, ngImport: i0, template: "<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{ width: formField.width || '100%' }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n <p-dropdown\n [formControlName]=\"formField.name\"\n [options]=\"formField.options\"\n [placeholder]=\"formField.placeholder || 'Select an option'\"\n optionLabel=\"label\"\n ></p-dropdown>\n <div\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n >\n <small class=\"p-error\">{{ getErrorMessage() }}</small>\n </div>\n</div>\n", styles: [".form-field{margin-bottom:1rem}.form-field label{display:block;margin-bottom:.5rem;font-weight:700}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3$5.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }] }); }
2188
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTDropdownComponent, selector: "pt-dropdown", inputs: { formGroup: "formGroup", formField: "formField" }, ngImport: i0, template: "<!-- ng-prime-tools/projects/ng-prime-tools/src/lib/pt-dropdown/pt-dropdown.component.html -->\n<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{ width: formField.width || '100%' }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n\n <p-dropdown\n [formControlName]=\"formField.name\"\n [options]=\"formField.options\"\n [placeholder]=\"formField.placeholder || 'Select an option'\"\n optionLabel=\"label\"\n >\n <!-- Selected value template -->\n <ng-template pTemplate=\"selectedItem\" let-option>\n <ng-container *ngIf=\"option; else placeholderTpl\">\n <div class=\"pt-dropdown-item\">\n <ng-container *ngIf=\"getResolvedIcon(option) as iconMeta\">\n <!-- IMAGE ICON -->\n <img\n *ngIf=\"iconMeta.type === 'image'\"\n [src]=\"iconMeta.imageUrl\"\n [ngStyle]=\"iconMeta.imageStyle\"\n class=\"pt-dropdown-icon-image\"\n />\n\n <!-- FONT ICON (PrimeNG / FontAwesome) -->\n <i\n *ngIf=\"iconMeta.type === 'font'\"\n [ngClass]=\"iconMeta.fontIconClass\"\n [ngStyle]=\"iconMeta.fontIconStyle\"\n class=\"pt-dropdown-icon-font\"\n ></i>\n </ng-container>\n\n <span class=\"pt-dropdown-label\">{{ option.label }}</span>\n </div>\n </ng-container>\n </ng-template>\n\n <!-- Placeholder when no value selected -->\n <ng-template #placeholderTpl>\n <span>{{ formField.placeholder || \"Select an option\" }}</span>\n </ng-template>\n\n <!-- Items template -->\n <ng-template pTemplate=\"item\" let-option>\n <div class=\"pt-dropdown-item\">\n <ng-container *ngIf=\"getResolvedIcon(option) as iconMeta\">\n <img\n *ngIf=\"iconMeta.type === 'image'\"\n [src]=\"iconMeta.imageUrl\"\n [ngStyle]=\"iconMeta.imageStyle\"\n class=\"pt-dropdown-icon-image\"\n />\n\n <i\n *ngIf=\"iconMeta.type === 'font'\"\n [ngClass]=\"iconMeta.fontIconClass\"\n [ngStyle]=\"iconMeta.fontIconStyle\"\n class=\"pt-dropdown-icon-font\"\n ></i>\n </ng-container>\n\n <span class=\"pt-dropdown-label\">{{ option.label }}</span>\n </div>\n </ng-template>\n </p-dropdown>\n\n <div\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n >\n <small class=\"p-error\">{{ getErrorMessage() }}</small>\n </div>\n</div>\n", styles: [".form-field{display:flex;flex-direction:column;gap:.25rem}.pt-dropdown-item{display:flex;align-items:center;gap:.5rem}.pt-dropdown-icon-image{object-fit:cover}.pt-dropdown-icon-font{display:inline-flex;align-items:center;justify-content:center}.pt-dropdown-label{display:inline-block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3$5.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }] }); }
2082
2189
  }
2083
2190
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTDropdownComponent, decorators: [{
2084
2191
  type: Component,
2085
- args: [{ selector: 'pt-dropdown', template: "<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{ width: formField.width || '100%' }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n <p-dropdown\n [formControlName]=\"formField.name\"\n [options]=\"formField.options\"\n [placeholder]=\"formField.placeholder || 'Select an option'\"\n optionLabel=\"label\"\n ></p-dropdown>\n <div\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n >\n <small class=\"p-error\">{{ getErrorMessage() }}</small>\n </div>\n</div>\n", styles: [".form-field{margin-bottom:1rem}.form-field label{display:block;margin-bottom:.5rem;font-weight:700}\n"] }]
2192
+ args: [{ selector: 'pt-dropdown', template: "<!-- ng-prime-tools/projects/ng-prime-tools/src/lib/pt-dropdown/pt-dropdown.component.html -->\n<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{ width: formField.width || '100%' }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n\n <p-dropdown\n [formControlName]=\"formField.name\"\n [options]=\"formField.options\"\n [placeholder]=\"formField.placeholder || 'Select an option'\"\n optionLabel=\"label\"\n >\n <!-- Selected value template -->\n <ng-template pTemplate=\"selectedItem\" let-option>\n <ng-container *ngIf=\"option; else placeholderTpl\">\n <div class=\"pt-dropdown-item\">\n <ng-container *ngIf=\"getResolvedIcon(option) as iconMeta\">\n <!-- IMAGE ICON -->\n <img\n *ngIf=\"iconMeta.type === 'image'\"\n [src]=\"iconMeta.imageUrl\"\n [ngStyle]=\"iconMeta.imageStyle\"\n class=\"pt-dropdown-icon-image\"\n />\n\n <!-- FONT ICON (PrimeNG / FontAwesome) -->\n <i\n *ngIf=\"iconMeta.type === 'font'\"\n [ngClass]=\"iconMeta.fontIconClass\"\n [ngStyle]=\"iconMeta.fontIconStyle\"\n class=\"pt-dropdown-icon-font\"\n ></i>\n </ng-container>\n\n <span class=\"pt-dropdown-label\">{{ option.label }}</span>\n </div>\n </ng-container>\n </ng-template>\n\n <!-- Placeholder when no value selected -->\n <ng-template #placeholderTpl>\n <span>{{ formField.placeholder || \"Select an option\" }}</span>\n </ng-template>\n\n <!-- Items template -->\n <ng-template pTemplate=\"item\" let-option>\n <div class=\"pt-dropdown-item\">\n <ng-container *ngIf=\"getResolvedIcon(option) as iconMeta\">\n <img\n *ngIf=\"iconMeta.type === 'image'\"\n [src]=\"iconMeta.imageUrl\"\n [ngStyle]=\"iconMeta.imageStyle\"\n class=\"pt-dropdown-icon-image\"\n />\n\n <i\n *ngIf=\"iconMeta.type === 'font'\"\n [ngClass]=\"iconMeta.fontIconClass\"\n [ngStyle]=\"iconMeta.fontIconStyle\"\n class=\"pt-dropdown-icon-font\"\n ></i>\n </ng-container>\n\n <span class=\"pt-dropdown-label\">{{ option.label }}</span>\n </div>\n </ng-template>\n </p-dropdown>\n\n <div\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n >\n <small class=\"p-error\">{{ getErrorMessage() }}</small>\n </div>\n</div>\n", styles: [".form-field{display:flex;flex-direction:column;gap:.25rem}.pt-dropdown-item{display:flex;align-items:center;gap:.5rem}.pt-dropdown-icon-image{object-fit:cover}.pt-dropdown-icon-font{display:inline-flex;align-items:center;justify-content:center}.pt-dropdown-label{display:inline-block}\n"] }]
2086
2193
  }], propDecorators: { formGroup: [{
2087
2194
  type: Input
2088
2195
  }], formField: [{
@@ -3999,7 +4106,6 @@ class PTLoginPageComponent {
3999
4106
  };
4000
4107
  }
4001
4108
  onLoginSubmit(loginModel) {
4002
- console.log('Login Submitted:', loginModel);
4003
4109
  this.loginSubmit.emit(loginModel);
4004
4110
  }
4005
4111
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTLoginPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }