ngx-dynamic-entity-builder 1.0.0 → 1.2.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.
@@ -19,11 +19,19 @@ export declare class BuilderStore {
19
19
  */
20
20
  private readonly manualIds;
21
21
  private readonly _isDirty;
22
+ /**
23
+ * Roles of the person using the builder — distinct from `availableRoles`, which is the
24
+ * vocabulary a schema may reference. Needed so the SYSTEM_DEFAULT_CAN_EDIT predicate can
25
+ * be asked a real question; it was previously called with a hardcoded empty array, which
26
+ * made any role-checking predicate answer false for everyone.
27
+ */
28
+ private readonly _userRoles;
22
29
  readonly config: import("@angular/core").Signal<EntityFormConfig>;
23
30
  readonly selectedFieldId: import("@angular/core").Signal<string>;
24
31
  readonly activeLanguage: import("@angular/core").Signal<string>;
25
32
  readonly rules: import("@angular/core").Signal<FormRule[]>;
26
33
  readonly isDirty: import("@angular/core").Signal<boolean>;
34
+ readonly userRoles: import("@angular/core").Signal<string[]>;
27
35
  readonly tabs: import("@angular/core").Signal<NestedTabConfig[]>;
28
36
  readonly fields: import("@angular/core").Signal<NestedFieldConfig[]>;
29
37
  readonly selectedField: import("@angular/core").Signal<NestedFieldConfig>;
@@ -39,7 +47,27 @@ export declare class BuilderStore {
39
47
  setMaskData(mask: boolean): void;
40
48
  setPermission(action: keyof EntityPermissions, roles: string[]): void;
41
49
  setActiveLanguage(language: string): void;
50
+ /** Roles of the person using the builder, for SYSTEM_DEFAULT_CAN_EDIT. */
51
+ setUserRoles(roles: string[]): void;
42
52
  private getAllFields;
53
+ /**
54
+ * Every tab in the tree, flattened.
55
+ *
56
+ * The structural operations below used to iterate `draft.tabs` directly, which is only
57
+ * the top level. A field on a sub-tab could be selected and edited but never removed,
58
+ * duplicated, moved or reordered — the builder could author nested configs it was then
59
+ * unable to restructure, which is the worst possible state for an authoring tool.
60
+ */
61
+ private flattenTabs;
62
+ /**
63
+ * Every field id in the config, including `group`/`array` children.
64
+ *
65
+ * Id uniqueness is a whole-config invariant, not a per-tab one: rules, `showWhen`
66
+ * conditions and `autoPatch` mappings all address fields by bare id, so two fields
67
+ * sharing an id anywhere in the tree interfere with each other. Uniqueness checks must
68
+ * therefore see deeper than `fields()`, which stops at a tab's own fields.
69
+ */
70
+ private allFieldIds;
43
71
  private findFieldInTabs;
44
72
  addField(type: RichFieldType, targetTabId?: string): string;
45
73
  updateField(id: string, patch: Partial<NestedFieldConfig>): void;
@@ -158,6 +186,19 @@ export declare class BuilderStore {
158
186
  moveTab(id: string, direction: -1 | 1): void;
159
187
  exportConfig(): EntityFormConfig;
160
188
  private mutate;
189
+ /**
190
+ * Replace one field, copying only the objects on the path to it.
191
+ *
192
+ * `mutate` deep-clones the entire config, which is right for a structural edit but wrong
193
+ * for the two setters bound to keystroke events: typing a label allocated a full copy of
194
+ * the config per character. Here every tab and field outside the target's chain is reused
195
+ * by reference, so the cost is proportional to nesting depth rather than config size —
196
+ * while the parts that did change are still fresh objects, so change detection and the
197
+ * signal both see a new identity.
198
+ *
199
+ * Returns without touching anything when the field is not found.
200
+ */
201
+ private mutateField;
161
202
  private uniqueId;
162
203
  private validate;
163
204
  static ɵfac: i0.ɵɵFactoryDeclaration<BuilderStore, never>;
@@ -10,6 +10,12 @@ export declare class ReferencedFieldConfigComponent {
10
10
  protected updateEntityKey(field: NestedFieldConfig, key: string): void;
11
11
  protected updateFieldId(field: NestedFieldConfig, fieldId: string): void;
12
12
  protected syncWithSource(field: NestedFieldConfig): Promise<void>;
13
+ /**
14
+ * Both callers pass the id of the field they just edited. This used to ignore that
15
+ * argument and read `store.selectedField()` instead, so whenever the edited field was not
16
+ * the selected one it checked drift against the wrong field's source entity — or bailed
17
+ * out entirely if nothing was selected.
18
+ */
13
19
  private checkDriftForField;
14
20
  private findField;
15
21
  private findFieldInList;
@@ -1,8 +1,17 @@
1
- import { InjectionToken } from '@angular/core';
2
1
  import type { NestedTabConfig } from '@dynamic-entity/core';
2
+ import { SYSTEM_DEFAULT_CAN_EDIT } from 'ngx-dynamic-entity';
3
3
  import { BuilderStore } from '../builder-store.service';
4
4
  import * as i0 from "@angular/core";
5
- export declare const SYSTEM_DEFAULT_CAN_EDIT: InjectionToken<(roles: string[]) => boolean>;
5
+ /**
6
+ * Re-exported so existing imports from this package keep working.
7
+ *
8
+ * This file used to declare its own `new InjectionToken('SYSTEM_DEFAULT_CAN_EDIT')` while
9
+ * `ngx-dynamic-entity` exported another under the same name. InjectionToken identity is by
10
+ * object reference, so a consumer providing the renderer's — the documented one — was
11
+ * providing a token nothing injected, and the predicate silently never ran. One token now,
12
+ * defined in the lower-level package that both depend on.
13
+ */
14
+ export { SYSTEM_DEFAULT_CAN_EDIT };
6
15
  /**
7
16
  * TabManagerComponent — add / rename / reorder / remove tabs & sub-tabs with systemDefault protection.
8
17
  */
@@ -8,12 +8,23 @@ import * as i0 from "@angular/core";
8
8
  */
9
9
  export declare class EntityBuilderComponent implements OnChanges {
10
10
  protected readonly store: BuilderStore;
11
+ /**
12
+ * Optional: only apps that registered a CONFIG_SOURCE have one. Used to drop the cached
13
+ * copy of a config the moment it is edited — see `doSave`.
14
+ */
15
+ private readonly configSource;
11
16
  /** Existing config to edit. When omitted, the builder starts blank. */
12
17
  config?: EntityFormConfig;
13
18
  /** Languages available for label/placeholder editing. First entry is the default. */
14
19
  languages: string[];
15
20
  /** Optional role list — enables multi-select role pickers for RBAC instead of free text. */
16
21
  availableRoles: string[];
22
+ /**
23
+ * Roles of the person using the builder. Distinct from `availableRoles`, which is the
24
+ * vocabulary a schema may reference. Passed to the `SYSTEM_DEFAULT_CAN_EDIT` predicate so
25
+ * it can decide whether this user may edit system-default tabs.
26
+ */
27
+ userRoles: string[];
17
28
  /** Optional common-module definitions for module tabs; defaults to the built-in list from core. */
18
29
  commonModules: readonly CommonModuleEntry[];
19
30
  /** Emitted on every change to the working config. */
@@ -38,5 +49,5 @@ export declare class EntityBuilderComponent implements OnChanges {
38
49
  /** Parse a comma-separated role string into a trimmed, de-duplicated array. */
39
50
  protected setRolesFromText(action: keyof EntityPermissions, text: string): void;
40
51
  static ɵfac: i0.ɵɵFactoryDeclaration<EntityBuilderComponent, never>;
41
- static ɵcmp: i0.ɵɵComponentDeclaration<EntityBuilderComponent, "ngx-entity-builder", never, { "config": { "alias": "config"; "required": false; }; "languages": { "alias": "languages"; "required": false; }; "availableRoles": { "alias": "availableRoles"; "required": false; }; "commonModules": { "alias": "commonModules"; "required": false; }; }, { "configChange": "configChange"; "save": "save"; }, never, ["[ngxBuilderPreview]"], true, never>;
52
+ static ɵcmp: i0.ɵɵComponentDeclaration<EntityBuilderComponent, "ngx-entity-builder", never, { "config": { "alias": "config"; "required": false; }; "languages": { "alias": "languages"; "required": false; }; "availableRoles": { "alias": "availableRoles"; "required": false; }; "userRoles": { "alias": "userRoles"; "required": false; }; "commonModules": { "alias": "commonModules"; "required": false; }; }, { "configChange": "configChange"; "save": "save"; }, never, ["[ngxBuilderPreview]"], true, never>;
42
53
  }
package/package.json CHANGED
@@ -1,19 +1,15 @@
1
1
  {
2
2
  "name": "ngx-dynamic-entity-builder",
3
- "version": "1.0.0",
4
- "description": "Angular 17 standalone visual builder for authoring dynamic-entity EntityConfig (fields, tabs, validators, RBAC).",
5
- "dependencies": {
6
- "ngx-dynamic-entity": "*",
7
- "tslib": "^2.3.0"
8
- },
3
+ "version": "1.2.0",
4
+ "description": "Angular standalone visual builder for authoring dynamic-entity EntityConfig (fields, tabs, validators, RBAC).",
9
5
  "peerDependencies": {
10
- "@angular/cdk": "^17.0.0",
11
- "@angular/common": "^17.0.0",
12
- "@angular/core": "^17.0.0",
13
- "@angular/forms": "^17.0.0",
14
- "@angular/material": "^17.0.0",
15
- "@dynamic-entity/core": "^1.0.0",
16
- "ngx-dynamic-entity": "^1.0.0",
6
+ "@angular/cdk": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
7
+ "@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
8
+ "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
9
+ "@angular/forms": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
10
+ "@angular/material": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
11
+ "@dynamic-entity/core": "^1.2.0",
12
+ "ngx-dynamic-entity": "^1.2.0",
17
13
  "rxjs": "^7.0.0"
18
14
  },
19
15
  "keywords": [
@@ -26,6 +22,16 @@
26
22
  ],
27
23
  "license": "MIT",
28
24
  "sideEffects": false,
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/berserker5619/Dynamic-Entity.git",
28
+ "directory": "packages/ngx-dynamic-entity-builder"
29
+ },
30
+ "homepage": "https://github.com/berserker5619/Dynamic-Entity/tree/main/packages/ngx-dynamic-entity-builder#readme",
31
+ "bugs": {
32
+ "url": "https://github.com/berserker5619/Dynamic-Entity/issues"
33
+ },
34
+ "author": "Nizamudeen",
29
35
  "module": "fesm2022/ngx-dynamic-entity-builder.mjs",
30
36
  "typings": "index.d.ts",
31
37
  "exports": {
@@ -38,5 +44,8 @@
38
44
  "esm": "./esm2022/ngx-dynamic-entity-builder.mjs",
39
45
  "default": "./fesm2022/ngx-dynamic-entity-builder.mjs"
40
46
  }
47
+ },
48
+ "dependencies": {
49
+ "tslib": "^2.3.0"
41
50
  }
42
51
  }
package/public-api.d.ts CHANGED
@@ -5,7 +5,6 @@ export * from './lib/components/tab-manager.component';
5
5
  export * from './lib/components/rule-form.component';
6
6
  export * from './lib/components/field-rules-list.component';
7
7
  export * from './lib/components/entity-reference-config.component';
8
- export * from './lib/components/connection-source-config.component';
9
8
  export * from './lib/components/entity-builder-canvas.component';
10
9
  export * from './lib/components/entity-builder-tree-node.component';
11
10
  export * from './lib/builder-store.service';
@@ -1,121 +0,0 @@
1
- import { Component, computed, inject } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule } from '@angular/forms';
4
- import { MatFormFieldModule } from '@angular/material/form-field';
5
- import { MatInputModule } from '@angular/material/input';
6
- import { MatSelectModule } from '@angular/material/select';
7
- import { BuilderStore } from '../builder-store.service';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/forms";
10
- import * as i2 from "@angular/material/form-field";
11
- import * as i3 from "@angular/material/input";
12
- /**
13
- * ConnectionSourceConfigComponent — allows configuring connection source settings
14
- * for an entity or field (Phase 7.2).
15
- */
16
- export class ConnectionSourceConfigComponent {
17
- store = inject(BuilderStore);
18
- field = computed(() => this.store.selectedField());
19
- connectionSourceEntity(field) {
20
- return field.connectionSource?.entity ?? '';
21
- }
22
- setConnectionSourceEntity(field, entity) {
23
- const trimmed = entity.trim();
24
- const existing = field.connectionSource ?? {};
25
- if (!trimmed && !existing.targetField) {
26
- this.store.updateField(field.id, { connectionSource: undefined });
27
- }
28
- else {
29
- this.store.updateField(field.id, {
30
- connectionSource: { ...existing, entity: trimmed },
31
- });
32
- }
33
- }
34
- connectionTargetField(field) {
35
- return field.connectionSource?.targetField ?? '';
36
- }
37
- setConnectionTargetField(field, targetField) {
38
- const trimmed = targetField.trim();
39
- const existing = field.connectionSource ?? {};
40
- if (!trimmed && !existing.entity) {
41
- this.store.updateField(field.id, { connectionSource: undefined });
42
- }
43
- else {
44
- this.store.updateField(field.id, {
45
- connectionSource: { ...existing, targetField: trimmed },
46
- });
47
- }
48
- }
49
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConnectionSourceConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
50
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ConnectionSourceConfigComponent, isStandalone: true, selector: "ngx-connection-source-config", ngImport: i0, template: `
51
- @if (field(); as f) {
52
- <div class="deb-connection-source">
53
- <span class="deb-section-title">Connection Source</span>
54
- <mat-form-field appearance="outline" subscriptSizing="dynamic" class="deb-full">
55
- <mat-label>Source Entity</mat-label>
56
- <input
57
- matInput
58
- data-testid="connection-source-entity"
59
- [ngModel]="connectionSourceEntity(f)"
60
- (ngModelChange)="setConnectionSourceEntity(f, $event)"
61
- placeholder="e.g. organizations"
62
- />
63
- </mat-form-field>
64
-
65
- <mat-form-field appearance="outline" subscriptSizing="dynamic" class="deb-full">
66
- <mat-label>Target Field ID</mat-label>
67
- <input
68
- matInput
69
- data-testid="connection-target-field"
70
- [ngModel]="connectionTargetField(f)"
71
- (ngModelChange)="setConnectionTargetField(f, $event)"
72
- placeholder="e.g. companyId"
73
- />
74
- </mat-form-field>
75
- </div>
76
- }
77
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }] });
78
- }
79
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConnectionSourceConfigComponent, decorators: [{
80
- type: Component,
81
- args: [{
82
- selector: 'ngx-connection-source-config',
83
- standalone: true,
84
- imports: [
85
- CommonModule,
86
- FormsModule,
87
- MatFormFieldModule,
88
- MatInputModule,
89
- MatSelectModule,
90
- ],
91
- template: `
92
- @if (field(); as f) {
93
- <div class="deb-connection-source">
94
- <span class="deb-section-title">Connection Source</span>
95
- <mat-form-field appearance="outline" subscriptSizing="dynamic" class="deb-full">
96
- <mat-label>Source Entity</mat-label>
97
- <input
98
- matInput
99
- data-testid="connection-source-entity"
100
- [ngModel]="connectionSourceEntity(f)"
101
- (ngModelChange)="setConnectionSourceEntity(f, $event)"
102
- placeholder="e.g. organizations"
103
- />
104
- </mat-form-field>
105
-
106
- <mat-form-field appearance="outline" subscriptSizing="dynamic" class="deb-full">
107
- <mat-label>Target Field ID</mat-label>
108
- <input
109
- matInput
110
- data-testid="connection-target-field"
111
- [ngModel]="connectionTargetField(f)"
112
- (ngModelChange)="setConnectionTargetField(f, $event)"
113
- placeholder="e.g. companyId"
114
- />
115
- </mat-form-field>
116
- </div>
117
- }
118
- `,
119
- }]
120
- }] });
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi1zb3VyY2UtY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jb25uZWN0aW9uLXNvdXJjZS1jb25maWcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQUV4RDs7O0dBR0c7QUF3Q0gsTUFBTSxPQUFPLCtCQUErQjtJQUN2QixLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdCLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBRTVELHNCQUFzQixDQUFDLEtBQVU7UUFDekMsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRVMseUJBQXlCLENBQUMsS0FBVSxFQUFFLE1BQWM7UUFDNUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFTLENBQUMsQ0FBQztRQUMzRSxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQy9CLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTthQUM1QyxDQUFDLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVTLHFCQUFxQixDQUFDLEtBQVU7UUFDeEMsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRVMsd0JBQXdCLENBQUMsS0FBVSxFQUFFLFdBQW1CO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBUyxDQUFDLENBQUM7UUFDM0UsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFO2dCQUMvQixnQkFBZ0IsRUFBRSxFQUFFLEdBQUcsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUU7YUFDakQsQ0FBQyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7d0dBbENVLCtCQUErQjs0RkFBL0IsK0JBQStCLHdGQTdCaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCVCwyREFqQ0MsWUFBWSw4QkFDWixXQUFXLDhtQkFDWCxrQkFBa0IsMFNBQ2xCLGNBQWMsMFdBQ2QsZUFBZTs7NEZBK0JOLCtCQUErQjtrQkF2QzNDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDhCQUE4QjtvQkFDeEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLGVBQWU7cUJBQ2hCO29CQUNELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJUO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IEJ1aWxkZXJTdG9yZSB9IGZyb20gJy4uL2J1aWxkZXItc3RvcmUuc2VydmljZSc7XG5cbi8qKlxuICogQ29ubmVjdGlvblNvdXJjZUNvbmZpZ0NvbXBvbmVudCDigJQgYWxsb3dzIGNvbmZpZ3VyaW5nIGNvbm5lY3Rpb24gc291cmNlIHNldHRpbmdzXG4gKiBmb3IgYW4gZW50aXR5IG9yIGZpZWxkIChQaGFzZSA3LjIpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtY29ubmVjdGlvbi1zb3VyY2UtY29uZmlnJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAoZmllbGQoKTsgYXMgZikge1xuICAgICAgPGRpdiBjbGFzcz1cImRlYi1jb25uZWN0aW9uLXNvdXJjZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRlYi1zZWN0aW9uLXRpdGxlXCI+Q29ubmVjdGlvbiBTb3VyY2U8L3NwYW4+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBjbGFzcz1cImRlYi1mdWxsXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5Tb3VyY2UgRW50aXR5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJjb25uZWN0aW9uLXNvdXJjZS1lbnRpdHlcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwiY29ubmVjdGlvblNvdXJjZUVudGl0eShmKVwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXRDb25uZWN0aW9uU291cmNlRW50aXR5KGYsICRldmVudClcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG9yZ2FuaXphdGlvbnNcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIGNsYXNzPVwiZGViLWZ1bGxcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPlRhcmdldCBGaWVsZCBJRDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiY29ubmVjdGlvbi10YXJnZXQtZmllbGRcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwiY29ubmVjdGlvblRhcmdldEZpZWxkKGYpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldENvbm5lY3Rpb25UYXJnZXRGaWVsZChmLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBjb21wYW55SWRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25Tb3VyY2VDb25maWdDb21wb25lbnQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RvcmUgPSBpbmplY3QoQnVpbGRlclN0b3JlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpZWxkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdG9yZS5zZWxlY3RlZEZpZWxkKCkpO1xuXG4gIHByb3RlY3RlZCBjb25uZWN0aW9uU291cmNlRW50aXR5KGZpZWxkOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWVsZC5jb25uZWN0aW9uU291cmNlPy5lbnRpdHkgPz8gJyc7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0Q29ubmVjdGlvblNvdXJjZUVudGl0eShmaWVsZDogYW55LCBlbnRpdHk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBlbnRpdHkudHJpbSgpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZmllbGQuY29ubmVjdGlvblNvdXJjZSA/PyB7fTtcbiAgICBpZiAoIXRyaW1tZWQgJiYgIWV4aXN0aW5nLnRhcmdldEZpZWxkKSB7XG4gICAgICB0aGlzLnN0b3JlLnVwZGF0ZUZpZWxkKGZpZWxkLmlkLCB7IGNvbm5lY3Rpb25Tb3VyY2U6IHVuZGVmaW5lZCB9IGFzIGFueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcmUudXBkYXRlRmllbGQoZmllbGQuaWQsIHtcbiAgICAgICAgY29ubmVjdGlvblNvdXJjZTogeyAuLi5leGlzdGluZywgZW50aXR5OiB0cmltbWVkIH0sXG4gICAgICB9IGFzIGFueSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNvbm5lY3Rpb25UYXJnZXRGaWVsZChmaWVsZDogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmllbGQuY29ubmVjdGlvblNvdXJjZT8udGFyZ2V0RmllbGQgPz8gJyc7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0Q29ubmVjdGlvblRhcmdldEZpZWxkKGZpZWxkOiBhbnksIHRhcmdldEZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0cmltbWVkID0gdGFyZ2V0RmllbGQudHJpbSgpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZmllbGQuY29ubmVjdGlvblNvdXJjZSA/PyB7fTtcbiAgICBpZiAoIXRyaW1tZWQgJiYgIWV4aXN0aW5nLmVudGl0eSkge1xuICAgICAgdGhpcy5zdG9yZS51cGRhdGVGaWVsZChmaWVsZC5pZCwgeyBjb25uZWN0aW9uU291cmNlOiB1bmRlZmluZWQgfSBhcyBhbnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3JlLnVwZGF0ZUZpZWxkKGZpZWxkLmlkLCB7XG4gICAgICAgIGNvbm5lY3Rpb25Tb3VyY2U6IHsgLi4uZXhpc3RpbmcsIHRhcmdldEZpZWxkOiB0cmltbWVkIH0sXG4gICAgICB9IGFzIGFueSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,16 +0,0 @@
1
- import { BuilderStore } from '../builder-store.service';
2
- import * as i0 from "@angular/core";
3
- /**
4
- * ConnectionSourceConfigComponent — allows configuring connection source settings
5
- * for an entity or field (Phase 7.2).
6
- */
7
- export declare class ConnectionSourceConfigComponent {
8
- protected readonly store: BuilderStore;
9
- protected readonly field: import("@angular/core").Signal<import("ngx-dynamic-entity").NestedFieldConfig>;
10
- protected connectionSourceEntity(field: any): string;
11
- protected setConnectionSourceEntity(field: any, entity: string): void;
12
- protected connectionTargetField(field: any): string;
13
- protected setConnectionTargetField(field: any, targetField: string): void;
14
- static ɵfac: i0.ɵɵFactoryDeclaration<ConnectionSourceConfigComponent, never>;
15
- static ɵcmp: i0.ɵɵComponentDeclaration<ConnectionSourceConfigComponent, "ngx-connection-source-config", never, {}, {}, never, never, true, never>;
16
- }