ngx-dynamic-entity 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +14 -0
  2. package/fesm2022/ngx-dynamic-entity.mjs +228 -150
  3. package/fesm2022/ngx-dynamic-entity.mjs.map +1 -1
  4. package/package.json +6 -7
  5. package/types/ngx-dynamic-entity.d.ts +1719 -0
  6. package/esm2022/lib/field-types/array-field.component.mjs +0 -168
  7. package/esm2022/lib/field-types/boolean-field.component.mjs +0 -101
  8. package/esm2022/lib/field-types/checkbox-field.component.mjs +0 -82
  9. package/esm2022/lib/field-types/currency-field.component.mjs +0 -102
  10. package/esm2022/lib/field-types/date-field.component.mjs +0 -91
  11. package/esm2022/lib/field-types/date-time-field.component.mjs +0 -138
  12. package/esm2022/lib/field-types/dropdown-field.component.mjs +0 -176
  13. package/esm2022/lib/field-types/email-field.component.mjs +0 -102
  14. package/esm2022/lib/field-types/entity-ref-field.component.mjs +0 -195
  15. package/esm2022/lib/field-types/field-component.contract.mjs +0 -2
  16. package/esm2022/lib/field-types/file-field.component.mjs +0 -157
  17. package/esm2022/lib/field-types/group-field.component.mjs +0 -89
  18. package/esm2022/lib/field-types/image-field.component.mjs +0 -169
  19. package/esm2022/lib/field-types/month-year-field.component.mjs +0 -152
  20. package/esm2022/lib/field-types/multi-select-field.component.mjs +0 -146
  21. package/esm2022/lib/field-types/number-field.component.mjs +0 -112
  22. package/esm2022/lib/field-types/password-field.component.mjs +0 -110
  23. package/esm2022/lib/field-types/radio-field.component.mjs +0 -153
  24. package/esm2022/lib/field-types/text-field.component.mjs +0 -121
  25. package/esm2022/lib/field-types/textarea-field.component.mjs +0 -85
  26. package/esm2022/lib/field-types/time-field.component.mjs +0 -96
  27. package/esm2022/lib/form/dynamic-field/dynamic-field.component.mjs +0 -152
  28. package/esm2022/lib/form/dynamic-form.component.mjs +0 -899
  29. package/esm2022/lib/form/dynamic-record-form.component.mjs +0 -531
  30. package/esm2022/lib/providers/provide-field-types.mjs +0 -75
  31. package/esm2022/lib/providers/provide-ngx-dynamic-entity.mjs +0 -27
  32. package/esm2022/lib/services/cascade-data.service.mjs +0 -129
  33. package/esm2022/lib/services/config-source.service.mjs +0 -67
  34. package/esm2022/lib/services/entity-ref-cache.mjs +0 -20
  35. package/esm2022/lib/services/entity-ref-registry.service.mjs +0 -31
  36. package/esm2022/lib/services/entity-ref-selection.service.mjs +0 -27
  37. package/esm2022/lib/services/entity-reference.service.mjs +0 -168
  38. package/esm2022/lib/services/field-registry.service.mjs +0 -55
  39. package/esm2022/lib/services/file-upload.service.mjs +0 -89
  40. package/esm2022/lib/services/hook-registry.service.mjs +0 -26
  41. package/esm2022/lib/services/lookup-registry.service.mjs +0 -246
  42. package/esm2022/lib/services/rbac.service.mjs +0 -46
  43. package/esm2022/lib/services/rules-evaluation.service.mjs +0 -27
  44. package/esm2022/lib/services/validation-messages.service.mjs +0 -56
  45. package/esm2022/lib/services/validator-registry.service.mjs +0 -99
  46. package/esm2022/lib/tokens/injection-tokens.mjs +0 -126
  47. package/esm2022/ngx-dynamic-entity.mjs +0 -5
  48. package/esm2022/public-api.mjs +0 -58
  49. package/index.d.ts +0 -5
  50. package/lib/field-types/array-field.component.d.ts +0 -28
  51. package/lib/field-types/boolean-field.component.d.ts +0 -18
  52. package/lib/field-types/checkbox-field.component.d.ts +0 -13
  53. package/lib/field-types/currency-field.component.d.ts +0 -17
  54. package/lib/field-types/date-field.component.d.ts +0 -15
  55. package/lib/field-types/date-time-field.component.d.ts +0 -30
  56. package/lib/field-types/dropdown-field.component.d.ts +0 -34
  57. package/lib/field-types/email-field.component.d.ts +0 -15
  58. package/lib/field-types/entity-ref-field.component.d.ts +0 -49
  59. package/lib/field-types/field-component.contract.d.ts +0 -49
  60. package/lib/field-types/file-field.component.d.ts +0 -25
  61. package/lib/field-types/group-field.component.d.ts +0 -17
  62. package/lib/field-types/image-field.component.d.ts +0 -30
  63. package/lib/field-types/month-year-field.component.d.ts +0 -28
  64. package/lib/field-types/multi-select-field.component.d.ts +0 -27
  65. package/lib/field-types/number-field.component.d.ts +0 -16
  66. package/lib/field-types/password-field.component.d.ts +0 -17
  67. package/lib/field-types/radio-field.component.d.ts +0 -33
  68. package/lib/field-types/text-field.component.d.ts +0 -23
  69. package/lib/field-types/textarea-field.component.d.ts +0 -14
  70. package/lib/field-types/time-field.component.d.ts +0 -27
  71. package/lib/form/dynamic-field/dynamic-field.component.d.ts +0 -78
  72. package/lib/form/dynamic-form.component.d.ts +0 -293
  73. package/lib/form/dynamic-record-form.component.d.ts +0 -199
  74. package/lib/providers/provide-field-types.d.ts +0 -24
  75. package/lib/providers/provide-ngx-dynamic-entity.d.ts +0 -56
  76. package/lib/services/cascade-data.service.d.ts +0 -45
  77. package/lib/services/config-source.service.d.ts +0 -14
  78. package/lib/services/entity-ref-cache.d.ts +0 -27
  79. package/lib/services/entity-ref-registry.service.d.ts +0 -21
  80. package/lib/services/entity-ref-selection.service.d.ts +0 -24
  81. package/lib/services/entity-reference.service.d.ts +0 -49
  82. package/lib/services/field-registry.service.d.ts +0 -32
  83. package/lib/services/file-upload.service.d.ts +0 -27
  84. package/lib/services/hook-registry.service.d.ts +0 -12
  85. package/lib/services/lookup-registry.service.d.ts +0 -94
  86. package/lib/services/rbac.service.d.ts +0 -27
  87. package/lib/services/rules-evaluation.service.d.ts +0 -17
  88. package/lib/services/validation-messages.service.d.ts +0 -43
  89. package/lib/services/validator-registry.service.d.ts +0 -32
  90. package/lib/tokens/injection-tokens.d.ts +0 -134
  91. package/public-api.d.ts +0 -42
