ngx-dynamic-entity 1.0.0 → 1.1.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.
- package/README.md +129 -139
- package/esm2022/lib/field-types/array-field.component.mjs +101 -101
- package/esm2022/lib/field-types/boolean-field.component.mjs +59 -59
- package/esm2022/lib/field-types/checkbox-field.component.mjs +45 -45
- package/esm2022/lib/field-types/currency-field.component.mjs +51 -51
- package/esm2022/lib/field-types/date-field.component.mjs +43 -43
- package/esm2022/lib/field-types/dropdown-field.component.mjs +81 -81
- package/esm2022/lib/field-types/email-field.component.mjs +61 -61
- package/esm2022/lib/field-types/entity-ref-field.component.mjs +67 -67
- package/esm2022/lib/field-types/file-field.component.mjs +85 -85
- package/esm2022/lib/field-types/group-field.component.mjs +47 -47
- package/esm2022/lib/field-types/image-field.component.mjs +89 -89
- package/esm2022/lib/field-types/month-year-field.component.mjs +77 -77
- package/esm2022/lib/field-types/multi-select-field.component.mjs +63 -63
- package/esm2022/lib/field-types/number-field.component.mjs +65 -65
- package/esm2022/lib/field-types/password-field.component.mjs +65 -65
- package/esm2022/lib/field-types/radio-field.component.mjs +63 -63
- package/esm2022/lib/field-types/text-field.component.mjs +59 -59
- package/esm2022/lib/field-types/textarea-field.component.mjs +45 -45
- package/esm2022/lib/form/dynamic-field/dynamic-field.component.mjs +1 -1
- package/esm2022/lib/form/dynamic-form.component.mjs +183 -10
- package/esm2022/lib/form/dynamic-record-form.component.mjs +36 -11
- package/esm2022/lib/providers/provide-field-types.mjs +1 -1
- package/esm2022/lib/providers/provide-ngx-dynamic-entity.mjs +3 -2
- package/esm2022/lib/services/cascade-data.service.mjs +1 -1
- package/esm2022/lib/services/entity-ref-cache.mjs +1 -1
- package/esm2022/lib/services/entity-ref-registry.service.mjs +1 -1
- package/esm2022/lib/services/entity-ref-selection.service.mjs +1 -1
- package/esm2022/lib/services/entity-reference.service.mjs +1 -1
- package/esm2022/lib/services/field-registry.service.mjs +1 -1
- package/esm2022/lib/services/file-upload.service.mjs +1 -1
- package/esm2022/lib/services/rbac.service.mjs +1 -1
- package/esm2022/lib/services/validator-registry.service.mjs +12 -1
- package/esm2022/lib/tokens/injection-tokens.mjs +17 -1
- package/esm2022/public-api.mjs +18 -2
- package/fesm2022/ngx-dynamic-entity.mjs +1392 -1166
- package/fesm2022/ngx-dynamic-entity.mjs.map +1 -1
- package/lib/field-types/dropdown-field.component.d.ts +1 -1
- package/lib/field-types/entity-ref-field.component.d.ts +1 -1
- package/lib/field-types/multi-select-field.component.d.ts +1 -1
- package/lib/field-types/radio-field.component.d.ts +1 -1
- package/lib/form/dynamic-form.component.d.ts +93 -6
- package/lib/form/dynamic-record-form.component.d.ts +13 -2
- package/lib/providers/provide-ngx-dynamic-entity.d.ts +8 -2
- package/lib/tokens/injection-tokens.d.ts +24 -2
- package/package.json +17 -18
- package/public-api.d.ts +10 -0
|
@@ -48,48 +48,48 @@ export class FileFieldComponent {
|
|
|
48
48
|
this.control.markAsTouched();
|
|
49
49
|
}
|
|
50
50
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
51
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FileFieldComponent, isStandalone: true, selector: "ngx-file-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
|
|
52
|
-
<div class="ngx-field ngx-field--file"
|
|
53
|
-
[attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
|
|
54
|
-
<label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
|
|
55
|
-
@if (masked) {
|
|
56
|
-
<span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
|
|
57
|
-
} @else if (readonly) {
|
|
58
|
-
@if (fileUrl()) {
|
|
59
|
-
<a class="ngx-field__file-link" [href]="fileUrl()!" target="_blank" rel="noopener">
|
|
60
|
-
📎 {{ fileName() || 'Download file' }}
|
|
61
|
-
</a>
|
|
62
|
-
} @else {
|
|
63
|
-
<span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">—</span>
|
|
64
|
-
}
|
|
65
|
-
} @else {
|
|
66
|
-
<div class="ngx-field__file-wrap">
|
|
67
|
-
@if (fileName()) {
|
|
68
|
-
<div class="ngx-field__file-selected">
|
|
69
|
-
<span class="ngx-field__file-name">📎 {{ fileName() }}</span>
|
|
70
|
-
<button type="button" class="ngx-field__remove-btn" (click)="remove()" aria-label="Remove file">✕</button>
|
|
71
|
-
</div>
|
|
72
|
-
}
|
|
73
|
-
<label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
|
|
74
|
-
@if (uploading()) {
|
|
75
|
-
<span>Uploading…</span>
|
|
76
|
-
} @else {
|
|
77
|
-
<span>{{ fileName() ? 'Replace file' : 'Choose file' }}</span>
|
|
78
|
-
<input
|
|
79
|
-
type="file"
|
|
80
|
-
class="ngx-field__file-input"
|
|
81
|
-
[id]="'field-' + field.id"
|
|
82
|
-
[disabled]="field.disabled || uploading()"
|
|
83
|
-
(change)="onFileSelect($any($event.target).files[0])"
|
|
84
|
-
/>
|
|
85
|
-
}
|
|
86
|
-
</label>
|
|
87
|
-
</div>
|
|
88
|
-
@if (uploadError()) {
|
|
89
|
-
<span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
</div>
|
|
51
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FileFieldComponent, isStandalone: true, selector: "ngx-file-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
|
|
52
|
+
<div class="ngx-field ngx-field--file"
|
|
53
|
+
[attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
|
|
54
|
+
<label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
|
|
55
|
+
@if (masked) {
|
|
56
|
+
<span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
|
|
57
|
+
} @else if (readonly) {
|
|
58
|
+
@if (fileUrl()) {
|
|
59
|
+
<a class="ngx-field__file-link" [href]="fileUrl()!" target="_blank" rel="noopener">
|
|
60
|
+
📎 {{ fileName() || 'Download file' }}
|
|
61
|
+
</a>
|
|
62
|
+
} @else {
|
|
63
|
+
<span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">—</span>
|
|
64
|
+
}
|
|
65
|
+
} @else {
|
|
66
|
+
<div class="ngx-field__file-wrap">
|
|
67
|
+
@if (fileName()) {
|
|
68
|
+
<div class="ngx-field__file-selected">
|
|
69
|
+
<span class="ngx-field__file-name">📎 {{ fileName() }}</span>
|
|
70
|
+
<button type="button" class="ngx-field__remove-btn" (click)="remove()" aria-label="Remove file">✕</button>
|
|
71
|
+
</div>
|
|
72
|
+
}
|
|
73
|
+
<label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
|
|
74
|
+
@if (uploading()) {
|
|
75
|
+
<span>Uploading…</span>
|
|
76
|
+
} @else {
|
|
77
|
+
<span>{{ fileName() ? 'Replace file' : 'Choose file' }}</span>
|
|
78
|
+
<input
|
|
79
|
+
type="file"
|
|
80
|
+
class="ngx-field__file-input"
|
|
81
|
+
[id]="'field-' + field.id"
|
|
82
|
+
[disabled]="field.disabled || uploading()"
|
|
83
|
+
(change)="onFileSelect($any($event.target).files[0])"
|
|
84
|
+
/>
|
|
85
|
+
}
|
|
86
|
+
</label>
|
|
87
|
+
</div>
|
|
88
|
+
@if (uploadError()) {
|
|
89
|
+
<span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
</div>
|
|
93
93
|
`, isInline: true });
|
|
94
94
|
}
|
|
95
95
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileFieldComponent, decorators: [{
|
|
@@ -98,48 +98,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
98
98
|
selector: 'ngx-file-field',
|
|
99
99
|
standalone: true,
|
|
100
100
|
imports: [],
|
|
101
|
-
template: `
|
|
102
|
-
<div class="ngx-field ngx-field--file"
|
|
103
|
-
[attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
|
|
104
|
-
<label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
|
|
105
|
-
@if (masked) {
|
|
106
|
-
<span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
|
|
107
|
-
} @else if (readonly) {
|
|
108
|
-
@if (fileUrl()) {
|
|
109
|
-
<a class="ngx-field__file-link" [href]="fileUrl()!" target="_blank" rel="noopener">
|
|
110
|
-
📎 {{ fileName() || 'Download file' }}
|
|
111
|
-
</a>
|
|
112
|
-
} @else {
|
|
113
|
-
<span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">—</span>
|
|
114
|
-
}
|
|
115
|
-
} @else {
|
|
116
|
-
<div class="ngx-field__file-wrap">
|
|
117
|
-
@if (fileName()) {
|
|
118
|
-
<div class="ngx-field__file-selected">
|
|
119
|
-
<span class="ngx-field__file-name">📎 {{ fileName() }}</span>
|
|
120
|
-
<button type="button" class="ngx-field__remove-btn" (click)="remove()" aria-label="Remove file">✕</button>
|
|
121
|
-
</div>
|
|
122
|
-
}
|
|
123
|
-
<label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
|
|
124
|
-
@if (uploading()) {
|
|
125
|
-
<span>Uploading…</span>
|
|
126
|
-
} @else {
|
|
127
|
-
<span>{{ fileName() ? 'Replace file' : 'Choose file' }}</span>
|
|
128
|
-
<input
|
|
129
|
-
type="file"
|
|
130
|
-
class="ngx-field__file-input"
|
|
131
|
-
[id]="'field-' + field.id"
|
|
132
|
-
[disabled]="field.disabled || uploading()"
|
|
133
|
-
(change)="onFileSelect($any($event.target).files[0])"
|
|
134
|
-
/>
|
|
135
|
-
}
|
|
136
|
-
</label>
|
|
137
|
-
</div>
|
|
138
|
-
@if (uploadError()) {
|
|
139
|
-
<span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
</div>
|
|
101
|
+
template: `
|
|
102
|
+
<div class="ngx-field ngx-field--file"
|
|
103
|
+
[attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
|
|
104
|
+
<label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
|
|
105
|
+
@if (masked) {
|
|
106
|
+
<span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
|
|
107
|
+
} @else if (readonly) {
|
|
108
|
+
@if (fileUrl()) {
|
|
109
|
+
<a class="ngx-field__file-link" [href]="fileUrl()!" target="_blank" rel="noopener">
|
|
110
|
+
📎 {{ fileName() || 'Download file' }}
|
|
111
|
+
</a>
|
|
112
|
+
} @else {
|
|
113
|
+
<span class="ngx-field__value" [attr.data-testid]="'field-' + field.id + '-value'">—</span>
|
|
114
|
+
}
|
|
115
|
+
} @else {
|
|
116
|
+
<div class="ngx-field__file-wrap">
|
|
117
|
+
@if (fileName()) {
|
|
118
|
+
<div class="ngx-field__file-selected">
|
|
119
|
+
<span class="ngx-field__file-name">📎 {{ fileName() }}</span>
|
|
120
|
+
<button type="button" class="ngx-field__remove-btn" (click)="remove()" aria-label="Remove file">✕</button>
|
|
121
|
+
</div>
|
|
122
|
+
}
|
|
123
|
+
<label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
|
|
124
|
+
@if (uploading()) {
|
|
125
|
+
<span>Uploading…</span>
|
|
126
|
+
} @else {
|
|
127
|
+
<span>{{ fileName() ? 'Replace file' : 'Choose file' }}</span>
|
|
128
|
+
<input
|
|
129
|
+
type="file"
|
|
130
|
+
class="ngx-field__file-input"
|
|
131
|
+
[id]="'field-' + field.id"
|
|
132
|
+
[disabled]="field.disabled || uploading()"
|
|
133
|
+
(change)="onFileSelect($any($event.target).files[0])"
|
|
134
|
+
/>
|
|
135
|
+
}
|
|
136
|
+
</label>
|
|
137
|
+
</div>
|
|
138
|
+
@if (uploadError()) {
|
|
139
|
+
<span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
</div>
|
|
143
143
|
`,
|
|
144
144
|
}]
|
|
145
145
|
}], propDecorators: { field: [{
|
|
@@ -153,4 +153,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
153
153
|
}], masked: [{
|
|
154
154
|
type: Input
|
|
155
155
|
}] } });
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ZpZWxkLXR5cGVzL2ZpbGUtZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7QUFFcEU7OztHQUdHO0FBaURILE1BQU0sT0FBTyxrQkFBa0I7SUFDcEIsS0FBSyxDQUFxQjtJQUMxQixPQUFPLENBQW1CO0lBQzFCLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDeEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLEdBQVksS0FBSyxDQUFDO0lBRWhCLE9BQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUU1QyxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLFdBQVcsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRW5ELElBQUksS0FBSztRQUNQLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBWSxLQUFLO1FBQ2YsT0FBUSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQXdCLElBQUksSUFBSSxDQUFDO0lBQ3pELENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLElBQXNCO1FBQ3ZDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUMzRCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQy9CLENBQUM7d0dBN0NVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLHdMQTVDbkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDVDs7NEZBRVUsa0JBQWtCO2tCQWhEOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ1Q7aUJBQ0Y7OEJBRVUsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIElucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB0eXBlIHsgRmlsZVJlZiwgTmVzdGVkRmllbGRDb25maWcgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBmaWxlUmVmTmFtZSwgcmVzb2x2ZUxhYmVsIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9maWxlLXVwbG9hZC5zZXJ2aWNlJztcblxuLyoqXG4gKiBGaWxlIGZpZWxkOiBmaWxlIGlucHV0IHdpdGggZmlsZW5hbWUgZGlzcGxheSBhbmQgZG93bmxvYWQgbGluay5cbiAqIFNoYXJlcyB0aGUgYEZpbGVSZWZgIC8gYFVQTE9BRF9IQU5ETEVSYCBjb250cmFjdCB3aXRoIGltYWdlLWZpZWxkIHZpYSBGaWxlVXBsb2FkU2VydmljZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWZpbGUtZmllbGQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkIG5neC1maWVsZC0tZmlsZVwiXG4gICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkXCIgW2F0dHIuZGF0YS1maWVsZC10eXBlXT1cImZpZWxkLnR5cGVcIiBbY2xhc3Mubmd4LWZpZWxkLS1yZWFkb25seV09XCJyZWFkb25seVwiIFtjbGFzcy5uZ3gtZmllbGQtLW1hc2tlZF09XCJtYXNrZWRcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cIm5neC1maWVsZF9fbGFiZWxcIiBbYXR0ci5mb3JdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgIEBpZiAobWFza2VkKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZSBuZ3gtZmllbGRfX3ZhbHVlLS1tYXNrZWRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1tYXNrZWQnXCI+WFhYWFhYWFhYPC9zcGFuPlxuICAgICAgfSBAZWxzZSBpZiAocmVhZG9ubHkpIHtcbiAgICAgICAgQGlmIChmaWxlVXJsKCkpIHtcbiAgICAgICAgICA8YSBjbGFzcz1cIm5neC1maWVsZF9fZmlsZS1saW5rXCIgW2hyZWZdPVwiZmlsZVVybCgpIVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+XG4gICAgICAgICAgICDwn5OOIHt7IGZpbGVOYW1lKCkgfHwgJ0Rvd25sb2FkIGZpbGUnIH19XG4gICAgICAgICAgPC9hPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fdmFsdWVcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy12YWx1ZSdcIj7igJQ8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkX19maWxlLXdyYXBcIj5cbiAgICAgICAgICBAaWYgKGZpbGVOYW1lKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZmllbGRfX2ZpbGUtc2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2ZpbGUtbmFtZVwiPvCfk44ge3sgZmlsZU5hbWUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZmllbGRfX3JlbW92ZS1idG5cIiAoY2xpY2spPVwicmVtb3ZlKClcIiBhcmlhLWxhYmVsPVwiUmVtb3ZlIGZpbGVcIj7inJU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtZmllbGRfX3VwbG9hZC1idG5cIiBbY2xhc3Mubmd4LWZpZWxkX191cGxvYWQtYnRuLS1sb2FkaW5nXT1cInVwbG9hZGluZygpXCI+XG4gICAgICAgICAgICBAaWYgKHVwbG9hZGluZygpKSB7XG4gICAgICAgICAgICAgIDxzcGFuPlVwbG9hZGluZ+KApjwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8c3Bhbj57eyBmaWxlTmFtZSgpID8gJ1JlcGxhY2UgZmlsZScgOiAnQ2hvb3NlIGZpbGUnIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJuZ3gtZmllbGRfX2ZpbGUtaW5wdXRcIlxuICAgICAgICAgICAgICAgIFtpZF09XCInZmllbGQtJyArIGZpZWxkLmlkXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWQgfHwgdXBsb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0KCRhbnkoJGV2ZW50LnRhcmdldCkuZmlsZXNbMF0pXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmICh1cGxvYWRFcnJvcigpKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2Vycm9yXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctZXJyb3InXCI+e3sgdXBsb2FkRXJyb3IoKSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBGaWxlRmllbGRDb21wb25lbnQge1xuICBASW5wdXQoKSBmaWVsZCE6IE5lc3RlZEZpZWxkQ29uZmlnO1xuICBASW5wdXQoKSBjb250cm9sITogQWJzdHJhY3RDb250cm9sO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nID0gJ2VuJztcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbWFza2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB1cGxvYWRzID0gaW5qZWN0KEZpbGVVcGxvYWRTZXJ2aWNlKTtcblxuICByZWFkb25seSB1cGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB1cGxvYWRFcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZUxhYmVsKHRoaXMuZmllbGQ/LmxhYmVsLCB0aGlzLmxhbmd1YWdlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHZhbHVlKCk6IEZpbGVSZWYgfCBudWxsIHtcbiAgICByZXR1cm4gKHRoaXMuY29udHJvbD8udmFsdWUgYXMgRmlsZVJlZiB8IG51bGwpID8/IG51bGw7XG4gIH1cblxuICBmaWxlVXJsKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy51cmwgPz8gbnVsbDtcbiAgfVxuXG4gIGZpbGVOYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBmaWxlUmVmTmFtZSh0aGlzLnZhbHVlKSB8fCBudWxsO1xuICB9XG5cbiAgYXN5bmMgb25GaWxlU2VsZWN0KGZpbGU6IEZpbGUgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICB0aGlzLnVwbG9hZEVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLnVwbG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShhd2FpdCB0aGlzLnVwbG9hZHMudG9GaWxlUmVmKGZpbGUpKTtcbiAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yLnNldCgnVXBsb2FkIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy51cGxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmUoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -20,56 +20,56 @@ export class GroupFieldComponent {
|
|
|
20
20
|
return group?.get(childId);
|
|
21
21
|
}
|
|
22
22
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GroupFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
23
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: GroupFieldComponent, isStandalone: true, selector: "ngx-group-field", inputs: { field: "field", control: "control", config: "config", language: "language", readonly: "readonly", masked: "masked", userRoles: "userRoles" }, ngImport: i0, template: `
|
|
24
|
-
<fieldset class="ngx-field ngx-field--group"
|
|
25
|
-
[attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
|
|
26
|
-
<legend class="ngx-field__legend">{{ label }}</legend>
|
|
27
|
-
@if (masked) {
|
|
28
|
-
<span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
|
|
29
|
-
} @else {
|
|
30
|
-
<div class="ngx-field__group-children">
|
|
31
|
-
@for (child of field.children ?? []; track child.id) {
|
|
32
|
-
@if (child.visibility !== false) {
|
|
33
|
-
<ngx-dynamic-field
|
|
34
|
-
[field]="child"
|
|
35
|
-
[control]="getChildControl(child.id)"
|
|
36
|
-
[config]="config"
|
|
37
|
-
[language]="language"
|
|
38
|
-
[readonly]="readonly || !!child.readonly"
|
|
39
|
-
[userRoles]="userRoles"
|
|
40
|
-
/>
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
</div>
|
|
44
|
-
}
|
|
45
|
-
</fieldset>
|
|
23
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: GroupFieldComponent, isStandalone: true, selector: "ngx-group-field", inputs: { field: "field", control: "control", config: "config", language: "language", readonly: "readonly", masked: "masked", userRoles: "userRoles" }, ngImport: i0, template: `
|
|
24
|
+
<fieldset class="ngx-field ngx-field--group"
|
|
25
|
+
[attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
|
|
26
|
+
<legend class="ngx-field__legend">{{ label }}</legend>
|
|
27
|
+
@if (masked) {
|
|
28
|
+
<span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
|
|
29
|
+
} @else {
|
|
30
|
+
<div class="ngx-field__group-children">
|
|
31
|
+
@for (child of field.children ?? []; track child.id) {
|
|
32
|
+
@if (child.visibility !== false) {
|
|
33
|
+
<ngx-dynamic-field
|
|
34
|
+
[field]="child"
|
|
35
|
+
[control]="getChildControl(child.id)"
|
|
36
|
+
[config]="config"
|
|
37
|
+
[language]="language"
|
|
38
|
+
[readonly]="readonly || !!child.readonly"
|
|
39
|
+
[userRoles]="userRoles"
|
|
40
|
+
/>
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
</div>
|
|
44
|
+
}
|
|
45
|
+
</fieldset>
|
|
46
46
|
`, isInline: true, styles: [".ngx-field--group{border:1px solid #e2e8f0;border-radius:8px;padding:16px;margin-bottom:16px;background:#fafafa}.ngx-field__legend{font-weight:600;font-size:14px;padding:0 8px;color:#334155}.ngx-field__group-children{display:flex;flex-direction:column;gap:12px}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => ReactiveFormsModule) }, { kind: "component", type: i0.forwardRef(() => DynamicFieldComponent), selector: "ngx-dynamic-field", inputs: ["field", "control", "config", "currentTabId", "language", "readonly", "userRoles"] }] });
|
|
47
47
|
}
|
|
48
48
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GroupFieldComponent, decorators: [{
|
|
49
49
|
type: Component,
|
|
50
|
-
args: [{ selector: 'ngx-group-field', standalone: true, imports: [ReactiveFormsModule, forwardRef(() => DynamicFieldComponent)], template: `
|
|
51
|
-
<fieldset class="ngx-field ngx-field--group"
|
|
52
|
-
[attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
|
|
53
|
-
<legend class="ngx-field__legend">{{ label }}</legend>
|
|
54
|
-
@if (masked) {
|
|
55
|
-
<span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
|
|
56
|
-
} @else {
|
|
57
|
-
<div class="ngx-field__group-children">
|
|
58
|
-
@for (child of field.children ?? []; track child.id) {
|
|
59
|
-
@if (child.visibility !== false) {
|
|
60
|
-
<ngx-dynamic-field
|
|
61
|
-
[field]="child"
|
|
62
|
-
[control]="getChildControl(child.id)"
|
|
63
|
-
[config]="config"
|
|
64
|
-
[language]="language"
|
|
65
|
-
[readonly]="readonly || !!child.readonly"
|
|
66
|
-
[userRoles]="userRoles"
|
|
67
|
-
/>
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
</div>
|
|
71
|
-
}
|
|
72
|
-
</fieldset>
|
|
50
|
+
args: [{ selector: 'ngx-group-field', standalone: true, imports: [ReactiveFormsModule, forwardRef(() => DynamicFieldComponent)], template: `
|
|
51
|
+
<fieldset class="ngx-field ngx-field--group"
|
|
52
|
+
[attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
|
|
53
|
+
<legend class="ngx-field__legend">{{ label }}</legend>
|
|
54
|
+
@if (masked) {
|
|
55
|
+
<span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
|
|
56
|
+
} @else {
|
|
57
|
+
<div class="ngx-field__group-children">
|
|
58
|
+
@for (child of field.children ?? []; track child.id) {
|
|
59
|
+
@if (child.visibility !== false) {
|
|
60
|
+
<ngx-dynamic-field
|
|
61
|
+
[field]="child"
|
|
62
|
+
[control]="getChildControl(child.id)"
|
|
63
|
+
[config]="config"
|
|
64
|
+
[language]="language"
|
|
65
|
+
[readonly]="readonly || !!child.readonly"
|
|
66
|
+
[userRoles]="userRoles"
|
|
67
|
+
/>
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
</div>
|
|
71
|
+
}
|
|
72
|
+
</fieldset>
|
|
73
73
|
`, styles: [".ngx-field--group{border:1px solid #e2e8f0;border-radius:8px;padding:16px;margin-bottom:16px;background:#fafafa}.ngx-field__legend{font-weight:600;font-size:14px;padding:0 8px;color:#334155}.ngx-field__group-children{display:flex;flex-direction:column;gap:12px}\n"] }]
|
|
74
74
|
}], propDecorators: { field: [{
|
|
75
75
|
type: Input
|
|
@@ -86,4 +86,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
86
86
|
}], userRoles: [{
|
|
87
87
|
type: Input
|
|
88
88
|
}] } });
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9ncm91cC1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBOEIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0NBQStDLENBQUM7O0FBRXRGLDBGQUEwRjtBQW9EMUYsTUFBTSxPQUFPLG1CQUFtQjtJQUNyQixLQUFLLENBQXFCO0lBQzFCLE9BQU8sQ0FBbUI7SUFDMUIsTUFBTSxDQUFvQjtJQUMxQixRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixTQUFTLEdBQWEsRUFBRSxDQUFDO0lBRWxDLElBQUksS0FBSztRQUNQLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQWU7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQW9CLENBQUM7UUFDeEMsT0FBTyxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBb0IsQ0FBQztJQUNoRCxDQUFDO3dHQWhCVSxtQkFBbUI7NEZBQW5CLG1CQUFtQixtT0EvQ3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCVCxvV0F4QlMsbUJBQW1CLG9EQUFtQixxQkFBcUI7OzRGQWdEMUQsbUJBQW1CO2tCQW5EL0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQyxZQUM3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1QlQ7OEJBeUJRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHR5cGUgeyBOZXN0ZWRGaWVsZENvbmZpZywgRW50aXR5Rm9ybUNvbmZpZyB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcbmltcG9ydCB7IHJlc29sdmVMYWJlbCB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcbmltcG9ydCB7IER5bmFtaWNGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZHluYW1pYy1maWVsZC9keW5hbWljLWZpZWxkLmNvbXBvbmVudCc7XG5cbi8qKiBBRFItMDA4OiBHcm91cEZpZWxkQ29tcG9uZW50IOKAlCByZW5kZXJzIG5lc3RlZCBmaWVsZHNldCBjb250YWluZXIgZm9yIGdyb3VwLmNoaWxkcmVuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZ3JvdXAtZmllbGQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZSwgZm9yd2FyZFJlZigoKSA9PiBEeW5hbWljRmllbGRDb21wb25lbnQpXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZmllbGRzZXQgY2xhc3M9XCJuZ3gtZmllbGQgbmd4LWZpZWxkLS1ncm91cFwiXG4gICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkXCIgW2F0dHIuZGF0YS1maWVsZC10eXBlXT1cImZpZWxkLnR5cGVcIiBbY2xhc3Mubmd4LWZpZWxkLS1yZWFkb25seV09XCJyZWFkb25seVwiIFtjbGFzcy5uZ3gtZmllbGQtLW1hc2tlZF09XCJtYXNrZWRcIj5cbiAgICAgIDxsZWdlbmQgY2xhc3M9XCJuZ3gtZmllbGRfX2xlZ2VuZFwiPnt7IGxhYmVsIH19PC9sZWdlbmQ+XG4gICAgICBAaWYgKG1hc2tlZCkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1maWVsZF9fdmFsdWUgbmd4LWZpZWxkX192YWx1ZS0tbWFza2VkXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctbWFza2VkJ1wiPlhYWFhYWFhYWDwvc3Bhbj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkX19ncm91cC1jaGlsZHJlblwiPlxuICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIGZpZWxkLmNoaWxkcmVuID8/IFtdOyB0cmFjayBjaGlsZC5pZCkge1xuICAgICAgICAgICAgQGlmIChjaGlsZC52aXNpYmlsaXR5ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICA8bmd4LWR5bmFtaWMtZmllbGRcbiAgICAgICAgICAgICAgICBbZmllbGRdPVwiY2hpbGRcIlxuICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENoaWxkQ29udHJvbChjaGlsZC5pZClcIlxuICAgICAgICAgICAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgICAgICAgICAgICBbbGFuZ3VhZ2VdPVwibGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSB8fCAhIWNoaWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICBbdXNlclJvbGVzXT1cInVzZXJSb2xlc1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2ZpZWxkc2V0PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAubmd4LWZpZWxkLS1ncm91cCB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZhZmFmYTtcbiAgICAgIH1cbiAgICAgIC5uZ3gtZmllbGRfX2xlZ2VuZCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgcGFkZGluZzogMCA4cHg7XG4gICAgICAgIGNvbG9yOiAjMzM0MTU1O1xuICAgICAgfVxuICAgICAgLm5neC1maWVsZF9fZ3JvdXAtY2hpbGRyZW4ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgR3JvdXBGaWVsZENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGZpZWxkITogTmVzdGVkRmllbGRDb25maWc7XG4gIEBJbnB1dCgpIGNvbnRyb2whOiBBYnN0cmFjdENvbnRyb2w7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IEVudGl0eUZvcm1Db25maWc7XG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgPSAnZW4nO1xuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdXNlclJvbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlTGFiZWwodGhpcy5maWVsZD8ubGFiZWwsIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAgZ2V0Q2hpbGRDb250cm9sKGNoaWxkSWQ6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgIHJldHVybiBncm91cD8uZ2V0KGNoaWxkSWQpIGFzIEFic3RyYWN0Q29udHJvbDtcbiAgfVxufVxuIl19
|
|
@@ -56,50 +56,50 @@ export class ImageFieldComponent {
|
|
|
56
56
|
this.uploads.revokePreviewUrl(this.previewCache);
|
|
57
57
|
}
|
|
58
58
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ImageFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
59
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ImageFieldComponent, isStandalone: true, selector: "ngx-image-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
|
|
60
|
-
<div class="ngx-field ngx-field--image"
|
|
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" [attr.for]="'field-' + field.id">{{ 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 {
|
|
66
|
-
<div class="ngx-field__image-wrap">
|
|
67
|
-
@if (previewUrl()) {
|
|
68
|
-
<img class="ngx-field__image-preview" [src]="previewUrl()" [alt]="label" />
|
|
69
|
-
} @else {
|
|
70
|
-
<div class="ngx-field__image-placeholder">
|
|
71
|
-
<span>📷</span>
|
|
72
|
-
<span>No image</span>
|
|
73
|
-
</div>
|
|
74
|
-
}
|
|
75
|
-
@if (!readonly) {
|
|
76
|
-
<div class="ngx-field__image-actions">
|
|
77
|
-
<label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
|
|
78
|
-
@if (uploading()) {
|
|
79
|
-
<span>Uploading…</span>
|
|
80
|
-
} @else {
|
|
81
|
-
<span>{{ previewUrl() ? 'Change' : 'Upload' }}</span>
|
|
82
|
-
<input
|
|
83
|
-
type="file"
|
|
84
|
-
class="ngx-field__file-input"
|
|
85
|
-
[id]="'field-' + field.id"
|
|
86
|
-
accept="image/*"
|
|
87
|
-
[disabled]="field.disabled || uploading()"
|
|
88
|
-
(change)="onFileSelect($any($event.target).files[0])"
|
|
89
|
-
/>
|
|
90
|
-
}
|
|
91
|
-
</label>
|
|
92
|
-
@if (previewUrl()) {
|
|
93
|
-
<button type="button" class="ngx-field__remove-btn" (click)="remove()">Remove</button>
|
|
94
|
-
}
|
|
95
|
-
</div>
|
|
96
|
-
}
|
|
97
|
-
</div>
|
|
98
|
-
@if (uploadError()) {
|
|
99
|
-
<span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
</div>
|
|
59
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ImageFieldComponent, isStandalone: true, selector: "ngx-image-field", inputs: { field: "field", control: "control", language: "language", readonly: "readonly", masked: "masked" }, ngImport: i0, template: `
|
|
60
|
+
<div class="ngx-field ngx-field--image"
|
|
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" [attr.for]="'field-' + field.id">{{ 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 {
|
|
66
|
+
<div class="ngx-field__image-wrap">
|
|
67
|
+
@if (previewUrl()) {
|
|
68
|
+
<img class="ngx-field__image-preview" [src]="previewUrl()" [alt]="label" />
|
|
69
|
+
} @else {
|
|
70
|
+
<div class="ngx-field__image-placeholder">
|
|
71
|
+
<span>📷</span>
|
|
72
|
+
<span>No image</span>
|
|
73
|
+
</div>
|
|
74
|
+
}
|
|
75
|
+
@if (!readonly) {
|
|
76
|
+
<div class="ngx-field__image-actions">
|
|
77
|
+
<label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
|
|
78
|
+
@if (uploading()) {
|
|
79
|
+
<span>Uploading…</span>
|
|
80
|
+
} @else {
|
|
81
|
+
<span>{{ previewUrl() ? 'Change' : 'Upload' }}</span>
|
|
82
|
+
<input
|
|
83
|
+
type="file"
|
|
84
|
+
class="ngx-field__file-input"
|
|
85
|
+
[id]="'field-' + field.id"
|
|
86
|
+
accept="image/*"
|
|
87
|
+
[disabled]="field.disabled || uploading()"
|
|
88
|
+
(change)="onFileSelect($any($event.target).files[0])"
|
|
89
|
+
/>
|
|
90
|
+
}
|
|
91
|
+
</label>
|
|
92
|
+
@if (previewUrl()) {
|
|
93
|
+
<button type="button" class="ngx-field__remove-btn" (click)="remove()">Remove</button>
|
|
94
|
+
}
|
|
95
|
+
</div>
|
|
96
|
+
}
|
|
97
|
+
</div>
|
|
98
|
+
@if (uploadError()) {
|
|
99
|
+
<span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
</div>
|
|
103
103
|
`, isInline: true });
|
|
104
104
|
}
|
|
105
105
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ImageFieldComponent, decorators: [{
|
|
@@ -108,50 +108,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
108
108
|
selector: 'ngx-image-field',
|
|
109
109
|
standalone: true,
|
|
110
110
|
imports: [],
|
|
111
|
-
template: `
|
|
112
|
-
<div class="ngx-field ngx-field--image"
|
|
113
|
-
[attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
|
|
114
|
-
<label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
|
|
115
|
-
@if (masked) {
|
|
116
|
-
<span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
|
|
117
|
-
} @else {
|
|
118
|
-
<div class="ngx-field__image-wrap">
|
|
119
|
-
@if (previewUrl()) {
|
|
120
|
-
<img class="ngx-field__image-preview" [src]="previewUrl()" [alt]="label" />
|
|
121
|
-
} @else {
|
|
122
|
-
<div class="ngx-field__image-placeholder">
|
|
123
|
-
<span>📷</span>
|
|
124
|
-
<span>No image</span>
|
|
125
|
-
</div>
|
|
126
|
-
}
|
|
127
|
-
@if (!readonly) {
|
|
128
|
-
<div class="ngx-field__image-actions">
|
|
129
|
-
<label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
|
|
130
|
-
@if (uploading()) {
|
|
131
|
-
<span>Uploading…</span>
|
|
132
|
-
} @else {
|
|
133
|
-
<span>{{ previewUrl() ? 'Change' : 'Upload' }}</span>
|
|
134
|
-
<input
|
|
135
|
-
type="file"
|
|
136
|
-
class="ngx-field__file-input"
|
|
137
|
-
[id]="'field-' + field.id"
|
|
138
|
-
accept="image/*"
|
|
139
|
-
[disabled]="field.disabled || uploading()"
|
|
140
|
-
(change)="onFileSelect($any($event.target).files[0])"
|
|
141
|
-
/>
|
|
142
|
-
}
|
|
143
|
-
</label>
|
|
144
|
-
@if (previewUrl()) {
|
|
145
|
-
<button type="button" class="ngx-field__remove-btn" (click)="remove()">Remove</button>
|
|
146
|
-
}
|
|
147
|
-
</div>
|
|
148
|
-
}
|
|
149
|
-
</div>
|
|
150
|
-
@if (uploadError()) {
|
|
151
|
-
<span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
</div>
|
|
111
|
+
template: `
|
|
112
|
+
<div class="ngx-field ngx-field--image"
|
|
113
|
+
[attr.data-testid]="'field-' + field.id" [attr.data-field-type]="field.type" [class.ngx-field--readonly]="readonly" [class.ngx-field--masked]="masked">
|
|
114
|
+
<label class="ngx-field__label" [attr.for]="'field-' + field.id">{{ label }}</label>
|
|
115
|
+
@if (masked) {
|
|
116
|
+
<span class="ngx-field__value ngx-field__value--masked" [attr.data-testid]="'field-' + field.id + '-masked'">XXXXXXXXX</span>
|
|
117
|
+
} @else {
|
|
118
|
+
<div class="ngx-field__image-wrap">
|
|
119
|
+
@if (previewUrl()) {
|
|
120
|
+
<img class="ngx-field__image-preview" [src]="previewUrl()" [alt]="label" />
|
|
121
|
+
} @else {
|
|
122
|
+
<div class="ngx-field__image-placeholder">
|
|
123
|
+
<span>📷</span>
|
|
124
|
+
<span>No image</span>
|
|
125
|
+
</div>
|
|
126
|
+
}
|
|
127
|
+
@if (!readonly) {
|
|
128
|
+
<div class="ngx-field__image-actions">
|
|
129
|
+
<label class="ngx-field__upload-btn" [class.ngx-field__upload-btn--loading]="uploading()">
|
|
130
|
+
@if (uploading()) {
|
|
131
|
+
<span>Uploading…</span>
|
|
132
|
+
} @else {
|
|
133
|
+
<span>{{ previewUrl() ? 'Change' : 'Upload' }}</span>
|
|
134
|
+
<input
|
|
135
|
+
type="file"
|
|
136
|
+
class="ngx-field__file-input"
|
|
137
|
+
[id]="'field-' + field.id"
|
|
138
|
+
accept="image/*"
|
|
139
|
+
[disabled]="field.disabled || uploading()"
|
|
140
|
+
(change)="onFileSelect($any($event.target).files[0])"
|
|
141
|
+
/>
|
|
142
|
+
}
|
|
143
|
+
</label>
|
|
144
|
+
@if (previewUrl()) {
|
|
145
|
+
<button type="button" class="ngx-field__remove-btn" (click)="remove()">Remove</button>
|
|
146
|
+
}
|
|
147
|
+
</div>
|
|
148
|
+
}
|
|
149
|
+
</div>
|
|
150
|
+
@if (uploadError()) {
|
|
151
|
+
<span class="ngx-field__error" [attr.data-testid]="'field-' + field.id + '-error'">{{ uploadError() }}</span>
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
</div>
|
|
155
155
|
`,
|
|
156
156
|
}]
|
|
157
157
|
}], propDecorators: { field: [{
|
|
@@ -165,4 +165,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
165
165
|
}], masked: [{
|
|
166
166
|
type: Input
|
|
167
167
|
}] } });
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9maWVsZC10eXBlcy9pbWFnZS1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7O0FBRXBFOzs7OztHQUtHO0FBbURILE1BQU0sT0FBTyxtQkFBbUI7SUFDckIsS0FBSyxDQUFxQjtJQUMxQixPQUFPLENBQW1CO0lBQzFCLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDeEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixNQUFNLEdBQVksS0FBSyxDQUFDO0lBRWhCLE9BQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUU1QyxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLFdBQVcsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRW5ELDJGQUEyRjtJQUNuRixhQUFhLEdBQW1CLElBQUksQ0FBQztJQUNyQyxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUUzQyxJQUFJLEtBQUs7UUFDUCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELFVBQVU7UUFDUixNQUFNLEtBQUssR0FBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQXdCLElBQUksSUFBSSxDQUFDO1FBQzlELElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRTNELElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLElBQXNCO1FBQ3ZDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUMzRCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQzt3R0FuRFUsbUJBQW1COzRGQUFuQixtQkFBbUIseUxBOUNwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q1Q7OzRGQUVVLG1CQUFtQjtrQkFsRC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxFQUFFO29CQUNYLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q1Q7aUJBQ0Y7OEJBRVUsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIGluamVjdCwgSW5wdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlUmVmLCBOZXN0ZWRGaWVsZENvbmZpZyB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcbmltcG9ydCB7IHJlc29sdmVMYWJlbCB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcbmltcG9ydCB7IEZpbGVVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZmlsZS11cGxvYWQuc2VydmljZSc7XG5cbi8qKlxuICogSW1hZ2UgZmllbGQ6IHByZXZpZXcgdGh1bWJuYWlsICsgdXBsb2FkIGJ1dHRvbi5cbiAqXG4gKiBXaXRoIGBVUExPQURfSEFORExFUmAgcmVnaXN0ZXJlZCB0aGUgZmlsZSBpcyBwZXJzaXN0ZWQgYW5kIHN0b3JlZCBhcyBgeyB1cmwgfWA7IHdpdGhvdXQgb25lXG4gKiBpdCBpcyBzdG9yZWQgYXMgYHsgZmlsZSB9YCBhbmQgcHJldmlld2VkIGZyb20gYW4gb2JqZWN0IFVSTCAocmV2b2tlZCB3aGVuIHJlcGxhY2VkL2Rlc3Ryb3llZCkuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1pbWFnZS1maWVsZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJuZ3gtZmllbGQgbmd4LWZpZWxkLS1pbWFnZVwiXG4gICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkXCIgW2F0dHIuZGF0YS1maWVsZC10eXBlXT1cImZpZWxkLnR5cGVcIiBbY2xhc3Mubmd4LWZpZWxkLS1yZWFkb25seV09XCJyZWFkb25seVwiIFtjbGFzcy5uZ3gtZmllbGQtLW1hc2tlZF09XCJtYXNrZWRcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cIm5neC1maWVsZF9fbGFiZWxcIiBbYXR0ci5mb3JdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgIEBpZiAobWFza2VkKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWZpZWxkX192YWx1ZSBuZ3gtZmllbGRfX3ZhbHVlLS1tYXNrZWRcIiBbYXR0ci5kYXRhLXRlc3RpZF09XCInZmllbGQtJyArIGZpZWxkLmlkICsgJy1tYXNrZWQnXCI+WFhYWFhYWFhYPC9zcGFuPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtZmllbGRfX2ltYWdlLXdyYXBcIj5cbiAgICAgICAgICBAaWYgKHByZXZpZXdVcmwoKSkge1xuICAgICAgICAgICAgPGltZyBjbGFzcz1cIm5neC1maWVsZF9faW1hZ2UtcHJldmlld1wiIFtzcmNdPVwicHJldmlld1VybCgpXCIgW2FsdF09XCJsYWJlbFwiIC8+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmd4LWZpZWxkX19pbWFnZS1wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICA8c3Bhbj7wn5O3PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj5ObyBpbWFnZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKCFyZWFkb25seSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5neC1maWVsZF9faW1hZ2UtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJuZ3gtZmllbGRfX3VwbG9hZC1idG5cIiBbY2xhc3Mubmd4LWZpZWxkX191cGxvYWQtYnRuLS1sb2FkaW5nXT1cInVwbG9hZGluZygpXCI+XG4gICAgICAgICAgICAgICAgQGlmICh1cGxvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+VXBsb2FkaW5n4oCmPC9zcGFuPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJldmlld1VybCgpID8gJ0NoYW5nZScgOiAnVXBsb2FkJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmd4LWZpZWxkX19maWxlLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidmaWVsZC0nICsgZmllbGQuaWRcIlxuICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCJpbWFnZS8qXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkIHx8IHVwbG9hZGluZygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGFueSgkZXZlbnQudGFyZ2V0KS5maWxlc1swXSlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIEBpZiAocHJldmlld1VybCgpKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtZmllbGRfX3JlbW92ZS1idG5cIiAoY2xpY2spPVwicmVtb3ZlKClcIj5SZW1vdmU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmICh1cGxvYWRFcnJvcigpKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtZmllbGRfX2Vycm9yXCIgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkLScgKyBmaWVsZC5pZCArICctZXJyb3InXCI+e3sgdXBsb2FkRXJyb3IoKSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBJbWFnZUZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KCkgZmllbGQhOiBOZXN0ZWRGaWVsZENvbmZpZztcbiAgQElucHV0KCkgY29udHJvbCE6IEFic3RyYWN0Q29udHJvbDtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyA9ICdlbic7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc2tlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBsb2FkcyA9IGluamVjdChGaWxlVXBsb2FkU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgdXBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgdXBsb2FkRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIENhY2hlZCBzbyBhbiBvYmplY3QgVVJMIGlzIG1pbnRlZCBvbmNlIHBlciBGaWxlLCBub3Qgb25jZSBwZXIgY2hhbmdlLWRldGVjdGlvbiBwYXNzLiAqL1xuICBwcml2YXRlIHByZXZpZXdTb3VyY2U6IEZpbGVSZWYgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmV2aWV3Q2FjaGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlTGFiZWwodGhpcy5maWVsZD8ubGFiZWwsIHRoaXMubGFuZ3VhZ2UpO1xuICB9XG5cbiAgcHJldmlld1VybCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLmNvbnRyb2w/LnZhbHVlIGFzIEZpbGVSZWYgfCBudWxsKSA/PyBudWxsO1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5wcmV2aWV3U291cmNlKSByZXR1cm4gdGhpcy5wcmV2aWV3Q2FjaGU7XG5cbiAgICB0aGlzLnVwbG9hZHMucmV2b2tlUHJldmlld1VybCh0aGlzLnByZXZpZXdDYWNoZSk7XG4gICAgdGhpcy5wcmV2aWV3U291cmNlID0gdmFsdWU7XG4gICAgdGhpcy5wcmV2aWV3Q2FjaGUgPSB0aGlzLnVwbG9hZHMucHJldmlld1VybEZvcih2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMucHJldmlld0NhY2hlO1xuICB9XG5cbiAgYXN5bmMgb25GaWxlU2VsZWN0KGZpbGU6IEZpbGUgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICB0aGlzLnVwbG9hZEVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLnVwbG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShhd2FpdCB0aGlzLnVwbG9hZHMudG9GaWxlUmVmKGZpbGUpKTtcbiAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yLnNldCgnVXBsb2FkIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy51cGxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmUoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVwbG9hZHMucmV2b2tlUHJldmlld1VybCh0aGlzLnByZXZpZXdDYWNoZSk7XG4gIH1cbn1cbiJdfQ==
|