ngx-dynamic-entity 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +15 -1
  2. package/fesm2022/ngx-dynamic-entity.mjs +512 -161
  3. package/fesm2022/ngx-dynamic-entity.mjs.map +1 -1
  4. package/package.json +6 -7
  5. package/types/ngx-dynamic-entity.d.ts +1719 -0
  6. package/esm2022/lib/field-types/array-field.component.mjs +0 -168
  7. package/esm2022/lib/field-types/boolean-field.component.mjs +0 -101
  8. package/esm2022/lib/field-types/checkbox-field.component.mjs +0 -82
  9. package/esm2022/lib/field-types/currency-field.component.mjs +0 -102
  10. package/esm2022/lib/field-types/date-field.component.mjs +0 -91
  11. package/esm2022/lib/field-types/dropdown-field.component.mjs +0 -176
  12. package/esm2022/lib/field-types/email-field.component.mjs +0 -102
  13. package/esm2022/lib/field-types/entity-ref-field.component.mjs +0 -195
  14. package/esm2022/lib/field-types/field-component.contract.mjs +0 -2
  15. package/esm2022/lib/field-types/file-field.component.mjs +0 -157
  16. package/esm2022/lib/field-types/group-field.component.mjs +0 -89
  17. package/esm2022/lib/field-types/image-field.component.mjs +0 -169
  18. package/esm2022/lib/field-types/month-year-field.component.mjs +0 -152
  19. package/esm2022/lib/field-types/multi-select-field.component.mjs +0 -146
  20. package/esm2022/lib/field-types/number-field.component.mjs +0 -112
  21. package/esm2022/lib/field-types/password-field.component.mjs +0 -110
  22. package/esm2022/lib/field-types/radio-field.component.mjs +0 -153
  23. package/esm2022/lib/field-types/text-field.component.mjs +0 -121
  24. package/esm2022/lib/field-types/textarea-field.component.mjs +0 -85
  25. package/esm2022/lib/form/dynamic-field/dynamic-field.component.mjs +0 -151
  26. package/esm2022/lib/form/dynamic-form.component.mjs +0 -890
  27. package/esm2022/lib/form/dynamic-record-form.component.mjs +0 -494
  28. package/esm2022/lib/providers/provide-field-types.mjs +0 -72
  29. package/esm2022/lib/providers/provide-ngx-dynamic-entity.mjs +0 -27
  30. package/esm2022/lib/services/cascade-data.service.mjs +0 -129
  31. package/esm2022/lib/services/config-source.service.mjs +0 -67
  32. package/esm2022/lib/services/entity-ref-cache.mjs +0 -20
  33. package/esm2022/lib/services/entity-ref-registry.service.mjs +0 -31
  34. package/esm2022/lib/services/entity-ref-selection.service.mjs +0 -27
  35. package/esm2022/lib/services/entity-reference.service.mjs +0 -168
  36. package/esm2022/lib/services/field-registry.service.mjs +0 -55
  37. package/esm2022/lib/services/file-upload.service.mjs +0 -89
  38. package/esm2022/lib/services/hook-registry.service.mjs +0 -26
  39. package/esm2022/lib/services/lookup-registry.service.mjs +0 -246
  40. package/esm2022/lib/services/rbac.service.mjs +0 -46
  41. package/esm2022/lib/services/rules-evaluation.service.mjs +0 -27
  42. package/esm2022/lib/services/validation-messages.service.mjs +0 -56
  43. package/esm2022/lib/services/validator-registry.service.mjs +0 -99
  44. package/esm2022/lib/tokens/injection-tokens.mjs +0 -126
  45. package/esm2022/ngx-dynamic-entity.mjs +0 -5
  46. package/esm2022/public-api.mjs +0 -56
  47. package/index.d.ts +0 -5
  48. package/lib/field-types/array-field.component.d.ts +0 -28
  49. package/lib/field-types/boolean-field.component.d.ts +0 -18
  50. package/lib/field-types/checkbox-field.component.d.ts +0 -13
  51. package/lib/field-types/currency-field.component.d.ts +0 -17
  52. package/lib/field-types/date-field.component.d.ts +0 -15
  53. package/lib/field-types/dropdown-field.component.d.ts +0 -34
  54. package/lib/field-types/email-field.component.d.ts +0 -15
  55. package/lib/field-types/entity-ref-field.component.d.ts +0 -49
  56. package/lib/field-types/field-component.contract.d.ts +0 -49
  57. package/lib/field-types/file-field.component.d.ts +0 -25
  58. package/lib/field-types/group-field.component.d.ts +0 -17
  59. package/lib/field-types/image-field.component.d.ts +0 -30
  60. package/lib/field-types/month-year-field.component.d.ts +0 -28
  61. package/lib/field-types/multi-select-field.component.d.ts +0 -27
  62. package/lib/field-types/number-field.component.d.ts +0 -16
  63. package/lib/field-types/password-field.component.d.ts +0 -17
  64. package/lib/field-types/radio-field.component.d.ts +0 -33
  65. package/lib/field-types/text-field.component.d.ts +0 -23
  66. package/lib/field-types/textarea-field.component.d.ts +0 -14
  67. package/lib/form/dynamic-field/dynamic-field.component.d.ts +0 -78
  68. package/lib/form/dynamic-form.component.d.ts +0 -291
  69. package/lib/form/dynamic-record-form.component.d.ts +0 -180
  70. package/lib/providers/provide-field-types.d.ts +0 -24
  71. package/lib/providers/provide-ngx-dynamic-entity.d.ts +0 -56
  72. package/lib/services/cascade-data.service.d.ts +0 -45
  73. package/lib/services/config-source.service.d.ts +0 -14
  74. package/lib/services/entity-ref-cache.d.ts +0 -27
  75. package/lib/services/entity-ref-registry.service.d.ts +0 -21
  76. package/lib/services/entity-ref-selection.service.d.ts +0 -24
  77. package/lib/services/entity-reference.service.d.ts +0 -49
  78. package/lib/services/field-registry.service.d.ts +0 -32
  79. package/lib/services/file-upload.service.d.ts +0 -27
  80. package/lib/services/hook-registry.service.d.ts +0 -12
  81. package/lib/services/lookup-registry.service.d.ts +0 -94
  82. package/lib/services/rbac.service.d.ts +0 -27
  83. package/lib/services/rules-evaluation.service.d.ts +0 -17
  84. package/lib/services/validation-messages.service.d.ts +0 -43
  85. package/lib/services/validator-registry.service.d.ts +0 -32
  86. package/lib/tokens/injection-tokens.d.ts +0 -134
  87. package/public-api.d.ts +0 -40