@@ -1,126 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- import { InMemoryEntityRefCacheStore } from '../services/entity-ref-cache';
3
- /** Roles that see XXXXXXXXX for masked fields. Presentational only — enforce authz server-side. */
4
- export const MASKED_ROLES = new InjectionToken('MASKED_ROLES');
5
- /**
6
- * Consumer **overrides**: fieldType string → Angular component class.
7
- * Highest priority — beats anything registered through `provideFieldTypes()`.
8
- */
9
- export const FIELD_TYPE_REGISTRY = new InjectionToken('FIELD_TYPE_REGISTRY');
10
- /**
11
- * Multi-provider of field-type sets, contributed by `provideFieldTypes()` /
12
- * `provideBuiltInFieldTypes()`. Multi so several calls compose instead of clobbering;
13
- * later sets win on key collision. This is the seam that keeps unused field components
14
- * out of the bundle — nothing is imported until a set names it.
15
- */
16
- export const FIELD_TYPE_SETS = new InjectionToken('FIELD_TYPE_SETS');
17
- /**
18
- * Registry: entity key → option loader.
19
- *
20
- * A loader receives a `ReferenceLoaderContext` (`parentValue`, `filters`, `lang`) and may
21
- * return an array, a Promise, or an Observable of `ReferenceOption[]`. `ctx` is optional,
22
- * so a zero-arg loader (`() => svc.list()`) is still a valid registration.
23
- */
24
- export const ENTITY_REF_REGISTRY = new InjectionToken('ENTITY_REF_REGISTRY');
25
- /**
26
- * Registry: list name → the values of a named master list (`field.listName`).
27
- *
28
- * A source may be the values themselves (array / Promise / Observable) or a **loader function**,
29
- * which is what you want for anything fetched: a bare Promise is created when the provider is
30
- * built, so every list would load whether or not a form uses it.
31
- *
32
- * Values are normalised by `normalizeLookupValues` — bare strings and `LocalizedText` are
33
- * accepted alongside the full `{ code, name, sortOrder }` shape.
34
- *
35
- * @example
36
- * provideNgxDynamicEntity({
37
- * lookups: {
38
- * employeeStatus: () => listService.getByName('employeeStatus'),
39
- * grades: ['Junior', 'Senior'],
40
- * },
41
- * })
42
- */
43
- export const LOOKUP_REGISTRY = new InjectionToken('LOOKUP_REGISTRY');
44
- /**
45
- * Ordered steps that move a saved record forward when a config's `version` increases.
46
- *
47
- * Without these, `EntityFormConfig.version` and `VersionedRecord._configVersion` are
48
- * declarations nothing acts on: a schema can be edited freely while records keep their old
49
- * shape, and nothing reconciles the two. Registering migrations makes the version numbers
50
- * mean something.
51
- *
52
- * @example
53
- * provideNgxDynamicEntity({
54
- * migrations: [
55
- * { from: 1, to: 2, description: 'split name', migrate: r => ({ ...r, firstName: r['name'] }) },
56
- * ],
57
- * })
58
- */
59
- export const RECORD_MIGRATIONS = new InjectionToken('RECORD_MIGRATIONS');
60
- /**
61
- * Overrides for the messages shown under an invalid field, keyed by Angular error key
62
- * (`required`, `minlength`, `pattern`, …) plus a few field-specific keys.
63
- *
64
- * The built-in messages are English literals. Registering here is what makes a non-English
65
- * form possible without re-implementing every field component; unlisted keys keep their
66
- * default, so overriding one does not mean supplying them all.
67
- */
68
- export const VALIDATION_MESSAGES = new InjectionToken('VALIDATION_MESSAGES');
69
- /** Registry: validator key → ValidatorFn */
70
- export const VALIDATOR_REGISTRY = new InjectionToken('VALIDATOR_REGISTRY');
71
- /**
72
- * Registry: validator key → AsyncValidatorFn.
73
- *
74
- * Kept separate from VALIDATOR_REGISTRY because Angular applies the two differently: an async
75
- * validator runs only once the synchronous ones pass, and puts the control into `pending`
76
- * while it does. Name them from a schema with `validators: { customAsync: ['uniqueEmail'] }`.
77
- */
78
- export const ASYNC_VALIDATOR_REGISTRY = new InjectionToken('ASYNC_VALIDATOR_REGISTRY');
79
- /** Registry: hook key → async (data, context) => data */
80
- export const HOOK_REGISTRY = new InjectionToken('HOOK_REGISTRY');
81
- /**
82
- * Consumer-registered list of common module tabs (documents, audit, tasks, etc.).
83
- * The library ships no built-in implementations. Consumers provide their own list
84
- * so the builder's module-picker and the renderer's tab switcher know what's available.
85
- *
86
- * @example
87
- * providers: [
88
- * {
89
- * provide: COMMON_MODULES_REGISTRY,
90
- * useValue: [
91
- * { id: 'documents', label: { en: 'Documents' }, component: 'app-documents-view' },
92
- * { id: 'audit', label: { en: 'Audit Log' }, component: 'app-audit' },
93
- * ] satisfies CommonModuleEntry[]
94
- * }
95
- * ]
96
- */
97
- export const COMMON_MODULES_REGISTRY = new InjectionToken('COMMON_MODULES_REGISTRY');
98
- /**
99
- * Consumer-provided file/image upload handler.
100
- * When supplied, image-field and file-field call it to persist the File and receive a stable
101
- * URL back. Without it the field stores `{ file, name, size, mimeType }` for the consumer to
102
- * upload on submit. May return the result directly, as a Promise, or as an Observable.
103
- *
104
- * @example
105
- * { provide: UPLOAD_HANDLER, useFactory: () => (file: File) => myUploadService.upload(file) }
106
- */
107
- export const UPLOAD_HANDLER = new InjectionToken('UPLOAD_HANDLER');
108
- /**
109
- * Backing store for the entity-reference options cache. Defaults to in-memory.
110
- * Provide your own to make the cache outlive a page refresh.
111
- *
112
- * @example
113
- * { provide: ENTITY_REF_CACHE_STORE, useClass: SessionStorageRefCache }
114
- */
115
- export const ENTITY_REF_CACHE_STORE = new InjectionToken('ENTITY_REF_CACHE_STORE', { providedIn: 'root', factory: () => new InMemoryEntityRefCacheStore() });
116
- /**
117
- * Consumer-provided predicate function to check whether user roles can edit system default tabs or fields.
118
- * Defaults to allowing edits if not provided.
119
- */
120
- export const SYSTEM_DEFAULT_CAN_EDIT = new InjectionToken('SYSTEM_DEFAULT_CAN_EDIT');
121
- /**
122
- * Registry/Resolver for resolving an EntityFormConfig by entity key across entities (Phase 8).
123
- * Enables cross-entity field referencing (`isReferenced`, `referencedEntityKey`, `referencedFieldId`, `hasDrift`).
124
- */
125
- export const CONFIG_SOURCE = new InjectionToken('CONFIG_SOURCE');
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0aW9uLXRva2Vucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdG9rZW5zL2luamVjdGlvbi10b2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVMvQyxPQUFPLEVBQUUsMkJBQTJCLEVBQTRCLE1BQU0sOEJBQThCLENBQUM7QUFFckcsbUdBQW1HO0FBQ25HLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBVyxjQUFjLENBQUMsQ0FBQztBQUV6RTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FBeUIscUJBQXFCLENBQUMsQ0FBQztBQUVyRzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBOEIsaUJBQWlCLENBQUMsQ0FBQztBQUVsRzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FDbkQscUJBQXFCLENBQ3RCLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxjQUFjLENBQWdDLGlCQUFpQixDQUFDLENBQUM7QUFFcEc7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGNBQWMsQ0FBb0IsbUJBQW1CLENBQUMsQ0FBQztBQUU1Rjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxjQUFjLENBQXNCLHFCQUFxQixDQUFDLENBQUM7QUFFbEcsNENBQTRDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUFtQixvQkFBb0IsQ0FBQyxDQUFDO0FBRTdGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksY0FBYyxDQUN4RCwwQkFBMEIsQ0FDM0IsQ0FBQztBQVVGLHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxjQUFjLENBQXNCLGVBQWUsQ0FBQyxDQUFDO0FBRXRGOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksY0FBYyxDQUN2RCx5QkFBeUIsQ0FDMUIsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFvQixnQkFBZ0IsQ0FBQyxDQUFDO0FBRXRGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksY0FBYyxDQUN0RCx3QkFBd0IsRUFDeEIsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLDJCQUEyQixFQUFFLEVBQUUsQ0FDekUsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksY0FBYyxDQUN2RCx5QkFBeUIsQ0FDMUIsQ0FBQztBQU1GOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGNBQWMsQ0FBc0IsZUFBZSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1vbk1vZHVsZUVudHJ5LFxuICBFbnRpdHlSZWZlcmVuY2VMb2FkZXIsXG4gIEZpbGVVcGxvYWRIYW5kbGVyLFxuICBMb29rdXBMaXN0U291cmNlLFxuICBSZWNvcmRNaWdyYXRpb24sXG59IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcbmltcG9ydCB7IEluTWVtb3J5RW50aXR5UmVmQ2FjaGVTdG9yZSwgdHlwZSBFbnRpdHlSZWZDYWNoZVN0b3JlIH0gZnJvbSAnLi4vc2VydmljZXMvZW50aXR5LXJlZi1jYWNoZSc7XG5cbi8qKiBSb2xlcyB0aGF0IHNlZSBYWFhYWFhYWFggZm9yIG1hc2tlZCBmaWVsZHMuIFByZXNlbnRhdGlvbmFsIG9ubHkg4oCUIGVuZm9yY2UgYXV0aHogc2VydmVyLXNpZGUuICovXG5leHBvcnQgY29uc3QgTUFTS0VEX1JPTEVTID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZ1tdPignTUFTS0VEX1JPTEVTJyk7XG5cbi8qKlxuICogQ29uc3VtZXIgKipvdmVycmlkZXMqKjogZmllbGRUeXBlIHN0cmluZyDihpIgQW5ndWxhciBjb21wb25lbnQgY2xhc3MuXG4gKiBIaWdoZXN0IHByaW9yaXR5IOKAlCBiZWF0cyBhbnl0aGluZyByZWdpc3RlcmVkIHRocm91Z2ggYHByb3ZpZGVGaWVsZFR5cGVzKClgLlxuICovXG5leHBvcnQgY29uc3QgRklFTERfVFlQRV9SRUdJU1RSWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxNYXA8c3RyaW5nLCBUeXBlPGFueT4+PignRklFTERfVFlQRV9SRUdJU1RSWScpO1xuXG4vKipcbiAqIE11bHRpLXByb3ZpZGVyIG9mIGZpZWxkLXR5cGUgc2V0cywgY29udHJpYnV0ZWQgYnkgYHByb3ZpZGVGaWVsZFR5cGVzKClgIC9cbiAqIGBwcm92aWRlQnVpbHRJbkZpZWxkVHlwZXMoKWAuIE11bHRpIHNvIHNldmVyYWwgY2FsbHMgY29tcG9zZSBpbnN0ZWFkIG9mIGNsb2JiZXJpbmc7XG4gKiBsYXRlciBzZXRzIHdpbiBvbiBrZXkgY29sbGlzaW9uLiBUaGlzIGlzIHRoZSBzZWFtIHRoYXQga2VlcHMgdW51c2VkIGZpZWxkIGNvbXBvbmVudHNcbiAqIG91dCBvZiB0aGUgYnVuZGxlIOKAlCBub3RoaW5nIGlzIGltcG9ydGVkIHVudGlsIGEgc2V0IG5hbWVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgRklFTERfVFlQRV9TRVRTID0gbmV3IEluamVjdGlvblRva2VuPFJlY29yZDxzdHJpbmcsIFR5cGU8YW55Pj5bXT4oJ0ZJRUxEX1RZUEVfU0VUUycpO1xuXG4vKipcbiAqIFJlZ2lzdHJ5OiBlbnRpdHkga2V5IOKGkiBvcHRpb24gbG9hZGVyLlxuICpcbiAqIEEgbG9hZGVyIHJlY2VpdmVzIGEgYFJlZmVyZW5jZUxvYWRlckNvbnRleHRgIChgcGFyZW50VmFsdWVgLCBgZmlsdGVyc2AsIGBsYW5nYCkgYW5kIG1heVxuICogcmV0dXJuIGFuIGFycmF5LCBhIFByb21pc2UsIG9yIGFuIE9ic2VydmFibGUgb2YgYFJlZmVyZW5jZU9wdGlvbltdYC4gYGN0eGAgaXMgb3B0aW9uYWwsXG4gKiBzbyBhIHplcm8tYXJnIGxvYWRlciAoYCgpID0+IHN2Yy5saXN0KClgKSBpcyBzdGlsbCBhIHZhbGlkIHJlZ2lzdHJhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEVOVElUWV9SRUZfUkVHSVNUUlkgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWFwPHN0cmluZywgRW50aXR5UmVmZXJlbmNlTG9hZGVyPj4oXG4gICdFTlRJVFlfUkVGX1JFR0lTVFJZJyxcbik7XG5cbi8qKlxuICogUmVnaXN0cnk6IGxpc3QgbmFtZSDihpIgdGhlIHZhbHVlcyBvZiBhIG5hbWVkIG1hc3RlciBsaXN0IChgZmllbGQubGlzdE5hbWVgKS5cbiAqXG4gKiBBIHNvdXJjZSBtYXkgYmUgdGhlIHZhbHVlcyB0aGVtc2VsdmVzIChhcnJheSAvIFByb21pc2UgLyBPYnNlcnZhYmxlKSBvciBhICoqbG9hZGVyIGZ1bmN0aW9uKiosXG4gKiB3aGljaCBpcyB3aGF0IHlvdSB3YW50IGZvciBhbnl0aGluZyBmZXRjaGVkOiBhIGJhcmUgUHJvbWlzZSBpcyBjcmVhdGVkIHdoZW4gdGhlIHByb3ZpZGVyIGlzXG4gKiBidWlsdCwgc28gZXZlcnkgbGlzdCB3b3VsZCBsb2FkIHdoZXRoZXIgb3Igbm90IGEgZm9ybSB1c2VzIGl0LlxuICpcbiAqIFZhbHVlcyBhcmUgbm9ybWFsaXNlZCBieSBgbm9ybWFsaXplTG9va3VwVmFsdWVzYCDigJQgYmFyZSBzdHJpbmdzIGFuZCBgTG9jYWxpemVkVGV4dGAgYXJlXG4gKiBhY2NlcHRlZCBhbG9uZ3NpZGUgdGhlIGZ1bGwgYHsgY29kZSwgbmFtZSwgc29ydE9yZGVyIH1gIHNoYXBlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBwcm92aWRlTmd4RHluYW1pY0VudGl0eSh7XG4gKiAgIGxvb2t1cHM6IHtcbiAqICAgICBlbXBsb3llZVN0YXR1czogKCkgPT4gbGlzdFNlcnZpY2UuZ2V0QnlOYW1lKCdlbXBsb3llZVN0YXR1cycpLFxuICogICAgIGdyYWRlczogWydKdW5pb3InLCAnU2VuaW9yJ10sXG4gKiAgIH0sXG4gKiB9KVxuICovXG5leHBvcnQgY29uc3QgTE9PS1VQX1JFR0lTVFJZID0gbmV3IEluamVjdGlvblRva2VuPE1hcDxzdHJpbmcsIExvb2t1cExpc3RTb3VyY2U+PignTE9PS1VQX1JFR0lTVFJZJyk7XG5cbi8qKlxuICogT3JkZXJlZCBzdGVwcyB0aGF0IG1vdmUgYSBzYXZlZCByZWNvcmQgZm9yd2FyZCB3aGVuIGEgY29uZmlnJ3MgYHZlcnNpb25gIGluY3JlYXNlcy5cbiAqXG4gKiBXaXRob3V0IHRoZXNlLCBgRW50aXR5Rm9ybUNvbmZpZy52ZXJzaW9uYCBhbmQgYFZlcnNpb25lZFJlY29yZC5fY29uZmlnVmVyc2lvbmAgYXJlXG4gKiBkZWNsYXJhdGlvbnMgbm90aGluZyBhY3RzIG9uOiBhIHNjaGVtYSBjYW4gYmUgZWRpdGVkIGZyZWVseSB3aGlsZSByZWNvcmRzIGtlZXAgdGhlaXIgb2xkXG4gKiBzaGFwZSwgYW5kIG5vdGhpbmcgcmVjb25jaWxlcyB0aGUgdHdvLiBSZWdpc3RlcmluZyBtaWdyYXRpb25zIG1ha2VzIHRoZSB2ZXJzaW9uIG51bWJlcnNcbiAqIG1lYW4gc29tZXRoaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBwcm92aWRlTmd4RHluYW1pY0VudGl0eSh7XG4gKiAgIG1pZ3JhdGlvbnM6IFtcbiAqICAgICB7IGZyb206IDEsIHRvOiAyLCBkZXNjcmlwdGlvbjogJ3NwbGl0IG5hbWUnLCBtaWdyYXRlOiByID0+ICh7IC4uLnIsIGZpcnN0TmFtZTogclsnbmFtZSddIH0pIH0sXG4gKiAgIF0sXG4gKiB9KVxuICovXG5leHBvcnQgY29uc3QgUkVDT1JEX01JR1JBVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48UmVjb3JkTWlncmF0aW9uW10+KCdSRUNPUkRfTUlHUkFUSU9OUycpO1xuXG4vKipcbiAqIE92ZXJyaWRlcyBmb3IgdGhlIG1lc3NhZ2VzIHNob3duIHVuZGVyIGFuIGludmFsaWQgZmllbGQsIGtleWVkIGJ5IEFuZ3VsYXIgZXJyb3Iga2V5XG4gKiAoYHJlcXVpcmVkYCwgYG1pbmxlbmd0aGAsIGBwYXR0ZXJuYCwg4oCmKSBwbHVzIGEgZmV3IGZpZWxkLXNwZWNpZmljIGtleXMuXG4gKlxuICogVGhlIGJ1aWx0LWluIG1lc3NhZ2VzIGFyZSBFbmdsaXNoIGxpdGVyYWxzLiBSZWdpc3RlcmluZyBoZXJlIGlzIHdoYXQgbWFrZXMgYSBub24tRW5nbGlzaFxuICogZm9ybSBwb3NzaWJsZSB3aXRob3V0IHJlLWltcGxlbWVudGluZyBldmVyeSBmaWVsZCBjb21wb25lbnQ7IHVubGlzdGVkIGtleXMga2VlcCB0aGVpclxuICogZGVmYXVsdCwgc28gb3ZlcnJpZGluZyBvbmUgZG9lcyBub3QgbWVhbiBzdXBwbHlpbmcgdGhlbSBhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBWQUxJREFUSU9OX01FU1NBR0VTID0gbmV3IEluamVjdGlvblRva2VuPFJlY29yZDxzdHJpbmcsIGFueT4+KCdWQUxJREFUSU9OX01FU1NBR0VTJyk7XG5cbi8qKiBSZWdpc3RyeTogdmFsaWRhdG9yIGtleSDihpIgVmFsaWRhdG9yRm4gKi9cbmV4cG9ydCBjb25zdCBWQUxJREFUT1JfUkVHSVNUUlkgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWFwPHN0cmluZywgYW55Pj4oJ1ZBTElEQVRPUl9SRUdJU1RSWScpO1xuXG4vKipcbiAqIFJlZ2lzdHJ5OiB2YWxpZGF0b3Iga2V5IOKGkiBBc3luY1ZhbGlkYXRvckZuLlxuICpcbiAqIEtlcHQgc2VwYXJhdGUgZnJvbSBWQUxJREFUT1JfUkVHSVNUUlkgYmVjYXVzZSBBbmd1bGFyIGFwcGxpZXMgdGhlIHR3byBkaWZmZXJlbnRseTogYW4gYXN5bmNcbiAqIHZhbGlkYXRvciBydW5zIG9ubHkgb25jZSB0aGUgc3luY2hyb25vdXMgb25lcyBwYXNzLCBhbmQgcHV0cyB0aGUgY29udHJvbCBpbnRvIGBwZW5kaW5nYFxuICogd2hpbGUgaXQgZG9lcy4gTmFtZSB0aGVtIGZyb20gYSBzY2hlbWEgd2l0aCBgdmFsaWRhdG9yczogeyBjdXN0b21Bc3luYzogWyd1bmlxdWVFbWFpbCddIH1gLlxuICovXG5leHBvcnQgY29uc3QgQVNZTkNfVkFMSURBVE9SX1JFR0lTVFJZID0gbmV3IEluamVjdGlvblRva2VuPE1hcDxzdHJpbmcsIGFueT4+KFxuICAnQVNZTkNfVkFMSURBVE9SX1JFR0lTVFJZJyxcbik7XG5cbi8qKlxuICogQSByZWdpc3RlcmVkIGhvb2s6IHJlY2VpdmVzIHRoZSBwYXlsb2FkLCByZXR1cm5zIGl0IChvciBhIHJlcGxhY2VtZW50KSwgc3luYyBvciBhc3luYy5cbiAqXG4gKiBTcGVsbGVkIG91dCByYXRoZXIgdGhhbiB0eXBlZCBhcyBgRnVuY3Rpb25gLCB3aGljaCBhY2NlcHRzIGNsYXNzIGRlY2xhcmF0aW9ucyBhbmQgYW55XG4gKiBhcml0eSBhbmQgZ2l2ZXMgYSBjb25zdW1lciBubyBzaWduYXR1cmUgdG8gd3JpdGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IHR5cGUgSG9va0ZuID0gKGRhdGE6IGFueSwgY29udGV4dD86IHVua25vd24pID0+IHVua25vd24gfCBQcm9taXNlPHVua25vd24+O1xuXG4vKiogUmVnaXN0cnk6IGhvb2sga2V5IOKGkiBhc3luYyAoZGF0YSwgY29udGV4dCkgPT4gZGF0YSAqL1xuZXhwb3J0IGNvbnN0IEhPT0tfUkVHSVNUUlkgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWFwPHN0cmluZywgSG9va0ZuPj4oJ0hPT0tfUkVHSVNUUlknKTtcblxuLyoqXG4gKiBDb25zdW1lci1yZWdpc3RlcmVkIGxpc3Qgb2YgY29tbW9uIG1vZHVsZSB0YWJzIChkb2N1bWVudHMsIGF1ZGl0LCB0YXNrcywgZXRjLikuXG4gKiBUaGUgbGlicmFyeSBzaGlwcyBubyBidWlsdC1pbiBpbXBsZW1lbnRhdGlvbnMuIENvbnN1bWVycyBwcm92aWRlIHRoZWlyIG93biBsaXN0XG4gKiBzbyB0aGUgYnVpbGRlcidzIG1vZHVsZS1waWNrZXIgYW5kIHRoZSByZW5kZXJlcidzIHRhYiBzd2l0Y2hlciBrbm93IHdoYXQncyBhdmFpbGFibGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIHByb3ZpZGVyczogW1xuICogICB7XG4gKiAgICAgcHJvdmlkZTogQ09NTU9OX01PRFVMRVNfUkVHSVNUUlksXG4gKiAgICAgdXNlVmFsdWU6IFtcbiAqICAgICAgIHsgaWQ6ICdkb2N1bWVudHMnLCBsYWJlbDogeyBlbjogJ0RvY3VtZW50cycgfSwgY29tcG9uZW50OiAnYXBwLWRvY3VtZW50cy12aWV3JyB9LFxuICogICAgICAgeyBpZDogJ2F1ZGl0JywgICAgIGxhYmVsOiB7IGVuOiAnQXVkaXQgTG9nJyAgfSwgY29tcG9uZW50OiAnYXBwLWF1ZGl0JyB9LFxuICogICAgIF0gc2F0aXNmaWVzIENvbW1vbk1vZHVsZUVudHJ5W11cbiAqICAgfVxuICogXVxuICovXG5leHBvcnQgY29uc3QgQ09NTU9OX01PRFVMRVNfUkVHSVNUUlkgPSBuZXcgSW5qZWN0aW9uVG9rZW48Q29tbW9uTW9kdWxlRW50cnlbXT4oXG4gICdDT01NT05fTU9EVUxFU19SRUdJU1RSWScsXG4pO1xuXG4vKipcbiAqIENvbnN1bWVyLXByb3ZpZGVkIGZpbGUvaW1hZ2UgdXBsb2FkIGhhbmRsZXIuXG4gKiBXaGVuIHN1cHBsaWVkLCBpbWFnZS1maWVsZCBhbmQgZmlsZS1maWVsZCBjYWxsIGl0IHRvIHBlcnNpc3QgdGhlIEZpbGUgYW5kIHJlY2VpdmUgYSBzdGFibGVcbiAqIFVSTCBiYWNrLiBXaXRob3V0IGl0IHRoZSBmaWVsZCBzdG9yZXMgYHsgZmlsZSwgbmFtZSwgc2l6ZSwgbWltZVR5cGUgfWAgZm9yIHRoZSBjb25zdW1lciB0b1xuICogdXBsb2FkIG9uIHN1Ym1pdC4gTWF5IHJldHVybiB0aGUgcmVzdWx0IGRpcmVjdGx5LCBhcyBhIFByb21pc2UsIG9yIGFzIGFuIE9ic2VydmFibGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIHsgcHJvdmlkZTogVVBMT0FEX0hBTkRMRVIsIHVzZUZhY3Rvcnk6ICgpID0+IChmaWxlOiBGaWxlKSA9PiBteVVwbG9hZFNlcnZpY2UudXBsb2FkKGZpbGUpIH1cbiAqL1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9IQU5ETEVSID0gbmV3IEluamVjdGlvblRva2VuPEZpbGVVcGxvYWRIYW5kbGVyPignVVBMT0FEX0hBTkRMRVInKTtcblxuLyoqXG4gKiBCYWNraW5nIHN0b3JlIGZvciB0aGUgZW50aXR5LXJlZmVyZW5jZSBvcHRpb25zIGNhY2hlLiBEZWZhdWx0cyB0byBpbi1tZW1vcnkuXG4gKiBQcm92aWRlIHlvdXIgb3duIHRvIG1ha2UgdGhlIGNhY2hlIG91dGxpdmUgYSBwYWdlIHJlZnJlc2guXG4gKlxuICogQGV4YW1wbGVcbiAqIHsgcHJvdmlkZTogRU5USVRZX1JFRl9DQUNIRV9TVE9SRSwgdXNlQ2xhc3M6IFNlc3Npb25TdG9yYWdlUmVmQ2FjaGUgfVxuICovXG5leHBvcnQgY29uc3QgRU5USVRZX1JFRl9DQUNIRV9TVE9SRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxFbnRpdHlSZWZDYWNoZVN0b3JlPihcbiAgJ0VOVElUWV9SRUZfQ0FDSEVfU1RPUkUnLFxuICB7IHByb3ZpZGVkSW46ICdyb290JywgZmFjdG9yeTogKCkgPT4gbmV3IEluTWVtb3J5RW50aXR5UmVmQ2FjaGVTdG9yZSgpIH0sXG4pO1xuXG4vKipcbiAqIENvbnN1bWVyLXByb3ZpZGVkIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBjaGVjayB3aGV0aGVyIHVzZXIgcm9sZXMgY2FuIGVkaXQgc3lzdGVtIGRlZmF1bHQgdGFicyBvciBmaWVsZHMuXG4gKiBEZWZhdWx0cyB0byBhbGxvd2luZyBlZGl0cyBpZiBub3QgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fREVGQVVMVF9DQU5fRURJVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjwocm9sZXM6IHN0cmluZ1tdKSA9PiBib29sZWFuPihcbiAgJ1NZU1RFTV9ERUZBVUxUX0NBTl9FRElUJyxcbik7XG5cbmV4cG9ydCB0eXBlIENvbmZpZ1NvdXJjZUhhbmRsZXIgPSAoXG4gIGVudGl0eUtleTogc3RyaW5nLFxuKSA9PiBhbnk7XG5cbi8qKlxuICogUmVnaXN0cnkvUmVzb2x2ZXIgZm9yIHJlc29sdmluZyBhbiBFbnRpdHlGb3JtQ29uZmlnIGJ5IGVudGl0eSBrZXkgYWNyb3NzIGVudGl0aWVzIChQaGFzZSA4KS5cbiAqIEVuYWJsZXMgY3Jvc3MtZW50aXR5IGZpZWxkIHJlZmVyZW5jaW5nIChgaXNSZWZlcmVuY2VkYCwgYHJlZmVyZW5jZWRFbnRpdHlLZXlgLCBgcmVmZXJlbmNlZEZpZWxkSWRgLCBgaGFzRHJpZnRgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IENPTkZJR19TT1VSQ0UgPSBuZXcgSW5qZWN0aW9uVG9rZW48Q29uZmlnU291cmNlSGFuZGxlcj4oJ0NPTkZJR19TT1VSQ0UnKTtcblxuXG4iXX0=
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWR5bmFtaWMtZW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25neC1keW5hbWljLWVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -1,58 +0,0 @@
1
- // Tokens
2
- export * from './lib/tokens/injection-tokens';
3
- // Providers
4
- export * from './lib/providers/provide-ngx-dynamic-entity';
5
- export * from './lib/providers/provide-field-types';
6
- // Services
7
- export * from './lib/services/field-registry.service';
8
- export * from './lib/services/hook-registry.service';
9
- export * from './lib/services/validator-registry.service';
10
- export * from './lib/services/entity-ref-registry.service';
11
- export * from './lib/services/entity-ref-selection.service';
12
- export * from './lib/services/cascade-data.service';
13
- export * from './lib/services/entity-reference.service';
14
- export * from './lib/services/entity-ref-cache';
15
- export * from './lib/services/lookup-registry.service';
16
- export * from './lib/services/rbac.service';
17
- export * from './lib/services/rules-evaluation.service';
18
- export * from './lib/services/config-source.service';
19
- export * from './lib/services/validation-messages.service';
20
- // Components — the library ships form UI only; rendering a data table is the consumer's choice.
21
- export * from './lib/form/dynamic-form.component';
22
- export * from './lib/form/dynamic-record-form.component';
23
- export * from './lib/form/dynamic-field/dynamic-field.component';
24
- // The contract a field component must satisfy to be registered with provideFieldTypes.
25
- // Previously this existed only as a code comment and an ADR that is gitignored, so a
26
- // consumer had no interface to implement against.
27
- export * from './lib/field-types/field-component.contract';
28
- // Field type components — every one, individually importable.
29
- //
30
- // The tree-shaking seam is `provideFieldTypes({ image: ImageFieldComponent })`: register
31
- // only what you use and the rest never enters the bundle. That only works for components a
32
- // consumer can name, and ten of these were unreachable — so wanting eleven of the twenty
33
- // meant calling provideBuiltInFieldTypes() and bundling all of them, which is exactly what
34
- // the seam exists to avoid.
35
- export * from './lib/field-types/text-field.component';
36
- export * from './lib/field-types/textarea-field.component';
37
- export * from './lib/field-types/number-field.component';
38
- export * from './lib/field-types/currency-field.component';
39
- export * from './lib/field-types/email-field.component';
40
- export * from './lib/field-types/password-field.component';
41
- export * from './lib/field-types/checkbox-field.component';
42
- export * from './lib/field-types/boolean-field.component';
43
- export * from './lib/field-types/date-field.component';
44
- export * from './lib/field-types/date-time-field.component';
45
- export * from './lib/field-types/time-field.component';
46
- export * from './lib/field-types/month-year-field.component';
47
- export * from './lib/field-types/dropdown-field.component';
48
- export * from './lib/field-types/radio-field.component';
49
- export * from './lib/field-types/multi-select-field.component';
50
- export * from './lib/field-types/entity-ref-field.component';
51
- export * from './lib/field-types/group-field.component';
52
- export * from './lib/field-types/array-field.component';
53
- export * from './lib/field-types/image-field.component';
54
- export * from './lib/field-types/file-field.component';
55
- // Value helpers — a dropdown value is now a language-keyed object, so a consumer rendering
56
- // record values needs these. Re-exported so they don't have to depend on core directly.
57
- export { resolveLabel, resolveOptionLabel, resolveOptionValue, formatDisplayValue, valuesMatch, normalizeOption, normalizeConfig, } from '@dynamic-entity/core';
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQVM7QUFDVCxjQUFjLCtCQUErQixDQUFDO0FBRTlDLFlBQVk7QUFDWixjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMscUNBQXFDLENBQUM7QUFFcEQsV0FBVztBQUNYLGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLDJDQUEyQyxDQUFDO0FBQzFELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsNENBQTRDLENBQUM7QUFFM0QsZ0dBQWdHO0FBQ2hHLGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYywwQ0FBMEMsQ0FBQztBQUN6RCxjQUFjLGtEQUFrRCxDQUFDO0FBRWpFLHVGQUF1RjtBQUN2RixxRkFBcUY7QUFDckYsa0RBQWtEO0FBQ2xELGNBQWMsNENBQTRDLENBQUM7QUFFM0QsOERBQThEO0FBQzlELEVBQUU7QUFDRix5RkFBeUY7QUFDekYsMkZBQTJGO0FBQzNGLHlGQUF5RjtBQUN6RiwyRkFBMkY7QUFDM0YsNEJBQTRCO0FBQzVCLGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYywyQ0FBMkMsQ0FBQztBQUMxRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsNkNBQTZDLENBQUM7QUFDNUQsY0FBYyx3Q0FBd0MsQ0FBQztBQUN2RCxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLGdEQUFnRCxDQUFDO0FBQy9ELGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYyx3Q0FBd0MsQ0FBQztBQUV2RCwyRkFBMkY7QUFDM0Ysd0ZBQXdGO0FBQ3hGLE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsV0FBVyxFQUNYLGVBQWUsRUFDZixlQUFlLEdBQ2hCLE1BQU0sc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUb2tlbnNcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Rva2Vucy9pbmplY3Rpb24tdG9rZW5zJztcblxuLy8gUHJvdmlkZXJzXG5leHBvcnQgKiBmcm9tICcuL2xpYi9wcm92aWRlcnMvcHJvdmlkZS1uZ3gtZHluYW1pYy1lbnRpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcHJvdmlkZXJzL3Byb3ZpZGUtZmllbGQtdHlwZXMnO1xuXG4vLyBTZXJ2aWNlc1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvZmllbGQtcmVnaXN0cnkuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9ob29rLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvdmFsaWRhdG9yLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvZW50aXR5LXJlZi1yZWdpc3RyeS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2VudGl0eS1yZWYtc2VsZWN0aW9uLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvY2FzY2FkZS1kYXRhLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvZW50aXR5LXJlZmVyZW5jZS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2VudGl0eS1yZWYtY2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvbG9va3VwLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvcmJhYy5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3J1bGVzLWV2YWx1YXRpb24uc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9jb25maWctc291cmNlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvdmFsaWRhdGlvbi1tZXNzYWdlcy5zZXJ2aWNlJztcblxuLy8gQ29tcG9uZW50cyDigJQgdGhlIGxpYnJhcnkgc2hpcHMgZm9ybSBVSSBvbmx5OyByZW5kZXJpbmcgYSBkYXRhIHRhYmxlIGlzIHRoZSBjb25zdW1lcidzIGNob2ljZS5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2Zvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9mb3JtL2R5bmFtaWMtcmVjb3JkLWZvcm0uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Zvcm0vZHluYW1pYy1maWVsZC9keW5hbWljLWZpZWxkLmNvbXBvbmVudCc7XG5cbi8vIFRoZSBjb250cmFjdCBhIGZpZWxkIGNvbXBvbmVudCBtdXN0IHNhdGlzZnkgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHByb3ZpZGVGaWVsZFR5cGVzLlxuLy8gUHJldmlvdXNseSB0aGlzIGV4aXN0ZWQgb25seSBhcyBhIGNvZGUgY29tbWVudCBhbmQgYW4gQURSIHRoYXQgaXMgZ2l0aWdub3JlZCwgc28gYVxuLy8gY29uc3VtZXIgaGFkIG5vIGludGVyZmFjZSB0byBpbXBsZW1lbnQgYWdhaW5zdC5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZpZWxkLXR5cGVzL2ZpZWxkLWNvbXBvbmVudC5jb250cmFjdCc7XG5cbi8vIEZpZWxkIHR5cGUgY29tcG9uZW50cyDigJQgZXZlcnkgb25lLCBpbmRpdmlkdWFsbHkgaW1wb3J0YWJsZS5cbi8vXG4vLyBUaGUgdHJlZS1zaGFraW5nIHNlYW0gaXMgYHByb3ZpZGVGaWVsZFR5cGVzKHsgaW1hZ2U6IEltYWdlRmllbGRDb21wb25lbnQgfSlgOiByZWdpc3RlclxuLy8gb25seSB3aGF0IHlvdSB1c2UgYW5kIHRoZSByZXN0IG5ldmVyIGVudGVycyB0aGUgYnVuZGxlLiBUaGF0IG9ubHkgd29ya3MgZm9yIGNvbXBvbmVudHMgYVxuLy8gY29uc3VtZXIgY2FuIG5hbWUsIGFuZCB0ZW4gb2YgdGhlc2Ugd2VyZSB1bnJlYWNoYWJsZSDigJQgc28gd2FudGluZyBlbGV2ZW4gb2YgdGhlIHR3ZW50eVxuLy8gbWVhbnQgY2FsbGluZyBwcm92aWRlQnVpbHRJbkZpZWxkVHlwZXMoKSBhbmQgYnVuZGxpbmcgYWxsIG9mIHRoZW0sIHdoaWNoIGlzIGV4YWN0bHkgd2hhdFxuLy8gdGhlIHNlYW0gZXhpc3RzIHRvIGF2b2lkLlxuZXhwb3J0ICogZnJvbSAnLi9saWIvZmllbGQtdHlwZXMvdGV4dC1maWVsZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmllbGQtdHlwZXMvdGV4dGFyZWEtZmllbGQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZpZWxkLXR5cGVzL251bWJlci1maWVsZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmllbGQtdHlwZXMvY3VycmVuY3ktZmllbGQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZpZWxkLXR5cGVzL2VtYWlsLWZpZWxkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9maWVsZC10eXBlcy9wYXNzd29yZC1maWVsZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmllbGQtdHlwZXMvY2hlY2tib3gtZmllbGQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZpZWxkLXR5cGVzL2Jvb2xlYW4tZmllbGQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZpZWxkLXR5cGVzL2RhdGUtZmllbGQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZpZWxkLXR5cGVzL2RhdGUtdGltZS1maWVsZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmllbGQtdHlwZXMvdGltZS1maWVsZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmllbGQtdHlwZXMvbW9udGgteWVhci1maWVsZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmllbGQtdHlwZXMvZHJvcGRvd24tZmllbGQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZpZWxkLXR5cGVzL3JhZGlvLWZpZWxkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9maWVsZC10eXBlcy9tdWx0aS1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZpZWxkLXR5cGVzL2VudGl0eS1yZWYtZmllbGQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZpZWxkLXR5cGVzL2dyb3VwLWZpZWxkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9maWVsZC10eXBlcy9hcnJheS1maWVsZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmllbGQtdHlwZXMvaW1hZ2UtZmllbGQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZpZWxkLXR5cGVzL2ZpbGUtZmllbGQuY29tcG9uZW50JztcblxuLy8gVmFsdWUgaGVscGVycyDigJQgYSBkcm9wZG93biB2YWx1ZSBpcyBub3cgYSBsYW5ndWFnZS1rZXllZCBvYmplY3QsIHNvIGEgY29uc3VtZXIgcmVuZGVyaW5nXG4vLyByZWNvcmQgdmFsdWVzIG5lZWRzIHRoZXNlLiBSZS1leHBvcnRlZCBzbyB0aGV5IGRvbid0IGhhdmUgdG8gZGVwZW5kIG9uIGNvcmUgZGlyZWN0bHkuXG5leHBvcnQge1xuICByZXNvbHZlTGFiZWwsXG4gIHJlc29sdmVPcHRpb25MYWJlbCxcbiAgcmVzb2x2ZU9wdGlvblZhbHVlLFxuICBmb3JtYXREaXNwbGF5VmFsdWUsXG4gIHZhbHVlc01hdGNoLFxuICBub3JtYWxpemVPcHRpb24sXG4gIG5vcm1hbGl6ZUNvbmZpZyxcbn0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xuXG4vLyBSZS1leHBvcnQgY29yZSB0eXBlcyBzbyBjb25zdW1lcnMgbmVlZCBvbmx5IG9uZSBpbXBvcnRcbmV4cG9ydCB0eXBlIHtcbiAgRW50aXR5Rm9ybUNvbmZpZyxcbiAgTmVzdGVkVGFiQ29uZmlnLFxuICBOZXN0ZWRGaWVsZENvbmZpZyxcbiAgRmllbGRUYWJsZUNvbmZpZyxcbiAgUmljaEZpZWxkVHlwZSxcbiAgTG9jYWxpemVkVGV4dCxcbiAgRHJvcGRvd25PcHRpb24sXG4gIFZlcnNpb25lZFJlY29yZCxcbiAgRW50aXR5UGVybWlzc2lvbnMsXG4gIFJiYWNDb250ZXh0LFxuICBGaWVsZFZhbGlkYXRvcnMsXG4gIEVudGl0eVJlZmVyZW5jZUNvbmZpZyxcbiAgRW50aXR5UmVmZXJlbmNlTG9hZGVyLFxuICBSZWZlcmVuY2VPcHRpb24sXG4gIFJlZmVyZW5jZUxvYWRlckNvbnRleHQsXG4gIEF1dG9QYXRjaENvbmZpZyxcbiAgUGF0Y2hPblRydWVNYXBwaW5nLFxuICBGaWxlUmVmLFxuICBGb3JtUnVsZSxcbiAgUnVsZUNvbmRpdGlvbixcbiAgUnVsZUFjdGlvbixcbiAgUnVsZUV2YWx1YXRpb25SZXN1bHQsXG4gIENvbW1vbk1vZHVsZUVudHJ5LFxufSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG4iXX0=
package/index.d.ts DELETED
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="ngx-dynamic-entity" />
5
- export * from './public-api';
@@ -1,28 +0,0 @@
1
- import { AbstractControl, FormArray } from '@angular/forms';
2
- import type { NestedFieldConfig, EntityFormConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- /** Renders repeating rows for a FormArray, with Add Item and Remove. */
5
- export declare class ArrayFieldComponent {
6
- /**
7
- * addItem/removeItem are public and may be called from outside this component's template,
8
- * which under OnPush would not re-render. The host also watches the control, but this
9
- * keeps the component correct on its own.
10
- */
11
- private readonly cdr;
12
- field: NestedFieldConfig;
13
- control: AbstractControl;
14
- config: EntityFormConfig;
15
- language: string;
16
- readonly: boolean;
17
- masked: boolean;
18
- userRoles: string[];
19
- private readonly fb;
20
- private readonly validatorRegistry;
21
- get label(): string;
22
- get formArray(): FormArray;
23
- getItemChildControl(itemGroup: AbstractControl, childId: string): AbstractControl;
24
- addItem(): void;
25
- removeItem(index: number): void;
26
- static ɵfac: i0.ɵɵFactoryDeclaration<ArrayFieldComponent, never>;
27
- static ɵcmp: i0.ɵɵComponentDeclaration<ArrayFieldComponent, "ngx-array-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "config": { "alias": "config"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; "userRoles": { "alias": "userRoles"; "required": false; }; }, {}, never, never, true, never>;
28
- }
@@ -1,18 +0,0 @@
1
- import { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- /**
5
- * Boolean field: a slide-toggle style switch (true/false).
6
- * Distinct from `checkbox` (which is a standalone bool) in that it renders as a
7
- * toggle switch with Yes/No labels for clearer binary state communication.
8
- */
9
- export declare class BooleanFieldComponent {
10
- field: NestedFieldConfig;
11
- control: AbstractControl;
12
- language: string;
13
- readonly: boolean;
14
- masked: boolean;
15
- get label(): string;
16
- static ɵfac: i0.ɵɵFactoryDeclaration<BooleanFieldComponent, never>;
17
- static ɵcmp: i0.ɵɵComponentDeclaration<BooleanFieldComponent, "ngx-boolean-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
18
- }
@@ -1,13 +0,0 @@
1
- import { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- export declare class CheckboxFieldComponent {
5
- field: NestedFieldConfig;
6
- control: AbstractControl;
7
- language: string;
8
- readonly: boolean;
9
- masked: boolean;
10
- get label(): string;
11
- static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxFieldComponent, never>;
12
- static ɵcmp: i0.ɵɵComponentDeclaration<CheckboxFieldComponent, "ngx-checkbox-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
13
- }
@@ -1,17 +0,0 @@
1
- import { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- /** Currency field: number input with locale-aware currency symbol prefix. */
5
- export declare class CurrencyFieldComponent {
6
- field: NestedFieldConfig;
7
- control: AbstractControl;
8
- language: string;
9
- readonly: boolean;
10
- masked: boolean;
11
- get label(): string;
12
- get placeholder(): string;
13
- /** Picks the currency symbol from the locale — defaults to '$'. */
14
- get symbol(): string;
15
- static ɵfac: i0.ɵɵFactoryDeclaration<CurrencyFieldComponent, never>;
16
- static ɵcmp: i0.ɵɵComponentDeclaration<CurrencyFieldComponent, "ngx-currency-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
17
- }
@@ -1,15 +0,0 @@
1
- import { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- export declare class DateFieldComponent {
5
- field: NestedFieldConfig;
6
- control: AbstractControl;
7
- language: string;
8
- readonly: boolean;
9
- masked: boolean;
10
- get label(): string;
11
- /** ISO 8601 date → locale display string (ONEHERMES convention: always UTC, display in user locale) */
12
- formatDate(value: string | null): string;
13
- static ɵfac: i0.ɵɵFactoryDeclaration<DateFieldComponent, never>;
14
- static ɵcmp: i0.ɵɵComponentDeclaration<DateFieldComponent, "ngx-date-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
15
- }
@@ -1,30 +0,0 @@
1
- import { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- /**
5
- * Date & Time field: a single `datetime-local` input.
6
- *
7
- * The type is stored as ISO 8601 UTC, per the same convention `date` follows, while the
8
- * input works in the viewer's local zone — `datetime-local` has no offset, so the two
9
- * conversions here are what keep a value stable across a round trip.
10
- */
11
- export declare class DateTimeFieldComponent {
12
- field: NestedFieldConfig;
13
- control: AbstractControl;
14
- language: string;
15
- readonly: boolean;
16
- masked: boolean;
17
- get label(): string;
18
- /** Stored ISO 8601 → the `YYYY-MM-DDTHH:mm` local form the input requires. */
19
- get inputValue(): string;
20
- /** The input's local `YYYY-MM-DDTHH:mm` → stored ISO 8601 UTC. */
21
- onInput(value: string): void;
22
- /**
23
- * Displays date *and* time. `DateFieldComponent` used `toLocaleDateString()` here, so a
24
- * datetime read back through the field showed no time while the same value in the record
25
- * summary — which goes through core's `formatDisplayValue` — showed it.
26
- */
27
- formatDateTime(value: unknown): string;
28
- static ɵfac: i0.ɵɵFactoryDeclaration<DateTimeFieldComponent, never>;
29
- static ɵcmp: i0.ɵɵComponentDeclaration<DateTimeFieldComponent, "ngx-date-time-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
30
- }
@@ -1,34 +0,0 @@
1
- import { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- export declare class DropdownFieldComponent {
5
- private readonly lookups;
6
- private readonly messages;
7
- private _field;
8
- private _language;
9
- /** Setter-based so options resolve however the input is set — see `refreshChoiceOptions`. */
10
- set field(value: NestedFieldConfig);
11
- get field(): NestedFieldConfig;
12
- set language(value: string);
13
- get language(): string;
14
- control: AbstractControl;
15
- readonly: boolean;
16
- masked: boolean;
17
- /** Inline `options`, or the field's named list resolved through the registry (§6.3). */
18
- readonly options: import("@angular/core").WritableSignal<DropdownOption[]>;
19
- readonly compareFn: (o1: any, o2: any) => boolean;
20
- isObjectVal(option: any): boolean;
21
- get label(): string;
22
- get placeholder(): string;
23
- getOptStoredVal(option: any): any;
24
- getOptLabel(option: any): string;
25
- /**
26
- * Read-only display. Never awaits (§6.2): a warm list resolves the label, a cold one falls
27
- * back to the stored text — which under the §2 contract *is* the display value, so it is
28
- * never wrong, only unlocalised.
29
- */
30
- getLabel(value: any): string;
31
- get errorMessage(): string;
32
- static ɵfac: i0.ɵɵFactoryDeclaration<DropdownFieldComponent, never>;
33
- static ɵcmp: i0.ɵɵComponentDeclaration<DropdownFieldComponent, "ngx-dropdown-field", never, { "field": { "alias": "field"; "required": false; }; "language": { "alias": "language"; "required": false; }; "control": { "alias": "control"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
34
- }
@@ -1,15 +0,0 @@
1
- import { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- /** Email field: type="email" input with inline validation hint. */
5
- export declare class EmailFieldComponent {
6
- field: NestedFieldConfig;
7
- control: AbstractControl;
8
- language: string;
9
- readonly: boolean;
10
- masked: boolean;
11
- get label(): string;
12
- get placeholder(): string;
13
- static ɵfac: i0.ɵɵFactoryDeclaration<EmailFieldComponent, never>;
14
- static ɵcmp: i0.ɵɵComponentDeclaration<EmailFieldComponent, "ngx-email-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
15
- }
@@ -1,49 +0,0 @@
1
- import { OnInit } from '@angular/core';
2
- import { AbstractControl } from '@angular/forms';
3
- import type { NestedFieldConfig } from '@dynamic-entity/core';
4
- import * as i0 from "@angular/core";
5
- /**
6
- * EntityRefFieldComponent — a select populated from a consumer-registered loader.
7
- *
8
- * Cascades: when `entityReference.parentField` is set, the component watches that sibling
9
- * control (via `control.parent`) and reloads its own options on every parent change,
10
- * clearing a now-invalid selection. It publishes the picked record on
11
- * `EntityRefSelectionService` so the owning form can run `autoPatch`.
12
- */
13
- export declare class EntityRefFieldComponent implements OnInit {
14
- field: NestedFieldConfig;
15
- control: AbstractControl;
16
- language: string;
17
- readonly: boolean;
18
- masked: boolean;
19
- private readonly cascade;
20
- private readonly selectionBus;
21
- private readonly destroyRef;
22
- readonly options: import("@angular/core").WritableSignal<ReferenceOption[]>;
23
- readonly loading: import("@angular/core").WritableSignal<boolean>;
24
- /** True when this field cascades but its parent has no value yet. */
25
- readonly awaitingParent: import("@angular/core").WritableSignal<boolean>;
26
- get label(): string;
27
- get placeholder(): string;
28
- get parentFieldId(): string | undefined;
29
- ngOnInit(): void;
30
- /** Reload options against the parent's current value. */
31
- reload(): Promise<void>;
32
- /**
33
- * Publish the selected option so autoPatch can copy from its record.
34
- *
35
- * Driven from `valueChanges` rather than the select's `change` event: that event is the
36
- * same one the `formControl` directive listens to, so reading the control inside a
37
- * template `(change)` handler can see the previous value. `valueChanges` fires after the
38
- * model has updated — including Playwright `selectOption`, which updates the control
39
- * through the value accessor.
40
- */
41
- onSelectionChange(value?: string): void;
42
- private publishSelection;
43
- getLabel(value: any): string;
44
- private parentValue;
45
- /** Reload (and drop a stale selection) whenever the parent control changes. */
46
- private watchParent;
47
- static ɵfac: i0.ɵɵFactoryDeclaration<EntityRefFieldComponent, never>;
48
- static ɵcmp: i0.ɵɵComponentDeclaration<EntityRefFieldComponent, "ngx-entity-ref-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
49
- }
@@ -1,49 +0,0 @@
1
- import type { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig } from '@dynamic-entity/core';
3
- /**
4
- * What a field component must accept to be registered with `provideFieldTypes`.
5
- *
6
- * The renderer instantiates a field component dynamically and assigns exactly these five
7
- * inputs — no more, no less — so any component satisfying this interface can stand in for a
8
- * built-in type or add a new one.
9
- *
10
- * Implement it explicitly and TypeScript will tell you when you have missed one:
11
- *
12
- * ```typescript
13
- * @Component({
14
- * selector: 'app-signature-field',
15
- * standalone: true,
16
- * template: `<canvas [attr.aria-label]="field.id"></canvas>`,
17
- * })
18
- * export class SignatureFieldComponent implements DynamicFieldComponentContract {
19
- * @Input() field!: NestedFieldConfig;
20
- * @Input() control!: AbstractControl;
21
- * @Input() language = 'en';
22
- * @Input() readonly = false;
23
- * @Input() masked = false;
24
- * }
25
- *
26
- * provideFieldTypes({ signature: SignatureFieldComponent });
27
- * ```
28
- *
29
- * Two implementation notes that are easy to get wrong:
30
- *
31
- * - Declare the inputs with definite assignment (`field!: …`) or an initialiser. The
32
- * renderer sets them through `ComponentRef.setInput()` after construction, so they are
33
- * genuinely undefined until the first assignment.
34
- * - `masked` means the value must not be displayed. Render a placeholder rather than the
35
- * control's value. This is presentational: the real value stays in the control and is
36
- * included in the submitted record, so it is not an access-control boundary.
37
- */
38
- export interface DynamicFieldComponentContract {
39
- /** The field's schema entry: id, type, label, validators, options, and so on. */
40
- field: NestedFieldConfig;
41
- /** The reactive control backing this field. A `FormGroup` for `group`, `FormArray` for `array`. */
42
- control: AbstractControl;
43
- /** Active language, for resolving `LocalizedText` labels, placeholders and options. */
44
- language: string;
45
- /** Render the value as text rather than an editable control. */
46
- readonly: boolean;
47
- /** Hide the value from display. See the note above — presentational only. */
48
- masked: boolean;
49
- }
@@ -1,25 +0,0 @@
1
- import { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- /**
5
- * File field: file input with filename display and download link.
6
- * Shares the `FileRef` / `UPLOAD_HANDLER` contract with image-field via FileUploadService.
7
- */
8
- export declare class FileFieldComponent {
9
- field: NestedFieldConfig;
10
- control: AbstractControl;
11
- language: string;
12
- readonly: boolean;
13
- masked: boolean;
14
- private readonly uploads;
15
- readonly uploading: import("@angular/core").WritableSignal<boolean>;
16
- readonly uploadError: import("@angular/core").WritableSignal<string>;
17
- get label(): string;
18
- private get value();
19
- fileUrl(): string | null;
20
- fileName(): string | null;
21
- onFileSelect(file: File | undefined): Promise<void>;
22
- remove(): void;
23
- static ɵfac: i0.ɵɵFactoryDeclaration<FileFieldComponent, never>;
24
- static ɵcmp: i0.ɵɵComponentDeclaration<FileFieldComponent, "ngx-file-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
25
- }
@@ -1,17 +0,0 @@
1
- import { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig, EntityFormConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- /** Renders a nested fieldset container for a group field's children. */
5
- export declare class GroupFieldComponent {
6
- field: NestedFieldConfig;
7
- control: AbstractControl;
8
- config: EntityFormConfig;
9
- language: string;
10
- readonly: boolean;
11
- masked: boolean;
12
- userRoles: string[];
13
- get label(): string;
14
- getChildControl(childId: string): AbstractControl;
15
- static ɵfac: i0.ɵɵFactoryDeclaration<GroupFieldComponent, never>;
16
- static ɵcmp: i0.ɵɵComponentDeclaration<GroupFieldComponent, "ngx-group-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "config": { "alias": "config"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; "userRoles": { "alias": "userRoles"; "required": false; }; }, {}, never, never, true, never>;
17
- }
@@ -1,30 +0,0 @@
1
- import { OnDestroy } from '@angular/core';
2
- import { AbstractControl } from '@angular/forms';
3
- import type { NestedFieldConfig } from '@dynamic-entity/core';
4
- import * as i0 from "@angular/core";
5
- /**
6
- * Image field: preview thumbnail + upload button.
7
- *
8
- * With `UPLOAD_HANDLER` registered the file is persisted and stored as `{ url }`; without one
9
- * it is stored as `{ file }` and previewed from an object URL (revoked when replaced/destroyed).
10
- */
11
- export declare class ImageFieldComponent implements OnDestroy {
12
- field: NestedFieldConfig;
13
- control: AbstractControl;
14
- language: string;
15
- readonly: boolean;
16
- masked: boolean;
17
- private readonly uploads;
18
- readonly uploading: import("@angular/core").WritableSignal<boolean>;
19
- readonly uploadError: import("@angular/core").WritableSignal<string>;
20
- /** Cached so an object URL is minted once per File, not once per change-detection pass. */
21
- private previewSource;
22
- private previewCache;
23
- get label(): string;
24
- previewUrl(): string | null;
25
- onFileSelect(file: File | undefined): Promise<void>;
26
- remove(): void;
27
- ngOnDestroy(): void;
28
- static ɵfac: i0.ɵɵFactoryDeclaration<ImageFieldComponent, never>;
29
- static ɵcmp: i0.ɵɵComponentDeclaration<ImageFieldComponent, "ngx-image-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
30
- }
@@ -1,28 +0,0 @@
1
- import { AbstractControl } from '@angular/forms';
2
- import type { NestedFieldConfig } from '@dynamic-entity/core';
3
- import * as i0 from "@angular/core";
4
- /**
5
- * Month-Year field: two linked selects (Month + Year).
6
- * Value stored as ISO partial date string "YYYY-MM" for unambiguous storage.
7
- */
8
- export declare class MonthYearFieldComponent {
9
- field: NestedFieldConfig;
10
- control: AbstractControl;
11
- language: string;
12
- readonly: boolean;
13
- masked: boolean;
14
- readonly months: {
15
- value: string;
16
- label: string;
17
- }[];
18
- readonly years: number[];
19
- get label(): string;
20
- /** Parses "YYYY-MM" or "YYYY-MM-DD" stored value → month part. */
21
- get selectedMonth(): string;
22
- get selectedYear(): string;
23
- onMonthChange(month: string): void;
24
- onYearChange(year: string): void;
25
- formatValue(value: unknown): string;
26
- static ɵfac: i0.ɵɵFactoryDeclaration<MonthYearFieldComponent, never>;
27
- static ɵcmp: i0.ɵɵComponentDeclaration<MonthYearFieldComponent, "ngx-month-year-field", never, { "field": { "alias": "field"; "required": false; }; "control": { "alias": "control"; "required": false; }; "language": { "alias": "language"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "masked": { "alias": "masked"; "required": false; }; }, {}, never, never, true, never>;
28
- }