ngx-dynamic-entity 0.0.1 → 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 -0
- package/esm2022/lib/field-types/array-field.component.mjs +160 -0
- package/esm2022/lib/field-types/boolean-field.component.mjs +100 -0
- package/esm2022/lib/field-types/checkbox-field.component.mjs +25 -17
- package/esm2022/lib/field-types/currency-field.component.mjs +101 -0
- package/esm2022/lib/field-types/date-field.component.mjs +21 -13
- package/esm2022/lib/field-types/dropdown-field.component.mjs +120 -29
- package/esm2022/lib/field-types/email-field.component.mjs +101 -0
- package/esm2022/lib/field-types/entity-ref-field.component.mjs +96 -32
- package/esm2022/lib/field-types/file-field.component.mjs +156 -0
- package/esm2022/lib/field-types/group-field.component.mjs +89 -0
- package/esm2022/lib/field-types/image-field.component.mjs +168 -0
- package/esm2022/lib/field-types/month-year-field.component.mjs +151 -0
- package/esm2022/lib/field-types/multi-select-field.component.mjs +79 -25
- package/esm2022/lib/field-types/number-field.component.mjs +60 -17
- package/esm2022/lib/field-types/password-field.component.mjs +109 -0
- package/esm2022/lib/field-types/radio-field.component.mjs +152 -0
- package/esm2022/lib/field-types/text-field.component.mjs +58 -18
- package/esm2022/lib/field-types/textarea-field.component.mjs +26 -15
- package/esm2022/lib/form/dynamic-field/dynamic-field.component.mjs +44 -26
- package/esm2022/lib/form/dynamic-form.component.mjs +676 -69
- package/esm2022/lib/form/dynamic-record-form.component.mjs +494 -0
- package/esm2022/lib/providers/provide-field-types.mjs +72 -0
- package/esm2022/lib/providers/provide-ngx-dynamic-entity.mjs +4 -5
- package/esm2022/lib/services/cascade-data.service.mjs +129 -0
- package/esm2022/lib/services/config-source.service.mjs +67 -0
- package/esm2022/lib/services/entity-ref-cache.mjs +20 -0
- package/esm2022/lib/services/entity-ref-registry.service.mjs +3 -3
- package/esm2022/lib/services/entity-ref-selection.service.mjs +27 -0
- package/esm2022/lib/services/entity-reference.service.mjs +168 -0
- package/esm2022/lib/services/field-registry.service.mjs +35 -30
- package/esm2022/lib/services/file-upload.service.mjs +89 -0
- package/esm2022/lib/services/lookup-registry.service.mjs +246 -0
- package/esm2022/lib/services/rbac.service.mjs +5 -11
- package/esm2022/lib/services/rules-evaluation.service.mjs +27 -0
- package/esm2022/lib/services/validator-registry.service.mjs +35 -7
- package/esm2022/lib/tokens/injection-tokens.mjs +104 -7
- package/esm2022/public-api.mjs +31 -6
- package/fesm2022/ngx-dynamic-entity.mjs +4094 -759
- package/fesm2022/ngx-dynamic-entity.mjs.map +1 -1
- package/lib/field-types/array-field.component.d.ts +22 -0
- package/lib/field-types/boolean-field.component.d.ts +18 -0
- package/lib/field-types/checkbox-field.component.d.ts +3 -2
- package/lib/field-types/currency-field.component.d.ts +17 -0
- package/lib/field-types/date-field.component.d.ts +3 -2
- package/lib/field-types/dropdown-field.component.d.ts +24 -4
- package/lib/field-types/email-field.component.d.ts +15 -0
- package/lib/field-types/entity-ref-field.component.d.ts +24 -11
- package/lib/field-types/file-field.component.d.ts +25 -0
- package/lib/field-types/group-field.component.d.ts +17 -0
- package/lib/field-types/image-field.component.d.ts +30 -0
- package/lib/field-types/month-year-field.component.d.ts +28 -0
- package/lib/field-types/multi-select-field.component.d.ts +18 -4
- package/lib/field-types/number-field.component.d.ts +5 -2
- package/lib/field-types/password-field.component.d.ts +17 -0
- package/lib/field-types/radio-field.component.d.ts +33 -0
- package/lib/field-types/text-field.component.d.ts +5 -3
- package/lib/field-types/textarea-field.component.d.ts +4 -2
- package/lib/form/dynamic-field/dynamic-field.component.d.ts +20 -7
- package/lib/form/dynamic-form.component.d.ts +203 -24
- package/lib/form/dynamic-record-form.component.d.ts +180 -0
- package/lib/providers/provide-field-types.d.ts +24 -0
- package/lib/providers/provide-ngx-dynamic-entity.d.ts +19 -8
- package/lib/services/cascade-data.service.d.ts +45 -0
- package/lib/services/config-source.service.d.ts +14 -0
- package/lib/services/entity-ref-cache.d.ts +27 -0
- package/lib/services/entity-ref-registry.service.d.ts +4 -3
- package/lib/services/entity-ref-selection.service.d.ts +24 -0
- package/lib/services/entity-reference.service.d.ts +49 -0
- package/lib/services/field-registry.service.d.ts +17 -7
- package/lib/services/file-upload.service.d.ts +27 -0
- package/lib/services/lookup-registry.service.d.ts +94 -0
- package/lib/services/rbac.service.d.ts +4 -9
- package/lib/services/rules-evaluation.service.d.ts +17 -0
- package/lib/services/validator-registry.service.d.ts +5 -4
- package/lib/tokens/injection-tokens.d.ts +113 -8
- package/package.json +18 -8
- package/public-api.d.ts +21 -4
- package/esm2022/lib/services/config.service.mjs +0 -58
- package/esm2022/lib/services/version.service.mjs +0 -40
- package/esm2022/lib/table/dynamic-table.component.mjs +0 -160
- package/lib/services/config.service.d.ts +0 -25
- package/lib/services/version.service.d.ts +0 -26
- package/lib/table/dynamic-table.component.d.ts +0 -56
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { makeEnvironmentProviders } from '@angular/core';
|
|
2
|
+
import { FIELD_TYPE_SETS } from '../tokens/injection-tokens';
|
|
3
|
+
import { TextFieldComponent } from '../field-types/text-field.component';
|
|
4
|
+
import { TextareaFieldComponent } from '../field-types/textarea-field.component';
|
|
5
|
+
import { NumberFieldComponent } from '../field-types/number-field.component';
|
|
6
|
+
import { CurrencyFieldComponent } from '../field-types/currency-field.component';
|
|
7
|
+
import { EmailFieldComponent } from '../field-types/email-field.component';
|
|
8
|
+
import { PasswordFieldComponent } from '../field-types/password-field.component';
|
|
9
|
+
import { CheckboxFieldComponent } from '../field-types/checkbox-field.component';
|
|
10
|
+
import { BooleanFieldComponent } from '../field-types/boolean-field.component';
|
|
11
|
+
import { DateFieldComponent } from '../field-types/date-field.component';
|
|
12
|
+
import { MonthYearFieldComponent } from '../field-types/month-year-field.component';
|
|
13
|
+
import { DropdownFieldComponent } from '../field-types/dropdown-field.component';
|
|
14
|
+
import { RadioFieldComponent } from '../field-types/radio-field.component';
|
|
15
|
+
import { MultiSelectFieldComponent } from '../field-types/multi-select-field.component';
|
|
16
|
+
import { EntityRefFieldComponent } from '../field-types/entity-ref-field.component';
|
|
17
|
+
import { GroupFieldComponent } from '../field-types/group-field.component';
|
|
18
|
+
import { ArrayFieldComponent } from '../field-types/array-field.component';
|
|
19
|
+
import { ImageFieldComponent } from '../field-types/image-field.component';
|
|
20
|
+
import { FileFieldComponent } from '../field-types/file-field.component';
|
|
21
|
+
/**
|
|
22
|
+
* Field-type registration — the tree-shaking seam.
|
|
23
|
+
*
|
|
24
|
+
* `FieldRegistryService` imports no components. Whatever you register here is what gets
|
|
25
|
+
* bundled, so an app that only uses text/number/dropdown pays for three components and
|
|
26
|
+
* their imports, not nineteen.
|
|
27
|
+
*
|
|
28
|
+
* ```ts
|
|
29
|
+
* // Everything (convenient; bundles all built-ins):
|
|
30
|
+
* provideNgxDynamicEntity(), provideBuiltInFieldTypes()
|
|
31
|
+
*
|
|
32
|
+
* // Only what this app renders:
|
|
33
|
+
* provideFieldTypes({ text: TextFieldComponent, number: NumberFieldComponent })
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* Both merge into `FIELD_TYPE_REGISTRY`; later registrations win on key collision.
|
|
37
|
+
*/
|
|
38
|
+
/** Map of every built-in field type key → component. Referencing this pulls in all of them. */
|
|
39
|
+
export function builtInFieldTypes() {
|
|
40
|
+
return {
|
|
41
|
+
text: TextFieldComponent,
|
|
42
|
+
textarea: TextareaFieldComponent,
|
|
43
|
+
number: NumberFieldComponent,
|
|
44
|
+
currency: CurrencyFieldComponent,
|
|
45
|
+
email: EmailFieldComponent,
|
|
46
|
+
password: PasswordFieldComponent,
|
|
47
|
+
checkbox: CheckboxFieldComponent,
|
|
48
|
+
boolean: BooleanFieldComponent,
|
|
49
|
+
date: DateFieldComponent,
|
|
50
|
+
datetime: DateFieldComponent,
|
|
51
|
+
monthYear: MonthYearFieldComponent,
|
|
52
|
+
dropdown: DropdownFieldComponent,
|
|
53
|
+
radio: RadioFieldComponent,
|
|
54
|
+
multiSelect: MultiSelectFieldComponent,
|
|
55
|
+
'entity-ref': EntityRefFieldComponent,
|
|
56
|
+
group: GroupFieldComponent,
|
|
57
|
+
array: ArrayFieldComponent,
|
|
58
|
+
image: ImageFieldComponent,
|
|
59
|
+
file: FileFieldComponent,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Register a specific set of field types. Only the components you name are bundled. */
|
|
63
|
+
export function provideFieldTypes(types) {
|
|
64
|
+
return makeEnvironmentProviders([
|
|
65
|
+
{ provide: FIELD_TYPE_SETS, useValue: types, multi: true },
|
|
66
|
+
]);
|
|
67
|
+
}
|
|
68
|
+
/** Register all 19 built-in field type keys. Convenience for apps that use most of them. */
|
|
69
|
+
export function provideBuiltInFieldTypes() {
|
|
70
|
+
return provideFieldTypes(builtInFieldTypes());
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1maWVsZC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvdmlkZXJzL3Byb3ZpZGUtZmllbGQtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE4Qix3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDeEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCwrRkFBK0Y7QUFDL0YsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixPQUFPO1FBQ0wsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixRQUFRLEVBQUUsc0JBQXNCO1FBQ2hDLE1BQU0sRUFBRSxvQkFBb0I7UUFDNUIsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxPQUFPLEVBQUUscUJBQXFCO1FBQzlCLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixTQUFTLEVBQUUsdUJBQXVCO1FBQ2xDLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixXQUFXLEVBQUUseUJBQXlCO1FBQ3RDLFlBQVksRUFBRSx1QkFBdUI7UUFDckMsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLEtBQUssRUFBRSxtQkFBbUI7UUFDMUIsSUFBSSxFQUFFLGtCQUFrQjtLQUN6QixDQUFDO0FBQ0osQ0FBQztBQUVELHdGQUF3RjtBQUN4RixNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBZ0M7SUFDaEUsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QixFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0tBQzNELENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCw0RkFBNEY7QUFDNUYsTUFBTSxVQUFVLHdCQUF3QjtJQUN0QyxPQUFPLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIFR5cGUsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRklFTERfVFlQRV9TRVRTIH0gZnJvbSAnLi4vdG9rZW5zL2luamVjdGlvbi10b2tlbnMnO1xuXG5pbXBvcnQgeyBUZXh0RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy90ZXh0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0YXJlYUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvdGV4dGFyZWEtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvbnVtYmVyLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDdXJyZW5jeUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvY3VycmVuY3ktZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEVtYWlsRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9lbWFpbC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFzc3dvcmRGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL3Bhc3N3b3JkLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGVja2JveEZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvY2hlY2tib3gtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEJvb2xlYW5GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2Jvb2xlYW4tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2RhdGUtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IE1vbnRoWWVhckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvbW9udGgteWVhci1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcGRvd25GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2Ryb3Bkb3duLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSYWRpb0ZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvcmFkaW8tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpU2VsZWN0RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9tdWx0aS1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEVudGl0eVJlZkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvZW50aXR5LXJlZi1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR3JvdXBGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2dyb3VwLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcnJheUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvYXJyYXktZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEltYWdlRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9pbWFnZS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmlsZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvZmlsZS1maWVsZC5jb21wb25lbnQnO1xuXG4vKipcbiAqIEZpZWxkLXR5cGUgcmVnaXN0cmF0aW9uIOKAlCB0aGUgdHJlZS1zaGFraW5nIHNlYW0uXG4gKlxuICogYEZpZWxkUmVnaXN0cnlTZXJ2aWNlYCBpbXBvcnRzIG5vIGNvbXBvbmVudHMuIFdoYXRldmVyIHlvdSByZWdpc3RlciBoZXJlIGlzIHdoYXQgZ2V0c1xuICogYnVuZGxlZCwgc28gYW4gYXBwIHRoYXQgb25seSB1c2VzIHRleHQvbnVtYmVyL2Ryb3Bkb3duIHBheXMgZm9yIHRocmVlIGNvbXBvbmVudHMgYW5kXG4gKiB0aGVpciBpbXBvcnRzLCBub3QgbmluZXRlZW4uXG4gKlxuICogYGBgdHNcbiAqIC8vIEV2ZXJ5dGhpbmcgKGNvbnZlbmllbnQ7IGJ1bmRsZXMgYWxsIGJ1aWx0LWlucyk6XG4gKiBwcm92aWRlTmd4RHluYW1pY0VudGl0eSgpLCBwcm92aWRlQnVpbHRJbkZpZWxkVHlwZXMoKVxuICpcbiAqIC8vIE9ubHkgd2hhdCB0aGlzIGFwcCByZW5kZXJzOlxuICogcHJvdmlkZUZpZWxkVHlwZXMoeyB0ZXh0OiBUZXh0RmllbGRDb21wb25lbnQsIG51bWJlcjogTnVtYmVyRmllbGRDb21wb25lbnQgfSlcbiAqIGBgYFxuICpcbiAqIEJvdGggbWVyZ2UgaW50byBgRklFTERfVFlQRV9SRUdJU1RSWWA7IGxhdGVyIHJlZ2lzdHJhdGlvbnMgd2luIG9uIGtleSBjb2xsaXNpb24uXG4gKi9cblxuLyoqIE1hcCBvZiBldmVyeSBidWlsdC1pbiBmaWVsZCB0eXBlIGtleSDihpIgY29tcG9uZW50LiBSZWZlcmVuY2luZyB0aGlzIHB1bGxzIGluIGFsbCBvZiB0aGVtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWx0SW5GaWVsZFR5cGVzKCk6IFJlY29yZDxzdHJpbmcsIFR5cGU8YW55Pj4ge1xuICByZXR1cm4ge1xuICAgIHRleHQ6IFRleHRGaWVsZENvbXBvbmVudCxcbiAgICB0ZXh0YXJlYTogVGV4dGFyZWFGaWVsZENvbXBvbmVudCxcbiAgICBudW1iZXI6IE51bWJlckZpZWxkQ29tcG9uZW50LFxuICAgIGN1cnJlbmN5OiBDdXJyZW5jeUZpZWxkQ29tcG9uZW50LFxuICAgIGVtYWlsOiBFbWFpbEZpZWxkQ29tcG9uZW50LFxuICAgIHBhc3N3b3JkOiBQYXNzd29yZEZpZWxkQ29tcG9uZW50LFxuICAgIGNoZWNrYm94OiBDaGVja2JveEZpZWxkQ29tcG9uZW50LFxuICAgIGJvb2xlYW46IEJvb2xlYW5GaWVsZENvbXBvbmVudCxcbiAgICBkYXRlOiBEYXRlRmllbGRDb21wb25lbnQsXG4gICAgZGF0ZXRpbWU6IERhdGVGaWVsZENvbXBvbmVudCxcbiAgICBtb250aFllYXI6IE1vbnRoWWVhckZpZWxkQ29tcG9uZW50LFxuICAgIGRyb3Bkb3duOiBEcm9wZG93bkZpZWxkQ29tcG9uZW50LFxuICAgIHJhZGlvOiBSYWRpb0ZpZWxkQ29tcG9uZW50LFxuICAgIG11bHRpU2VsZWN0OiBNdWx0aVNlbGVjdEZpZWxkQ29tcG9uZW50LFxuICAgICdlbnRpdHktcmVmJzogRW50aXR5UmVmRmllbGRDb21wb25lbnQsXG4gICAgZ3JvdXA6IEdyb3VwRmllbGRDb21wb25lbnQsXG4gICAgYXJyYXk6IEFycmF5RmllbGRDb21wb25lbnQsXG4gICAgaW1hZ2U6IEltYWdlRmllbGRDb21wb25lbnQsXG4gICAgZmlsZTogRmlsZUZpZWxkQ29tcG9uZW50LFxuICB9O1xufVxuXG4vKiogUmVnaXN0ZXIgYSBzcGVjaWZpYyBzZXQgb2YgZmllbGQgdHlwZXMuIE9ubHkgdGhlIGNvbXBvbmVudHMgeW91IG5hbWUgYXJlIGJ1bmRsZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUZpZWxkVHlwZXModHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGU8YW55Pj4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHsgcHJvdmlkZTogRklFTERfVFlQRV9TRVRTLCB1c2VWYWx1ZTogdHlwZXMsIG11bHRpOiB0cnVlIH0sXG4gIF0pO1xufVxuXG4vKiogUmVnaXN0ZXIgYWxsIDE5IGJ1aWx0LWluIGZpZWxkIHR5cGUga2V5cy4gQ29udmVuaWVuY2UgZm9yIGFwcHMgdGhhdCB1c2UgbW9zdCBvZiB0aGVtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVCdWlsdEluRmllbGRUeXBlcygpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBwcm92aWRlRmllbGRUeXBlcyhidWlsdEluRmllbGRUeXBlcygpKTtcbn1cbiJdfQ==
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import { makeEnvironmentProviders } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { ENTITY_REF_REGISTRY, FIELD_TYPE_REGISTRY, HOOK_REGISTRY, RECORD_MIGRATIONS, LOOKUP_REGISTRY, MASKED_ROLES, VALIDATOR_REGISTRY, } from '../tokens/injection-tokens';
|
|
3
3
|
/**
|
|
4
4
|
* Provider function for ngx-dynamic-entity.
|
|
5
5
|
* All options are optional — consumers provide only what they use (ISP).
|
|
6
6
|
*
|
|
7
7
|
* Usage in app.config.ts:
|
|
8
8
|
* provideNgxDynamicEntity({
|
|
9
|
-
* apiUrl: 'http://localhost:3000/api/entities',
|
|
10
9
|
* maskedRoles: ['IT_SUPPORT'],
|
|
11
10
|
* entityRefs: { clients: () => clientService.getOptions() },
|
|
12
11
|
* })
|
|
13
12
|
*/
|
|
14
13
|
export const provideNgxDynamicEntity = (config = {}) => makeEnvironmentProviders([
|
|
15
|
-
{ provide: DYNAMIC_ENTITY_API_URL, useValue: config.apiUrl ?? '' },
|
|
16
14
|
{ provide: MASKED_ROLES, useValue: config.maskedRoles ?? [] },
|
|
17
|
-
{ provide: MIGRATION_STRATEGY, useValue: config.migrationStrategy ?? 'graceful' },
|
|
18
15
|
{ provide: FIELD_TYPE_REGISTRY, useValue: new Map(Object.entries(config.fieldTypes ?? {})) },
|
|
19
16
|
{ provide: ENTITY_REF_REGISTRY, useValue: new Map(Object.entries(config.entityRefs ?? {})) },
|
|
17
|
+
{ provide: LOOKUP_REGISTRY, useValue: new Map(Object.entries(config.lookups ?? {})) },
|
|
20
18
|
{ provide: VALIDATOR_REGISTRY, useValue: new Map(Object.entries(config.validators ?? {})) },
|
|
21
19
|
{ provide: HOOK_REGISTRY, useValue: new Map(Object.entries(config.hooks ?? {})) },
|
|
20
|
+
{ provide: RECORD_MIGRATIONS, useValue: config.migrations ?? [] },
|
|
22
21
|
]);
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1uZ3gtZHluYW1pYy1lbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Byb3ZpZGVycy9wcm92aWRlLW5neC1keW5hbWljLWVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXdCLHdCQUF3QixFQUFRLE1BQU0sZUFBZSxDQUFDO0FBRXJGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGFBQWEsRUFFYixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFlBQVksRUFDWixrQkFBa0IsR0FDbkIsTUFBTSw0QkFBNEIsQ0FBQztBQTZCcEM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxTQUFpQyxFQUFFLEVBQXdCLEVBQUUsQ0FDbkcsd0JBQXdCLENBQUM7SUFDdkIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsV0FBVyxJQUFJLEVBQUUsRUFBRTtJQUM3RCxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDNUYsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQzVGLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDckYsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQzNGLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDakYsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFO0NBQ2xFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudmlyb25tZW50UHJvdmlkZXJzLCBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgRW50aXR5UmVmZXJlbmNlTG9hZGVyLCBMb29rdXBMaXN0U291cmNlLCBSZWNvcmRNaWdyYXRpb24gfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQge1xuICBFTlRJVFlfUkVGX1JFR0lTVFJZLFxuICBGSUVMRF9UWVBFX1JFR0lTVFJZLFxuICBIT09LX1JFR0lTVFJZLFxuICB0eXBlIEhvb2tGbixcbiAgUkVDT1JEX01JR1JBVElPTlMsXG4gIExPT0tVUF9SRUdJU1RSWSxcbiAgTUFTS0VEX1JPTEVTLFxuICBWQUxJREFUT1JfUkVHSVNUUlksXG59IGZyb20gJy4uL3Rva2Vucy9pbmplY3Rpb24tdG9rZW5zJztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3hEeW5hbWljRW50aXR5Q29uZmlnIHtcbiAgLyoqIFJvbGVzIHRoYXQgc2VlIG1hc2tlZCBmaWVsZCB2YWx1ZXMgYXMgWFhYWFhYWFhYICovXG4gIG1hc2tlZFJvbGVzPzogc3RyaW5nW107XG4gIC8qKiBDdXN0b20gZmllbGQgdHlwZSBjb21wb25lbnRzIGtleWVkIGJ5IHR5cGUgc3RyaW5nICovXG4gIGZpZWxkVHlwZXM/OiBSZWNvcmQ8c3RyaW5nLCBUeXBlPGFueT4+O1xuICAvKipcbiAgICogRW50aXR5LXJlZiBvcHRpb24gbG9hZGVycyBrZXllZCBieSBlbnRpdHkga2V5IChBRFItMDA2KS5cbiAgICogRWFjaCByZWNlaXZlcyBgeyBwYXJlbnRWYWx1ZSwgZmlsdGVycywgbGFuZyB9YCBhbmQgbWF5IHJldHVybiBhbiBhcnJheSwgUHJvbWlzZSwgb3IgT2JzZXJ2YWJsZS5cbiAgICovXG4gIGVudGl0eVJlZnM/OiBSZWNvcmQ8c3RyaW5nLCBFbnRpdHlSZWZlcmVuY2VMb2FkZXI+O1xuICAvKipcbiAgICogTmFtZWQgbWFzdGVyIGxpc3RzIGtleWVkIGJ5IGxpc3QgbmFtZSwgZm9yIGZpZWxkcyB0aGF0IHNldCBgbGlzdE5hbWVgLlxuICAgKiBFYWNoIG1heSBiZSB0aGUgdmFsdWVzIHRoZW1zZWx2ZXMgKGFycmF5L1Byb21pc2UvT2JzZXJ2YWJsZSkgb3IgYSBsb2FkZXIgZnVuY3Rpb24g4oCUIHByZWZlclxuICAgKiBhIGxvYWRlciBmb3IgYW55dGhpbmcgZmV0Y2hlZCwgc28gYW4gdW51c2VkIGxpc3QgaXMgbmV2ZXIgbG9hZGVkLlxuICAgKi9cbiAgbG9va3Vwcz86IFJlY29yZDxzdHJpbmcsIExvb2t1cExpc3RTb3VyY2U+O1xuICAvKiogQ3VzdG9tIHZhbGlkYXRvciBmdW5jdGlvbnMga2V5ZWQgYnkgdmFsaWRhdG9yIG5hbWUgKi9cbiAgdmFsaWRhdG9ycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBIb29rIGZ1bmN0aW9ucyBrZXllZCBieSBob29rIG5hbWUgKi9cbiAgaG9va3M/OiBSZWNvcmQ8c3RyaW5nLCBIb29rRm4+O1xuICAvKipcbiAgICogT3JkZXJlZCBzdGVwcyB0aGF0IHVwZ3JhZGUgYSBzYXZlZCByZWNvcmQgd2hlbiBgRW50aXR5Rm9ybUNvbmZpZy52ZXJzaW9uYCBtb3ZlcyBhaGVhZFxuICAgKiBvZiB0aGUgcmVjb3JkJ3MgYF9jb25maWdWZXJzaW9uYC4gQXBwbGllZCB0byBgaW5pdGlhbERhdGFgIGJlZm9yZSB0aGUgZm9ybSBpcyBwYXRjaGVkLlxuICAgKi9cbiAgbWlncmF0aW9ucz86IFJlY29yZE1pZ3JhdGlvbltdO1xufVxuXG4vKipcbiAqIFByb3ZpZGVyIGZ1bmN0aW9uIGZvciBuZ3gtZHluYW1pYy1lbnRpdHkuXG4gKiBBbGwgb3B0aW9ucyBhcmUgb3B0aW9uYWwg4oCUIGNvbnN1bWVycyBwcm92aWRlIG9ubHkgd2hhdCB0aGV5IHVzZSAoSVNQKS5cbiAqXG4gKiBVc2FnZSBpbiBhcHAuY29uZmlnLnRzOlxuICogICBwcm92aWRlTmd4RHluYW1pY0VudGl0eSh7XG4gKiAgICAgbWFza2VkUm9sZXM6IFsnSVRfU1VQUE9SVCddLFxuICogICAgIGVudGl0eVJlZnM6IHsgY2xpZW50czogKCkgPT4gY2xpZW50U2VydmljZS5nZXRPcHRpb25zKCkgfSxcbiAqICAgfSlcbiAqL1xuZXhwb3J0IGNvbnN0IHByb3ZpZGVOZ3hEeW5hbWljRW50aXR5ID0gKGNvbmZpZzogTmd4RHluYW1pY0VudGl0eUNvbmZpZyA9IHt9KTogRW52aXJvbm1lbnRQcm92aWRlcnMgPT5cbiAgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7IHByb3ZpZGU6IE1BU0tFRF9ST0xFUywgdXNlVmFsdWU6IGNvbmZpZy5tYXNrZWRSb2xlcyA/PyBbXSB9LFxuICAgIHsgcHJvdmlkZTogRklFTERfVFlQRV9SRUdJU1RSWSwgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLmZpZWxkVHlwZXMgPz8ge30pKSB9LFxuICAgIHsgcHJvdmlkZTogRU5USVRZX1JFRl9SRUdJU1RSWSwgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLmVudGl0eVJlZnMgPz8ge30pKSB9LFxuICAgIHsgcHJvdmlkZTogTE9PS1VQX1JFR0lTVFJZLCB1c2VWYWx1ZTogbmV3IE1hcChPYmplY3QuZW50cmllcyhjb25maWcubG9va3VwcyA/PyB7fSkpIH0sXG4gICAgeyBwcm92aWRlOiBWQUxJREFUT1JfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy52YWxpZGF0b3JzID8/IHt9KSkgfSxcbiAgICB7IHByb3ZpZGU6IEhPT0tfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5ob29rcyA/PyB7fSkpIH0sXG4gICAgeyBwcm92aWRlOiBSRUNPUkRfTUlHUkFUSU9OUywgdXNlVmFsdWU6IGNvbmZpZy5taWdyYXRpb25zID8/IFtdIH0sXG4gIF0pO1xuIl19
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { applyCascadeFilter } from '@dynamic-entity/core';
|
|
3
|
+
import { EntityRefRegistryService } from './entity-ref-registry.service';
|
|
4
|
+
import { EntityReferenceService } from './entity-reference.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* CascadeDataService — loads entity-reference options and applies parent→child cascades.
|
|
8
|
+
*
|
|
9
|
+
* Loaders come from the registry only (ADR-006). This service owns the three things a
|
|
10
|
+
* field component should not: resolving the loader, coercing whatever it returned
|
|
11
|
+
* (array | Promise | Observable) into a Promise, and filtering by the parent's value.
|
|
12
|
+
*/
|
|
13
|
+
export class CascadeDataService {
|
|
14
|
+
registry = inject(EntityRefRegistryService);
|
|
15
|
+
references = inject(EntityReferenceService);
|
|
16
|
+
/** Preload runs by formConfigId, so a second call joins the first rather than re-fetching. */
|
|
17
|
+
preloads = new Map();
|
|
18
|
+
/** Registry key for a field: explicit `linkedEntityKey`, else the field id. */
|
|
19
|
+
entityKeyFor(field) {
|
|
20
|
+
return field.entityReference?.linkedEntityKey ?? field.id;
|
|
21
|
+
}
|
|
22
|
+
/** Whether a loader is registered for this field. */
|
|
23
|
+
canLoad(field) {
|
|
24
|
+
return this.registry.has(this.entityKeyFor(field));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load the options for a field, cascade-filtered against `parentValue`.
|
|
28
|
+
* Returns `[]` when no loader is registered, or when a cascade child has no parent value yet.
|
|
29
|
+
*/
|
|
30
|
+
async load(field, ctx = {}) {
|
|
31
|
+
const cfg = field.entityReference;
|
|
32
|
+
if (!this.canLoad(field))
|
|
33
|
+
return [];
|
|
34
|
+
// A cascade child with no parent selection must offer nothing.
|
|
35
|
+
const hasParentValue = ctx.parentValue !== null && ctx.parentValue !== undefined && ctx.parentValue !== '';
|
|
36
|
+
if (cfg?.parentField && !hasParentValue)
|
|
37
|
+
return [];
|
|
38
|
+
const lang = ctx.lang ?? 'en';
|
|
39
|
+
// When the cascade can be resolved locally (`lookupFilter`/`lookupPath`), fetch the
|
|
40
|
+
// unfiltered set once and filter per parent below — switching parent then costs nothing.
|
|
41
|
+
// Otherwise the loader is the only thing that can narrow the list, so `parentValue` is
|
|
42
|
+
// passed through and becomes part of the cache identity (one entry per parent).
|
|
43
|
+
const filtersLocally = !!(cfg?.lookupFilter || cfg?.lookupPath);
|
|
44
|
+
const options = await this.references.load(this.entityKeyFor(field), {
|
|
45
|
+
...ctx,
|
|
46
|
+
parentValue: filtersLocally ? undefined : ctx.parentValue,
|
|
47
|
+
filters: { ...(cfg?.filters ?? {}), ...(ctx.filters ?? {}) },
|
|
48
|
+
displayFields: cfg?.displayFields,
|
|
49
|
+
lang,
|
|
50
|
+
});
|
|
51
|
+
return applyCascadeFilter(options, ctx.parentValue, cfg, lang);
|
|
52
|
+
}
|
|
53
|
+
// ─── Preload ────────────────────────────────────────────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* Warm the cache for every entity a config's cascades depend on, so changing a parent
|
|
56
|
+
* resolves from memory instead of a round-trip.
|
|
57
|
+
*
|
|
58
|
+
* Idempotent per `formConfigId`: calling it again returns the in-flight or completed run
|
|
59
|
+
* rather than re-fetching.
|
|
60
|
+
*/
|
|
61
|
+
initializeCascadeData(formConfigId, config, lang = 'en') {
|
|
62
|
+
const existing = this.preloads.get(formConfigId);
|
|
63
|
+
if (existing)
|
|
64
|
+
return existing;
|
|
65
|
+
const fields = this.cascadeFields(config);
|
|
66
|
+
const run = Promise.all(fields.map(field => this.references.load(this.entityKeyFor(field), {
|
|
67
|
+
filters: field.entityReference?.filters,
|
|
68
|
+
displayFields: field.entityReference?.displayFields,
|
|
69
|
+
lang,
|
|
70
|
+
}))).then(() => undefined);
|
|
71
|
+
this.preloads.set(formConfigId, run);
|
|
72
|
+
return run;
|
|
73
|
+
}
|
|
74
|
+
/** Resolves true once `initializeCascadeData` for this config has finished. */
|
|
75
|
+
async waitForData(formConfigId) {
|
|
76
|
+
const run = this.preloads.get(formConfigId);
|
|
77
|
+
if (!run)
|
|
78
|
+
return false;
|
|
79
|
+
await run;
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Child options for a parent selection, from cache only — no load is triggered.
|
|
84
|
+
* Returns `[]` when the entity has not been preloaded.
|
|
85
|
+
*/
|
|
86
|
+
getCachedChildOptions(field, parentValue, lang = 'en') {
|
|
87
|
+
const cfg = field.entityReference;
|
|
88
|
+
const cached = this.references.peek(this.entityKeyFor(field), {
|
|
89
|
+
filters: cfg?.filters,
|
|
90
|
+
displayFields: cfg?.displayFields,
|
|
91
|
+
lang,
|
|
92
|
+
});
|
|
93
|
+
if (!cached)
|
|
94
|
+
return [];
|
|
95
|
+
return applyCascadeFilter(cached, parentValue, cfg, lang);
|
|
96
|
+
}
|
|
97
|
+
/** Forget the preload for one config. The option cache itself is untouched. */
|
|
98
|
+
clearCache(formConfigId) {
|
|
99
|
+
this.preloads.delete(formConfigId);
|
|
100
|
+
}
|
|
101
|
+
/** Every entity-ref field in the config that participates in a cascade. */
|
|
102
|
+
cascadeFields(config) {
|
|
103
|
+
const found = [];
|
|
104
|
+
const walkFields = (fields) => {
|
|
105
|
+
for (const field of fields ?? []) {
|
|
106
|
+
const cfg = field.entityReference;
|
|
107
|
+
if (cfg?.enabled && (cfg.parentField || cfg.lookupPath || cfg.lookupFilter)) {
|
|
108
|
+
found.push(field);
|
|
109
|
+
}
|
|
110
|
+
walkFields(field.children);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const walkTabs = (tabs) => {
|
|
114
|
+
for (const tab of tabs ?? []) {
|
|
115
|
+
walkFields(tab.fields);
|
|
116
|
+
walkTabs(tab.children);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
walkTabs(config?.tabs);
|
|
120
|
+
return found;
|
|
121
|
+
}
|
|
122
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CascadeDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
123
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CascadeDataService, providedIn: 'root' });
|
|
124
|
+
}
|
|
125
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CascadeDataService, decorators: [{
|
|
126
|
+
type: Injectable,
|
|
127
|
+
args: [{ providedIn: 'root' }]
|
|
128
|
+
}] });
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzY2FkZS1kYXRhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2Nhc2NhZGUtZGF0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUVwRTs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osUUFBUSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzVDLFVBQVUsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUU3RCw4RkFBOEY7SUFDN0UsUUFBUSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBRTdELCtFQUErRTtJQUMvRSxZQUFZLENBQUMsS0FBd0I7UUFDbkMsT0FBTyxLQUFLLENBQUMsZUFBZSxFQUFFLGVBQWUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxxREFBcUQ7SUFDckQsT0FBTyxDQUFDLEtBQXdCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLEtBQXdCLEVBQ3hCLE1BQThCLEVBQUU7UUFFaEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVwQywrREFBK0Q7UUFDL0QsTUFBTSxjQUFjLEdBQ2xCLEdBQUcsQ0FBQyxXQUFXLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssRUFBRSxDQUFDO1FBQ3RGLElBQUksR0FBRyxFQUFFLFdBQVcsSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVuRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUU5QixvRkFBb0Y7UUFDcEYseUZBQXlGO1FBQ3pGLHVGQUF1RjtRQUN2RixnRkFBZ0Y7UUFDaEYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksSUFBSSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFaEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25FLEdBQUcsR0FBRztZQUNOLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVc7WUFDekQsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUU7WUFDNUQsYUFBYSxFQUFFLEdBQUcsRUFBRSxhQUFhO1lBQ2pDLElBQUk7U0FDTCxDQUFDLENBQUM7UUFFSCxPQUFPLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsK0VBQStFO0lBRS9FOzs7Ozs7T0FNRztJQUNILHFCQUFxQixDQUFDLFlBQW9CLEVBQUUsTUFBd0IsRUFBRSxJQUFJLEdBQUcsSUFBSTtRQUMvRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRCxJQUFJLFFBQVE7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUU5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQ3JCLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QyxPQUFPLEVBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxPQUFPO1lBQ3ZDLGFBQWEsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLGFBQWE7WUFDbkQsSUFBSTtTQUNMLENBQUMsQ0FDSCxDQUNGLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFvQjtRQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxDQUFDO1FBQ1YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUJBQXFCLENBQ25CLEtBQXdCLEVBQ3hCLFdBQW9CLEVBQ3BCLElBQUksR0FBRyxJQUFJO1FBRVgsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzVELE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTztZQUNyQixhQUFhLEVBQUUsR0FBRyxFQUFFLGFBQWE7WUFDakMsSUFBSTtTQUNMLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDdkIsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsK0VBQStFO0lBQy9FLFVBQVUsQ0FBQyxZQUFvQjtRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsMkVBQTJFO0lBQ25FLGFBQWEsQ0FBQyxNQUF3QjtRQUM1QyxNQUFNLEtBQUssR0FBd0IsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBdUMsRUFBRSxFQUFFO1lBQzdELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO2dCQUNsQyxJQUFJLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7b0JBQzVFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BCLENBQUM7Z0JBQ0QsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFtQyxFQUFFLEVBQUU7WUFDdkQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQzdCLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO3dHQXBJVSxrQkFBa0I7NEdBQWxCLGtCQUFrQixjQURMLE1BQU07OzRGQUNuQixrQkFBa0I7a0JBRDlCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEVudGl0eUZvcm1Db25maWcsXG4gIE5lc3RlZEZpZWxkQ29uZmlnLFxuICBOZXN0ZWRUYWJDb25maWcsXG4gIFJlZmVyZW5jZUxvYWRlckNvbnRleHQsXG4gIFJlZmVyZW5jZU9wdGlvbixcbn0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgYXBwbHlDYXNjYWRlRmlsdGVyIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgRW50aXR5UmVmUmVnaXN0cnlTZXJ2aWNlIH0gZnJvbSAnLi9lbnRpdHktcmVmLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRW50aXR5UmVmZXJlbmNlU2VydmljZSB9IGZyb20gJy4vZW50aXR5LXJlZmVyZW5jZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBDYXNjYWRlRGF0YVNlcnZpY2Ug4oCUIGxvYWRzIGVudGl0eS1yZWZlcmVuY2Ugb3B0aW9ucyBhbmQgYXBwbGllcyBwYXJlbnTihpJjaGlsZCBjYXNjYWRlcy5cbiAqXG4gKiBMb2FkZXJzIGNvbWUgZnJvbSB0aGUgcmVnaXN0cnkgb25seSAoQURSLTAwNikuIFRoaXMgc2VydmljZSBvd25zIHRoZSB0aHJlZSB0aGluZ3MgYVxuICogZmllbGQgY29tcG9uZW50IHNob3VsZCBub3Q6IHJlc29sdmluZyB0aGUgbG9hZGVyLCBjb2VyY2luZyB3aGF0ZXZlciBpdCByZXR1cm5lZFxuICogKGFycmF5IHwgUHJvbWlzZSB8IE9ic2VydmFibGUpIGludG8gYSBQcm9taXNlLCBhbmQgZmlsdGVyaW5nIGJ5IHRoZSBwYXJlbnQncyB2YWx1ZS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBDYXNjYWRlRGF0YVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5ID0gaW5qZWN0KEVudGl0eVJlZlJlZ2lzdHJ5U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmZXJlbmNlcyA9IGluamVjdChFbnRpdHlSZWZlcmVuY2VTZXJ2aWNlKTtcblxuICAvKiogUHJlbG9hZCBydW5zIGJ5IGZvcm1Db25maWdJZCwgc28gYSBzZWNvbmQgY2FsbCBqb2lucyB0aGUgZmlyc3QgcmF0aGVyIHRoYW4gcmUtZmV0Y2hpbmcuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlbG9hZHMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcblxuICAvKiogUmVnaXN0cnkga2V5IGZvciBhIGZpZWxkOiBleHBsaWNpdCBgbGlua2VkRW50aXR5S2V5YCwgZWxzZSB0aGUgZmllbGQgaWQuICovXG4gIGVudGl0eUtleUZvcihmaWVsZDogTmVzdGVkRmllbGRDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWVsZC5lbnRpdHlSZWZlcmVuY2U/LmxpbmtlZEVudGl0eUtleSA/PyBmaWVsZC5pZDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGEgbG9hZGVyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZmllbGQuICovXG4gIGNhbkxvYWQoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuaGFzKHRoaXMuZW50aXR5S2V5Rm9yKGZpZWxkKSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgb3B0aW9ucyBmb3IgYSBmaWVsZCwgY2FzY2FkZS1maWx0ZXJlZCBhZ2FpbnN0IGBwYXJlbnRWYWx1ZWAuXG4gICAqIFJldHVybnMgYFtdYCB3aGVuIG5vIGxvYWRlciBpcyByZWdpc3RlcmVkLCBvciB3aGVuIGEgY2FzY2FkZSBjaGlsZCBoYXMgbm8gcGFyZW50IHZhbHVlIHlldC5cbiAgICovXG4gIGFzeW5jIGxvYWQoXG4gICAgZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLFxuICAgIGN0eDogUmVmZXJlbmNlTG9hZGVyQ29udGV4dCA9IHt9LFxuICApOiBQcm9taXNlPFJlZmVyZW5jZU9wdGlvbltdPiB7XG4gICAgY29uc3QgY2ZnID0gZmllbGQuZW50aXR5UmVmZXJlbmNlO1xuICAgIGlmICghdGhpcy5jYW5Mb2FkKGZpZWxkKSkgcmV0dXJuIFtdO1xuXG4gICAgLy8gQSBjYXNjYWRlIGNoaWxkIHdpdGggbm8gcGFyZW50IHNlbGVjdGlvbiBtdXN0IG9mZmVyIG5vdGhpbmcuXG4gICAgY29uc3QgaGFzUGFyZW50VmFsdWUgPVxuICAgICAgY3R4LnBhcmVudFZhbHVlICE9PSBudWxsICYmIGN0eC5wYXJlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGN0eC5wYXJlbnRWYWx1ZSAhPT0gJyc7XG4gICAgaWYgKGNmZz8ucGFyZW50RmllbGQgJiYgIWhhc1BhcmVudFZhbHVlKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBsYW5nID0gY3R4LmxhbmcgPz8gJ2VuJztcblxuICAgIC8vIFdoZW4gdGhlIGNhc2NhZGUgY2FuIGJlIHJlc29sdmVkIGxvY2FsbHkgKGBsb29rdXBGaWx0ZXJgL2Bsb29rdXBQYXRoYCksIGZldGNoIHRoZVxuICAgIC8vIHVuZmlsdGVyZWQgc2V0IG9uY2UgYW5kIGZpbHRlciBwZXIgcGFyZW50IGJlbG93IOKAlCBzd2l0Y2hpbmcgcGFyZW50IHRoZW4gY29zdHMgbm90aGluZy5cbiAgICAvLyBPdGhlcndpc2UgdGhlIGxvYWRlciBpcyB0aGUgb25seSB0aGluZyB0aGF0IGNhbiBuYXJyb3cgdGhlIGxpc3QsIHNvIGBwYXJlbnRWYWx1ZWAgaXNcbiAgICAvLyBwYXNzZWQgdGhyb3VnaCBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjYWNoZSBpZGVudGl0eSAob25lIGVudHJ5IHBlciBwYXJlbnQpLlxuICAgIGNvbnN0IGZpbHRlcnNMb2NhbGx5ID0gISEoY2ZnPy5sb29rdXBGaWx0ZXIgfHwgY2ZnPy5sb29rdXBQYXRoKTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLnJlZmVyZW5jZXMubG9hZCh0aGlzLmVudGl0eUtleUZvcihmaWVsZCksIHtcbiAgICAgIC4uLmN0eCxcbiAgICAgIHBhcmVudFZhbHVlOiBmaWx0ZXJzTG9jYWxseSA/IHVuZGVmaW5lZCA6IGN0eC5wYXJlbnRWYWx1ZSxcbiAgICAgIGZpbHRlcnM6IHsgLi4uKGNmZz8uZmlsdGVycyA/PyB7fSksIC4uLihjdHguZmlsdGVycyA/PyB7fSkgfSxcbiAgICAgIGRpc3BsYXlGaWVsZHM6IGNmZz8uZGlzcGxheUZpZWxkcyxcbiAgICAgIGxhbmcsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXBwbHlDYXNjYWRlRmlsdGVyKG9wdGlvbnMsIGN0eC5wYXJlbnRWYWx1ZSwgY2ZnLCBsYW5nKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQcmVsb2FkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBXYXJtIHRoZSBjYWNoZSBmb3IgZXZlcnkgZW50aXR5IGEgY29uZmlnJ3MgY2FzY2FkZXMgZGVwZW5kIG9uLCBzbyBjaGFuZ2luZyBhIHBhcmVudFxuICAgKiByZXNvbHZlcyBmcm9tIG1lbW9yeSBpbnN0ZWFkIG9mIGEgcm91bmQtdHJpcC5cbiAgICpcbiAgICogSWRlbXBvdGVudCBwZXIgYGZvcm1Db25maWdJZGA6IGNhbGxpbmcgaXQgYWdhaW4gcmV0dXJucyB0aGUgaW4tZmxpZ2h0IG9yIGNvbXBsZXRlZCBydW5cbiAgICogcmF0aGVyIHRoYW4gcmUtZmV0Y2hpbmcuXG4gICAqL1xuICBpbml0aWFsaXplQ2FzY2FkZURhdGEoZm9ybUNvbmZpZ0lkOiBzdHJpbmcsIGNvbmZpZzogRW50aXR5Rm9ybUNvbmZpZywgbGFuZyA9ICdlbicpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMucHJlbG9hZHMuZ2V0KGZvcm1Db25maWdJZCk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG5cbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmNhc2NhZGVGaWVsZHMoY29uZmlnKTtcbiAgICBjb25zdCBydW4gPSBQcm9taXNlLmFsbChcbiAgICAgIGZpZWxkcy5tYXAoZmllbGQgPT5cbiAgICAgICAgdGhpcy5yZWZlcmVuY2VzLmxvYWQodGhpcy5lbnRpdHlLZXlGb3IoZmllbGQpLCB7XG4gICAgICAgICAgZmlsdGVyczogZmllbGQuZW50aXR5UmVmZXJlbmNlPy5maWx0ZXJzLFxuICAgICAgICAgIGRpc3BsYXlGaWVsZHM6IGZpZWxkLmVudGl0eVJlZmVyZW5jZT8uZGlzcGxheUZpZWxkcyxcbiAgICAgICAgICBsYW5nLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKS50aGVuKCgpID0+IHVuZGVmaW5lZCk7XG5cbiAgICB0aGlzLnByZWxvYWRzLnNldChmb3JtQ29uZmlnSWQsIHJ1bik7XG4gICAgcmV0dXJuIHJ1bjtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlcyB0cnVlIG9uY2UgYGluaXRpYWxpemVDYXNjYWRlRGF0YWAgZm9yIHRoaXMgY29uZmlnIGhhcyBmaW5pc2hlZC4gKi9cbiAgYXN5bmMgd2FpdEZvckRhdGEoZm9ybUNvbmZpZ0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBydW4gPSB0aGlzLnByZWxvYWRzLmdldChmb3JtQ29uZmlnSWQpO1xuICAgIGlmICghcnVuKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgcnVuO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoaWxkIG9wdGlvbnMgZm9yIGEgcGFyZW50IHNlbGVjdGlvbiwgZnJvbSBjYWNoZSBvbmx5IOKAlCBubyBsb2FkIGlzIHRyaWdnZXJlZC5cbiAgICogUmV0dXJucyBgW11gIHdoZW4gdGhlIGVudGl0eSBoYXMgbm90IGJlZW4gcHJlbG9hZGVkLlxuICAgKi9cbiAgZ2V0Q2FjaGVkQ2hpbGRPcHRpb25zKFxuICAgIGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyxcbiAgICBwYXJlbnRWYWx1ZTogdW5rbm93bixcbiAgICBsYW5nID0gJ2VuJyxcbiAgKTogUmVmZXJlbmNlT3B0aW9uW10ge1xuICAgIGNvbnN0IGNmZyA9IGZpZWxkLmVudGl0eVJlZmVyZW5jZTtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnJlZmVyZW5jZXMucGVlayh0aGlzLmVudGl0eUtleUZvcihmaWVsZCksIHtcbiAgICAgIGZpbHRlcnM6IGNmZz8uZmlsdGVycyxcbiAgICAgIGRpc3BsYXlGaWVsZHM6IGNmZz8uZGlzcGxheUZpZWxkcyxcbiAgICAgIGxhbmcsXG4gICAgfSk7XG4gICAgaWYgKCFjYWNoZWQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXBwbHlDYXNjYWRlRmlsdGVyKGNhY2hlZCwgcGFyZW50VmFsdWUsIGNmZywgbGFuZyk7XG4gIH1cblxuICAvKiogRm9yZ2V0IHRoZSBwcmVsb2FkIGZvciBvbmUgY29uZmlnLiBUaGUgb3B0aW9uIGNhY2hlIGl0c2VsZiBpcyB1bnRvdWNoZWQuICovXG4gIGNsZWFyQ2FjaGUoZm9ybUNvbmZpZ0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnByZWxvYWRzLmRlbGV0ZShmb3JtQ29uZmlnSWQpO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGVudGl0eS1yZWYgZmllbGQgaW4gdGhlIGNvbmZpZyB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIGNhc2NhZGUuICovXG4gIHByaXZhdGUgY2FzY2FkZUZpZWxkcyhjb25maWc6IEVudGl0eUZvcm1Db25maWcpOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHtcbiAgICBjb25zdCBmb3VuZDogTmVzdGVkRmllbGRDb25maWdbXSA9IFtdO1xuICAgIGNvbnN0IHdhbGtGaWVsZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcyA/PyBbXSkge1xuICAgICAgICBjb25zdCBjZmcgPSBmaWVsZC5lbnRpdHlSZWZlcmVuY2U7XG4gICAgICAgIGlmIChjZmc/LmVuYWJsZWQgJiYgKGNmZy5wYXJlbnRGaWVsZCB8fCBjZmcubG9va3VwUGF0aCB8fCBjZmcubG9va3VwRmlsdGVyKSkge1xuICAgICAgICAgIGZvdW5kLnB1c2goZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIHdhbGtGaWVsZHMoZmllbGQuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdGFiIG9mIHRhYnMgPz8gW10pIHtcbiAgICAgICAgd2Fsa0ZpZWxkcyh0YWIuZmllbGRzKTtcbiAgICAgICAgd2Fsa1RhYnModGFiLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGtUYWJzKGNvbmZpZz8udGFicyk7XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Injectable, Inject, Optional } from '@angular/core';
|
|
2
|
+
import { isObservable, firstValueFrom } from 'rxjs';
|
|
3
|
+
import { CONFIG_SOURCE } from '../tokens/injection-tokens';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class ConfigSourceService {
|
|
6
|
+
cache = new Map();
|
|
7
|
+
inFlight = new Map();
|
|
8
|
+
handler;
|
|
9
|
+
constructor(handler) {
|
|
10
|
+
this.handler = handler;
|
|
11
|
+
}
|
|
12
|
+
/** Retrieve an entity config by key, with caching and in-flight deduplication. */
|
|
13
|
+
async getConfig(entityKey) {
|
|
14
|
+
if (!entityKey || !this.handler)
|
|
15
|
+
return undefined;
|
|
16
|
+
if (this.cache.has(entityKey))
|
|
17
|
+
return this.cache.get(entityKey);
|
|
18
|
+
if (this.inFlight.has(entityKey))
|
|
19
|
+
return this.inFlight.get(entityKey);
|
|
20
|
+
const promise = (async () => {
|
|
21
|
+
try {
|
|
22
|
+
const raw = this.handler(entityKey);
|
|
23
|
+
let resolved;
|
|
24
|
+
if (isObservable(raw)) {
|
|
25
|
+
resolved = await firstValueFrom(raw);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
resolved = await Promise.resolve(raw);
|
|
29
|
+
}
|
|
30
|
+
if (resolved) {
|
|
31
|
+
this.cache.set(entityKey, resolved);
|
|
32
|
+
}
|
|
33
|
+
return resolved;
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
console.warn(`ConfigSourceService failed to load config for entity "${entityKey}"`, err);
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
this.inFlight.delete(entityKey);
|
|
41
|
+
}
|
|
42
|
+
})();
|
|
43
|
+
this.inFlight.set(entityKey, promise);
|
|
44
|
+
return promise;
|
|
45
|
+
}
|
|
46
|
+
/** Clear cached configs (e.g. after a config edit in the builder). */
|
|
47
|
+
clearCache(entityKey) {
|
|
48
|
+
if (entityKey) {
|
|
49
|
+
this.cache.delete(entityKey);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.cache.clear();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConfigSourceService, deps: [{ token: CONFIG_SOURCE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
56
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConfigSourceService, providedIn: 'root' });
|
|
57
|
+
}
|
|
58
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConfigSourceService, decorators: [{
|
|
59
|
+
type: Injectable,
|
|
60
|
+
args: [{ providedIn: 'root' }]
|
|
61
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
62
|
+
type: Optional
|
|
63
|
+
}, {
|
|
64
|
+
type: Inject,
|
|
65
|
+
args: [CONFIG_SOURCE]
|
|
66
|
+
}] }] });
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLXNvdXJjZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9jb25maWctc291cmNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQTRCLE1BQU0sNEJBQTRCLENBQUM7O0FBR3JGLE1BQU0sT0FBTyxtQkFBbUI7SUFDYixLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDNUMsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFpRCxDQUFDO0lBRXBFLE9BQU8sQ0FBdUI7SUFFL0MsWUFBK0MsT0FBYTtRQUMxRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBaUI7UUFDL0IsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RSxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLFFBQXNDLENBQUM7Z0JBRTNDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3RCLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FBQyxHQUFVLENBQUMsQ0FBQztnQkFDOUMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBVSxDQUFDLENBQUM7Z0JBQy9DLENBQUM7Z0JBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7Z0JBQ0QsT0FBTyxRQUFRLENBQUM7WUFDbEIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyx5REFBeUQsU0FBUyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3pGLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVMLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLFVBQVUsQ0FBQyxTQUFrQjtRQUMzQixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO3dHQWxEVSxtQkFBbUIsa0JBTUUsYUFBYTs0R0FObEMsbUJBQW1CLGNBRE4sTUFBTTs7NEZBQ25CLG1CQUFtQjtrQkFEL0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQU9uQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eUZvcm1Db25maWcgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBpc09ic2VydmFibGUsIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDT05GSUdfU09VUkNFLCB0eXBlIENvbmZpZ1NvdXJjZUhhbmRsZXIgfSBmcm9tICcuLi90b2tlbnMvaW5qZWN0aW9uLXRva2Vucyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ29uZmlnU291cmNlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRW50aXR5Rm9ybUNvbmZpZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPEVudGl0eUZvcm1Db25maWcgfCB1bmRlZmluZWQ+PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcj86IENvbmZpZ1NvdXJjZUhhbmRsZXI7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChDT05GSUdfU09VUkNFKSBoYW5kbGVyPzogYW55KSB7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKiBSZXRyaWV2ZSBhbiBlbnRpdHkgY29uZmlnIGJ5IGtleSwgd2l0aCBjYWNoaW5nIGFuZCBpbi1mbGlnaHQgZGVkdXBsaWNhdGlvbi4gKi9cbiAgYXN5bmMgZ2V0Q29uZmlnKGVudGl0eUtleTogc3RyaW5nKTogUHJvbWlzZTxFbnRpdHlGb3JtQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCFlbnRpdHlLZXkgfHwgIXRoaXMuaGFuZGxlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5jYWNoZS5oYXMoZW50aXR5S2V5KSkgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGVudGl0eUtleSk7XG4gICAgaWYgKHRoaXMuaW5GbGlnaHQuaGFzKGVudGl0eUtleSkpIHJldHVybiB0aGlzLmluRmxpZ2h0LmdldChlbnRpdHlLZXkpO1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSB0aGlzLmhhbmRsZXIhKGVudGl0eUtleSk7XG4gICAgICAgIGxldCByZXNvbHZlZDogRW50aXR5Rm9ybUNvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKHJhdykpIHtcbiAgICAgICAgICByZXNvbHZlZCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHJhdyBhcyBhbnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHJhdyBhcyBhbnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQoZW50aXR5S2V5LCByZXNvbHZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ29uZmlnU291cmNlU2VydmljZSBmYWlsZWQgdG8gbG9hZCBjb25maWcgZm9yIGVudGl0eSBcIiR7ZW50aXR5S2V5fVwiYCwgZXJyKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaW5GbGlnaHQuZGVsZXRlKGVudGl0eUtleSk7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIHRoaXMuaW5GbGlnaHQuc2V0KGVudGl0eUtleSwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvKiogQ2xlYXIgY2FjaGVkIGNvbmZpZ3MgKGUuZy4gYWZ0ZXIgYSBjb25maWcgZWRpdCBpbiB0aGUgYnVpbGRlcikuICovXG4gIGNsZWFyQ2FjaGUoZW50aXR5S2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGVudGl0eUtleSkge1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoZW50aXR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Default in-memory store. Lives as long as the injector that created it. */
|
|
2
|
+
export class InMemoryEntityRefCacheStore {
|
|
3
|
+
map = new Map();
|
|
4
|
+
get(key) {
|
|
5
|
+
return this.map.get(key);
|
|
6
|
+
}
|
|
7
|
+
set(key, value) {
|
|
8
|
+
this.map.set(key, value);
|
|
9
|
+
}
|
|
10
|
+
delete(key) {
|
|
11
|
+
this.map.delete(key);
|
|
12
|
+
}
|
|
13
|
+
keys() {
|
|
14
|
+
return [...this.map.keys()];
|
|
15
|
+
}
|
|
16
|
+
clear() {
|
|
17
|
+
this.map.clear();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZi1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZW50aXR5LXJlZi1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQkEsOEVBQThFO0FBQzlFLE1BQU0sT0FBTywyQkFBMkI7SUFDckIsR0FBRyxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBRTVELEdBQUcsQ0FBQyxHQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUF3QjtRQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlZmVyZW5jZU9wdGlvbiB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcblxuLyoqXG4gKiBCYWNraW5nIHN0b3JlIGZvciBjYWNoZWQgcmVmZXJlbmNlIG9wdGlvbnMuXG4gKlxuICogUGx1Z2dhYmxlIG9uIHB1cnBvc2UuIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24ga2VwdCBpdHMgY2FjaGUgaW4gYSBzZXJ2aWNlIGluc3RhbmNlLFxuICogc28gZXZlcnkgZW50aXR5IGxhYmVsIHdhcyByZS1mZXRjaGVkIG9uIGEgYnJvd3NlciByZWZyZXNoIChpc3N1ZSAjMjIgaW4gdGhlIGFyY2hpdGVjdHVyZVxuICogZG9jKS4gQSBjb25zdW1lciB0aGF0IHdhbnRzIHRoZSBjYWNoZSB0byBzdXJ2aXZlIGEgcmVsb2FkIGNhbiBiYWNrIHRoaXMgd2l0aFxuICogc2Vzc2lvblN0b3JhZ2U7IHRoZSBkZWZhdWx0IGtlZXBzIGl0IGluIG1lbW9yeSwgd2hpY2ggaXMgdGhlIHJpZ2h0IGNhbGwgZm9yIGEgbGlicmFyeVxuICogdGhhdCBtdXN0IG5vdCBzaWxlbnRseSBwZXJzaXN0IGEgdGVuYW50J3MgZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlSZWZDYWNoZVN0b3JlIHtcbiAgZ2V0KGtleTogc3RyaW5nKTogUmVmZXJlbmNlT3B0aW9uW10gfCB1bmRlZmluZWQ7XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFJlZmVyZW5jZU9wdGlvbltdKTogdm9pZDtcbiAgZGVsZXRlKGtleTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIEV2ZXJ5IGtleSBjdXJyZW50bHkgaGVsZCDigJQgdXNlZCBmb3IgcHJlZml4IGludmFsaWRhdGlvbiBvZiBvbmUgZW50aXR5LiAqL1xuICBrZXlzKCk6IHN0cmluZ1tdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG4vKiogRGVmYXVsdCBpbi1tZW1vcnkgc3RvcmUuIExpdmVzIGFzIGxvbmcgYXMgdGhlIGluamVjdG9yIHRoYXQgY3JlYXRlZCBpdC4gKi9cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeUVudGl0eVJlZkNhY2hlU3RvcmUgaW1wbGVtZW50cyBFbnRpdHlSZWZDYWNoZVN0b3JlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlT3B0aW9uW10+KCk7XG5cbiAgZ2V0KGtleTogc3RyaW5nKTogUmVmZXJlbmNlT3B0aW9uW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1hcC5nZXQoa2V5KTtcbiAgfVxuXG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFJlZmVyZW5jZU9wdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KGtleSwgdmFsdWUpO1xuICB9XG5cbiAgZGVsZXRlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuZGVsZXRlKGtleSk7XG4gIH1cblxuICBrZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMubWFwLmtleXMoKV07XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5jbGVhcigpO1xuICB9XG59XG4iXX0=
|
|
@@ -12,8 +12,8 @@ import * as i0 from "@angular/core";
|
|
|
12
12
|
export class EntityRefRegistryService {
|
|
13
13
|
registry = inject(ENTITY_REF_REGISTRY, { optional: true }) ?? new Map();
|
|
14
14
|
/**
|
|
15
|
-
* Get the option loader
|
|
16
|
-
* @returns
|
|
15
|
+
* Get the option loader for an entity key.
|
|
16
|
+
* @returns The loader, or null if none is registered.
|
|
17
17
|
*/
|
|
18
18
|
resolve(entityKey) {
|
|
19
19
|
return this.registry.get(entityKey) ?? null;
|
|
@@ -28,4 +28,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
28
28
|
type: Injectable,
|
|
29
29
|
args: [{ providedIn: 'root' }]
|
|
30
30
|
}] });
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZi1yZWdpc3RyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9lbnRpdHktcmVmLXJlZ2lzdHJ5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRWpFOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLE9BQU8sd0JBQXdCO0lBQ2xCLFFBQVEsR0FDdkIsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFFOUY7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLFNBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzlDLENBQUM7SUFFRCxHQUFHLENBQUMsU0FBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxDQUFDO3dHQWRVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCLGNBRFgsTUFBTTs7NEZBQ25CLHdCQUF3QjtrQkFEcEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgRW50aXR5UmVmZXJlbmNlTG9hZGVyIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuaW1wb3J0IHsgRU5USVRZX1JFRl9SRUdJU1RSWSB9IGZyb20gJy4uL3Rva2Vucy9pbmplY3Rpb24tdG9rZW5zJztcblxuLyoqXG4gKiBFbnRpdHlSZWZSZWdpc3RyeVNlcnZpY2Ug4oCUIHJlc29sdmVzIGVudGl0eS1yZWYgb3B0aW9uIGxvYWRlciBmdW5jdGlvbnMuXG4gKiBBRFItMDA2OiBFbnRpdHktcmVmIG9wdGlvbnMgY29tZSBPTkxZIGZyb20gdGhpcyByZWdpc3RyeS5cbiAqIE5ldmVyIHBhc3MgbG9hZGVycyB2aWEgQElucHV0KCkgb24gZmllbGQgY29tcG9uZW50cy5cbiAqXG4gKiBDb25zdW1lcnMgcmVnaXN0ZXIgbG9hZGVycyB2aWEgcHJvdmlkZU5neER5bmFtaWNFbnRpdHkoeyBlbnRpdHlSZWZzOiB7IGNsaWVudHM6ICgpID0+IFsuLi5dIH0gfSkuXG4gKiBFbnRpdHlSZWZGaWVsZENvbXBvbmVudCBpbmplY3RzIHRoaXMgc2VydmljZSBhbmQgY2FsbHMgcmVzb2x2ZShmaWVsZC5jb21wb25lbnQgPz8gZmllbGQuaWQpLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEVudGl0eVJlZlJlZ2lzdHJ5U2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnkgPVxuICAgIGluamVjdChFTlRJVFlfUkVGX1JFR0lTVFJZLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBNYXA8c3RyaW5nLCBFbnRpdHlSZWZlcmVuY2VMb2FkZXI+KCk7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3B0aW9uIGxvYWRlciBmb3IgYW4gZW50aXR5IGtleS5cbiAgICogQHJldHVybnMgVGhlIGxvYWRlciwgb3IgbnVsbCBpZiBub25lIGlzIHJlZ2lzdGVyZWQuXG4gICAqL1xuICByZXNvbHZlKGVudGl0eUtleTogc3RyaW5nKTogRW50aXR5UmVmZXJlbmNlTG9hZGVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0KGVudGl0eUtleSkgPz8gbnVsbDtcbiAgfVxuXG4gIGhhcyhlbnRpdHlLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmhhcyhlbnRpdHlLZXkpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* EntityRefSelectionService — the channel an entity-ref field uses to publish *which record*
|
|
6
|
+
* the user picked, so the owning form can run `autoPatch` against it.
|
|
7
|
+
*
|
|
8
|
+
* The control value alone is not enough: `autoPatch` copies fields out of the selected
|
|
9
|
+
* record, which only the field component has after loading its options.
|
|
10
|
+
*
|
|
11
|
+
* Provided at `DynamicFormComponent` level so each form instance gets its own channel;
|
|
12
|
+
* the `root` fallback keeps standalone field components injectable in isolation.
|
|
13
|
+
*/
|
|
14
|
+
export class EntityRefSelectionService {
|
|
15
|
+
subject = new Subject();
|
|
16
|
+
selection$ = this.subject.asObservable();
|
|
17
|
+
emit(fieldId, option) {
|
|
18
|
+
this.subject.next({ fieldId, option });
|
|
19
|
+
}
|
|
20
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EntityRefSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
21
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EntityRefSelectionService, providedIn: 'root' });
|
|
22
|
+
}
|
|
23
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EntityRefSelectionService, decorators: [{
|
|
24
|
+
type: Injectable,
|
|
25
|
+
args: [{ providedIn: 'root' }]
|
|
26
|
+
}] });
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZi1zZWxlY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZW50aXR5LXJlZi1zZWxlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBUy9COzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTyx5QkFBeUI7SUFDbkIsT0FBTyxHQUFHLElBQUksT0FBTyxFQUFzQixDQUFDO0lBRXBELFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRWxELElBQUksQ0FBQyxPQUFlLEVBQUUsTUFBOEI7UUFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO3dHQVBVLHlCQUF5Qjs0R0FBekIseUJBQXlCLGNBRFosTUFBTTs7NEZBQ25CLHlCQUF5QjtrQkFEckMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgdHlwZSB7IFJlZmVyZW5jZU9wdGlvbiB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlSZWZTZWxlY3Rpb24ge1xuICBmaWVsZElkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY2hvc2VuIG9wdGlvbiwgb3IgYG51bGxgIHdoZW4gdGhlIHNlbGVjdGlvbiB3YXMgY2xlYXJlZC4gKi9cbiAgb3B0aW9uOiBSZWZlcmVuY2VPcHRpb24gfCBudWxsO1xufVxuXG4vKipcbiAqIEVudGl0eVJlZlNlbGVjdGlvblNlcnZpY2Ug4oCUIHRoZSBjaGFubmVsIGFuIGVudGl0eS1yZWYgZmllbGQgdXNlcyB0byBwdWJsaXNoICp3aGljaCByZWNvcmQqXG4gKiB0aGUgdXNlciBwaWNrZWQsIHNvIHRoZSBvd25pbmcgZm9ybSBjYW4gcnVuIGBhdXRvUGF0Y2hgIGFnYWluc3QgaXQuXG4gKlxuICogVGhlIGNvbnRyb2wgdmFsdWUgYWxvbmUgaXMgbm90IGVub3VnaDogYGF1dG9QYXRjaGAgY29waWVzIGZpZWxkcyBvdXQgb2YgdGhlIHNlbGVjdGVkXG4gKiByZWNvcmQsIHdoaWNoIG9ubHkgdGhlIGZpZWxkIGNvbXBvbmVudCBoYXMgYWZ0ZXIgbG9hZGluZyBpdHMgb3B0aW9ucy5cbiAqXG4gKiBQcm92aWRlZCBhdCBgRHluYW1pY0Zvcm1Db21wb25lbnRgIGxldmVsIHNvIGVhY2ggZm9ybSBpbnN0YW5jZSBnZXRzIGl0cyBvd24gY2hhbm5lbDtcbiAqIHRoZSBgcm9vdGAgZmFsbGJhY2sga2VlcHMgc3RhbmRhbG9uZSBmaWVsZCBjb21wb25lbnRzIGluamVjdGFibGUgaW4gaXNvbGF0aW9uLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEVudGl0eVJlZlNlbGVjdGlvblNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmplY3QgPSBuZXcgU3ViamVjdDxFbnRpdHlSZWZTZWxlY3Rpb24+KCk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uJCA9IHRoaXMuc3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBlbWl0KGZpZWxkSWQ6IHN0cmluZywgb3B0aW9uOiBSZWZlcmVuY2VPcHRpb24gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zdWJqZWN0Lm5leHQoeyBmaWVsZElkLCBvcHRpb24gfSk7XG4gIH1cbn1cbiJdfQ==
|