@@ -1,176 +0,0 @@
1
- import { Component, Input, inject, signal, ChangeDetectionStrategy } from '@angular/core';
2
- import { ReactiveFormsModule } from '@angular/forms';
3
- import { getOptionStoredValue, resolveLabel, resolveOptionLabel, valuesMatch, } from '@dynamic-entity/core';
4
- import { LookupRegistryService, refreshChoiceOptions } from '../services/lookup-registry.service';
5
- import { ValidationMessagesService } from '../services/validation-messages.service';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/forms";
8
- export class DropdownFieldComponent {
9
- lookups = inject(LookupRegistryService);
10
- messages = inject(ValidationMessagesService);
11
- _field;
12
- _language = 'en';
13
- /** Setter-based so options resolve however the input is set — see `refreshChoiceOptions`. */
14
- set field(value) {
15
- this._field = value;
16
- refreshChoiceOptions(this, this.lookups);
17
- }
18
- get field() {
19
- return this._field;
20
- }
21
- set language(value) {
22
- this._language = value || 'en';
23
- refreshChoiceOptions(this, this.lookups);
24
- }
25
- get language() {
26
- return this._language;
27
- }
28
- control;
29
- readonly = false;
30
- masked = false;
31
- /** Inline `options`, or the field's named list resolved through the registry (§6.3). */
32
- options = signal([]);
33
- compareFn = (o1, o2) => valuesMatch(o1, o2, this.language);
34
- isObjectVal(option) {
35
- const val = getOptionStoredValue(option);
36
- return typeof val === 'object' && val !== null;
37
- }
38
- get label() {
39
- return resolveLabel(this.field?.label, this.language);
40
- }
41
- get placeholder() {
42
- return resolveLabel(this.field?.placeholder, this.language);
43
- }
44
- getOptStoredVal(option) {
45
- return getOptionStoredValue(option);
46
- }
47
- getOptLabel(option) {
48
- return resolveOptionLabel(option, this.language);
49
- }
50
- /**
51
- * Read-only display. Never awaits (§6.2): a warm list resolves the label, a cold one falls
52
- * back to the stored text — which under the §2 contract *is* the display value, so it is
53
- * never wrong, only unlocalised.
54
- */
55
- getLabel(value) {
56
- if (value == null || value === '')
57
- return '—';
58
- const option = this.options().find(o => valuesMatch(getOptionStoredValue(o), value, this.language));
59
- if (option)
60
- return this.getOptLabel(option);
61
- const cached = this.lookups.labelFor(this.field?.listName, value, this.language);
62
- if (cached)
63
- return cached;
64
- return typeof value === 'object' ? resolveLabel(value, this.language) : (value ?? '—');
65
- }
66
- get errorMessage() {
67
- if (!this.control || !this.control.errors || !this.control.touched)
68
- return '';
69
- // `requiredSelection` rather than `required`: "Please select an option" reads better on a
70
- // dropdown than "This field is required", and both stay independently overridable.
71
- return this.messages.resolve(this.control.errors, this.language, [['required', 'requiredSelection']], 'invalidSelection');
72
- }
73
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DropdownFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
74
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DropdownFieldComponent, isStandalone: true, selector: "ngx-dropdown-field", inputs: { field: "field", language: "language", control: "control", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
75
- <div
76
- class="ngx-field ngx-field--dropdown"
77
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type"
78
- [class.ngx-field--readonly]="readonly"
79
- [class.ngx-field--masked]="masked"
80
- [class.ngx-field--invalid]="control && control.invalid && control.touched"
81
- >
82
- <label class="ngx-field__label" [attr.for]="field.id">
83
- {{ label }}
84
- @if (field.validators?.required) { <span class="ngx-field__req">*</span> }
85
- </label>
86
- @if (masked) {
87
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
88
- } @else if (readonly) {
89
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ getLabel(control.value) }}</span>
90
- } @else {
91
- <select
92
- [id]="field.id"
93
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
94
- [formControl]="$any(control)"
95
- [compareWith]="compareFn"
96
- [attr.disabled]="field.disabled ? true : null"
97
- [attr.aria-invalid]="control.invalid && control.touched"
98
- [attr.aria-describedby]="errorMessage ? field.id + '-error' : null"
99
- >
100
- <option [value]="''">{{ placeholder || 'Select...' }}</option>
101
- @for (option of options(); track getOptLabel(option)) {
102
- @if (isObjectVal(option)) {
103
- <option [ngValue]="getOptStoredVal(option)">{{ getOptLabel(option) }}</option>
104
- } @else {
105
- <option [value]="getOptStoredVal(option)">{{ getOptLabel(option) }}</option>
106
- }
107
- }
108
- </select>
109
- @if (errorMessage) {
110
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'" [id]="field.id + '-error'" role="alert">{{ errorMessage }}</span>
111
- }
112
- }
113
- </div>
114
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
115
- }
116
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DropdownFieldComponent, decorators: [{
117
- type: Component,
118
- args: [{
119
- changeDetection: ChangeDetectionStrategy.OnPush,
120
- selector: 'ngx-dropdown-field',
121
- standalone: true,
122
- imports: [ReactiveFormsModule],
123
- template: `
124
- <div
125
- class="ngx-field ngx-field--dropdown"
126
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type"
127
- [class.ngx-field--readonly]="readonly"
128
- [class.ngx-field--masked]="masked"
129
- [class.ngx-field--invalid]="control && control.invalid && control.touched"
130
- >
131
- <label class="ngx-field__label" [attr.for]="field.id">
132
- {{ label }}
133
- @if (field.validators?.required) { <span class="ngx-field__req">*</span> }
134
- </label>
135
- @if (masked) {
136
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
137
- } @else if (readonly) {
138
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ getLabel(control.value) }}</span>
139
- } @else {
140
- <select
141
- [id]="field.id"
142
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
143
- [formControl]="$any(control)"
144
- [compareWith]="compareFn"
145
- [attr.disabled]="field.disabled ? true : null"
146
- [attr.aria-invalid]="control.invalid && control.touched"
147
- [attr.aria-describedby]="errorMessage ? field.id + '-error' : null"
148
- >
149
- <option [value]="''">{{ placeholder || 'Select...' }}</option>
150
- @for (option of options(); track getOptLabel(option)) {
151
- @if (isObjectVal(option)) {
152
- <option [ngValue]="getOptStoredVal(option)">{{ getOptLabel(option) }}</option>
153
- } @else {
154
- <option [value]="getOptStoredVal(option)">{{ getOptLabel(option) }}</option>
155
- }
156
- }
157
- </select>
158
- @if (errorMessage) {
159
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'" [id]="field.id + '-error'" role="alert">{{ errorMessage }}</span>
160
- }
161
- }
162
- </div>
163
- `,
164
- }]
165
- }], propDecorators: { field: [{
166
- type: Input
167
- }], language: [{
168
- type: Input
169
- }], control: [{
170
- type: Input
171
- }], readonly: [{
172
- type: Input
173
- }], masked: [{
174
- type: Input
175
- }] } });
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9kcm9wZG93bi1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQW1CLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLFdBQVcsR0FDWixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7QUFpRHBGLE1BQU0sT0FBTyxzQkFBc0I7SUFDaEIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLFFBQVEsR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUV0RCxNQUFNLENBQXFCO0lBQzNCLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFFekIsNkZBQTZGO0lBQzdGLElBQWEsS0FBSyxDQUFDLEtBQXdCO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLG9CQUFvQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBYSxRQUFRLENBQUMsS0FBYTtRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUM7UUFDL0Is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TEExQ3ZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NULDJEQXpDUyxtQkFBbUI7OzRGQTJDbEIsc0JBQXNCO2tCQS9DbEMsU0FBUzttQkFBQztvQkFDVCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO29CQUM5QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q1Q7aUJBQ0Y7OEJBU2MsS0FBSztzQkFBakIsS0FBSztnQkFRTyxRQUFRO3NCQUFwQixLQUFLO2dCQVFHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIGluamVjdCwgc2lnbmFsLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHR5cGUgeyBEcm9wZG93bk9wdGlvbiwgTmVzdGVkRmllbGRDb25maWcgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQge1xuICBnZXRPcHRpb25TdG9yZWRWYWx1ZSxcbiAgcmVzb2x2ZUxhYmVsLFxuICByZXNvbHZlT3B0aW9uTGFiZWwsXG4gIHZhbHVlc01hdGNoLFxufSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBMb29rdXBSZWdpc3RyeVNlcnZpY2UsIHJlZnJlc2hDaG9pY2VPcHRpb25zIH0gZnJvbSAnLi4vc2VydmljZXMvbG9va3VwLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24tbWVzc2FnZXMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc2VsZWN0b3I6ICduZ3gtZHJvcGRvd24tZmllbGQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJuZ3gtZmllbGQgbmd4LWZpZWxkLS1kcm9wZG93blwiXG4gICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkXCIgW2F0dHIuZGF0YS1maWVsZC10eXBlXT1cImZpZWxkLnR5cGVcIlxuICAgICAgW2NsYXNzLm5neC1maWVsZC0tcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgW2NsYXNzLm5neC1maWVsZC0tbWFza2VkXT1cIm1hc2tlZFwiXG4gICAgICBbY2xhc3Mubmd4LWZpZWxkLS1pbnZhbGlkXT1cImNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIGNvbnRyb2wudG91Y2hlZFwiXG4gICAgPlxuICAgICAgPGxhYmVsIGNsYXNzPVwibmd4LWZpZWxkX19sYWJlbFwiIFthdHRyLmZvcl09XCJmaWVsZC5pZFwiPlxuICAgICAgICB7eyBsYWJlbCB9fVxuICAgICAgICBAaWYgKGZpZWxkLnZhbGlkYXRvcnM/LnJlcXVpcmVkKSB7IDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX19yZXFcIj4qPC9zcGFuPiB9XG4gICAgICA8L2xhYmVsPlxuICAgICAgQGlmIChtYXNrZWQpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX3ZhbHVlIG5neC1maWVsZF9fdmFsdWUtLW1hc2tlZFwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLW1hc2tlZCdcIj5YWFhYWFhYWFg8L3NwYW4+XG4gICAgICB9IEBlbHNlIGlmIChyZWFkb25seSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fdmFsdWVcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy12YWx1ZSdcIj57eyBnZXRMYWJlbChjb250cm9sLnZhbHVlKSB9fTwvc3Bhbj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgW2lkXT1cImZpZWxkLmlkXCJcbiAgICAgICAgICBjbGFzcz1cIm5neC1maWVsZF9faW5wdXRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1pbnB1dCdcIlxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCIkYW55KGNvbnRyb2wpXCJcbiAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiY29tcGFyZUZuXCJcbiAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiY29udHJvbC5pbnZhbGlkICYmIGNvbnRyb2wudG91Y2hlZFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJlcnJvck1lc3NhZ2UgPyBmaWVsZC5pZCArICctZXJyb3InIDogbnVsbFwiXG4gICAgICAgID5cbiAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCInJ1wiPnt7IHBsYWNlaG9sZGVyIHx8ICdTZWxlY3QuLi4nIH19PC9vcHRpb24+XG4gICAgICAgICAgQGZvciAob3B0aW9uIG9mIG9wdGlvbnMoKTsgdHJhY2sgZ2V0T3B0TGFiZWwob3B0aW9uKSkge1xuICAgICAgICAgICAgQGlmIChpc09iamVjdFZhbChvcHRpb24pKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiZ2V0T3B0U3RvcmVkVmFsKG9wdGlvbilcIj57eyBnZXRPcHRMYWJlbChvcHRpb24pIH19PC9vcHRpb24+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiZ2V0T3B0U3RvcmVkVmFsKG9wdGlvbilcIj57eyBnZXRPcHRMYWJlbChvcHRpb24pIH19PC9vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgQGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fZXJyb3JcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1lcnJvcidcIiBbaWRdPVwiZmllbGQuaWQgKyAnLWVycm9yJ1wiIHJvbGU9XCJhbGVydFwiPnt7IGVycm9yTWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wZG93bkZpZWxkQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb29rdXBzID0gaW5qZWN0KExvb2t1cFJlZ2lzdHJ5U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZXMgPSBpbmplY3QoVmFsaWRhdGlvbk1lc3NhZ2VzU2VydmljZSk7XG5cbiAgcHJpdmF0ZSBfZmllbGQhOiBOZXN0ZWRGaWVsZENvbmZpZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSAnZW4nO1xuXG4gIC8qKiBTZXR0ZXItYmFzZWQgc28gb3B0aW9ucyByZXNvbHZlIGhvd2V2ZXIgdGhlIGlucHV0IGlzIHNldCDigJQgc2VlIGByZWZyZXNoQ2hvaWNlT3B0aW9uc2AuICovXG4gIEBJbnB1dCgpIHNldCBmaWVsZCh2YWx1ZTogTmVzdGVkRmllbGRDb25maWcpIHtcbiAgICB0aGlzLl9maWVsZCA9IHZhbHVlO1xuICAgIHJlZnJlc2hDaG9pY2VPcHRpb25zKHRoaXMsIHRoaXMubG9va3Vwcyk7XG4gIH1cbiAgZ2V0IGZpZWxkKCk6IE5lc3RlZEZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGQ7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgbGFuZ3VhZ2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2xhbmd1YWdlID0gdmFsdWUgfHwgJ2VuJztcbiAgICByZWZyZXNoQ2hvaWNlT3B0aW9ucyh0aGlzLCB0aGlzLmxvb2t1cHMpO1xuICB9XG4gIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgfVxuXG4gIEBJbnB1dCgpIGNvbnRyb2whOiBBYnN0cmFjdENvbnRyb2w7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBJbmxpbmUgYG9wdGlvbnNgLCBvciB0aGUgZmllbGQncyBuYW1lZCBsaXN0IHJlc29sdmVkIHRocm91Z2ggdGhlIHJlZ2lzdHJ5ICjCpzYuMykuICovXG4gIHJlYWRvbmx5IG9wdGlvbnMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuXG4gIHJlYWRvbmx5IGNvbXBhcmVGbiA9IChvMTogYW55LCBvMjogYW55KTogYm9vbGVhbiA9PiB2YWx1ZXNNYXRjaChvMSwgbzIsIHRoaXMubGFuZ3VhZ2UpO1xuXG4gIGlzT2JqZWN0VmFsKG9wdGlvbjogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsID0gZ2V0T3B0aW9uU3RvcmVkVmFsdWUob3B0aW9uKTtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsO1xuICB9XG5cbiAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVMYWJlbCh0aGlzLmZpZWxkPy5sYWJlbCwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKHRoaXMuZmllbGQ/LnBsYWNlaG9sZGVyLCB0aGlzLmxhbmd1YWdlKTtcbiAgfVxuXG4gIGdldE9wdFN0b3JlZFZhbChvcHRpb246IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGdldE9wdGlvblN0b3JlZFZhbHVlKG9wdGlvbik7XG4gIH1cblxuICBnZXRPcHRMYWJlbChvcHRpb246IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVPcHRpb25MYWJlbChvcHRpb24sIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQtb25seSBkaXNwbGF5LiBOZXZlciBhd2FpdHMgKMKnNi4yKTogYSB3YXJtIGxpc3QgcmVzb2x2ZXMgdGhlIGxhYmVsLCBhIGNvbGQgb25lIGZhbGxzXG4gICAqIGJhY2sgdG8gdGhlIHN0b3JlZCB0ZXh0IOKAlCB3aGljaCB1bmRlciB0aGUgwqcyIGNvbnRyYWN0ICppcyogdGhlIGRpc3BsYXkgdmFsdWUsIHNvIGl0IGlzXG4gICAqIG5ldmVyIHdyb25nLCBvbmx5IHVubG9jYWxpc2VkLlxuICAgKi9cbiAgZ2V0TGFiZWwodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gJ+KAlCc7XG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zKCkuZmluZChvID0+IHZhbHVlc01hdGNoKGdldE9wdGlvblN0b3JlZFZhbHVlKG8pLCB2YWx1ZSwgdGhpcy5sYW5ndWFnZSkpO1xuICAgIGlmIChvcHRpb24pIHJldHVybiB0aGlzLmdldE9wdExhYmVsKG9wdGlvbik7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5sb29rdXBzLmxhYmVsRm9yKHRoaXMuZmllbGQ/Lmxpc3ROYW1lLCB2YWx1ZSwgdGhpcy5sYW5ndWFnZSk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHJlc29sdmVMYWJlbCh2YWx1ZSwgdGhpcy5sYW5ndWFnZSkgOiAodmFsdWUgPz8gJ+KAlCcpO1xuICB9XG5cbiAgZ2V0IGVycm9yTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb250cm9sIHx8ICF0aGlzLmNvbnRyb2wuZXJyb3JzIHx8ICF0aGlzLmNvbnRyb2wudG91Y2hlZCkgcmV0dXJuICcnO1xuICAgIC8vIGByZXF1aXJlZFNlbGVjdGlvbmAgcmF0aGVyIHRoYW4gYHJlcXVpcmVkYDogXCJQbGVhc2Ugc2VsZWN0IGFuIG9wdGlvblwiIHJlYWRzIGJldHRlciBvbiBhXG4gICAgLy8gZHJvcGRvd24gdGhhbiBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIiwgYW5kIGJvdGggc3RheSBpbmRlcGVuZGVudGx5IG92ZXJyaWRhYmxlLlxuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VzLnJlc29sdmUoXG4gICAgICB0aGlzLmNvbnRyb2wuZXJyb3JzLFxuICAgICAgdGhpcy5sYW5ndWFnZSxcbiAgICAgIFtbJ3JlcXVpcmVkJywgJ3JlcXVpcmVkU2VsZWN0aW9uJ11dLFxuICAgICAgJ2ludmFsaWRTZWxlY3Rpb24nLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -1,102 +0,0 @@
1
- import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
2
- import { ReactiveFormsModule } from '@angular/forms';
3
- import { resolveLabel } from '@dynamic-entity/core';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/forms";
6
- /** Email field: type="email" input with inline validation hint. */
7
- export class EmailFieldComponent {
8
- field;
9
- control;
10
- language = 'en';
11
- readonly = false;
12
- masked = false;
13
- get label() {
14
- return resolveLabel(this.field?.label, this.language);
15
- }
16
- get placeholder() {
17
- return resolveLabel(this.field?.placeholder, this.language);
18
- }
19
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EmailFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: EmailFieldComponent, isStandalone: true, selector: "ngx-email-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
21
- <div class="ngx-field ngx-field--email"
22
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
23
- <label class="ngx-field__label">{{ label }}</label>
24
- @if (masked) {
25
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
26
- } @else if (readonly) {
27
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">
28
- <a [href]="'mailto:' + control.value" class="ngx-field__email-link">{{ control.value || '—' }}</a>
29
- </span>
30
- } @else {
31
- <input
32
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
33
- type="email"
34
- autocomplete="email"
35
- [formControl]="$any(control)"
36
- [placeholder]="placeholder || 'you@example.com'"
37
- [attr.disabled]="field.disabled ? true : null"
38
- />
39
- @if (control.invalid && control.touched) {
40
- @if (control.errors?.['required']) {
41
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">Email is required</span>
42
- } @else if (control.errors?.['email']) {
43
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">Enter a valid email address</span>
44
- } @else {
45
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
46
- }
47
- }
48
- }
49
- </div>
50
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
51
- }
52
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EmailFieldComponent, decorators: [{
53
- type: Component,
54
- args: [{
55
- changeDetection: ChangeDetectionStrategy.OnPush,
56
- selector: 'ngx-email-field',
57
- standalone: true,
58
- imports: [ReactiveFormsModule],
59
- template: `
60
- <div class="ngx-field ngx-field--email"
61
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
62
- <label class="ngx-field__label">{{ label }}</label>
63
- @if (masked) {
64
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
65
- } @else if (readonly) {
66
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">
67
- <a [href]="'mailto:' + control.value" class="ngx-field__email-link">{{ control.value || '—' }}</a>
68
- </span>
69
- } @else {
70
- <input
71
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
72
- type="email"
73
- autocomplete="email"
74
- [formControl]="$any(control)"
75
- [placeholder]="placeholder || 'you@example.com'"
76
- [attr.disabled]="field.disabled ? true : null"
77
- />
78
- @if (control.invalid && control.touched) {
79
- @if (control.errors?.['required']) {
80
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">Email is required</span>
81
- } @else if (control.errors?.['email']) {
82
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">Enter a valid email address</span>
83
- } @else {
84
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
85
- }
86
- }
87
- }
88
- </div>
89
- `,
90
- }]
91
- }], propDecorators: { field: [{
92
- type: Input
93
- }], control: [{
94
- type: Input
95
- }], language: [{
96
- type: Input
97
- }], readonly: [{
98
- type: Input
99
- }], masked: [{
100
- type: Input
101
- }] } });
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9lbWFpbC1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFtQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRXBELG1FQUFtRTtBQXNDbkUsTUFBTSxPQUFPLG1CQUFtQjtJQUNyQixLQUFLLENBQXFCO0lBQzFCLE9BQU8sQ0FBbUI7SUFDMUIsUUFBUSxHQUFXLElBQUksQ0FBQztJQUN4QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLE1BQU0sR0FBWSxLQUFLLENBQUM7SUFFakMsSUFBSSxLQUFLO1FBQ1AsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUQsQ0FBQzt3R0FiVSxtQkFBbUI7NEZBQW5CLG1CQUFtQix5TEFoQ3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4QlQsMkRBL0JTLG1CQUFtQjs7NEZBaUNsQixtQkFBbUI7a0JBckMvQixTQUFTO21CQUFDO29CQUNULGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsbUJBQW1CLENBQUM7b0JBQzlCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJUO2lCQUNGOzhCQUVVLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IE5lc3RlZEZpZWxkQ29uZmlnIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZUxhYmVsIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuXG4vKiogRW1haWwgZmllbGQ6IHR5cGU9XCJlbWFpbFwiIGlucHV0IHdpdGggaW5saW5lIHZhbGlkYXRpb24gaGludC4gKi9cbkBDb21wb25lbnQoe1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc2VsZWN0b3I6ICduZ3gtZW1haWwtZmllbGQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cIm5neC1maWVsZCBuZ3gtZmllbGQtLWVtYWlsXCJcbiAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWRcIiBbYXR0ci5kYXRhLWZpZWxkLXR5cGVdPVwiZmllbGQudHlwZVwiIFtjbGFzcy5uZ3gtZmllbGQtLXJlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2NsYXNzLm5neC1maWVsZC0tbWFza2VkXT1cIm1hc2tlZFwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwibmd4LWZpZWxkX19sYWJlbFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgIEBpZiAobWFza2VkKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZSBuZ3gtZmllbGRfX3ZhbHVlLS1tYXNrZWRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1tYXNrZWQnXCI+WFhYWFhYWFhYPC9zcGFuPlxuICAgICAgfSBAZWxzZSBpZiAocmVhZG9ubHkpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX3ZhbHVlXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctdmFsdWUnXCI+XG4gICAgICAgICAgPGEgW2hyZWZdPVwiJ21haWx0bzonICsgY29udHJvbC52YWx1ZVwiIGNsYXNzPVwibmd4LWZpZWxkX19lbWFpbC1saW5rXCI+e3sgY29udHJvbC52YWx1ZSB8fCAn4oCUJyB9fTwvYT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGNsYXNzPVwibmd4LWZpZWxkX19pbnB1dFwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLWlucHV0J1wiXG4gICAgICAgICAgdHlwZT1cImVtYWlsXCJcbiAgICAgICAgICBhdXRvY29tcGxldGU9XCJlbWFpbFwiXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cIiRhbnkoY29udHJvbClcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCAneW91QGV4YW1wbGUuY29tJ1wiXG4gICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWQgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgIC8+XG4gICAgICAgIEBpZiAoY29udHJvbC5pbnZhbGlkICYmIGNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgICAgIEBpZiAoY29udHJvbC5lcnJvcnM/LlsncmVxdWlyZWQnXSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2Vycm9yXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctZXJyb3InXCI+RW1haWwgaXMgcmVxdWlyZWQ8L3NwYW4+XG4gICAgICAgICAgfSBAZWxzZSBpZiAoY29udHJvbC5lcnJvcnM/LlsnZW1haWwnXSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2Vycm9yXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctZXJyb3InXCI+RW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzPC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2Vycm9yXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctZXJyb3InXCI+VGhpcyBmaWVsZCBoYXMgYW4gZXJyb3I8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEVtYWlsRmllbGRDb21wb25lbnQge1xuICBASW5wdXQoKSBmaWVsZCE6IE5lc3RlZEZpZWxkQ29uZmlnO1xuICBASW5wdXQoKSBjb250cm9sITogQWJzdHJhY3RDb250cm9sO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nID0gJ2VuJztcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbWFza2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVMYWJlbCh0aGlzLmZpZWxkPy5sYWJlbCwgdGhpcy5sYW5ndWFnZSk7XG4gIH1cblxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKHRoaXMuZmllbGQ/LnBsYWNlaG9sZGVyLCB0aGlzLmxhbmd1YWdlKTtcbiAgfVxufVxuIl19
@@ -1,195 +0,0 @@
1
- import { Component, DestroyRef, Input, inject, signal, ChangeDetectionStrategy } from '@angular/core';
2
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
- import { ReactiveFormsModule } from '@angular/forms';
4
- import { resolveLabel } from '@dynamic-entity/core';
5
- import { CascadeDataService } from '../services/cascade-data.service';
6
- import { EntityRefSelectionService } from '../services/entity-ref-selection.service';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/forms";
9
- /**
10
- * EntityRefFieldComponent — a select populated from a consumer-registered loader.
11
- *
12
- * Cascades: when `entityReference.parentField` is set, the component watches that sibling
13
- * control (via `control.parent`) and reloads its own options on every parent change,
14
- * clearing a now-invalid selection. It publishes the picked record on
15
- * `EntityRefSelectionService` so the owning form can run `autoPatch`.
16
- */
17
- export class EntityRefFieldComponent {
18
- field;
19
- control;
20
- language = 'en';
21
- readonly = false;
22
- masked = false;
23
- cascade = inject(CascadeDataService);
24
- selectionBus = inject(EntityRefSelectionService);
25
- destroyRef = inject(DestroyRef);
26
- options = signal([]);
27
- loading = signal(false);
28
- /** True when this field cascades but its parent has no value yet. */
29
- awaitingParent = signal(false);
30
- get label() {
31
- return resolveLabel(this.field?.label, this.language);
32
- }
33
- get placeholder() {
34
- return resolveLabel(this.field?.placeholder, this.language);
35
- }
36
- get parentFieldId() {
37
- return this.field?.entityReference?.parentField;
38
- }
39
- ngOnInit() {
40
- if (this.masked)
41
- return;
42
- void this.reload();
43
- this.watchParent();
44
- this.control?.valueChanges
45
- .pipe(takeUntilDestroyed(this.destroyRef))
46
- .subscribe(value => this.publishSelection(String(value ?? '')));
47
- }
48
- /** Reload options against the parent's current value. */
49
- async reload() {
50
- const parentValue = this.parentValue();
51
- this.awaitingParent.set(!!this.parentFieldId && (parentValue === null || parentValue === undefined || parentValue === ''));
52
- if (!this.cascade.canLoad(this.field)) {
53
- this.options.set([]);
54
- return;
55
- }
56
- this.loading.set(true);
57
- try {
58
- this.options.set(await this.cascade.load(this.field, { parentValue, lang: this.language }));
59
- }
60
- finally {
61
- this.loading.set(false);
62
- }
63
- }
64
- /**
65
- * Publish the selected option so autoPatch can copy from its record.
66
- *
67
- * Driven from `valueChanges` rather than the select's `change` event: that event is the
68
- * same one the `formControl` directive listens to, so reading the control inside a
69
- * template `(change)` handler can see the previous value. `valueChanges` fires after the
70
- * model has updated — including Playwright `selectOption`, which updates the control
71
- * through the value accessor.
72
- */
73
- onSelectionChange(value) {
74
- this.publishSelection(value ?? String(this.control?.value ?? ''));
75
- }
76
- publishSelection(current) {
77
- const selected = this.options().find(o => String(o.value) === current);
78
- this.selectionBus.emit(this.field.id, selected ?? null);
79
- }
80
- getLabel(value) {
81
- const option = this.options().find(o => String(o.value) === String(value));
82
- return option?.label ?? (value ?? '—');
83
- }
84
- parentValue() {
85
- const parentId = this.parentFieldId;
86
- if (!parentId)
87
- return undefined;
88
- return this.control?.parent?.get(parentId)?.value;
89
- }
90
- /** Reload (and drop a stale selection) whenever the parent control changes. */
91
- watchParent() {
92
- const parentId = this.parentFieldId;
93
- if (!parentId)
94
- return;
95
- const parentControl = this.control?.parent?.get(parentId);
96
- if (!parentControl)
97
- return;
98
- parentControl.valueChanges
99
- .pipe(takeUntilDestroyed(this.destroyRef))
100
- .subscribe(() => {
101
- if (this.control.value) {
102
- this.control.setValue('', { emitEvent: false });
103
- this.selectionBus.emit(this.field.id, null);
104
- }
105
- void this.reload();
106
- });
107
- }
108
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EntityRefFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
109
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: EntityRefFieldComponent, isStandalone: true, selector: "ngx-entity-ref-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
110
- <div class="ngx-field ngx-field--entity-ref"
111
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
112
- <label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
113
- @if (masked) {
114
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
115
- } @else if (readonly) {
116
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ getLabel(control.value) }}</span>
117
- } @else {
118
- @if (loading()) {
119
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-loading'" role="status">Loading…</span>
120
- } @else {
121
- <select
122
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
123
- [id]="'field-' + field.id"
124
- [formControl]="$any(control)"
125
- [attr.disabled]="field.disabled ? true : null"
126
- >
127
- <option value="">{{ placeholder || 'Select...' }}</option>
128
- @for (option of options(); track option.value) {
129
- <option [value]="option.value">{{ option.label }}</option>
130
- }
131
- </select>
132
- @if (awaitingParent()) {
133
- <span class="ngx-field__hint" [attr.data-testid]="'field-' + field.id + '-hint'">Select {{ parentFieldId }} first.</span>
134
- }
135
- }
136
- @if (control.invalid && control.touched) {
137
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
138
- }
139
- }
140
- </div>
141
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
142
- }
143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EntityRefFieldComponent, decorators: [{
144
- type: Component,
145
- args: [{
146
- changeDetection: ChangeDetectionStrategy.OnPush,
147
- selector: 'ngx-entity-ref-field',
148
- standalone: true,
149
- imports: [ReactiveFormsModule],
150
- template: `
151
- <div class="ngx-field ngx-field--entity-ref"
152
- [attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
153
- <label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
154
- @if (masked) {
155
- <span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
156
- } @else if (readonly) {
157
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">{{ getLabel(control.value) }}</span>
158
- } @else {
159
- @if (loading()) {
160
- <span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-loading'" role="status">Loading…</span>
161
- } @else {
162
- <select
163
- class="ngx-field__input" [attr.data-testid]="'field-' + field.id + '-input'"
164
- [id]="'field-' + field.id"
165
- [formControl]="$any(control)"
166
- [attr.disabled]="field.disabled ? true : null"
167
- >
168
- <option value="">{{ placeholder || 'Select...' }}</option>
169
- @for (option of options(); track option.value) {
170
- <option [value]="option.value">{{ option.label }}</option>
171
- }
172
- </select>
173
- @if (awaitingParent()) {
174
- <span class="ngx-field__hint" [attr.data-testid]="'field-' + field.id + '-hint'">Select {{ parentFieldId }} first.</span>
175
- }
176
- }
177
- @if (control.invalid && control.touched) {
178
- <span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">This field has an error</span>
179
- }
180
- }
181
- </div>
182
- `,
183
- }]
184
- }], propDecorators: { field: [{
185
- type: Input
186
- }], control: [{
187
- type: Input
188
- }], language: [{
189
- type: Input
190
- }], readonly: [{
191
- type: Input
192
- }], masked: [{
193
- type: Input
194
- }] } });
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZi1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ZpZWxkLXR5cGVzL2VudGl0eS1yZWYtZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMENBQTBDLENBQUM7OztBQUVyRjs7Ozs7OztHQU9HO0FBd0NILE1BQU0sT0FBTyx1QkFBdUI7SUFDekIsS0FBSyxDQUFxQjtJQUMxQixPQUFPLENBQW1CO0lBQzFCLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDeEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLEdBQVksS0FBSyxDQUFDO0lBRWhCLE9BQU8sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxZQUFZLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDakQsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4QyxPQUFPLEdBQUcsTUFBTSxDQUFvQixFQUFFLENBQUMsQ0FBQztJQUN4QyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLHFFQUFxRTtJQUM1RCxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFD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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDVCwyREFqQ1MsbUJBQW1COzs0RkFtQ2xCLHVCQUF1QjtrQkF2Q25DLFNBQVM7bUJBQUM7b0JBQ1QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDOUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDVDtpQkFDRjs4QkFFVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIERlc3Ryb3lSZWYsIElucHV0LCBPbkluaXQsIGluamVjdCwgc2lnbmFsLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHR5cGUgeyBOZXN0ZWRGaWVsZENvbmZpZywgUmVmZXJlbmNlT3B0aW9uIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZUxhYmVsIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgQ2FzY2FkZURhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2FzY2FkZS1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW50aXR5UmVmU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2VudGl0eS1yZWYtc2VsZWN0aW9uLnNlcnZpY2UnO1xuXG4vKipcbiAqIEVudGl0eVJlZkZpZWxkQ29tcG9uZW50IOKAlCBhIHNlbGVjdCBwb3B1bGF0ZWQgZnJvbSBhIGNvbnN1bWVyLXJlZ2lzdGVyZWQgbG9hZGVyLlxuICpcbiAqIENhc2NhZGVzOiB3aGVuIGBlbnRpdHlSZWZlcmVuY2UucGFyZW50RmllbGRgIGlzIHNldCwgdGhlIGNvbXBvbmVudCB3YXRjaGVzIHRoYXQgc2libGluZ1xuICogY29udHJvbCAodmlhIGBjb250cm9sLnBhcmVudGApIGFuZCByZWxvYWRzIGl0cyBvd24gb3B0aW9ucyBvbiBldmVyeSBwYXJlbnQgY2hhbmdlLFxuICogY2xlYXJpbmcgYSBub3ctaW52YWxpZCBzZWxlY3Rpb24uIEl0IHB1Ymxpc2hlcyB0aGUgcGlja2VkIHJlY29yZCBvblxuICogYEVudGl0eVJlZlNlbGVjdGlvblNlcnZpY2VgIHNvIHRoZSBvd25pbmcgZm9ybSBjYW4gcnVuIGBhdXRvUGF0Y2hgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHNlbGVjdG9yOiAnbmd4LWVudGl0eS1yZWYtZmllbGQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cIm5neC1maWVsZCBuZ3gtZmllbGQtLWVudGl0eS1yZWZcIlxuICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZFwiIFthdHRyLmRhdGEtZmllbGQtdHlwZV09XCJmaWVsZC50eXBlXCIgW2NsYXNzLm5neC1maWVsZC0tcmVhZG9ubHldPVwicmVhZG9ubHlcIiBbY2xhc3Mubmd4LWZpZWxkLS1tYXNrZWRdPVwibWFza2VkXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtZmllbGRfX2xhYmVsXCIgW2F0dHIuZm9yXT1cIidmaWVsZC0nICsgZmllbGQuaWRcIj57eyBsYWJlbCB9fTwvbGFiZWw+XG4gICAgICBAaWYgKG1hc2tlZCkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fdmFsdWUgbmd4LWZpZWxkX192YWx1ZS0tbWFza2VkXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctbWFza2VkJ1wiPlhYWFhYWFhYWDwvc3Bhbj5cbiAgICAgIH0gQGVsc2UgaWYgKHJlYWRvbmx5KSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZVwiIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZC0nICsgZmllbGQuaWQgKyAnLXZhbHVlJ1wiPnt7IGdldExhYmVsKGNvbnRyb2wudmFsdWUpIH19PC9zcGFuPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX3ZhbHVlXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctbG9hZGluZydcIiByb2xlPVwic3RhdHVzXCI+TG9hZGluZ+KApjwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgY2xhc3M9XCJuZ3gtZmllbGRfX2lucHV0XCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctaW5wdXQnXCJcbiAgICAgICAgICAgIFtpZF09XCInZmllbGQtJyArIGZpZWxkLmlkXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCIkYW55KGNvbnRyb2wpXCJcbiAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj57eyBwbGFjZWhvbGRlciB8fCAnU2VsZWN0Li4uJyB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIG9wdGlvbnMoKTsgdHJhY2sgb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPnt7IG9wdGlvbi5sYWJlbCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIEBpZiAoYXdhaXRpbmdQYXJlbnQoKSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2hpbnRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1oaW50J1wiPlNlbGVjdCB7eyBwYXJlbnRGaWVsZElkIH19IGZpcnN0Ljwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChjb250cm9sLmludmFsaWQgJiYgY29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2Vycm9yXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctZXJyb3InXCI+VGhpcyBmaWVsZCBoYXMgYW4gZXJyb3I8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgRW50aXR5UmVmRmllbGRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBmaWVsZCE6IE5lc3RlZEZpZWxkQ29uZmlnO1xuICBASW5wdXQoKSBjb250cm9sITogQWJzdHJhY3RDb250cm9sO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nID0gJ2VuJztcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbWFza2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYXNjYWRlID0gaW5qZWN0KENhc2NhZGVEYXRhU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uQnVzID0gaW5qZWN0KEVudGl0eVJlZlNlbGVjdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcmVhZG9ubHkgb3B0aW9ucyA9IHNpZ25hbDxSZWZlcmVuY2VPcHRpb25bXT4oW10pO1xuICByZWFkb25seSBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgLyoqIFRydWUgd2hlbiB0aGlzIGZpZWxkIGNhc2NhZGVzIGJ1dCBpdHMgcGFyZW50IGhhcyBubyB2YWx1ZSB5ZXQuICovXG4gIHJlYWRvbmx5IGF3YWl0aW5nUGFyZW50ID0gc2lnbmFsKGZhbHNlKTtcblxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKHRoaXMuZmllbGQ/LmxhYmVsLCB0aGlzLmxhbmd1YWdlKTtcbiAgfVxuXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlTGFiZWwodGhpcy5maWVsZD8ucGxhY2Vob2xkZXIsIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAgZ2V0IHBhcmVudEZpZWxkSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZD8uZW50aXR5UmVmZXJlbmNlPy5wYXJlbnRGaWVsZDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hc2tlZCkgcmV0dXJuO1xuICAgIHZvaWQgdGhpcy5yZWxvYWQoKTtcbiAgICB0aGlzLndhdGNoUGFyZW50KCk7XG4gICAgdGhpcy5jb250cm9sPy52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLnB1Ymxpc2hTZWxlY3Rpb24oU3RyaW5nKHZhbHVlID8/ICcnKSkpO1xuICB9XG5cbiAgLyoqIFJlbG9hZCBvcHRpb25zIGFnYWluc3QgdGhlIHBhcmVudCdzIGN1cnJlbnQgdmFsdWUuICovXG4gIGFzeW5jIHJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJlbnRWYWx1ZSA9IHRoaXMucGFyZW50VmFsdWUoKTtcbiAgICB0aGlzLmF3YWl0aW5nUGFyZW50LnNldChcbiAgICAgICEhdGhpcy5wYXJlbnRGaWVsZElkICYmIChwYXJlbnRWYWx1ZSA9PT0gbnVsbCB8fCBwYXJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHBhcmVudFZhbHVlID09PSAnJyksXG4gICAgKTtcblxuICAgIGlmICghdGhpcy5jYXNjYWRlLmNhbkxvYWQodGhpcy5maWVsZCkpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5zZXQoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub3B0aW9ucy5zZXQoXG4gICAgICAgIGF3YWl0IHRoaXMuY2FzY2FkZS5sb2FkKHRoaXMuZmllbGQsIHsgcGFyZW50VmFsdWUsIGxhbmc6IHRoaXMubGFuZ3VhZ2UgfSksXG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCB0aGUgc2VsZWN0ZWQgb3B0aW9uIHNvIGF1dG9QYXRjaCBjYW4gY29weSBmcm9tIGl0cyByZWNvcmQuXG4gICAqXG4gICAqIERyaXZlbiBmcm9tIGB2YWx1ZUNoYW5nZXNgIHJhdGhlciB0aGFuIHRoZSBzZWxlY3QncyBgY2hhbmdlYCBldmVudDogdGhhdCBldmVudCBpcyB0aGVcbiAgICogc2FtZSBvbmUgdGhlIGBmb3JtQ29udHJvbGAgZGlyZWN0aXZlIGxpc3RlbnMgdG8sIHNvIHJlYWRpbmcgdGhlIGNvbnRyb2wgaW5zaWRlIGFcbiAgICogdGVtcGxhdGUgYChjaGFuZ2UpYCBoYW5kbGVyIGNhbiBzZWUgdGhlIHByZXZpb3VzIHZhbHVlLiBgdmFsdWVDaGFuZ2VzYCBmaXJlcyBhZnRlciB0aGVcbiAgICogbW9kZWwgaGFzIHVwZGF0ZWQg4oCUIGluY2x1ZGluZyBQbGF5d3JpZ2h0IGBzZWxlY3RPcHRpb25gLCB3aGljaCB1cGRhdGVzIHRoZSBjb250cm9sXG4gICAqIHRocm91Z2ggdGhlIHZhbHVlIGFjY2Vzc29yLlxuICAgKi9cbiAgb25TZWxlY3Rpb25DaGFuZ2UodmFsdWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnB1Ymxpc2hTZWxlY3Rpb24odmFsdWUgPz8gU3RyaW5nKHRoaXMuY29udHJvbD8udmFsdWUgPz8gJycpKTtcbiAgfVxuXG4gIHByaXZhdGUgcHVibGlzaFNlbGVjdGlvbihjdXJyZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMub3B0aW9ucygpLmZpbmQobyA9PiBTdHJpbmcoby52YWx1ZSkgPT09IGN1cnJlbnQpO1xuICAgIHRoaXMuc2VsZWN0aW9uQnVzLmVtaXQodGhpcy5maWVsZC5pZCwgc2VsZWN0ZWQgPz8gbnVsbCk7XG4gIH1cblxuICBnZXRMYWJlbCh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnMoKS5maW5kKG8gPT4gU3RyaW5nKG8udmFsdWUpID09PSBTdHJpbmcodmFsdWUpKTtcbiAgICByZXR1cm4gb3B0aW9uPy5sYWJlbCA/PyAodmFsdWUgPz8gJ+KAlCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJlbnRWYWx1ZSgpOiB1bmtub3duIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMucGFyZW50RmllbGRJZDtcbiAgICBpZiAoIXBhcmVudElkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2w/LnBhcmVudD8uZ2V0KHBhcmVudElkKT8udmFsdWU7XG4gIH1cblxuICAvKiogUmVsb2FkIChhbmQgZHJvcCBhIHN0YWxlIHNlbGVjdGlvbikgd2hlbmV2ZXIgdGhlIHBhcmVudCBjb250cm9sIGNoYW5nZXMuICovXG4gIHByaXZhdGUgd2F0Y2hQYXJlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLnBhcmVudEZpZWxkSWQ7XG4gICAgaWYgKCFwYXJlbnRJZCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhcmVudENvbnRyb2wgPSB0aGlzLmNvbnRyb2w/LnBhcmVudD8uZ2V0KHBhcmVudElkKTtcbiAgICBpZiAoIXBhcmVudENvbnRyb2wpIHJldHVybjtcblxuICAgIHBhcmVudENvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb25CdXMuZW1pdCh0aGlzLmZpZWxkLmlkLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB2b2lkIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtY29tcG9uZW50LmNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9maWVsZC1jb21wb25lbnQuY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHR5cGUgeyBOZXN0ZWRGaWVsZENvbmZpZyB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcblxuLyoqXG4gKiBXaGF0IGEgZmllbGQgY29tcG9uZW50IG11c3QgYWNjZXB0IHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBgcHJvdmlkZUZpZWxkVHlwZXNgLlxuICpcbiAqIFRoZSByZW5kZXJlciBpbnN0YW50aWF0ZXMgYSBmaWVsZCBjb21wb25lbnQgZHluYW1pY2FsbHkgYW5kIGFzc2lnbnMgZXhhY3RseSB0aGVzZSBmaXZlXG4gKiBpbnB1dHMg4oCUIG5vIG1vcmUsIG5vIGxlc3Mg4oCUIHNvIGFueSBjb21wb25lbnQgc2F0aXNmeWluZyB0aGlzIGludGVyZmFjZSBjYW4gc3RhbmQgaW4gZm9yIGFcbiAqIGJ1aWx0LWluIHR5cGUgb3IgYWRkIGEgbmV3IG9uZS5cbiAqXG4gKiBJbXBsZW1lbnQgaXQgZXhwbGljaXRseSBhbmQgVHlwZVNjcmlwdCB3aWxsIHRlbGwgeW91IHdoZW4geW91IGhhdmUgbWlzc2VkIG9uZTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAtc2lnbmF0dXJlLWZpZWxkJyxcbiAqICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAqICAgdGVtcGxhdGU6IGA8Y2FudmFzIFthdHRyLmFyaWEtbGFiZWxdPVwiZmllbGQuaWRcIj48L2NhbnZhcz5gLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBTaWduYXR1cmVGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIER5bmFtaWNGaWVsZENvbXBvbmVudENvbnRyYWN0IHtcbiAqICAgQElucHV0KCkgZmllbGQhOiBOZXN0ZWRGaWVsZENvbmZpZztcbiAqICAgQElucHV0KCkgY29udHJvbCE6IEFic3RyYWN0Q29udHJvbDtcbiAqICAgQElucHV0KCkgbGFuZ3VhZ2UgPSAnZW4nO1xuICogICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuICogICBASW5wdXQoKSBtYXNrZWQgPSBmYWxzZTtcbiAqIH1cbiAqXG4gKiBwcm92aWRlRmllbGRUeXBlcyh7IHNpZ25hdHVyZTogU2lnbmF0dXJlRmllbGRDb21wb25lbnQgfSk7XG4gKiBgYGBcbiAqXG4gKiBUd28gaW1wbGVtZW50YXRpb24gbm90ZXMgdGhhdCBhcmUgZWFzeSB0byBnZXQgd3Jvbmc6XG4gKlxuICogLSBEZWNsYXJlIHRoZSBpbnB1dHMgd2l0aCBkZWZpbml0ZSBhc3NpZ25tZW50IChgZmllbGQhOiDigKZgKSBvciBhbiBpbml0aWFsaXNlci4gVGhlXG4gKiAgIHJlbmRlcmVyIHNldHMgdGhlbSB0aHJvdWdoIGBDb21wb25lbnRSZWYuc2V0SW5wdXQoKWAgYWZ0ZXIgY29uc3RydWN0aW9uLCBzbyB0aGV5IGFyZVxuICogICBnZW51aW5lbHkgdW5kZWZpbmVkIHVudGlsIHRoZSBmaXJzdCBhc3NpZ25tZW50LlxuICogLSBgbWFza2VkYCBtZWFucyB0aGUgdmFsdWUgbXVzdCBub3QgYmUgZGlzcGxheWVkLiBSZW5kZXIgYSBwbGFjZWhvbGRlciByYXRoZXIgdGhhbiB0aGVcbiAqICAgY29udHJvbCdzIHZhbHVlLiBUaGlzIGlzIHByZXNlbnRhdGlvbmFsOiB0aGUgcmVhbCB2YWx1ZSBzdGF5cyBpbiB0aGUgY29udHJvbCBhbmQgaXNcbiAqICAgaW5jbHVkZWQgaW4gdGhlIHN1Ym1pdHRlZCByZWNvcmQsIHNvIGl0IGlzIG5vdCBhbiBhY2Nlc3MtY29udHJvbCBib3VuZGFyeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljRmllbGRDb21wb25lbnRDb250cmFjdCB7XG4gIC8qKiBUaGUgZmllbGQncyBzY2hlbWEgZW50cnk6IGlkLCB0eXBlLCBsYWJlbCwgdmFsaWRhdG9ycywgb3B0aW9ucywgYW5kIHNvIG9uLiAqL1xuICBmaWVsZDogTmVzdGVkRmllbGRDb25maWc7XG5cbiAgLyoqIFRoZSByZWFjdGl2ZSBjb250cm9sIGJhY2tpbmcgdGhpcyBmaWVsZC4gQSBgRm9ybUdyb3VwYCBmb3IgYGdyb3VwYCwgYEZvcm1BcnJheWAgZm9yIGBhcnJheWAuICovXG4gIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcblxuICAvKiogQWN0aXZlIGxhbmd1YWdlLCBmb3IgcmVzb2x2aW5nIGBMb2NhbGl6ZWRUZXh0YCBsYWJlbHMsIHBsYWNlaG9sZGVycyBhbmQgb3B0aW9ucy4gKi9cbiAgbGFuZ3VhZ2U6IHN0cmluZztcblxuICAvKiogUmVuZGVyIHRoZSB2YWx1ZSBhcyB0ZXh0IHJhdGhlciB0aGFuIGFuIGVkaXRhYmxlIGNvbnRyb2wuICovXG4gIHJlYWRvbmx5OiBib29sZWFuO1xuXG4gIC8qKiBIaWRlIHRoZSB2YWx1ZSBmcm9tIGRpc3BsYXkuIFNlZSB0aGUgbm90ZSBhYm92ZSDigJQgcHJlc2VudGF0aW9uYWwgb25seS4gKi9cbiAgbWFza2VkOiBib29sZWFuO1xufVxuIl19