@abp/ng.theme.shared 5.0.0-rc.1 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/abp-ng.theme.shared.d.ts +5 -5
  2. package/bundles/abp-ng.theme.shared-extensions.umd.js +1749 -1748
  3. package/bundles/abp-ng.theme.shared-extensions.umd.js.map +1 -1
  4. package/bundles/abp-ng.theme.shared-testing.umd.js +41 -41
  5. package/bundles/abp-ng.theme.shared.umd.js +2316 -2316
  6. package/bundles/abp-ng.theme.shared.umd.js.map +1 -1
  7. package/esm2015/abp-ng.theme.shared.js +4 -4
  8. package/esm2015/extensions/abp-ng.theme.shared-extensions.js +4 -4
  9. package/esm2015/extensions/lib/adapters/date-time.adapter.js +33 -33
  10. package/esm2015/extensions/lib/adapters/date.adapter.js +40 -40
  11. package/esm2015/extensions/lib/adapters/time.adapter.js +35 -35
  12. package/esm2015/extensions/lib/components/abstract-actions/abstract-actions.component.js +24 -24
  13. package/esm2015/extensions/lib/components/date-time-picker/date-time-picker.component.js +73 -73
  14. package/esm2015/extensions/lib/components/extensible-form/extensible-form-prop.component.js +164 -164
  15. package/esm2015/extensions/lib/components/extensible-form/extensible-form.component.js +70 -70
  16. package/esm2015/extensions/lib/components/extensible-table/extensible-table.component.js +133 -133
  17. package/esm2015/extensions/lib/components/grid-actions/grid-actions.component.js +45 -45
  18. package/esm2015/extensions/lib/components/page-toolbar/page-toolbar.component.js +45 -45
  19. package/esm2015/extensions/lib/constants/extra-properties.js +1 -1
  20. package/esm2015/extensions/lib/directives/disabled.directive.js +28 -28
  21. package/esm2015/extensions/lib/directives/prop-data.directive.js +40 -40
  22. package/esm2015/extensions/lib/enums/props.enum.js +1 -1
  23. package/esm2015/extensions/lib/models/actions.js +45 -45
  24. package/esm2015/extensions/lib/models/entity-actions.js +28 -28
  25. package/esm2015/extensions/lib/models/entity-props.js +36 -34
  26. package/esm2015/extensions/lib/models/form-props.js +51 -51
  27. package/esm2015/extensions/lib/models/internal/object-extensions.js +1 -1
  28. package/esm2015/extensions/lib/models/object-extensions.js +2 -2
  29. package/esm2015/extensions/lib/models/props.js +49 -49
  30. package/esm2015/extensions/lib/models/toolbar-actions.js +40 -40
  31. package/esm2015/extensions/lib/services/extensions.service.js +23 -23
  32. package/esm2015/extensions/lib/tokens/extensions.token.js +6 -6
  33. package/esm2015/extensions/lib/ui-extensions.module.js +91 -91
  34. package/esm2015/extensions/lib/utils/actions.util.js +8 -8
  35. package/esm2015/extensions/lib/utils/enum.util.js +41 -41
  36. package/esm2015/extensions/lib/utils/factory.util.js +3 -3
  37. package/esm2015/extensions/lib/utils/form-props.util.js +50 -50
  38. package/esm2015/extensions/lib/utils/localization.util.js +12 -12
  39. package/esm2015/extensions/lib/utils/props.util.js +13 -13
  40. package/esm2015/extensions/lib/utils/state.util.js +123 -123
  41. package/esm2015/extensions/lib/utils/typeahead.util.js +51 -51
  42. package/esm2015/extensions/lib/utils/validation.util.js +10 -10
  43. package/esm2015/extensions/public-api.js +27 -27
  44. package/esm2015/lib/animations/bounce.animations.js +16 -16
  45. package/esm2015/lib/animations/collapse.animations.js +49 -49
  46. package/esm2015/lib/animations/fade.animations.js +37 -37
  47. package/esm2015/lib/animations/index.js +6 -6
  48. package/esm2015/lib/animations/modal.animations.js +10 -10
  49. package/esm2015/lib/animations/slide.animations.js +7 -7
  50. package/esm2015/lib/animations/toast.animations.js +12 -12
  51. package/esm2015/lib/components/breadcrumb/breadcrumb.component.js +48 -48
  52. package/esm2015/lib/components/breadcrumb-items/breadcrumb-items.component.js +21 -21
  53. package/esm2015/lib/components/button/button.component.js +71 -71
  54. package/esm2015/lib/components/confirmation/confirmation.component.js +39 -39
  55. package/esm2015/lib/components/http-error-wrapper/http-error-wrapper.component.js +65 -65
  56. package/esm2015/lib/components/index.js +12 -12
  57. package/esm2015/lib/components/loader-bar/loader-bar.component.js +101 -101
  58. package/esm2015/lib/components/loading/loading.component.js +17 -17
  59. package/esm2015/lib/components/modal/modal-close.directive.js +27 -27
  60. package/esm2015/lib/components/modal/modal-ref.service.js +25 -25
  61. package/esm2015/lib/components/modal/modal.component.js +188 -188
  62. package/esm2015/lib/components/toast/toast.component.js +60 -60
  63. package/esm2015/lib/components/toast-container/toast-container.component.js +48 -48
  64. package/esm2015/lib/constants/styles.js +1 -1
  65. package/esm2015/lib/constants/validation.js +14 -14
  66. package/esm2015/lib/directives/ellipsis.directive.js +62 -62
  67. package/esm2015/lib/directives/index.js +4 -4
  68. package/esm2015/lib/directives/loading.directive.js +89 -89
  69. package/esm2015/lib/directives/ngx-datatable-default.directive.js +74 -74
  70. package/esm2015/lib/directives/ngx-datatable-list.directive.js +93 -93
  71. package/esm2015/lib/enums/index.js +1 -1
  72. package/esm2015/lib/enums/route-names.js +1 -1
  73. package/esm2015/lib/handlers/document-dir.handler.js +32 -32
  74. package/esm2015/lib/handlers/error.handler.js +291 -291
  75. package/esm2015/lib/handlers/index.js +2 -2
  76. package/esm2015/lib/models/common.js +1 -1
  77. package/esm2015/lib/models/confirmation.js +9 -9
  78. package/esm2015/lib/models/index.js +5 -5
  79. package/esm2015/lib/models/nav-item.js +6 -6
  80. package/esm2015/lib/models/statistics.js +1 -1
  81. package/esm2015/lib/models/toaster.js +1 -1
  82. package/esm2015/lib/providers/index.js +2 -2
  83. package/esm2015/lib/providers/ng-bootstrap-config.provider.js +16 -16
  84. package/esm2015/lib/providers/route.provider.js +17 -17
  85. package/esm2015/lib/services/confirmation.service.js +67 -67
  86. package/esm2015/lib/services/index.js +4 -4
  87. package/esm2015/lib/services/nav-items.service.js +50 -50
  88. package/esm2015/lib/services/page-alert.service.js +25 -25
  89. package/esm2015/lib/services/toaster.service.js +102 -102
  90. package/esm2015/lib/theme-shared.module.js +164 -164
  91. package/esm2015/lib/tokens/append-content.token.js +10 -10
  92. package/esm2015/lib/tokens/http-error.token.js +9 -9
  93. package/esm2015/lib/tokens/index.js +4 -4
  94. package/esm2015/lib/tokens/ngx-datatable-messages.token.js +7 -7
  95. package/esm2015/lib/tokens/suppress-unsaved-changes-warning.token.js +2 -2
  96. package/esm2015/lib/utils/date-parser-formatter.js +58 -58
  97. package/esm2015/lib/utils/index.js +2 -2
  98. package/esm2015/lib/utils/validation-utils.js +32 -32
  99. package/esm2015/public-api.js +15 -15
  100. package/esm2015/testing/abp-ng.theme.shared-testing.js +4 -4
  101. package/esm2015/testing/lib/models/config.js +1 -1
  102. package/esm2015/testing/lib/models/index.js +1 -1
  103. package/esm2015/testing/lib/theme-shared-testing.module.js +42 -42
  104. package/esm2015/testing/public-api.js +3 -3
  105. package/extensions/abp-ng.theme.shared-extensions.d.ts +5 -5
  106. package/extensions/lib/adapters/date-time.adapter.d.ts +11 -11
  107. package/extensions/lib/adapters/date.adapter.d.ts +9 -9
  108. package/extensions/lib/adapters/time.adapter.d.ts +8 -8
  109. package/extensions/lib/components/abstract-actions/abstract-actions.component.d.ts +14 -14
  110. package/extensions/lib/components/date-time-picker/date-time-picker.component.d.ts +16 -16
  111. package/extensions/lib/components/extensible-form/extensible-form-prop.component.d.ts +37 -37
  112. package/extensions/lib/components/extensible-form/extensible-form.component.d.ts +24 -24
  113. package/extensions/lib/components/extensible-table/extensible-table.component.d.ts +35 -35
  114. package/extensions/lib/components/grid-actions/grid-actions.component.d.ts +13 -13
  115. package/extensions/lib/components/page-toolbar/page-toolbar.component.d.ts +12 -12
  116. package/extensions/lib/constants/extra-properties.d.ts +1 -1
  117. package/extensions/lib/directives/disabled.directive.d.ts +11 -11
  118. package/extensions/lib/directives/prop-data.directive.d.ts +19 -19
  119. package/extensions/lib/enums/props.enum.d.ts +15 -15
  120. package/extensions/lib/models/actions.d.ts +35 -35
  121. package/extensions/lib/models/entity-actions.d.ts +22 -22
  122. package/extensions/lib/models/entity-props.d.ts +29 -29
  123. package/extensions/lib/models/form-props.d.ts +42 -42
  124. package/extensions/lib/models/internal/object-extensions.d.ts +85 -85
  125. package/extensions/lib/models/object-extensions.d.ts +2 -2
  126. package/extensions/lib/models/props.d.ts +39 -39
  127. package/extensions/lib/models/toolbar-actions.d.ts +29 -29
  128. package/extensions/lib/services/extensions.service.d.ts +14 -14
  129. package/extensions/lib/tokens/extensions.token.d.ts +14 -14
  130. package/extensions/lib/ui-extensions.module.d.ts +23 -23
  131. package/extensions/lib/utils/actions.util.d.ts +7 -7
  132. package/extensions/lib/utils/enum.util.d.ts +7 -7
  133. package/extensions/lib/utils/factory.util.d.ts +1 -1
  134. package/extensions/lib/utils/form-props.util.d.ts +3 -3
  135. package/extensions/lib/utils/localization.util.d.ts +3 -3
  136. package/extensions/lib/utils/props.util.d.ts +8 -8
  137. package/extensions/lib/utils/state.util.d.ts +5 -5
  138. package/extensions/lib/utils/typeahead.util.d.ts +11 -11
  139. package/extensions/lib/utils/validation.util.d.ts +3 -3
  140. package/extensions/public-api.d.ts +27 -27
  141. package/fesm2015/abp-ng.theme.shared-extensions.js +1227 -1226
  142. package/fesm2015/abp-ng.theme.shared-extensions.js.map +1 -1
  143. package/fesm2015/abp-ng.theme.shared-testing.js +37 -37
  144. package/fesm2015/abp-ng.theme.shared.js +1858 -1858
  145. package/fesm2015/abp-ng.theme.shared.js.map +1 -1
  146. package/lib/animations/bounce.animations.d.ts +1 -1
  147. package/lib/animations/collapse.animations.d.ts +9 -9
  148. package/lib/animations/fade.animations.d.ts +10 -10
  149. package/lib/animations/index.d.ts +6 -6
  150. package/lib/animations/modal.animations.d.ts +2 -2
  151. package/lib/animations/slide.animations.d.ts +1 -1
  152. package/lib/animations/toast.animations.d.ts +1 -1
  153. package/lib/components/breadcrumb/breadcrumb.component.d.ts +16 -16
  154. package/lib/components/breadcrumb-items/breadcrumb-items.component.d.ts +7 -7
  155. package/lib/components/button/button.component.d.ts +25 -25
  156. package/lib/components/confirmation/confirmation.component.d.ts +14 -14
  157. package/lib/components/http-error-wrapper/http-error-wrapper.component.d.ts +27 -27
  158. package/lib/components/index.d.ts +12 -12
  159. package/lib/components/loader-bar/loader-bar.component.d.ts +33 -33
  160. package/lib/components/loading/loading.component.d.ts +5 -5
  161. package/lib/components/modal/modal-close.directive.d.ts +9 -9
  162. package/lib/components/modal/modal-ref.service.d.ts +13 -13
  163. package/lib/components/modal/modal.component.d.ts +50 -50
  164. package/lib/components/toast/toast.component.d.ts +14 -14
  165. package/lib/components/toast-container/toast-container.component.d.ts +18 -18
  166. package/lib/constants/styles.d.ts +2 -2
  167. package/lib/constants/validation.d.ts +14 -14
  168. package/lib/directives/ellipsis.directive.d.ts +21 -21
  169. package/lib/directives/index.d.ts +4 -4
  170. package/lib/directives/loading.directive.d.ts +25 -25
  171. package/lib/directives/ngx-datatable-default.directive.d.ts +30 -30
  172. package/lib/directives/ngx-datatable-list.directive.d.ts +24 -24
  173. package/lib/enums/index.d.ts +1 -1
  174. package/lib/enums/route-names.d.ts +3 -3
  175. package/lib/handlers/document-dir.handler.d.ts +13 -13
  176. package/lib/handlers/error.handler.d.ts +82 -82
  177. package/lib/handlers/index.d.ts +2 -2
  178. package/lib/models/common.d.ts +19 -19
  179. package/lib/models/confirmation.d.ts +25 -25
  180. package/lib/models/index.d.ts +5 -5
  181. package/lib/models/nav-item.d.ts +11 -11
  182. package/lib/models/statistics.d.ts +12 -12
  183. package/lib/models/toaster.d.ts +30 -30
  184. package/lib/providers/index.d.ts +2 -2
  185. package/lib/providers/ng-bootstrap-config.provider.d.ts +8 -8
  186. package/lib/providers/route.provider.d.ts +8 -8
  187. package/lib/services/confirmation.service.d.ts +21 -21
  188. package/lib/services/index.d.ts +4 -4
  189. package/lib/services/nav-items.service.d.ts +13 -13
  190. package/lib/services/page-alert.service.d.ts +18 -18
  191. package/lib/services/toaster.service.d.ts +60 -60
  192. package/lib/theme-shared.module.d.ts +33 -33
  193. package/lib/tokens/append-content.token.d.ts +2 -2
  194. package/lib/tokens/http-error.token.d.ts +5 -5
  195. package/lib/tokens/index.d.ts +4 -4
  196. package/lib/tokens/ngx-datatable-messages.token.d.ts +12 -12
  197. package/lib/tokens/suppress-unsaved-changes-warning.token.d.ts +2 -2
  198. package/lib/utils/date-parser-formatter.d.ts +12 -12
  199. package/lib/utils/index.d.ts +2 -2
  200. package/lib/utils/validation-utils.d.ts +3 -3
  201. package/package.json +4 -4
  202. package/public-api.d.ts +12 -12
  203. package/testing/abp-ng.theme.shared-testing.d.ts +5 -5
  204. package/testing/lib/models/config.d.ts +4 -4
  205. package/testing/lib/models/index.d.ts +1 -1
  206. package/testing/lib/theme-shared-testing.module.d.ts +14 -14
  207. package/testing/public-api.d.ts +3 -3
