@yourself.create/ngx-form-designer 0.0.3 → 0.0.5

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 (34) hide show
  1. package/fesm2022/uch-web-ngx-form-designer.mjs +4359 -1414
  2. package/fesm2022/uch-web-ngx-form-designer.mjs.map +1 -1
  3. package/lib/ai/provide-form-designer-angai-feature.d.ts +16 -0
  4. package/lib/form-core/form-engine.d.ts +7 -3
  5. package/lib/form-core/form-event-runner.d.ts +14 -0
  6. package/lib/form-core/form-journey.models.d.ts +30 -0
  7. package/lib/form-core/models.d.ts +7 -12
  8. package/lib/form-designer/designer-state.service.d.ts +34 -0
  9. package/lib/form-designer/dynamic-properties/dynamic-properties.component.d.ts +3 -5
  10. package/lib/form-designer/events-workspace.component.d.ts +28 -3
  11. package/lib/form-designer/form-designer-shell.component.d.ts +30 -5
  12. package/lib/form-designer/form-journey-state.service.d.ts +28 -0
  13. package/lib/form-designer/form-preview.component.d.ts +20 -1
  14. package/lib/form-designer/inspector-sections/inspector-backgrounds-section.component.d.ts +5 -0
  15. package/lib/form-designer/inspector-sections/inspector-transform-section.component.d.ts +12 -0
  16. package/lib/form-designer/inspector-sections/inspector-typography-section.component.d.ts +1 -0
  17. package/lib/form-designer/json-form-designer.component.d.ts +21 -2
  18. package/lib/form-designer/layout-canvas.component.d.ts +13 -1
  19. package/lib/form-designer/properties-panel.component.d.ts +4 -0
  20. package/lib/form-designer/template-library.d.ts +2 -0
  21. package/lib/form-renderer/form-journey-viewer.component.d.ts +51 -0
  22. package/lib/form-renderer/form-viewer/form-viewer.component.d.ts +16 -3
  23. package/lib/form-renderer/json-form-renderer.component.d.ts +34 -3
  24. package/lib/form-renderer/layout-node.component.d.ts +12 -1
  25. package/lib/ui/ui-color-swatch.component.d.ts +1 -0
  26. package/lib/widgets/field-widgets/checkbox-group/checkbox-group-widget.component.d.ts +5 -0
  27. package/lib/widgets/field-widgets/option-field-labels.d.ts +3 -0
  28. package/lib/widgets/field-widgets/radio/radio-widget.component.d.ts +5 -0
  29. package/lib/widgets/field-widgets/search/search-widget.component.d.ts +4 -0
  30. package/lib/widgets/field-widgets/select/select-widget.component.d.ts +9 -0
  31. package/lib/widgets/field-widgets/text-field/text-field.component.d.ts +3 -0
  32. package/lib/widgets/widget-definition.d.ts +1 -1
  33. package/package.json +3 -2
  34. package/public-api.d.ts +4 -0
@@ -0,0 +1,16 @@
1
+ import { Provider } from '@angular/core';
2
+ import { type AiToolRuntimeContext } from '@uch-web/angai';
3
+ import type { DesignerEventApiDefinition } from '../form-core/models';
4
+ import { DesignerStateService } from '../form-designer/designer-state.service';
5
+ import { type FormDesignerToolContext } from './plugins/form-designer-tool-plugin';
6
+ import * as i0 from "@angular/core";
7
+ export declare class FormDesignerAiFeatureStateService {
8
+ private readonly widgetDefinitions;
9
+ private readonly eventApisSignal;
10
+ setEventApis(apis: DesignerEventApiDefinition[]): void;
11
+ createToolContext(state: DesignerStateService): FormDesignerToolContext;
12
+ createDiscoveryContext(state: DesignerStateService): AiToolRuntimeContext;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormDesignerAiFeatureStateService, never>;
14
+ static ɵprov: i0.ɵɵInjectableDeclaration<FormDesignerAiFeatureStateService>;
15
+ }
16
+ export declare function provideFormDesignerAngaiFeature(): Provider[];
@@ -1,4 +1,4 @@
1
- import { FormSchema, WidgetEventType } from './models';
1
+ import { FieldDisplayLabel, FormSchema, WidgetEventType } from './models';
2
2
  /**
3
3
  * A framework-agnostic engine to handle form state, validation, and visibility logic.
4
4
  */