@@ -1,164 +1,164 @@
1
- import { AbpValidators, ConfigStateService, TrackByService } from '@abp/ng.core';
2
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, Optional, SkipSelf, ViewChild, } from '@angular/core';
3
- import { ControlContainer, FormGroupDirective, Validators, } from '@angular/forms';
4
- import { NgbDateAdapter, NgbTimeAdapter } from '@ng-bootstrap/ng-bootstrap';
5
- import { of } from 'rxjs';
6
- import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';
7
- import { DateAdapter } from '../../adapters/date.adapter';
8
- import { TimeAdapter } from '../../adapters/time.adapter';
9
- import { EXTRA_PROPERTIES_KEY } from '../../constants/extra-properties';
10
- import { FormProp } from '../../models/form-props';
11
- import { PropData } from '../../models/props';
12
- import { selfFactory } from '../../utils/factory.util';
13
- import { addTypeaheadTextSuffix } from '../../utils/typeahead.util';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "@abp/ng.core";
16
- import * as i2 from "@angular/forms";
17
- import * as i3 from "@ng-bootstrap/ng-bootstrap";
18
- import * as i4 from "../date-time-picker/date-time-picker.component";
19
- import * as i5 from "@angular/common";
20
- import * as i6 from "@ngx-validate/core";
21
- import * as i7 from "../../directives/disabled.directive";
22
- export class ExtensibleFormPropComponent {
23
- constructor(cdRef, track, configState, groupDirective) {
24
- this.cdRef = cdRef;
25
- this.track = track;
26
- this.configState = configState;
27
- this.asterisk = '';
28
- this.options$ = of([]);
29
- this.validators = [];
30
- this.search = (text$) => text$
31
- ? text$.pipe(debounceTime(300), distinctUntilChanged(), switchMap(text => this.prop.options(this.data, text)))
32
- : of([]);
33
- this.typeaheadFormatter = (option) => option.key;
34
- this.form = groupDirective.form;
35
- }
36
- setTypeaheadValue(selectedOption) {
37
- this.typeaheadModel = selectedOption || { key: null, value: null };
38
- const { key, value } = this.typeaheadModel;
39
- const [keyControl, valueControl] = this.getTypeaheadControls();
40
- if ((valueControl === null || valueControl === void 0 ? void 0 : valueControl.value) && !value)
41
- valueControl.markAsDirty();
42
- keyControl === null || keyControl === void 0 ? void 0 : keyControl.setValue(key);
43
- valueControl === null || valueControl === void 0 ? void 0 : valueControl.setValue(value);
44
- }
45
- get meridian() {
46
- return (this.configState.getDeep('localization.currentCulture.dateTimeFormat.shortTimePattern') || '').includes('tt');
47
- }
48
- get isInvalid() {
49
- const control = this.form.get(this.prop.name);
50
- return control.touched && control.invalid;
51
- }
52
- getTypeaheadControls() {
53
- const { name } = this.prop;
54
- const extraPropName = `${EXTRA_PROPERTIES_KEY}.${name}`;
55
- const keyControl = this.form.get(addTypeaheadTextSuffix(extraPropName)) ||
56
- this.form.get(addTypeaheadTextSuffix(name));
57
- const valueControl = this.form.get(extraPropName) || this.form.get(name);
58
- return [keyControl, valueControl];
59
- }
60
- setAsterisk() {
61
- this.asterisk = this.validators.some(isRequired) ? '*' : '';
62
- }
63
- ngAfterViewInit() {
64
- if (this.first && this.fieldRef) {
65
- this.fieldRef.nativeElement.focus();
66
- }
67
- }
68
- getComponent(prop) {
69
- switch (prop.type) {
70
- case "boolean" /* Boolean */:
71
- return 'checkbox';
72
- case "date" /* Date */:
73
- return 'date';
74
- case "dateTime" /* DateTime */:
75
- return 'dateTime';
76
- case "hidden" /* Hidden */:
77
- return 'hidden';
78
- case "multiselect" /* MultiSelect */:
79
- return 'multiselect';
80
- case "text" /* Text */:
81
- return 'textarea';
82
- case "time" /* Time */:
83
- return 'time';
84
- case "typeahead" /* Typeahead */:
85
- return 'typeahead';
86
- default:
87
- return prop.options ? 'select' : 'input';
88
- }
89
- }
90
- getType(prop) {
91
- switch (prop.type) {
92
- case "date" /* Date */:
93
- case "string" /* String */:
94
- return 'text';
95
- case "boolean" /* Boolean */:
96
- return 'checkbox';
97
- case "number" /* Number */:
98
- return 'number';
99
- case "email" /* Email */:
100
- return 'email';
101
- case "password" /* Password */:
102
- return 'password';
103
- default:
104
- return 'hidden';
105
- }
106
- }
107
- ngOnChanges({ prop }) {
108
- const currentProp = prop === null || prop === void 0 ? void 0 : prop.currentValue;
109
- const { options, readonly, disabled, validators } = currentProp || {};
110
- if (options)
111
- this.options$ = options(this.data);
112
- if (readonly)
113
- this.readonly = readonly(this.data);
114
- if (disabled)
115
- this.disabled = disabled(this.data);
116
- if (validators) {
117
- this.validators = validators(this.data);
118
- this.setAsterisk();
119
- }
120
- const [keyControl, valueControl] = this.getTypeaheadControls();
121
- if (keyControl && valueControl)
122
- this.typeaheadModel = { key: keyControl.value, value: valueControl.value };
123
- }
124
- }
125
- ExtensibleFormPropComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ExtensibleFormPropComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TrackByService }, { token: i1.ConfigStateService }, { token: i2.FormGroupDirective }], target: i0.ɵɵFactoryTarget.Component });
126
- ExtensibleFormPropComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: ExtensibleFormPropComponent, selector: "abp-extensible-form-prop", inputs: { data: "data", prop: "prop", first: "first" }, viewQueries: [{ propertyName: "fieldRef", first: true, predicate: ["field"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"mb-3 form-group\" *abpPermission=\"prop.permission\" [ngSwitch]=\"getComponent(prop)\">\n <ng-template ngSwitchCase=\"input\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <input\n #field\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n [autocomplete]=\"prop.autocomplete\"\n [type]=\"getType(prop)\"\n [abpDisabled]=\"disabled\"\n [readonly]=\"readonly\"\n class=\"form-control\"\n />\n </ng-template>\n\n <ng-template ngSwitchCase=\"hidden\">\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\n </ng-template>\n\n <ng-template ngSwitchCase=\"checkbox\">\n <div class=\"form-check\" validationTarget>\n <input\n #field\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n [abpDisabled]=\"disabled\"\n type=\"checkbox\"\n class=\"form-check-input\"\n />\n <ng-template\n [ngTemplateOutlet]=\"label\"\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\n ></ng-template>\n </div>\n </ng-template>\n\n <ng-template ngSwitchCase=\"select\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <select\n #field\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n [abpDisabled]=\"disabled\"\n class=\"form-select form-control\"\n >\n <option\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\n [ngValue]=\"option.value\"\n >\n {{ option.key }}\n </option>\n </select>\n </ng-template>\n\n <ng-template ngSwitchCase=\"multiselect\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <select\n #field\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n [abpDisabled]=\"disabled\"\n multiple=\"multiple\"\n class=\"form-select form-control\"\n >\n <option\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\n [ngValue]=\"option.value\"\n >\n {{ option.key }}\n </option>\n </select>\n </ng-template>\n\n <ng-template ngSwitchCase=\"typeahead\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\n <input\n #field\n [id]=\"prop.id\"\n [autocomplete]=\"prop.autocomplete\"\n [abpDisabled]=\"disabled\"\n [ngbTypeahead]=\"search\"\n [editable]=\"false\"\n [inputFormatter]=\"typeaheadFormatter\"\n [resultFormatter]=\"typeaheadFormatter\"\n [ngModelOptions]=\"{ standalone: true }\"\n [(ngModel)]=\"typeaheadModel\"\n (selectItem)=\"setTypeaheadValue($event.item)\"\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\n class=\"form-control\"\n />\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\n </div>\n </ng-template>\n\n <ng-template ngSwitchCase=\"date\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <input\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n (click)=\"datepicker.open()\"\n (keyup.space)=\"datepicker.open()\"\n ngbDatepicker\n #datepicker=\"ngbDatepicker\"\n type=\"text\"\n class=\"form-control\"\n />\n </ng-template>\n\n <ng-template ngSwitchCase=\"time\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <ngb-timepicker [formControlName]=\"prop.name\"></ngb-timepicker>\n </ng-template>\n\n <ng-template ngSwitchCase=\"dateTime\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <abp-date-time-picker [prop]=\"prop\" [meridian]=\"meridian\"></abp-date-time-picker>\n </ng-template>\n\n <ng-template ngSwitchCase=\"textarea\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <textarea\n #field\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n [abpDisabled]=\"disabled\"\n [readonly]=\"readonly\"\n class=\"form-control\"\n ></textarea>\n </ng-template>\n</div>\n\n<ng-template #label let-classes>\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label'\"\n >{{ prop.displayName | abpLocalization }} {{ asterisk }}</label\n >\n</ng-template>\n", components: [{ type: i3.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }, { type: i4.DateTimePickerComponent, selector: "abp-date-time-picker", inputs: ["prop", "meridian"], exportAs: ["abpDateTimePicker"] }], directives: [{ type: i1.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission"] }, { type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { 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]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.ValidationDirective, selector: "[formControl],[formControlName]", inputs: ["blueprints", "errorTemplate", "invalidClasses", "mapErrorsFn", "skipValidation", "targetSelector", "validateOnSubmit"] }, { type: i7.DisabledDirective, selector: "[abpDisabled]", inputs: ["abpDisabled"] }, { type: i6.ValidationTargetDirective, selector: "[validationTarget]" }, { type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { type: i6.ValidationStyleDirective, selector: "[validationStyle]" }, { type: i3.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "placement", "container", "editable", "focusFirst", "showHint", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["disabled", "autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "async": i5.AsyncPipe, "abpLocalization": i1.LocalizationPipe }, viewProviders: [
127
- {
128
- provide: ControlContainer,
129
- useFactory: selfFactory,
130
- deps: [[new Optional(), new SkipSelf(), ControlContainer]],
131
- },
132
- { provide: NgbDateAdapter, useClass: DateAdapter },
133
- { provide: NgbTimeAdapter, useClass: TimeAdapter },
134
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ExtensibleFormPropComponent, decorators: [{
136
- type: Component,
137
- args: [{
138
- selector: 'abp-extensible-form-prop',
139
- templateUrl: './extensible-form-prop.component.html',
140
- changeDetection: ChangeDetectionStrategy.OnPush,
141
- viewProviders: [
142
- {
143
- provide: ControlContainer,
144
- useFactory: selfFactory,
145
- deps: [[new Optional(), new SkipSelf(), ControlContainer]],
146
- },
147
- { provide: NgbDateAdapter, useClass: DateAdapter },
148
- { provide: NgbTimeAdapter, useClass: TimeAdapter },
149
- ],
150
- }]
151
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.TrackByService }, { type: i1.ConfigStateService }, { type: i2.FormGroupDirective }]; }, propDecorators: { data: [{
152
- type: Input
153
- }], prop: [{
154
- type: Input
155
- }], first: [{
156
- type: Input
157
- }], fieldRef: [{
158
- type: ViewChild,
159
- args: ['field']
160
- }] } });
161
- function isRequired(validator) {
162
- return validator === Validators.required || validator === AbpValidators.required;
163
- }
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaWJsZS1mb3JtLXByb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdGhlbWUtc2hhcmVkL2V4dGVuc2lvbnMvc3JjL2xpYi9jb21wb25lbnRzL2V4dGVuc2libGUtZm9ybS9leHRlbnNpYmxlLWZvcm0tcHJvcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy90aGVtZS1zaGFyZWQvZXh0ZW5zaW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZXh0ZW5zaWJsZS1mb3JtL2V4dGVuc2libGUtZm9ybS1wcm9wLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RGLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUVMLFFBQVEsRUFFUixRQUFRLEVBQ1IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsa0JBQWtCLEVBRWxCLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENB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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFCUCwgQWJwVmFsaWRhdG9ycywgQ29uZmlnU3RhdGVTZXJ2aWNlLCBUcmFja0J5U2VydmljZSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3B0aW9uYWwsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNraXBTZWxmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29udHJvbENvbnRhaW5lcixcbiAgRm9ybUdyb3VwLFxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ2JEYXRlQWRhcHRlciwgTmdiVGltZUFkYXB0ZXIgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9hZGFwdGVycy9kYXRlLmFkYXB0ZXInO1xuaW1wb3J0IHsgVGltZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9hZGFwdGVycy90aW1lLmFkYXB0ZXInO1xuaW1wb3J0IHsgRVhUUkFfUFJPUEVSVElFU19LRVkgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZXh0cmEtcHJvcGVydGllcyc7XG5pbXBvcnQgeyBlUHJvcFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9wcm9wcy5lbnVtJztcbmltcG9ydCB7IEZvcm1Qcm9wIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Zvcm0tcHJvcHMnO1xuaW1wb3J0IHsgUHJvcERhdGEgfSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvcHMnO1xuaW1wb3J0IHsgc2VsZkZhY3RvcnkgfSBmcm9tICcuLi8uLi91dGlscy9mYWN0b3J5LnV0aWwnO1xuaW1wb3J0IHsgYWRkVHlwZWFoZWFkVGV4dFN1ZmZpeCB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVhaGVhZC51dGlsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWJwLWV4dGVuc2libGUtZm9ybS1wcm9wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2V4dGVuc2libGUtZm9ybS1wcm9wLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHZpZXdQcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLFxuICAgICAgdXNlRmFjdG9yeTogc2VsZkZhY3RvcnksXG4gICAgICBkZXBzOiBbW25ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKSwgQ29udHJvbENvbnRhaW5lcl1dLFxuICAgIH0sXG4gICAgeyBwcm92aWRlOiBOZ2JEYXRlQWRhcHRlciwgdXNlQ2xhc3M6IERhdGVBZGFwdGVyIH0sXG4gICAgeyBwcm92aWRlOiBOZ2JUaW1lQWRhcHRlciwgdXNlQ2xhc3M6IFRpbWVBZGFwdGVyIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEV4dGVuc2libGVGb3JtUHJvcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIGRhdGEhOiBQcm9wRGF0YTtcblxuICBASW5wdXQoKSBwcm9wITogRm9ybVByb3A7XG5cbiAgQElucHV0KCkgZmlyc3Q/OiBib29sZWFuO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpZWxkJykgcHJpdmF0ZSBmaWVsZFJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGFzdGVyaXNrID0gJyc7XG5cbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8QUJQLk9wdGlvbjxhbnk+W10+ID0gb2YoW10pO1xuXG4gIHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcblxuICByZWFkb25seSE6IGJvb2xlYW47XG5cbiAgZGlzYWJsZWQhOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybTogRm9ybUdyb3VwO1xuXG4gIHR5cGVhaGVhZE1vZGVsOiBhbnk7XG5cbiAgc2V0VHlwZWFoZWFkVmFsdWUoc2VsZWN0ZWRPcHRpb246IEFCUC5PcHRpb248c3RyaW5nPikge1xuICAgIHRoaXMudHlwZWFoZWFkTW9kZWwgPSBzZWxlY3RlZE9wdGlvbiB8fCB7IGtleTogbnVsbCwgdmFsdWU6IG51bGwgfTtcbiAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHRoaXMudHlwZWFoZWFkTW9kZWw7XG4gICAgY29uc3QgW2tleUNvbnRyb2wsIHZhbHVlQ29udHJvbF0gPSB0aGlzLmdldFR5cGVhaGVhZENvbnRyb2xzKCk7XG4gICAgaWYgKHZhbHVlQ29udHJvbD8udmFsdWUgJiYgIXZhbHVlKSB2YWx1ZUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICBrZXlDb250cm9sPy5zZXRWYWx1ZShrZXkpO1xuICAgIHZhbHVlQ29udHJvbD8uc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgc2VhcmNoID0gKHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4pID0+XG4gICAgdGV4dCRcbiAgICAgID8gdGV4dCQucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIHN3aXRjaE1hcCh0ZXh0ID0+IHRoaXMucHJvcC5vcHRpb25zKHRoaXMuZGF0YSwgdGV4dCkpLFxuICAgICAgICApXG4gICAgICA6IG9mKFtdKTtcblxuICB0eXBlYWhlYWRGb3JtYXR0ZXIgPSAob3B0aW9uOiBBQlAuT3B0aW9uPGFueT4pID0+IG9wdGlvbi5rZXk7XG5cbiAgZ2V0IG1lcmlkaWFuKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbmZpZ1N0YXRlLmdldERlZXAoJ2xvY2FsaXphdGlvbi5jdXJyZW50Q3VsdHVyZS5kYXRlVGltZUZvcm1hdC5zaG9ydFRpbWVQYXR0ZXJuJykgfHwgJydcbiAgICApLmluY2x1ZGVzKCd0dCcpO1xuICB9XG5cbiAgZ2V0IGlzSW52YWxpZCgpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLnByb3AubmFtZSk7XG4gICAgcmV0dXJuIGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmludmFsaWQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHB1YmxpYyByZWFkb25seSB0cmFjazogVHJhY2tCeVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNvbmZpZ1N0YXRlOiBDb25maWdTdGF0ZVNlcnZpY2UsXG4gICAgZ3JvdXBEaXJlY3RpdmU6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JtID0gZ3JvdXBEaXJlY3RpdmUuZm9ybTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHlwZWFoZWFkQ29udHJvbHMoKSB7XG4gICAgY29uc3QgeyBuYW1lIH0gPSB0aGlzLnByb3A7XG4gICAgY29uc3QgZXh0cmFQcm9wTmFtZSA9IGAke0VYVFJBX1BST1BFUlRJRVNfS0VZfS4ke25hbWV9YDtcbiAgICBjb25zdCBrZXlDb250cm9sID1cbiAgICAgIHRoaXMuZm9ybS5nZXQoYWRkVHlwZWFoZWFkVGV4dFN1ZmZpeChleHRyYVByb3BOYW1lKSkgfHxcbiAgICAgIHRoaXMuZm9ybS5nZXQoYWRkVHlwZWFoZWFkVGV4dFN1ZmZpeChuYW1lKSk7XG4gICAgY29uc3QgdmFsdWVDb250cm9sID0gdGhpcy5mb3JtLmdldChleHRyYVByb3BOYW1lKSB8fCB0aGlzLmZvcm0uZ2V0KG5hbWUpO1xuICAgIHJldHVybiBba2V5Q29udHJvbCwgdmFsdWVDb250cm9sXTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QXN0ZXJpc2soKSB7XG4gICAgdGhpcy5hc3RlcmlzayA9IHRoaXMudmFsaWRhdG9ycy5zb21lKGlzUmVxdWlyZWQpID8gJyonIDogJyc7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuZmlyc3QgJiYgdGhpcy5maWVsZFJlZikge1xuICAgICAgdGhpcy5maWVsZFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcG9uZW50KHByb3A6IEZvcm1Qcm9wKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgICAgY2FzZSBlUHJvcFR5cGUuQm9vbGVhbjpcbiAgICAgICAgcmV0dXJuICdjaGVja2JveCc7XG4gICAgICBjYXNlIGVQcm9wVHlwZS5EYXRlOlxuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgY2FzZSBlUHJvcFR5cGUuRGF0ZVRpbWU6XG4gICAgICAgIHJldHVybiAnZGF0ZVRpbWUnO1xuICAgICAgY2FzZSBlUHJvcFR5cGUuSGlkZGVuOlxuICAgICAgICByZXR1cm4gJ2hpZGRlbic7XG4gICAgICBjYXNlIGVQcm9wVHlwZS5NdWx0aVNlbGVjdDpcbiAgICAgICAgcmV0dXJuICdtdWx0aXNlbGVjdCc7XG4gICAgICBjYXNlIGVQcm9wVHlwZS5UZXh0OlxuICAgICAgICByZXR1cm4gJ3RleHRhcmVhJztcbiAgICAgIGNhc2UgZVByb3BUeXBlLlRpbWU6XG4gICAgICAgIHJldHVybiAndGltZSc7XG4gICAgICBjYXNlIGVQcm9wVHlwZS5UeXBlYWhlYWQ6XG4gICAgICAgIHJldHVybiAndHlwZWFoZWFkJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwcm9wLm9wdGlvbnMgPyAnc2VsZWN0JyA6ICdpbnB1dCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0VHlwZShwcm9wOiBGb3JtUHJvcCk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgZVByb3BUeXBlLkRhdGU6XG4gICAgICBjYXNlIGVQcm9wVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICBjYXNlIGVQcm9wVHlwZS5Cb29sZWFuOlxuICAgICAgICByZXR1cm4gJ2NoZWNrYm94JztcbiAgICAgIGNhc2UgZVByb3BUeXBlLk51bWJlcjpcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgICAgY2FzZSBlUHJvcFR5cGUuRW1haWw6XG4gICAgICAgIHJldHVybiAnZW1haWwnO1xuICAgICAgY2FzZSBlUHJvcFR5cGUuUGFzc3dvcmQ6XG4gICAgICAgIHJldHVybiAncGFzc3dvcmQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdoaWRkZW4nO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKHsgcHJvcCB9OiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgY3VycmVudFByb3AgPSBwcm9wPy5jdXJyZW50VmFsdWU7XG4gICAgY29uc3QgeyBvcHRpb25zLCByZWFkb25seSwgZGlzYWJsZWQsIHZhbGlkYXRvcnMgfSA9IGN1cnJlbnRQcm9wIHx8IHt9O1xuXG4gICAgaWYgKG9wdGlvbnMpIHRoaXMub3B0aW9ucyQgPSBvcHRpb25zKHRoaXMuZGF0YSk7XG4gICAgaWYgKHJlYWRvbmx5KSB0aGlzLnJlYWRvbmx5ID0gcmVhZG9ubHkodGhpcy5kYXRhKTtcbiAgICBpZiAoZGlzYWJsZWQpIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZCh0aGlzLmRhdGEpO1xuICAgIGlmICh2YWxpZGF0b3JzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzKHRoaXMuZGF0YSk7XG4gICAgICB0aGlzLnNldEFzdGVyaXNrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgW2tleUNvbnRyb2wsIHZhbHVlQ29udHJvbF0gPSB0aGlzLmdldFR5cGVhaGVhZENvbnRyb2xzKCk7XG4gICAgaWYgKGtleUNvbnRyb2wgJiYgdmFsdWVDb250cm9sKVxuICAgICAgdGhpcy50eXBlYWhlYWRNb2RlbCA9IHsga2V5OiBrZXlDb250cm9sLnZhbHVlLCB2YWx1ZTogdmFsdWVDb250cm9sLnZhbHVlIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNSZXF1aXJlZCh2YWxpZGF0b3I6IFZhbGlkYXRvckZuKSB7XG4gIHJldHVybiB2YWxpZGF0b3IgPT09IFZhbGlkYXRvcnMucmVxdWlyZWQgfHwgdmFsaWRhdG9yID09PSBBYnBWYWxpZGF0b3JzLnJlcXVpcmVkO1xufVxuIiwiPGRpdiBjbGFzcz1cIm1iLTMgZm9ybS1ncm91cFwiICphYnBQZXJtaXNzaW9uPVwicHJvcC5wZXJtaXNzaW9uXCIgW25nU3dpdGNoXT1cImdldENvbXBvbmVudChwcm9wKVwiPlxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiaW5wdXRcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDxpbnB1dFxuICAgICAgI2ZpZWxkXG4gICAgICBbaWRdPVwicHJvcC5pZFwiXG4gICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3AubmFtZVwiXG4gICAgICBbYXV0b2NvbXBsZXRlXT1cInByb3AuYXV0b2NvbXBsZXRlXCJcbiAgICAgIFt0eXBlXT1cImdldFR5cGUocHJvcClcIlxuICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgLz5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiaGlkZGVuXCI+XG4gICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCIgdHlwZT1cImhpZGRlblwiIC8+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImNoZWNrYm94XCI+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiB2YWxpZGF0aW9uVGFyZ2V0PlxuICAgICAgPGlucHV0XG4gICAgICAgICNmaWVsZFxuICAgICAgICBbaWRdPVwicHJvcC5pZFwiXG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCJcbiAgICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcbiAgICAgIC8+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6ICdmb3JtLWNoZWNrLWxhYmVsJyB9XCJcbiAgICAgID48L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJzZWxlY3RcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDxzZWxlY3RcbiAgICAgICNmaWVsZFxuICAgICAgW2lkXT1cInByb3AuaWRcIlxuICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIlxuICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1jb250cm9sXCJcbiAgICA+XG4gICAgICA8b3B0aW9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9ucyQgfCBhc3luYzsgdHJhY2tCeTogdHJhY2suYnkoJ3ZhbHVlJylcIlxuICAgICAgICBbbmdWYWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgICAgPlxuICAgICAgICB7eyBvcHRpb24ua2V5IH19XG4gICAgICA8L29wdGlvbj5cbiAgICA8L3NlbGVjdD5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwibXVsdGlzZWxlY3RcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDxzZWxlY3RcbiAgICAgICNmaWVsZFxuICAgICAgW2lkXT1cInByb3AuaWRcIlxuICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIlxuICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIG11bHRpcGxlPVwibXVsdGlwbGVcIlxuICAgICAgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLWNvbnRyb2xcIlxuICAgID5cbiAgICAgIDxvcHRpb25cbiAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zJCB8IGFzeW5jOyB0cmFja0J5OiB0cmFjay5ieSgndmFsdWUnKVwiXG4gICAgICAgIFtuZ1ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICA+XG4gICAgICAgIHt7IG9wdGlvbi5rZXkgfX1cbiAgICAgIDwvb3B0aW9uPlxuICAgIDwvc2VsZWN0PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJ0eXBlYWhlYWRcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDxkaXYgI3R5cGVhaGVhZCBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgdmFsaWRhdGlvblN0eWxlIHZhbGlkYXRpb25UYXJnZXQ+XG4gICAgICA8aW5wdXRcbiAgICAgICAgI2ZpZWxkXG4gICAgICAgIFtpZF09XCJwcm9wLmlkXCJcbiAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJwcm9wLmF1dG9jb21wbGV0ZVwiXG4gICAgICAgIFthYnBEaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtuZ2JUeXBlYWhlYWRdPVwic2VhcmNoXCJcbiAgICAgICAgW2VkaXRhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgW2lucHV0Rm9ybWF0dGVyXT1cInR5cGVhaGVhZEZvcm1hdHRlclwiXG4gICAgICAgIFtyZXN1bHRGb3JtYXR0ZXJdPVwidHlwZWFoZWFkRm9ybWF0dGVyXCJcbiAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJ0eXBlYWhlYWRNb2RlbFwiXG4gICAgICAgIChzZWxlY3RJdGVtKT1cInNldFR5cGVhaGVhZFZhbHVlKCRldmVudC5pdGVtKVwiXG4gICAgICAgIChibHVyKT1cInNldFR5cGVhaGVhZFZhbHVlKHR5cGVhaGVhZE1vZGVsKVwiXG4gICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInR5cGVhaGVhZC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWludmFsaWQnKVwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgIC8+XG4gICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiZGF0ZVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiPjwvbmctdGVtcGxhdGU+XG4gICAgPGlucHV0XG4gICAgICBbaWRdPVwicHJvcC5pZFwiXG4gICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3AubmFtZVwiXG4gICAgICAoY2xpY2spPVwiZGF0ZXBpY2tlci5vcGVuKClcIlxuICAgICAgKGtleXVwLnNwYWNlKT1cImRhdGVwaWNrZXIub3BlbigpXCJcbiAgICAgIG5nYkRhdGVwaWNrZXJcbiAgICAgICNkYXRlcGlja2VyPVwibmdiRGF0ZXBpY2tlclwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgLz5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwidGltZVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiPjwvbmctdGVtcGxhdGU+XG4gICAgPG5nYi10aW1lcGlja2VyIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCI+PC9uZ2ItdGltZXBpY2tlcj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiZGF0ZVRpbWVcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDxhYnAtZGF0ZS10aW1lLXBpY2tlciBbcHJvcF09XCJwcm9wXCIgW21lcmlkaWFuXT1cIm1lcmlkaWFuXCI+PC9hYnAtZGF0ZS10aW1lLXBpY2tlcj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwidGV4dGFyZWFcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDx0ZXh0YXJlYVxuICAgICAgI2ZpZWxkXG4gICAgICBbaWRdPVwicHJvcC5pZFwiXG4gICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3AubmFtZVwiXG4gICAgICBbYWJwRGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICA+PC90ZXh0YXJlYT5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2xhYmVsIGxldC1jbGFzc2VzPlxuICA8bGFiZWwgW2h0bWxGb3JdPVwicHJvcC5pZFwiIFtuZ0NsYXNzXT1cImNsYXNzZXMgfHwgJ2Zvcm0tbGFiZWwnXCJcbiAgICA+e3sgcHJvcC5kaXNwbGF5TmFtZSB8IGFicExvY2FsaXphdGlvbiB9fSB7eyBhc3RlcmlzayB9fTwvbGFiZWxcbiAgPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
1
+ import { AbpValidators, ConfigStateService, TrackByService } from '@abp/ng.core';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, Optional, SkipSelf, ViewChild, } from '@angular/core';
3
+ import { ControlContainer, FormGroupDirective, Validators, } from '@angular/forms';
4
+ import { NgbDateAdapter, NgbTimeAdapter } from '@ng-bootstrap/ng-bootstrap';
5
+ import { of } from 'rxjs';
6
+ import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';
7
+ import { DateAdapter } from '../../adapters/date.adapter';
8
+ import { TimeAdapter } from '../../adapters/time.adapter';
9
+ import { EXTRA_PROPERTIES_KEY } from '../../constants/extra-properties';
10
+ import { FormProp } from '../../models/form-props';
11
+ import { PropData } from '../../models/props';
12
+ import { selfFactory } from '../../utils/factory.util';
13
+ import { addTypeaheadTextSuffix } from '../../utils/typeahead.util';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@abp/ng.core";
16
+ import * as i2 from "@angular/forms";
17
+ import * as i3 from "@ng-bootstrap/ng-bootstrap";
18
+ import * as i4 from "../date-time-picker/date-time-picker.component";
19
+ import * as i5 from "@angular/common";
20
+ import * as i6 from "@ngx-validate/core";
21
+ import * as i7 from "../../directives/disabled.directive";
22
+ export class ExtensibleFormPropComponent {
23
+ constructor(cdRef, track, configState, groupDirective) {
24
+ this.cdRef = cdRef;
25
+ this.track = track;
26
+ this.configState = configState;
27
+ this.asterisk = '';
28
+ this.options$ = of([]);
29
+ this.validators = [];
30
+ this.search = (text$) => text$
31
+ ? text$.pipe(debounceTime(300), distinctUntilChanged(), switchMap(text => this.prop.options(this.data, text)))
32
+ : of([]);
33
+ this.typeaheadFormatter = (option) => option.key;
34
+ this.form = groupDirective.form;
35
+ }
36
+ setTypeaheadValue(selectedOption) {
37
+ this.typeaheadModel = selectedOption || { key: null, value: null };
38
+ const { key, value } = this.typeaheadModel;
39
+ const [keyControl, valueControl] = this.getTypeaheadControls();
40
+ if ((valueControl === null || valueControl === void 0 ? void 0 : valueControl.value) && !value)
41
+ valueControl.markAsDirty();
42
+ keyControl === null || keyControl === void 0 ? void 0 : keyControl.setValue(key);
43
+ valueControl === null || valueControl === void 0 ? void 0 : valueControl.setValue(value);
44
+ }
45
+ get meridian() {
46
+ return (this.configState.getDeep('localization.currentCulture.dateTimeFormat.shortTimePattern') || '').includes('tt');
47
+ }
48
+ get isInvalid() {
49
+ const control = this.form.get(this.prop.name);
50
+ return control.touched && control.invalid;
51
+ }
52
+ getTypeaheadControls() {
53
+ const { name } = this.prop;
54
+ const extraPropName = `${EXTRA_PROPERTIES_KEY}.${name}`;
55
+ const keyControl = this.form.get(addTypeaheadTextSuffix(extraPropName)) ||
56
+ this.form.get(addTypeaheadTextSuffix(name));
57
+ const valueControl = this.form.get(extraPropName) || this.form.get(name);
58
+ return [keyControl, valueControl];
59
+ }
60
+ setAsterisk() {
61
+ this.asterisk = this.validators.some(isRequired) ? '*' : '';
62
+ }
63
+ ngAfterViewInit() {
64
+ if (this.first && this.fieldRef) {
65
+ this.fieldRef.nativeElement.focus();
66
+ }
67
+ }
68
+ getComponent(prop) {
69
+ switch (prop.type) {
70
+ case "boolean" /* Boolean */:
71
+ return 'checkbox';
72
+ case "date" /* Date */:
73
+ return 'date';
74
+ case "dateTime" /* DateTime */:
75
+ return 'dateTime';
76
+ case "hidden" /* Hidden */:
77
+ return 'hidden';
78
+ case "multiselect" /* MultiSelect */:
79
+ return 'multiselect';
80
+ case "text" /* Text */:
81
+ return 'textarea';
82
+ case "time" /* Time */:
83
+ return 'time';
84
+ case "typeahead" /* Typeahead */:
85
+ return 'typeahead';
86
+ default:
87
+ return prop.options ? 'select' : 'input';
88
+ }
89
+ }
90
+ getType(prop) {
91
+ switch (prop.type) {
92
+ case "date" /* Date */:
93
+ case "string" /* String */:
94
+ return 'text';
95
+ case "boolean" /* Boolean */:
96
+ return 'checkbox';
97
+ case "number" /* Number */:
98
+ return 'number';
99
+ case "email" /* Email */:
100
+ return 'email';
101
+ case "password" /* Password */:
102
+ return 'password';
103
+ default:
104
+ return 'hidden';
105
+ }
106
+ }
107
+ ngOnChanges({ prop }) {
108
+ const currentProp = prop === null || prop === void 0 ? void 0 : prop.currentValue;
109
+ const { options, readonly, disabled, validators } = currentProp || {};
110
+ if (options)
111
+ this.options$ = options(this.data);
112
+ if (readonly)
113
+ this.readonly = readonly(this.data);
114
+ if (disabled)
115
+ this.disabled = disabled(this.data);
116
+ if (validators) {
117
+ this.validators = validators(this.data);
118
+ this.setAsterisk();
119
+ }
120
+ const [keyControl, valueControl] = this.getTypeaheadControls();
121
+ if (keyControl && valueControl)
122
+ this.typeaheadModel = { key: keyControl.value, value: valueControl.value };
123
+ }
124
+ }
125
+ ExtensibleFormPropComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ExtensibleFormPropComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TrackByService }, { token: i1.ConfigStateService }, { token: i2.FormGroupDirective }], target: i0.ɵɵFactoryTarget.Component });
126
+ ExtensibleFormPropComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: ExtensibleFormPropComponent, selector: "abp-extensible-form-prop", inputs: { data: "data", prop: "prop", first: "first" }, viewQueries: [{ propertyName: "fieldRef", first: true, predicate: ["field"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"mb-3 form-group\" *abpPermission=\"prop.permission\" [ngSwitch]=\"getComponent(prop)\">\n <ng-template ngSwitchCase=\"input\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <input\n #field\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n [autocomplete]=\"prop.autocomplete\"\n [type]=\"getType(prop)\"\n [abpDisabled]=\"disabled\"\n [readonly]=\"readonly\"\n class=\"form-control\"\n />\n </ng-template>\n\n <ng-template ngSwitchCase=\"hidden\">\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\n </ng-template>\n\n <ng-template ngSwitchCase=\"checkbox\">\n <div class=\"form-check\" validationTarget>\n <input\n #field\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n [abpDisabled]=\"disabled\"\n type=\"checkbox\"\n class=\"form-check-input\"\n />\n <ng-template\n [ngTemplateOutlet]=\"label\"\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\n ></ng-template>\n </div>\n </ng-template>\n\n <ng-template ngSwitchCase=\"select\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <select\n #field\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n [abpDisabled]=\"disabled\"\n class=\"form-select form-control\"\n >\n <option\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\n [ngValue]=\"option.value\"\n >\n {{ option.key }}\n </option>\n </select>\n </ng-template>\n\n <ng-template ngSwitchCase=\"multiselect\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <select\n #field\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n [abpDisabled]=\"disabled\"\n multiple=\"multiple\"\n class=\"form-select form-control\"\n >\n <option\n *ngFor=\"let option of options$ | async; trackBy: track.by('value')\"\n [ngValue]=\"option.value\"\n >\n {{ option.key }}\n </option>\n </select>\n </ng-template>\n\n <ng-template ngSwitchCase=\"typeahead\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\n <input\n #field\n [id]=\"prop.id\"\n [autocomplete]=\"prop.autocomplete\"\n [abpDisabled]=\"disabled\"\n [ngbTypeahead]=\"search\"\n [editable]=\"false\"\n [inputFormatter]=\"typeaheadFormatter\"\n [resultFormatter]=\"typeaheadFormatter\"\n [ngModelOptions]=\"{ standalone: true }\"\n [(ngModel)]=\"typeaheadModel\"\n (selectItem)=\"setTypeaheadValue($event.item)\"\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\n class=\"form-control\"\n />\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\n </div>\n </ng-template>\n\n <ng-template ngSwitchCase=\"date\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <input\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n (click)=\"datepicker.open()\"\n (keyup.space)=\"datepicker.open()\"\n ngbDatepicker\n #datepicker=\"ngbDatepicker\"\n type=\"text\"\n class=\"form-control\"\n />\n </ng-template>\n\n <ng-template ngSwitchCase=\"time\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <ngb-timepicker [formControlName]=\"prop.name\"></ngb-timepicker>\n </ng-template>\n\n <ng-template ngSwitchCase=\"dateTime\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <abp-date-time-picker [prop]=\"prop\" [meridian]=\"meridian\"></abp-date-time-picker>\n </ng-template>\n\n <ng-template ngSwitchCase=\"textarea\">\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\n <textarea\n #field\n [id]=\"prop.id\"\n [formControlName]=\"prop.name\"\n [abpDisabled]=\"disabled\"\n [readonly]=\"readonly\"\n class=\"form-control\"\n ></textarea>\n </ng-template>\n</div>\n\n<ng-template #label let-classes>\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label'\"\n >{{ prop.displayName | abpLocalization }} {{ asterisk }}</label\n >\n</ng-template>\n", components: [{ type: i3.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }, { type: i4.DateTimePickerComponent, selector: "abp-date-time-picker", inputs: ["prop", "meridian"], exportAs: ["abpDateTimePicker"] }], directives: [{ type: i1.PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission"] }, { type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { 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]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { type: i7.DisabledDirective, selector: "[abpDisabled]", inputs: ["abpDisabled"] }, { type: i6.ValidationTargetDirective, selector: "[validationTarget]", exportAs: ["validationTarget"] }, { type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { type: i6.ValidationStyleDirective, selector: "[validationStyle]", exportAs: ["validationStyle"] }, { type: i3.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "placement", "container", "editable", "focusFirst", "showHint", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["disabled", "autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "async": i5.AsyncPipe, "abpLocalization": i1.LocalizationPipe }, viewProviders: [
127
+ {
128
+ provide: ControlContainer,
129
+ useFactory: selfFactory,
130
+ deps: [[new Optional(), new SkipSelf(), ControlContainer]],
131
+ },
132
+ { provide: NgbDateAdapter, useClass: DateAdapter },
133
+ { provide: NgbTimeAdapter, useClass: TimeAdapter },
134
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
135
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ExtensibleFormPropComponent, decorators: [{
136
+ type: Component,
137
+ args: [{
138
+ selector: 'abp-extensible-form-prop',
139
+ templateUrl: './extensible-form-prop.component.html',
140
+ changeDetection: ChangeDetectionStrategy.OnPush,
141
+ viewProviders: [
142
+ {
143
+ provide: ControlContainer,
144
+ useFactory: selfFactory,
145
+ deps: [[new Optional(), new SkipSelf(), ControlContainer]],
146
+ },
147
+ { provide: NgbDateAdapter, useClass: DateAdapter },
148
+ { provide: NgbTimeAdapter, useClass: TimeAdapter },
149
+ ],
150
+ }]
151
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.TrackByService }, { type: i1.ConfigStateService }, { type: i2.FormGroupDirective }]; }, propDecorators: { data: [{
152
+ type: Input
153
+ }], prop: [{
154
+ type: Input
155
+ }], first: [{
156
+ type: Input
157
+ }], fieldRef: [{
158
+ type: ViewChild,
159
+ args: ['field']
160
+ }] } });
161
+ function isRequired(validator) {
162
+ return validator === Validators.required || validator === AbpValidators.required;
163
+ }
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaWJsZS1mb3JtLXByb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdGhlbWUtc2hhcmVkL2V4dGVuc2lvbnMvc3JjL2xpYi9jb21wb25lbnRzL2V4dGVuc2libGUtZm9ybS9leHRlbnNpYmxlLWZvcm0tcHJvcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy90aGVtZS1zaGFyZWQvZXh0ZW5zaW9ucy9zcmMvbGliL2NvbXBvbmVudHMvZXh0ZW5zaWJsZS1mb3JtL2V4dGVuc2libGUtZm9ybS1wcm9wLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RGLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUVMLFFBQVEsRUFFUixRQUFRLEVBQ1IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsa0JBQWtCLEVBRWxCLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENB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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFCUCwgQWJwVmFsaWRhdG9ycywgQ29uZmlnU3RhdGVTZXJ2aWNlLCBUcmFja0J5U2VydmljZSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3B0aW9uYWwsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNraXBTZWxmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29udHJvbENvbnRhaW5lcixcbiAgRm9ybUdyb3VwLFxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ2JEYXRlQWRhcHRlciwgTmdiVGltZUFkYXB0ZXIgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9hZGFwdGVycy9kYXRlLmFkYXB0ZXInO1xuaW1wb3J0IHsgVGltZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9hZGFwdGVycy90aW1lLmFkYXB0ZXInO1xuaW1wb3J0IHsgRVhUUkFfUFJPUEVSVElFU19LRVkgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZXh0cmEtcHJvcGVydGllcyc7XG5pbXBvcnQgeyBlUHJvcFR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9wcm9wcy5lbnVtJztcbmltcG9ydCB7IEZvcm1Qcm9wIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Zvcm0tcHJvcHMnO1xuaW1wb3J0IHsgUHJvcERhdGEgfSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvcHMnO1xuaW1wb3J0IHsgc2VsZkZhY3RvcnkgfSBmcm9tICcuLi8uLi91dGlscy9mYWN0b3J5LnV0aWwnO1xuaW1wb3J0IHsgYWRkVHlwZWFoZWFkVGV4dFN1ZmZpeCB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVhaGVhZC51dGlsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWJwLWV4dGVuc2libGUtZm9ybS1wcm9wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2V4dGVuc2libGUtZm9ybS1wcm9wLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHZpZXdQcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLFxuICAgICAgdXNlRmFjdG9yeTogc2VsZkZhY3RvcnksXG4gICAgICBkZXBzOiBbW25ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKSwgQ29udHJvbENvbnRhaW5lcl1dLFxuICAgIH0sXG4gICAgeyBwcm92aWRlOiBOZ2JEYXRlQWRhcHRlciwgdXNlQ2xhc3M6IERhdGVBZGFwdGVyIH0sXG4gICAgeyBwcm92aWRlOiBOZ2JUaW1lQWRhcHRlciwgdXNlQ2xhc3M6IFRpbWVBZGFwdGVyIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEV4dGVuc2libGVGb3JtUHJvcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIGRhdGEhOiBQcm9wRGF0YTtcblxuICBASW5wdXQoKSBwcm9wITogRm9ybVByb3A7XG5cbiAgQElucHV0KCkgZmlyc3Q/OiBib29sZWFuO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpZWxkJykgcHJpdmF0ZSBmaWVsZFJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGFzdGVyaXNrID0gJyc7XG5cbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8QUJQLk9wdGlvbjxhbnk+W10+ID0gb2YoW10pO1xuXG4gIHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcblxuICByZWFkb25seSE6IGJvb2xlYW47XG5cbiAgZGlzYWJsZWQhOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybTogRm9ybUdyb3VwO1xuXG4gIHR5cGVhaGVhZE1vZGVsOiBhbnk7XG5cbiAgc2V0VHlwZWFoZWFkVmFsdWUoc2VsZWN0ZWRPcHRpb246IEFCUC5PcHRpb248c3RyaW5nPikge1xuICAgIHRoaXMudHlwZWFoZWFkTW9kZWwgPSBzZWxlY3RlZE9wdGlvbiB8fCB7IGtleTogbnVsbCwgdmFsdWU6IG51bGwgfTtcbiAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHRoaXMudHlwZWFoZWFkTW9kZWw7XG4gICAgY29uc3QgW2tleUNvbnRyb2wsIHZhbHVlQ29udHJvbF0gPSB0aGlzLmdldFR5cGVhaGVhZENvbnRyb2xzKCk7XG4gICAgaWYgKHZhbHVlQ29udHJvbD8udmFsdWUgJiYgIXZhbHVlKSB2YWx1ZUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICBrZXlDb250cm9sPy5zZXRWYWx1ZShrZXkpO1xuICAgIHZhbHVlQ29udHJvbD8uc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgc2VhcmNoID0gKHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4pID0+XG4gICAgdGV4dCRcbiAgICAgID8gdGV4dCQucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIHN3aXRjaE1hcCh0ZXh0ID0+IHRoaXMucHJvcC5vcHRpb25zKHRoaXMuZGF0YSwgdGV4dCkpLFxuICAgICAgICApXG4gICAgICA6IG9mKFtdKTtcblxuICB0eXBlYWhlYWRGb3JtYXR0ZXIgPSAob3B0aW9uOiBBQlAuT3B0aW9uPGFueT4pID0+IG9wdGlvbi5rZXk7XG5cbiAgZ2V0IG1lcmlkaWFuKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbmZpZ1N0YXRlLmdldERlZXAoJ2xvY2FsaXphdGlvbi5jdXJyZW50Q3VsdHVyZS5kYXRlVGltZUZvcm1hdC5zaG9ydFRpbWVQYXR0ZXJuJykgfHwgJydcbiAgICApLmluY2x1ZGVzKCd0dCcpO1xuICB9XG5cbiAgZ2V0IGlzSW52YWxpZCgpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLnByb3AubmFtZSk7XG4gICAgcmV0dXJuIGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmludmFsaWQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHB1YmxpYyByZWFkb25seSB0cmFjazogVHJhY2tCeVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNvbmZpZ1N0YXRlOiBDb25maWdTdGF0ZVNlcnZpY2UsXG4gICAgZ3JvdXBEaXJlY3RpdmU6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JtID0gZ3JvdXBEaXJlY3RpdmUuZm9ybTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHlwZWFoZWFkQ29udHJvbHMoKSB7XG4gICAgY29uc3QgeyBuYW1lIH0gPSB0aGlzLnByb3A7XG4gICAgY29uc3QgZXh0cmFQcm9wTmFtZSA9IGAke0VYVFJBX1BST1BFUlRJRVNfS0VZfS4ke25hbWV9YDtcbiAgICBjb25zdCBrZXlDb250cm9sID1cbiAgICAgIHRoaXMuZm9ybS5nZXQoYWRkVHlwZWFoZWFkVGV4dFN1ZmZpeChleHRyYVByb3BOYW1lKSkgfHxcbiAgICAgIHRoaXMuZm9ybS5nZXQoYWRkVHlwZWFoZWFkVGV4dFN1ZmZpeChuYW1lKSk7XG4gICAgY29uc3QgdmFsdWVDb250cm9sID0gdGhpcy5mb3JtLmdldChleHRyYVByb3BOYW1lKSB8fCB0aGlzLmZvcm0uZ2V0KG5hbWUpO1xuICAgIHJldHVybiBba2V5Q29udHJvbCwgdmFsdWVDb250cm9sXTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QXN0ZXJpc2soKSB7XG4gICAgdGhpcy5hc3RlcmlzayA9IHRoaXMudmFsaWRhdG9ycy5zb21lKGlzUmVxdWlyZWQpID8gJyonIDogJyc7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuZmlyc3QgJiYgdGhpcy5maWVsZFJlZikge1xuICAgICAgdGhpcy5maWVsZFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcG9uZW50KHByb3A6IEZvcm1Qcm9wKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgICAgY2FzZSBlUHJvcFR5cGUuQm9vbGVhbjpcbiAgICAgICAgcmV0dXJuICdjaGVja2JveCc7XG4gICAgICBjYXNlIGVQcm9wVHlwZS5EYXRlOlxuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgY2FzZSBlUHJvcFR5cGUuRGF0ZVRpbWU6XG4gICAgICAgIHJldHVybiAnZGF0ZVRpbWUnO1xuICAgICAgY2FzZSBlUHJvcFR5cGUuSGlkZGVuOlxuICAgICAgICByZXR1cm4gJ2hpZGRlbic7XG4gICAgICBjYXNlIGVQcm9wVHlwZS5NdWx0aVNlbGVjdDpcbiAgICAgICAgcmV0dXJuICdtdWx0aXNlbGVjdCc7XG4gICAgICBjYXNlIGVQcm9wVHlwZS5UZXh0OlxuICAgICAgICByZXR1cm4gJ3RleHRhcmVhJztcbiAgICAgIGNhc2UgZVByb3BUeXBlLlRpbWU6XG4gICAgICAgIHJldHVybiAndGltZSc7XG4gICAgICBjYXNlIGVQcm9wVHlwZS5UeXBlYWhlYWQ6XG4gICAgICAgIHJldHVybiAndHlwZWFoZWFkJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwcm9wLm9wdGlvbnMgPyAnc2VsZWN0JyA6ICdpbnB1dCc7XG4gICAgfVxuICB9XG5cbiAgZ2V0VHlwZShwcm9wOiBGb3JtUHJvcCk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgZVByb3BUeXBlLkRhdGU6XG4gICAgICBjYXNlIGVQcm9wVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICBjYXNlIGVQcm9wVHlwZS5Cb29sZWFuOlxuICAgICAgICByZXR1cm4gJ2NoZWNrYm94JztcbiAgICAgIGNhc2UgZVByb3BUeXBlLk51bWJlcjpcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgICAgY2FzZSBlUHJvcFR5cGUuRW1haWw6XG4gICAgICAgIHJldHVybiAnZW1haWwnO1xuICAgICAgY2FzZSBlUHJvcFR5cGUuUGFzc3dvcmQ6XG4gICAgICAgIHJldHVybiAncGFzc3dvcmQnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdoaWRkZW4nO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKHsgcHJvcCB9OiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgY3VycmVudFByb3AgPSBwcm9wPy5jdXJyZW50VmFsdWU7XG4gICAgY29uc3QgeyBvcHRpb25zLCByZWFkb25seSwgZGlzYWJsZWQsIHZhbGlkYXRvcnMgfSA9IGN1cnJlbnRQcm9wIHx8IHt9O1xuXG4gICAgaWYgKG9wdGlvbnMpIHRoaXMub3B0aW9ucyQgPSBvcHRpb25zKHRoaXMuZGF0YSk7XG4gICAgaWYgKHJlYWRvbmx5KSB0aGlzLnJlYWRvbmx5ID0gcmVhZG9ubHkodGhpcy5kYXRhKTtcbiAgICBpZiAoZGlzYWJsZWQpIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZCh0aGlzLmRhdGEpO1xuICAgIGlmICh2YWxpZGF0b3JzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzKHRoaXMuZGF0YSk7XG4gICAgICB0aGlzLnNldEFzdGVyaXNrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgW2tleUNvbnRyb2wsIHZhbHVlQ29udHJvbF0gPSB0aGlzLmdldFR5cGVhaGVhZENvbnRyb2xzKCk7XG4gICAgaWYgKGtleUNvbnRyb2wgJiYgdmFsdWVDb250cm9sKVxuICAgICAgdGhpcy50eXBlYWhlYWRNb2RlbCA9IHsga2V5OiBrZXlDb250cm9sLnZhbHVlLCB2YWx1ZTogdmFsdWVDb250cm9sLnZhbHVlIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNSZXF1aXJlZCh2YWxpZGF0b3I6IFZhbGlkYXRvckZuKSB7XG4gIHJldHVybiB2YWxpZGF0b3IgPT09IFZhbGlkYXRvcnMucmVxdWlyZWQgfHwgdmFsaWRhdG9yID09PSBBYnBWYWxpZGF0b3JzLnJlcXVpcmVkO1xufVxuIiwiPGRpdiBjbGFzcz1cIm1iLTMgZm9ybS1ncm91cFwiICphYnBQZXJtaXNzaW9uPVwicHJvcC5wZXJtaXNzaW9uXCIgW25nU3dpdGNoXT1cImdldENvbXBvbmVudChwcm9wKVwiPlxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiaW5wdXRcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDxpbnB1dFxuICAgICAgI2ZpZWxkXG4gICAgICBbaWRdPVwicHJvcC5pZFwiXG4gICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3AubmFtZVwiXG4gICAgICBbYXV0b2NvbXBsZXRlXT1cInByb3AuYXV0b2NvbXBsZXRlXCJcbiAgICAgIFt0eXBlXT1cImdldFR5cGUocHJvcClcIlxuICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgLz5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiaGlkZGVuXCI+XG4gICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCIgdHlwZT1cImhpZGRlblwiIC8+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlIG5nU3dpdGNoQ2FzZT1cImNoZWNrYm94XCI+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiB2YWxpZGF0aW9uVGFyZ2V0PlxuICAgICAgPGlucHV0XG4gICAgICAgICNmaWVsZFxuICAgICAgICBbaWRdPVwicHJvcC5pZFwiXG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCJcbiAgICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcbiAgICAgIC8+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6ICdmb3JtLWNoZWNrLWxhYmVsJyB9XCJcbiAgICAgID48L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJzZWxlY3RcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDxzZWxlY3RcbiAgICAgICNmaWVsZFxuICAgICAgW2lkXT1cInByb3AuaWRcIlxuICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIlxuICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1jb250cm9sXCJcbiAgICA+XG4gICAgICA8b3B0aW9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9ucyQgfCBhc3luYzsgdHJhY2tCeTogdHJhY2suYnkoJ3ZhbHVlJylcIlxuICAgICAgICBbbmdWYWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgICAgPlxuICAgICAgICB7eyBvcHRpb24ua2V5IH19XG4gICAgICA8L29wdGlvbj5cbiAgICA8L3NlbGVjdD5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwibXVsdGlzZWxlY3RcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDxzZWxlY3RcbiAgICAgICNmaWVsZFxuICAgICAgW2lkXT1cInByb3AuaWRcIlxuICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIlxuICAgICAgW2FicERpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIG11bHRpcGxlPVwibXVsdGlwbGVcIlxuICAgICAgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLWNvbnRyb2xcIlxuICAgID5cbiAgICAgIDxvcHRpb25cbiAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zJCB8IGFzeW5jOyB0cmFja0J5OiB0cmFjay5ieSgndmFsdWUnKVwiXG4gICAgICAgIFtuZ1ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICA+XG4gICAgICAgIHt7IG9wdGlvbi5rZXkgfX1cbiAgICAgIDwvb3B0aW9uPlxuICAgIDwvc2VsZWN0PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBuZ1N3aXRjaENhc2U9XCJ0eXBlYWhlYWRcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDxkaXYgI3R5cGVhaGVhZCBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgdmFsaWRhdGlvblN0eWxlIHZhbGlkYXRpb25UYXJnZXQ+XG4gICAgICA8aW5wdXRcbiAgICAgICAgI2ZpZWxkXG4gICAgICAgIFtpZF09XCJwcm9wLmlkXCJcbiAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJwcm9wLmF1dG9jb21wbGV0ZVwiXG4gICAgICAgIFthYnBEaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtuZ2JUeXBlYWhlYWRdPVwic2VhcmNoXCJcbiAgICAgICAgW2VkaXRhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgW2lucHV0Rm9ybWF0dGVyXT1cInR5cGVhaGVhZEZvcm1hdHRlclwiXG4gICAgICAgIFtyZXN1bHRGb3JtYXR0ZXJdPVwidHlwZWFoZWFkRm9ybWF0dGVyXCJcbiAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJ0eXBlYWhlYWRNb2RlbFwiXG4gICAgICAgIChzZWxlY3RJdGVtKT1cInNldFR5cGVhaGVhZFZhbHVlKCRldmVudC5pdGVtKVwiXG4gICAgICAgIChibHVyKT1cInNldFR5cGVhaGVhZFZhbHVlKHR5cGVhaGVhZE1vZGVsKVwiXG4gICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInR5cGVhaGVhZC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWludmFsaWQnKVwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgIC8+XG4gICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wLm5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiZGF0ZVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiPjwvbmctdGVtcGxhdGU+XG4gICAgPGlucHV0XG4gICAgICBbaWRdPVwicHJvcC5pZFwiXG4gICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3AubmFtZVwiXG4gICAgICAoY2xpY2spPVwiZGF0ZXBpY2tlci5vcGVuKClcIlxuICAgICAgKGtleXVwLnNwYWNlKT1cImRhdGVwaWNrZXIub3BlbigpXCJcbiAgICAgIG5nYkRhdGVwaWNrZXJcbiAgICAgICNkYXRlcGlja2VyPVwibmdiRGF0ZXBpY2tlclwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgLz5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwidGltZVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFwiPjwvbmctdGVtcGxhdGU+XG4gICAgPG5nYi10aW1lcGlja2VyIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcC5uYW1lXCI+PC9uZ2ItdGltZXBpY2tlcj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwiZGF0ZVRpbWVcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDxhYnAtZGF0ZS10aW1lLXBpY2tlciBbcHJvcF09XCJwcm9wXCIgW21lcmlkaWFuXT1cIm1lcmlkaWFuXCI+PC9hYnAtZGF0ZS10aW1lLXBpY2tlcj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgbmdTd2l0Y2hDYXNlPVwidGV4dGFyZWFcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDx0ZXh0YXJlYVxuICAgICAgI2ZpZWxkXG4gICAgICBbaWRdPVwicHJvcC5pZFwiXG4gICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3AubmFtZVwiXG4gICAgICBbYWJwRGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICA+PC90ZXh0YXJlYT5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2xhYmVsIGxldC1jbGFzc2VzPlxuICA8bGFiZWwgW2h0bWxGb3JdPVwicHJvcC5pZFwiIFtuZ0NsYXNzXT1cImNsYXNzZXMgfHwgJ2Zvcm0tbGFiZWwnXCJcbiAgICA+e3sgcHJvcC5kaXNwbGF5TmFtZSB8IGFicExvY2FsaXphdGlvbiB9fSB7eyBhc3RlcmlzayB9fTwvbGFiZWxcbiAgPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==