@@ -17,6 +17,7 @@ export interface DataSourceUpdateEvent {
17
17
  export declare class FormEngine {
18
18
  private schema;
19
19
  private values;
20
+ private fieldLabels;
20
21
  private errors;
21
22
  private ruleEvaluator;
22
23
  private valueSubject;
@@ -31,12 +32,15 @@ export declare class FormEngine {
31
32
  value: Record<string, unknown>;
32
33
  valueChanges: Observable<Record<string, unknown>>;
33
34
  };
34
- constructor(schema: FormSchema, initialValues?: Record<string, unknown>);
35
+ constructor(schema: FormSchema, initialValues?: Record<string, unknown>, initialFieldLabels?: Record<string, FieldDisplayLabel>);
35
36
  getSchema(): FormSchema;
36
37
  updateSchema(schema: FormSchema): void;
37
38
  getValue(fieldName: string): unknown;
38
39
  setValue(fieldName: string, value: unknown): void;
39
40
  getValues(): Record<string, unknown>;
41
+ getFieldLabel(fieldName: string): FieldDisplayLabel | undefined;
42
+ getFieldLabels(): Record<string, FieldDisplayLabel>;
43
+ setFieldLabel(fieldName: string, label: FieldDisplayLabel | undefined): void;
40
44
  getErrors(): Record<string, string[]>;
41
45
  getError(fieldName: string): string | null;
42
46
  emitUiEvent(event: Omit<UiEvent, 'ts'>): void;
@@ -53,4 +57,4 @@ export declare class FormEngine {
53
57
  private evaluateEnterpriseRules;
54
58
  private applyRuleAction;
55
59
  }
56
- export declare function createFormEngine(schema: FormSchema, initialValues?: Record<string, unknown>): FormEngine;
60
+ export declare function createFormEngine(schema: FormSchema, initialValues?: Record<string, unknown>, initialFieldLabels?: Record<string, FieldDisplayLabel>): FormEngine;
@@ -8,6 +8,10 @@ export interface FormEventRunnerOptions {
8
8
  logger?: FormEventLogger;
9
9
  apiExecutor?: WidgetEventApiExecutor;
10
10
  dataSourceWriter?: WidgetEventDatasourceWriter;
11
+ navigateToPage?: (pageId: string) => Promise<{
12
+ ok: boolean;
13
+ reason?: string;
14
+ }>;
11
15
  }
12
16
  export declare class FormEventRunner {
13
17
  private engine;
@@ -16,12 +20,22 @@ export declare class FormEventRunner {
16
20
  private readonly logger;
17
21
  private readonly apiExecutor?;
18
22
  private readonly dataSourceWriter?;
23
+ private readonly navigateToPage?;
19
24
  constructor(engine: FormEngine, loggerOrOptions?: FormEventLogger | FormEventRunnerOptions);
20
25
  dispose(): void;
21
26
  private handleEvent;
22
27
  private executeAction;
23
28
  private handleSetValue;
24
29
  private handleApiAction;
30
+ private handleNavigateAction;
31
+ private evaluateNavigateCondition;
32
+ private evaluateLogicGroup;
33
+ private isLogicCondition;
34
+ private evaluateLogicCondition;
35
+ private compareValues;
36
+ private containsValue;
37
+ private isEmptyValue;
38
+ private getFieldValue;
25
39
  private collectSourceValues;
26
40
  private resolveDatasourceId;
27
41
  private normalizeRowsForDatasource;
@@ -0,0 +1,30 @@
1
+ import type { FormSchema } from './models';
2
+ export interface FormJourneyPage {
3
+ id: string;
4
+ name: string;
5
+ route: string;
6
+ schema: FormSchema;
7
+ }
8
+ export interface FormJourneyProject {
9
+ id: string;
10
+ title?: string;
11
+ pages: FormJourneyPage[];
12
+ startPageId: string;
13
+ metadata?: Record<string, unknown>;
14
+ }
15
+ export declare function createFormJourneyPage(opts?: {
16
+ id?: string;
17
+ name?: string;
18
+ route?: string;
19
+ schema?: FormSchema;
20
+ }): FormJourneyPage;
21
+ export declare function createFormJourneyProject(opts?: {
22
+ id?: string;
23
+ title?: string;
24
+ pages?: FormJourneyPage[];
25
+ startPageId?: string;
26
+ metadata?: Record<string, unknown>;
27
+ }): FormJourneyProject;
28
+ export declare function isFormJourneyProject(value: unknown): value is FormJourneyProject;
29
+ export declare function normalizeToJourney(value: FormSchema | FormJourneyProject): FormJourneyProject;
30
+ export declare function unwrapSinglePageJourney(value: FormJourneyProject): FormSchema | FormJourneyProject;
@@ -114,12 +114,9 @@ export interface FieldSchema {
114
114
  appearance?: 'outline' | 'fill' | 'standard';
115
115
  readonly?: boolean;
116
116
  disabled?: boolean;
117
- prefixIcon?: string;
118
- suffixIcon?: string;
119
117
  html5?: Html5ValidationProps;
120
118
  validation?: ValidationRule[];
121
119
  dependencies?: DependencyRule[];
122
- conditionalVisibility?: ConditionalVisibility;
123
120
  rules?: FormRule[];
124
121
  dataConfig?: DataSourceConfig;
125
122
  events?: WidgetEventBinding[];
@@ -195,7 +192,12 @@ export interface WidgetEventActionApi {
195
192
  inputTransformScript?: string;
196
193
  outputTransformScript?: string;
197
194
  }
198
- export type WidgetEventAction = WidgetEventActionSetValue | WidgetEventActionLog | WidgetEventActionApi;
195
+ export interface WidgetEventActionNavigate {
196
+ type: 'navigate';
197
+ targetPageId: string;
198
+ when?: LogicGroup;
199
+ }
200
+ export type WidgetEventAction = WidgetEventActionSetValue | WidgetEventActionLog | WidgetEventActionApi | WidgetEventActionNavigate;
199
201
  export interface WidgetEventApiExecutionRequest {
200
202
  eventId: string;
201
203
  action: WidgetEventActionApi;
@@ -280,15 +282,11 @@ export interface DataDependencyBinding {
280
282
  fieldId: string;
281
283
  paramKey: string;
282
284
  }
283
- export interface ConditionalVisibility {
284
- fieldName: string;
285
- operator: 'equals' | 'notEquals' | 'contains' | 'isEmpty' | 'isNotEmpty' | 'greaterThan' | 'lessThan';
286
- value?: unknown;
287
- }
288
285
  export interface OptionSchema {
289
286
  label: string;
290
287
  value: string | number;
291
288
  }
289
+ export type FieldDisplayLabel = string | string[];
292
290
  export interface DependencyRule {
293
291
  effect: 'show' | 'hide' | 'enable' | 'disable' | 'require' | 'optional';
294
292
  when: string;
@@ -359,7 +357,4 @@ export interface FormSchema {
359
357
  fields: FieldSchema[];
360
358
  layout: LayoutNode;
361
359
  ui?: FormUIConfig;
362
- submitButtonText?: string;
363
- resetButtonText?: string;
364
- showResetButton?: boolean;
365
360
  }
@@ -30,6 +30,7 @@ export interface DesignerFieldMoveOptions {
30
30
  position?: 'before' | 'after';
31
31
  index?: number;
32
32
  }
33
+ type RelativeInsertPosition = 'before' | 'after';
33
34
  interface DragDropEventLike {
34
35
  previousContainer: unknown;
35
36
  container: unknown;
@@ -69,6 +70,10 @@ export declare class DesignerStateService {
69
70
  fields: FieldSchema[];
70
71
  scopePath: string[];
71
72
  } | null>;
73
+ readonly pendingFieldInsert: import("@angular/core").WritableSignal<{
74
+ referenceFieldId: string;
75
+ position: RelativeInsertPosition;
76
+ } | null>;
72
77
  private readonly history;
73
78
  private readonly historyIndex;
74
79
  private readonly historyLength;
@@ -78,6 +83,16 @@ export declare class DesignerStateService {
78
83
  constructor();
79
84
  readonly layoutIndex: import("@angular/core").Signal<LayoutIndex>;
80
85
  readonly selectedNode: import("@angular/core").Signal<LayoutNode | null>;
86
+ readonly selectedEntry: import("@angular/core").Signal<LayoutIndexEntry | null>;
87
+ readonly selectedColumnId: import("@angular/core").Signal<string | null>;
88
+ readonly selectedRowId: import("@angular/core").Signal<string | null>;
89
+ readonly canInsertColumnBeforeSelection: import("@angular/core").Signal<boolean>;
90
+ readonly canInsertColumnAfterSelection: import("@angular/core").Signal<boolean>;
91
+ readonly canInsertRowInSelectedColumn: import("@angular/core").Signal<boolean>;
92
+ readonly canInsertRowBeforeSelection: import("@angular/core").Signal<boolean>;
93
+ readonly canInsertRowAfterSelection: import("@angular/core").Signal<boolean>;
94
+ readonly canArmFieldInsertBeforeSelection: import("@angular/core").Signal<boolean>;
95
+ readonly canArmFieldInsertAfterSelection: import("@angular/core").Signal<boolean>;
81
96
  readonly selectedField: import("@angular/core").Signal<FieldSchema | null>;
82
97
  updateSchema(schema: FormSchema): void;
83
98
  setFlavor(flavor: DesignerFlavor): void;
@@ -88,6 +103,8 @@ export declare class DesignerStateService {
88
103
  selectNode(id: string | null): void;
89
104
  toggleNodeSelection(id: string): void;
90
105
  isNodeSelected(nodeId: string): boolean;
106
+ isSelectionRowAncestor(nodeId: string): boolean;
107
+ isSelectionColumnAncestor(nodeId: string): boolean;
91
108
  composeScopedNodeId(scopePath: string[], nodeId: string): string;
92
109
  getSelectedScopeFields(): FieldSchema[];
93
110
  isSelectionInScope(scopePath: string[]): boolean;
@@ -117,6 +134,13 @@ export declare class DesignerStateService {
117
134
  private insertNodeIntoLayout;
118
135
  handleDrop(event: DragDropEventLike, targetColId: string): void;
119
136
  pushField(widgetDef: WidgetDefinition): void;
137
+ insertColumnBeforeSelection(): void;
138
+ insertColumnAfterSelection(): void;
139
+ insertRowBeforeSelection(): void;
140
+ insertRowAfterSelection(): void;
141
+ insertRowInSelectedColumn(): void;
142
+ armFieldInsertBeforeSelection(): void;
143
+ armFieldInsertAfterSelection(): void;
120
144
  insertField(options: DesignerFieldInsertOptions): DesignerFieldInsertResult | null;
121
145
  deleteFields(fieldIds: string[]): void;
122
146
  moveField(fieldId: string, options: DesignerFieldMoveOptions): boolean;
@@ -170,10 +194,19 @@ export declare class DesignerStateService {
170
194
  */
171
195
  private updateNodeInTree;
172
196
  private resolveEntry;
197
+ private findSelectionColumnEntry;
198
+ private findSelectionRowEntry;
199
+ private findAncestorEntryByType;
173
200
  private resolveSchemaAtScope;
174
201
  private findFieldByIdInScope;
175
202
  private resolveInsertionScopePath;
176
203
  private resolveTargetColumnForFieldInsert;
204
+ private resolveColumnInsertTarget;
205
+ private insertColumnRelativeToSelection;
206
+ private resolveRelativeRowInsertTarget;
207
+ private insertRowRelativeToSelection;
208
+ private armFieldInsertForSelection;
209
+ private getSelectedFieldReference;
177
210
  private resolveFieldWidgetDefinition;
178
211
  private normalizeFieldTypeAlias;
179
212
  private normalizeLookupValue;
@@ -188,6 +221,7 @@ export declare class DesignerStateService {
188
221
  private clampIndex;
189
222
  private isLayoutNode;
190
223
  private detachNode;
224
+ private pruneEmptyRows;
191
225
  private findWidgetByRefId;
192
226
  private findParentCol;
193
227
  private removeWidgetByRefId;
@@ -11,7 +11,7 @@ export declare class DynamicPropertiesComponent implements OnChanges {
11
11
  onPropertyChange?: () => void;
12
12
  private readonly designerCtx;
13
13
  protected readonly validatorTypeOptions: NativeSelectOption<string>[];
14
- protected readonly conditionalTypeOptions: NativeSelectOption<string>[];
14
+ protected readonly builtinValidatorOptions: NativeSelectOption<string>[];
15
15
  get properties(): PropertySection[];
16
16
  getFieldReferenceCandidates(field: PropertyField): FieldSchema[];
17
17
  fieldReferenceOptions(field: PropertyField): NativeSelectOption<string>[];
@@ -91,10 +91,8 @@ export declare class DynamicPropertiesComponent implements OnChanges {
91
91
  addValidator(path: string): void;
92
92
  removeValidator(path: string, index: number): void;
93
93
  updateValidator(path: string, index: number, field: string, value: any): void;
94
- getValidatorLabel(name: string): string;
95
- enableConditional(path: string): void;
96
- disableConditional(path: string): void;
97
- updateConditional(path: string, field: string, value: any): void;
94
+ private createDefaultValidationRule;
95
+ private defaultValidationMessage;
98
96
  static ɵfac: i0.ɵɵFactoryDeclaration<DynamicPropertiesComponent, never>;
99
97
  static ɵcmp: i0.ɵɵComponentDeclaration<DynamicPropertiesComponent, "app-dynamic-properties", never, { "onPropertyChange": { "alias": "onPropertyChange"; "required": false; }; "config": { "alias": "config"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "includeSections": { "alias": "includeSections"; "required": false; }; "excludeSections": { "alias": "excludeSections"; "required": false; }; "allFields": { "alias": "allFields"; "required": false; }; }, { "configChange": "configChange"; }, never, never, true, never>;
100
98
  }
@@ -1,4 +1,4 @@
1
- import { DesignerEventApiBrowser, DesignerEventApiDefinition, EventsWorkspaceSavePayload, FieldSchema, FormSchema, WidgetEventAction, WidgetEventActionApi, WidgetEventActionLog, WidgetEventActionSetValue, WidgetEventBinding, WidgetEventType } from '../form-core/models';
1
+ import { ConditionOperator, DesignerEventApiBrowser, DesignerEventApiDefinition, EventsWorkspaceSavePayload, FieldSchema, FormSchema, LogicGroup, WidgetEventAction, WidgetEventActionApi, WidgetEventActionLog, WidgetEventActionNavigate, WidgetEventActionSetValue, WidgetEventBinding, WidgetEventType } from '../form-core/models';
2
2
  import * as i0 from "@angular/core";
3
3
  type WorkspaceTab = 'fields' | 'input' | 'output';
4
4
  interface WorkspaceFieldItem {
@@ -25,11 +25,16 @@ interface ApiSchemaState {
25
25
  loading: boolean;
26
26
  error: string | null;
27
27
  }
28
+ interface WorkspacePageOption {
29
+ id: string;
30
+ name: string;
31
+ }
28
32
  export declare class EventsWorkspaceComponent {
29
33
  readonly schema: import("@angular/core").InputSignal<FormSchema>;
30
34
  readonly readOnly: import("@angular/core").InputSignal<boolean>;
31
35
  readonly eventApis: import("@angular/core").InputSignal<DesignerEventApiDefinition[]>;
32
36
  readonly eventApiBrowser: import("@angular/core").InputSignal<DesignerEventApiBrowser | undefined>;
37
+ readonly pages: import("@angular/core").InputSignal<WorkspacePageOption[]>;
33
38
  readonly schemaChange: import("@angular/core").OutputEmitterRef<FormSchema>;
34
39
  readonly eventsSave: import("@angular/core").OutputEmitterRef<EventsWorkspaceSavePayload>;
35
40
  readonly draftSchema: import("@angular/core").WritableSignal<FormSchema | null>;
@@ -45,6 +50,10 @@ export declare class EventsWorkspaceComponent {
45
50
  label: string;
46
51
  value: string;
47
52
  }[];
53
+ readonly conditionOperatorOptions: Array<{
54
+ label: string;
55
+ value: ConditionOperator;
56
+ }>;
48
57
  readonly currentSchema: import("@angular/core").Signal<FormSchema>;
49
58
  readonly fields: import("@angular/core").Signal<WorkspaceFieldItem[]>;
50
59
  readonly filteredFields: import("@angular/core").Signal<WorkspaceFieldItem[]>;
@@ -80,7 +89,7 @@ export declare class EventsWorkspaceComponent {
80
89
  removeAction(bindingIndex: number, actionIndex: number): void;
81
90
  setActionType(action: WidgetEventAction, type: WidgetEventAction['type']): void;
82
91
  updateActionType(bindingIndex: number, actionIndex: number, type: WidgetEventAction['type']): void;
83
- patchAction(bindingIndex: number, actionIndex: number, patch: Partial<WidgetEventActionSetValue> | Partial<WidgetEventActionLog> | Partial<WidgetEventActionApi>): void;
92
+ patchAction(bindingIndex: number, actionIndex: number, patch: Partial<WidgetEventActionSetValue> | Partial<WidgetEventActionLog> | Partial<WidgetEventActionApi> | Partial<WidgetEventActionNavigate>): void;
84
93
  patchApiAction(action: WidgetEventAction, patch: Partial<WidgetEventActionApi>): void;
85
94
  getSelectableActionFields(action: WidgetEventAction): WorkspaceFieldItem[];
86
95
  actionFieldSearch(action: WidgetEventAction): string;
@@ -107,6 +116,19 @@ export declare class EventsWorkspaceComponent {
107
116
  asSetValue(action: WidgetEventAction): WidgetEventActionSetValue;
108
117
  asLog(action: WidgetEventAction): WidgetEventActionLog;
109
118
  asApi(action: WidgetEventAction): WidgetEventActionApi;
119
+ asNavigate(action: WidgetEventAction): WidgetEventActionNavigate;
120
+ updateNavigateTarget(bindingIndex: number, actionIndex: number, targetPageId: string): void;
121
+ hasNavigateCondition(action: WidgetEventActionNavigate): boolean;
122
+ toggleNavigateCondition(bindingIndex: number, actionIndex: number, enabled: boolean): void;
123
+ updateNavigateConditionGroup(bindingIndex: number, actionIndex: number, group?: LogicGroup): void;
124
+ navigateConditionFieldId(action: WidgetEventActionNavigate): string;
125
+ navigateConditionOperator(action: WidgetEventActionNavigate): ConditionOperator;
126
+ navigateConditionValue(action: WidgetEventActionNavigate): string;
127
+ updateNavigateConditionField(bindingIndex: number, actionIndex: number, fieldId: string): void;
128
+ updateNavigateConditionOperator(bindingIndex: number, actionIndex: number, operator: ConditionOperator): void;
129
+ updateNavigateConditionValue(bindingIndex: number, actionIndex: number, value: string): void;
130
+ navigateOperatorNeedsValue(operator: ConditionOperator): boolean;
131
+ navigateConditionFields(): FieldSchema[];
110
132
  trackFieldById(_: number, field: WorkspaceFieldItem): string;
111
133
  trackBindingById(_: number, binding: WidgetEventBinding): string;
112
134
  trackActionByIndex(index: number): number;
@@ -116,6 +138,9 @@ export declare class EventsWorkspaceComponent {
116
138
  isEventExpanded(bindingId: string): boolean;
117
139
  toggleEventExpansion(bindingId: string): void;
118
140
  private getFieldsExcludingSelected;
141
+ private firstNavigateCondition;
142
+ private isLogicCondition;
143
+ private toNavigateLogicGroup;
119
144
  private updateSelectedEvents;
120
145
  private buildActionByType;
121
146
  private flattenFields;
@@ -141,6 +166,6 @@ export declare class EventsWorkspaceComponent {
141
166
  private clone;
142
167
  private createEventDatasourceId;
143
168
  static ɵfac: i0.ɵɵFactoryDeclaration<EventsWorkspaceComponent, never>;
144
- static ɵcmp: i0.ɵɵComponentDeclaration<EventsWorkspaceComponent, "app-events-workspace", never, { "schema": { "alias": "schema"; "required": true; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "eventApis": { "alias": "eventApis"; "required": false; "isSignal": true; }; "eventApiBrowser": { "alias": "eventApiBrowser"; "required": false; "isSignal": true; }; }, { "schemaChange": "schemaChange"; "eventsSave": "eventsSave"; }, never, never, true, never>;
169
+ static ɵcmp: i0.ɵɵComponentDeclaration<EventsWorkspaceComponent, "app-events-workspace", never, { "schema": { "alias": "schema"; "required": true; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "eventApis": { "alias": "eventApis"; "required": false; "isSignal": true; }; "eventApiBrowser": { "alias": "eventApiBrowser"; "required": false; "isSignal": true; }; "pages": { "alias": "pages"; "required": false; "isSignal": true; }; }, { "schemaChange": "schemaChange"; "eventsSave": "eventsSave"; }, never, never, true, never>;
145
170
  }
146
171
  export {};
@@ -1,9 +1,11 @@
1
1
  import { EventEmitter, SimpleChanges, OnChanges } from '@angular/core';
2
2
  import { FormEngine } from '../form-core/form-engine';
3
3
  import { FormSchema, DesignerEventApiBrowser, DesignerEventApiDefinition, DesignerFlavor, EventsWorkspaceSavePayload, WidgetEventApiExecutor } from '../form-core/models';
4
+ import type { FormJourneyProject } from '../form-core/form-journey.models';
4
5
  import { DesignerStateService } from './designer-state.service';
5
6
  import { DesignerTemplateDefinition } from './template-library';
6
7
  import { ExternalDataSource } from '../data/external-data-source';
8
+ import { FormJourneyStateService } from './form-journey-state.service';
7
9
  import * as i0 from "@angular/core";
8
10
  export interface FormDesignerShellSchemaMetadata {
9
11
  id?: string;
@@ -13,9 +15,11 @@ export interface FormDesignerShellSchemaMetadata {
13
15
  }
14
16
  export declare class FormDesignerShellComponent implements OnChanges {
15
17
  protected readonly state: DesignerStateService;
18
+ protected readonly journeyState: FormJourneyStateService;
16
19
  protected readonly aiAvailable: boolean;
17
- private readonly aiToolRegistry;
20
+ private readonly aiFeatureState;
18
21
  schema?: FormSchema;
22
+ journey?: FormJourneyProject;
19
23
  schemaMetadata?: FormDesignerShellSchemaMetadata;
20
24
  flavor: DesignerFlavor;
21
25
  flavors: DesignerFlavor[];
@@ -34,10 +38,13 @@ export declare class FormDesignerShellComponent implements OnChanges {
34
38
  eventApiBrowser?: DesignerEventApiBrowser;
35
39
  eventApiExecutor?: WidgetEventApiExecutor;
36
40
  flavorChange: EventEmitter<DesignerFlavor>;
37
- edit: EventEmitter<FormSchema>;
38
- save: EventEmitter<FormSchema>;
39
- push: EventEmitter<FormSchema>;
41
+ edit: EventEmitter<FormSchema | FormJourneyProject>;
42
+ save: EventEmitter<FormSchema | FormJourneyProject>;
43
+ push: EventEmitter<FormSchema | FormJourneyProject>;
40
44
  eventsSave: EventEmitter<EventsWorkspaceSavePayload>;
45
+ saveDocument: EventEmitter<FormSchema | FormJourneyProject>;
46
+ pushDocument: EventEmitter<FormSchema | FormJourneyProject>;
47
+ editDocument: EventEmitter<FormSchema | FormJourneyProject>;
41
48
  private catalog;
42
49
  private managedSourceIds;
43
50
  private managedEventSourceIds;
@@ -48,9 +55,17 @@ export declare class FormDesignerShellComponent implements OnChanges {
48
55
  selectedTemplateId: string | null;
49
56
  pendingTemplate: DesignerTemplateDefinition | null;
50
57
  private lastSavedSchemaSnapshot;
58
+ readonly designerPages: import("@angular/core").Signal<{
59
+ id: string;
60
+ name: string;
61
+ route: string;
62
+ }[]>;
63
+ private readonly journeySyncEnabled;
64
+ private readonly schemaSync;
51
65
  get engine(): FormEngine;
52
66
  get filteredTemplates(): DesignerTemplateDefinition[];
53
67
  get selectedTemplate(): DesignerTemplateDefinition | null;
68
+ constructor();
54
69
  get resolvedHeaderLabel(): string;
55
70
  ngOnChanges(changes: SimpleChanges): void;
56
71
  private syncDataSources;
@@ -63,6 +78,11 @@ export declare class FormDesignerShellComponent implements OnChanges {
63
78
  openEventsWorkspace(): void;
64
79
  openAiWorkspace(): void;
65
80
  closeAiWorkspace(): void;
81
+ addPage(): void;
82
+ selectPage(id: string): void;
83
+ removePage(id: string): void;
84
+ renamePage(id: string, name: string): void;
85
+ updatePageRoute(id: string, route: string): void;
66
86
  onEventsSchemaChange(schema: FormSchema): void;
67
87
  onEventsSave(payload: EventsWorkspaceSavePayload): void;
68
88
  selectTemplate(template: DesignerTemplateDefinition): void;
@@ -78,10 +98,15 @@ export declare class FormDesignerShellComponent implements OnChanges {
78
98
  private hasUnsavedChanges;
79
99
  private serializeSchema;
80
100
  private applyTemplate;
101
+ private parseTemplateJourney;
81
102
  private syncTemplateSelection;
82
103
  private createSchemaId;
104
+ private loadExternalDocument;
105
+ private loadActivePage;
106
+ private persistActivePage;
107
+ private getResolvedExternalDocument;
83
108
  private getResolvedExternalSchema;
84
109
  private applySchemaMetadata;
85
110
  static ɵfac: i0.ɵɵFactoryDeclaration<FormDesignerShellComponent, never>;
86
- static ɵcmp: i0.ɵɵComponentDeclaration<FormDesignerShellComponent, "app-form-designer-shell", never, { "schema": { "alias": "schema"; "required": false; }; "schemaMetadata": { "alias": "schemaMetadata"; "required": false; }; "flavor": { "alias": "flavor"; "required": false; }; "flavors": { "alias": "flavors"; "required": false; }; "templates": { "alias": "templates"; "required": false; }; "headerLabel": { "alias": "headerLabel"; "required": false; }; "enableTemplateLibrary": { "alias": "enableTemplateLibrary"; "required": false; }; "enableGlobalDataManager": { "alias": "enableGlobalDataManager"; "required": false; }; "enableAiAssistant": { "alias": "enableAiAssistant"; "required": false; }; "showEditButton": { "alias": "showEditButton"; "required": false; }; "showSaveButton": { "alias": "showSaveButton"; "required": false; }; "showPushButton": { "alias": "showPushButton"; "required": false; }; "showEmailPreview": { "alias": "showEmailPreview"; "required": false; }; "isReadOnly": { "alias": "isReadOnly"; "required": false; }; "dataSources": { "alias": "dataSources"; "required": false; }; "eventApis": { "alias": "eventApis"; "required": false; }; "eventApiBrowser": { "alias": "eventApiBrowser"; "required": false; }; "eventApiExecutor": { "alias": "eventApiExecutor"; "required": false; }; }, { "flavorChange": "flavorChange"; "edit": "edit"; "save": "save"; "push": "push"; "eventsSave": "eventsSave"; }, never, never, true, never>;
111
+ static ɵcmp: i0.ɵɵComponentDeclaration<FormDesignerShellComponent, "app-form-designer-shell", never, { "schema": { "alias": "schema"; "required": false; }; "journey": { "alias": "journey"; "required": false; }; "schemaMetadata": { "alias": "schemaMetadata"; "required": false; }; "flavor": { "alias": "flavor"; "required": false; }; "flavors": { "alias": "flavors"; "required": false; }; "templates": { "alias": "templates"; "required": false; }; "headerLabel": { "alias": "headerLabel"; "required": false; }; "enableTemplateLibrary": { "alias": "enableTemplateLibrary"; "required": false; }; "enableGlobalDataManager": { "alias": "enableGlobalDataManager"; "required": false; }; "enableAiAssistant": { "alias": "enableAiAssistant"; "required": false; }; "showEditButton": { "alias": "showEditButton"; "required": false; }; "showSaveButton": { "alias": "showSaveButton"; "required": false; }; "showPushButton": { "alias": "showPushButton"; "required": false; }; "showEmailPreview": { "alias": "showEmailPreview"; "required": false; }; "isReadOnly": { "alias": "isReadOnly"; "required": false; }; "dataSources": { "alias": "dataSources"; "required": false; }; "eventApis": { "alias": "eventApis"; "required": false; }; "eventApiBrowser": { "alias": "eventApiBrowser"; "required": false; }; "eventApiExecutor": { "alias": "eventApiExecutor"; "required": false; }; }, { "flavorChange": "flavorChange"; "edit": "edit"; "save": "save"; "push": "push"; "eventsSave": "eventsSave"; "saveDocument": "saveDocument"; "pushDocument": "pushDocument"; "editDocument": "editDocument"; }, never, never, true, never>;
87
112
  }
@@ -0,0 +1,28 @@
1
+ import type { FormSchema } from '../form-core/models';
2
+ import type { FormJourneyPage, FormJourneyProject } from '../form-core/form-journey.models';
3
+ import * as i0 from "@angular/core";
4
+ export declare class FormJourneyStateService {
5
+ private readonly documentSignal;
6
+ private readonly sourceWasPlainSchema;
7
+ readonly document: import("@angular/core").Signal<FormJourneyProject>;
8
+ readonly pages: import("@angular/core").Signal<FormJourneyPage[]>;
9
+ readonly activePageId: import("@angular/core").WritableSignal<string>;
10
+ readonly activePage: import("@angular/core").Signal<FormJourneyPage | null>;
11
+ readonly canRemovePage: import("@angular/core").Signal<boolean>;
12
+ readonly isJourneyMode: import("@angular/core").Signal<boolean>;
13
+ setDocument(input: FormSchema | FormJourneyProject): void;
14
+ setActivePage(id: string): void;
15
+ addPage(): FormJourneyPage;
16
+ removePage(id: string): void;
17
+ renamePage(id: string, name: string): void;
18
+ updateRoute(id: string, route: string): void;
19
+ updateActivePageSchema(schema: FormSchema): void;
20
+ updatePageSchema(id: string, schema: FormSchema): void;
21
+ compatibleOutput(): FormSchema | FormJourneyProject;
22
+ private isJourneyInput;
23
+ private nextPageName;
24
+ private ensureUniqueRoute;
25
+ private normalizeRoute;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormJourneyStateService, never>;
27
+ static ɵprov: i0.ɵɵInjectableDeclaration<FormJourneyStateService>;
28
+ }
@@ -1,7 +1,13 @@
1
+ import { EventEmitter } from '@angular/core';
1
2
  import { DesignerStateService } from './designer-state.service';
2
3
  import { type FieldDataAccessMap, type RuntimeFieldDataAccessApi } from '../data/runtime-field-data-access-registry.service';
3
4
  import { DesignerEventApiDefinition, WidgetEventApiExecutor } from '../form-core/models';
4
5
  import * as i0 from "@angular/core";
6
+ type PreviewPage = {
7
+ id: string;
8
+ name: string;
9
+ route: string;
10
+ };
5
11
  export declare class FormPreviewComponent {
6
12
  state: DesignerStateService;
7
13
  eventApis: DesignerEventApiDefinition[];
@@ -10,6 +16,9 @@ export declare class FormPreviewComponent {
10
16
  fieldDataAccessApi?: RuntimeFieldDataAccessApi;
11
17
  formContentId?: string;
12
18
  formContentVersion?: string;
19
+ pages: PreviewPage[];
20
+ activePageId: string | null;
21
+ pageSelect: EventEmitter<string>;
13
22
  breakpoints: readonly ["xs", "sm", "md", "lg", "xl", "2xl"];
14
23
  breakpoint: import("@angular/core").WritableSignal<"xs" | "sm" | "md" | "lg" | "xl" | "2xl">;
15
24
  activeDevice: import("@angular/core").Signal<"mobile" | "desktop">;
@@ -17,6 +26,13 @@ export declare class FormPreviewComponent {
17
26
  combinedFormData: any;
18
27
  constructor(state: DesignerStateService);
19
28
  setBreakpoint(bp: any): void;
29
+ hasJourneyPages(): boolean;
30
+ isPageActive(pageId: string): boolean;
31
+ requestPageSelect(pageId: string): void;
32
+ readonly navigateToPage: (pageId: string) => Promise<{
33
+ ok: boolean;
34
+ reason?: string;
35
+ }>;
20
36
  getContainerWidth(): "100%" | "375px" | "576px" | "768px" | "992px" | "1200px" | "1400px";
21
37
  getPageStyle(): Record<string, any>;
22
38
  close(): void;
@@ -31,6 +47,9 @@ export declare class FormPreviewComponent {
31
47
  private isBytePayload;
32
48
  private isBase64Payload;
33
49
  private isLikelyBase64;
50
+ trackPageById(_: number, page: PreviewPage): string;
51
+ private resolveActivePageId;
34
52
  static ɵfac: i0.ɵɵFactoryDeclaration<FormPreviewComponent, never>;
35
- static ɵcmp: i0.ɵɵComponentDeclaration<FormPreviewComponent, "app-form-preview", never, { "eventApis": { "alias": "eventApis"; "required": false; }; "eventApiExecutor": { "alias": "eventApiExecutor"; "required": false; }; "fieldDataAccessMap": { "alias": "fieldDataAccessMap"; "required": false; }; "fieldDataAccessApi": { "alias": "fieldDataAccessApi"; "required": false; }; "formContentId": { "alias": "formContentId"; "required": false; }; "formContentVersion": { "alias": "formContentVersion"; "required": false; }; }, {}, never, never, true, never>;
53
+ static ɵcmp: i0.ɵɵComponentDeclaration<FormPreviewComponent, "app-form-preview", never, { "eventApis": { "alias": "eventApis"; "required": false; }; "eventApiExecutor": { "alias": "eventApiExecutor"; "required": false; }; "fieldDataAccessMap": { "alias": "fieldDataAccessMap"; "required": false; }; "fieldDataAccessApi": { "alias": "fieldDataAccessApi"; "required": false; }; "formContentId": { "alias": "formContentId"; "required": false; }; "formContentVersion": { "alias": "formContentVersion"; "required": false; }; "pages": { "alias": "pages"; "required": false; }; "activePageId": { "alias": "activePageId"; "required": false; }; }, { "pageSelect": "pageSelect"; }, never, never, true, never>;
36
54
  }
55
+ export {};
@@ -15,8 +15,13 @@ export declare class InspectorBackgroundsSectionComponent {
15
15
  value: string;
16
16
  }[];
17
17
  showImageUrl: boolean;
18
+ protected backgroundColorValue(): string;
18
19
  getBackgroundPreview(): string;
20
+ protected onBackgroundPickerChange(value: string): void;
21
+ protected onBackgroundColorInputChange(value: string): void;
19
22
  updateStyle(key: string, value: any): void;
23
+ private normalizeBackgroundColor;
24
+ private isTransparentColor;
20
25
  static ɵfac: i0.ɵɵFactoryDeclaration<InspectorBackgroundsSectionComponent, never>;
21
26
  static ɵcmp: i0.ɵɵComponentDeclaration<InspectorBackgroundsSectionComponent, "inspector-backgrounds-section", never, { "style": { "alias": "style"; "required": false; "isSignal": true; }; }, { "styleChange": "styleChange"; }, never, never, true, never>;
22
27
  }
@@ -0,0 +1,12 @@
1
+ import { StyleTokenSet } from '../../form-core/models';
2
+ import * as i0 from "@angular/core";
3
+ type TransformKey = 'transformX' | 'transformY' | 'transformZ' | 'rotate' | 'scale';
4
+ export declare class InspectorTransformSectionComponent {
5
+ readonly style: import("@angular/core").InputSignal<Partial<StyleTokenSet>>;
6
+ readonly styleChange: import("@angular/core").OutputEmitterRef<Partial<StyleTokenSet>>;
7
+ protected numberValue(key: TransformKey, fallback: number): number;
8
+ protected updateTransform(key: TransformKey, value: unknown): void;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<InspectorTransformSectionComponent, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<InspectorTransformSectionComponent, "inspector-transform-section", never, { "style": { "alias": "style"; "required": false; "isSignal": true; }; }, { "styleChange": "styleChange"; }, never, never, true, never>;
11
+ }
12
+ export {};
@@ -25,6 +25,7 @@ export declare class InspectorTypographySectionComponent {
25
25
  isBoldActive(): boolean;
26
26
  isItalicActive(): boolean;
27
27
  isUnderlineActive(): boolean;
28
+ colorValue(): string;
28
29
  updateStyle(key: string, value: any): void;
29
30
  static ɵfac: i0.ɵɵFactoryDeclaration<InspectorTypographySectionComponent, never>;
30
31
  static ɵcmp: i0.ɵɵComponentDeclaration<InspectorTypographySectionComponent, "inspector-typography-section", never, { "style": { "alias": "style"; "required": false; "isSignal": true; }; }, { "styleChange": "styleChange"; }, never, never, true, never>;
@@ -1,17 +1,36 @@
1
- import { OnInit, OnChanges, SimpleChanges } from '@angular/core';
1
+ import { EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import { DesignerStateService } from './designer-state.service';
3
3
  import { DesignerEventApiDefinition, DesignerFlavor, WidgetEventApiExecutor } from '../form-core/models';
4
4
  import * as i0 from "@angular/core";
5
5
  type DesignerMode = 'edit' | 'view';
6
+ type DesignerPage = {
7
+ id: string;
8
+ name: string;
9
+ route: string;
10
+ };
6
11
  export declare class JsonFormDesignerComponent implements OnInit, OnChanges {
7
12
  flavor: DesignerFlavor;
8
13
  mode: DesignerMode;
9
14
  eventApis: DesignerEventApiDefinition[];
10
15
  eventApiExecutor?: WidgetEventApiExecutor;
16
+ pages: DesignerPage[] | null;
17
+ activePageId: string | null;
18
+ canRemovePage: boolean;
19
+ readonly pageAdd: EventEmitter<void>;
20
+ readonly pageSelect: EventEmitter<string>;
21
+ readonly pageRemove: EventEmitter<string>;
22
+ readonly pageRename: EventEmitter<{
23
+ id: string;
24
+ name: string;
25
+ }>;
26
+ readonly pageRouteChange: EventEmitter<{
27
+ id: string;
28
+ route: string;
29
+ }>;
11
30
  state: DesignerStateService;
12
31
  ngOnInit(): void;
13
32
  ngOnChanges(changes: SimpleChanges): void;
14
33
  static ɵfac: i0.ɵɵFactoryDeclaration<JsonFormDesignerComponent, never>;
15
- static ɵcmp: i0.ɵɵComponentDeclaration<JsonFormDesignerComponent, "app-json-form-designer", never, { "flavor": { "alias": "flavor"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "eventApis": { "alias": "eventApis"; "required": false; }; "eventApiExecutor": { "alias": "eventApiExecutor"; "required": false; }; }, {}, never, never, true, never>;
34
+ static ɵcmp: i0.ɵɵComponentDeclaration<JsonFormDesignerComponent, "app-json-form-designer", never, { "flavor": { "alias": "flavor"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "eventApis": { "alias": "eventApis"; "required": false; }; "eventApiExecutor": { "alias": "eventApiExecutor"; "required": false; }; "pages": { "alias": "pages"; "required": false; }; "activePageId": { "alias": "activePageId"; "required": false; }; "canRemovePage": { "alias": "canRemovePage"; "required": false; }; }, { "pageAdd": "pageAdd"; "pageSelect": "pageSelect"; "pageRemove": "pageRemove"; "pageRename": "pageRename"; "pageRouteChange": "pageRouteChange"; }, never, never, true, never>;
16
35
  }
17
36
  export {};