@praxisui/dynamic-form 1.0.0-beta.60 → 1.0.0-beta.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -343,6 +343,94 @@ declare class FormAiAdapter extends BaseAiAdapter<FormConfig> {
343
343
  private isFilled;
344
344
  }
345
345
 
346
+ interface EditorDocument<TConfig, TBindings = unknown> {
347
+ kind: string;
348
+ version: number;
349
+ config: TConfig;
350
+ bindings?: TBindings;
351
+ }
352
+ interface EditorDiagnostic {
353
+ level: 'error' | 'warning' | 'info';
354
+ code: string;
355
+ message: string;
356
+ path?: string;
357
+ }
358
+ type DynamicFormMode = 'create' | 'edit' | 'view';
359
+ interface DynamicFormBindings {
360
+ mode?: DynamicFormMode;
361
+ }
362
+ interface DynamicFormPresentationSnapshot {
363
+ labelPosition?: 'above' | 'left';
364
+ labelFontSize?: number | null;
365
+ valueFontSize?: number | null;
366
+ compact?: boolean;
367
+ density?: 'comfortable' | 'cozy' | 'compact';
368
+ labelWidth?: number | null;
369
+ labelAlign?: 'start' | 'center' | 'end';
370
+ valueAlign?: 'start' | 'center' | 'end';
371
+ }
372
+ interface DynamicFormSchemaPrefsSnapshot {
373
+ notifyIfOutdated?: 'inline' | 'snackbar' | 'both' | 'none';
374
+ snoozeMs?: number;
375
+ autoOpenSettingsOnOutdated?: boolean;
376
+ }
377
+ interface DynamicFormContextSnapshot {
378
+ backConfig?: BackConfig;
379
+ presentation?: DynamicFormPresentationSnapshot;
380
+ schemaPrefs?: DynamicFormSchemaPrefsSnapshot;
381
+ }
382
+ interface DynamicFormAuthoringDocument extends EditorDocument<FormConfig, DynamicFormBindings> {
383
+ kind: 'praxis.dynamic-form.editor';
384
+ version: 1;
385
+ contextSnapshot?: DynamicFormContextSnapshot;
386
+ }
387
+ interface DynamicFormValidationContext {
388
+ server?: {
389
+ schemaHash?: string;
390
+ };
391
+ }
392
+ interface DynamicFormProjectionContext {
393
+ mode?: DynamicFormMode;
394
+ }
395
+ interface DynamicFormRuntimeContext {
396
+ currentBindings?: DynamicFormBindings;
397
+ currentContextSnapshot?: DynamicFormContextSnapshot;
398
+ server?: {
399
+ schemaHash?: string;
400
+ };
401
+ }
402
+ interface DynamicFormApplyPlan {
403
+ canonicalConfig: FormConfig;
404
+ bindingsPatch?: DynamicFormBindings;
405
+ contextSnapshot?: DynamicFormContextSnapshot;
406
+ persistence?: {
407
+ saveConfig?: boolean;
408
+ saveBindings?: boolean;
409
+ saveContextSnapshot?: boolean;
410
+ };
411
+ runtime?: {
412
+ rebindMode?: boolean;
413
+ clearMode?: boolean;
414
+ rebuildForm?: boolean;
415
+ refreshPresentation?: boolean;
416
+ clearPresentation?: boolean;
417
+ refreshSchemaState?: boolean;
418
+ clearSchemaState?: boolean;
419
+ refreshBackNavigation?: boolean;
420
+ clearBackNavigation?: boolean;
421
+ };
422
+ metadata?: {
423
+ attachSchemaSnapshot?: boolean;
424
+ };
425
+ diff?: {
426
+ modeChanged?: boolean;
427
+ presentationChanged?: boolean;
428
+ schemaPrefsChanged?: boolean;
429
+ backConfigChanged?: boolean;
430
+ };
431
+ diagnostics: EditorDiagnostic[];
432
+ }
433
+
346
434
  interface DynamicFieldRenderErrorEvent {
347
435
  phase: 'executeRendering' | 'detectChanges';
348
436
  fieldName: string;
@@ -380,7 +468,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
380
468
  resourcePath?: string;
381
469
  resourceId?: string | number;
382
470
  /**
383
- * Shared editorial context for widgets hosted before/after the form.
471
+ * Shared editorial context for widgets hosted around the form.
384
472
  * Treat this input as immutable: in-place mutations do not invalidate the cached
385
473
  * widget context snapshot used to avoid re-binding on every change detection pass.
386
474
  */
@@ -465,9 +553,9 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
465
553
  }>;
466
554
  /** Forwarded from DynamicFieldLoader to allow host-side observability. */
467
555
  fieldRenderError: EventEmitter<DynamicFieldRenderErrorEvent>;
468
- /** Re-emits events from editorial widgets hosted before/after the form sections. */
556
+ /** Re-emits events from editorial widgets hosted before, before actions, or after the form. */
469
557
  widgetEvent: EventEmitter<{
470
- placement: "before" | "after";
558
+ placement: "before" | "beforeActions" | "after";
471
559
  sourceId: string;
472
560
  output?: string;
473
561
  payload?: any;
@@ -508,6 +596,9 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
508
596
  private editorialWidgetContextDeps;
509
597
  get formBlocksBefore(): WidgetDefinition[];
510
598
  get formBlocksAfter(): WidgetDefinition[];
599
+ get formBlocksBeforeActions(): WidgetDefinition[];
600
+ get beforeActionsPlacement(): 'insideLastSection' | 'afterSections';
601
+ get actionPlacement(): 'insideLastSection' | 'afterSections' | 'top';
511
602
  /**
512
603
  * Precedence for editorial widget interpolation:
513
604
  * 1. form runtime context
@@ -520,7 +611,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
520
611
  * In-place mutations do not invalidate the cached merged context snapshot.
521
612
  */
522
613
  getEditorialWidgetContext(): Record<string, unknown>;
523
- onEditorialWidgetEvent(placement: 'before' | 'after', event: {
614
+ onEditorialWidgetEvent(placement: 'before' | 'beforeActions' | 'after', event: {
524
615
  sourceId: string;
525
616
  output?: string;
526
617
  payload?: any;
@@ -613,6 +704,8 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
613
704
  isSectionVisible(section?: FormSection): boolean;
614
705
  getSectionTitle(section: FormSection): string | undefined;
615
706
  getSectionDescription(section: FormSection): string | undefined;
707
+ getSectionAppearance(section: FormSection): 'card' | 'plain' | 'step' | undefined;
708
+ getSectionStepLabel(section: FormSection): string | undefined;
616
709
  getSectionTitleColor(section: FormSection): string | undefined;
617
710
  getSectionDescriptionColor(section: FormSection): string | undefined;
618
711
  getSectionTitleStyle(section: FormSection): string | undefined;
@@ -779,8 +872,20 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
779
872
  trackBySection(index: number, section: FormSection): string;
780
873
  trackByRow(index: number, row: FormRow): string;
781
874
  trackByColumn(index: number, column: FormColumn): string;
782
- /** Apply configuration updates coming from external adapters (e.g., AI) in a controlled way. */
875
+ /** Apply configuration or canonical authoring updates coming from external adapters (e.g., AI). */
783
876
  applyConfigFromAdapter(nextConfig: FormConfig): void;
877
+ applyConfigFromAdapter(nextConfig: DynamicFormAuthoringDocument): void;
878
+ private buildDynamicFormEditorRuntimeContext;
879
+ private captureCurrentContextSnapshot;
880
+ private captureCurrentPresentationSnapshot;
881
+ private captureCurrentSchemaPrefsSnapshot;
882
+ private executeDynamicFormEditorApplyPlan;
883
+ private attachRuntimeMetadataToDynamicFormConfig;
884
+ private parsePresentationCssNumber;
885
+ private clearDynamicFormEditorPersistence;
886
+ private clearStoredPresentationSnapshots;
887
+ private resetPresentationVarsToDefaults;
888
+ private resetSchemaPrefsToDefaults;
784
889
  retryInitialization(): void;
785
890
  getErrorTitle(): string;
786
891
  showDetailedError(): void;
@@ -825,7 +930,9 @@ declare class FormConfigService {
825
930
  interface JsonValidationResult {
826
931
  isValid: boolean;
827
932
  error?: string;
933
+ document?: DynamicFormAuthoringDocument;
828
934
  config?: FormConfig;
935
+ diagnostics?: EditorDiagnostic[];
829
936
  }
830
937
  interface JsonEditorEvent {
831
938
  type: 'apply' | 'format' | 'validation';
@@ -835,12 +942,15 @@ declare class JsonConfigEditorComponent implements OnInit, OnDestroy {
835
942
  private cdr;
836
943
  private configService;
837
944
  config: FormConfig | null;
945
+ document: DynamicFormAuthoringDocument | null;
838
946
  configChange: EventEmitter<FormConfig>;
947
+ documentChange: EventEmitter<DynamicFormAuthoringDocument>;
839
948
  validationChange: EventEmitter<JsonValidationResult>;
840
949
  editorEvent: EventEmitter<JsonEditorEvent>;
841
950
  jsonText: string;
842
951
  isValidJson: boolean;
843
952
  jsonError: string;
953
+ diagnostics: EditorDiagnostic[];
844
954
  private destroy$;
845
955
  private jsonTextChanges$;
846
956
  constructor(cdr: ChangeDetectorRef, configService: FormConfigService);
@@ -850,18 +960,20 @@ declare class JsonConfigEditorComponent implements OnInit, OnDestroy {
850
960
  applyJsonChanges(): void;
851
961
  formatJson(): void;
852
962
  updateJsonFromConfig(config: FormConfig): void;
963
+ updateJsonFromDocument(document: DynamicFormAuthoringDocument): void;
853
964
  /**
854
965
  * Força atualização do JSON com a configuração atual
855
966
  */
856
967
  refreshJson(): void;
857
968
  getCurrentConfig(): FormConfig | null;
969
+ getCurrentDocument(): DynamicFormAuthoringDocument | null;
858
970
  hasChanges(): boolean;
859
971
  private validateJson;
860
972
  private updateValidationState;
861
973
  insertHooksTemplate(): void;
862
974
  enableReactiveValidation(): void;
863
975
  static ɵfac: i0.ɵɵFactoryDeclaration<JsonConfigEditorComponent, never>;
864
- static ɵcmp: i0.ɵɵComponentDeclaration<JsonConfigEditorComponent, "form-json-config-editor", never, { "config": { "alias": "config"; "required": false; }; }, { "configChange": "configChange"; "validationChange": "validationChange"; "editorEvent": "editorEvent"; }, never, never, true, never>;
976
+ static ɵcmp: i0.ɵɵComponentDeclaration<JsonConfigEditorComponent, "form-json-config-editor", never, { "config": { "alias": "config"; "required": false; }; "document": { "alias": "document"; "required": false; }; }, { "configChange": "configChange"; "documentChange": "documentChange"; "validationChange": "validationChange"; "editorEvent": "editorEvent"; }, never, never, true, never>;
865
977
  }
866
978
 
867
979
  declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, OnInit, OnDestroy {
@@ -875,10 +987,14 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
875
987
  ruleBuilderState?: RuleBuilderState;
876
988
  currentRules: FormLayoutRule[];
877
989
  private initialConfig;
990
+ private initialDocument;
991
+ private readonly openedWithCanonicalDocument;
878
992
  backConfig?: BackConfig;
993
+ private includeBackConfigBlock;
879
994
  formId?: string;
880
995
  componentKeyId?: string;
881
996
  inputMode: 'create' | 'edit' | 'view';
997
+ private includeBindingsBlock;
882
998
  private readonly editorMode;
883
999
  isPresentationMode: boolean;
884
1000
  truncatePreview: boolean;
@@ -903,6 +1019,8 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
903
1019
  snoozeMs: number;
904
1020
  autoOpenSettingsOnOutdated: boolean;
905
1021
  };
1022
+ private includePresentationBlock;
1023
+ private includeSchemaPrefsBlock;
906
1024
  serverMeta?: {
907
1025
  serverHash?: string;
908
1026
  lastVerifiedAt?: string;
@@ -921,11 +1039,20 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
921
1039
  updateDirtyState(reason?: string): void;
922
1040
  getSettingsValue(): any;
923
1041
  onSave(): any;
924
- onJsonConfigChange(newConfig: FormConfig): void;
1042
+ onJsonConfigChange(newValue: FormConfig | DynamicFormAuthoringDocument): void;
925
1043
  onJsonValidationChange(result: JsonValidationResult): void;
926
1044
  onJsonEditorEvent(_event: JsonEditorEvent): void;
927
1045
  onConfigChange(newConfig: FormConfig): void;
928
1046
  onRulesChanged(state: RuleBuilderState): void;
1047
+ get jsonDocument(): DynamicFormAuthoringDocument;
1048
+ onBackConfigChange(): void;
1049
+ isBindingsBlockPersisted(): boolean;
1050
+ isPresentationBlockPersisted(): boolean;
1051
+ isSchemaPrefsBlockPersisted(): boolean;
1052
+ isBackConfigBlockPersisted(): boolean;
1053
+ onInputModeChange(): void;
1054
+ onPresentationPrefsChange(reason: string): void;
1055
+ onSchemaPrefsChange(reason: string): void;
929
1056
  private createRuleBuilderConfig;
930
1057
  private mapMetadataToSchema;
931
1058
  private mapDataTypeToFieldType;
@@ -938,6 +1065,13 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
938
1065
  restoreHintsDefaults(): void;
939
1066
  private loadPrefsFromStorage;
940
1067
  private normalizeMode;
1068
+ private buildAuthoringDocument;
1069
+ private createBackConfigState;
1070
+ private mergePresentationPrefs;
1071
+ private mergeSchemaPrefs;
1072
+ private toPresentationSnapshot;
1073
+ private toSchemaPrefsSnapshot;
1074
+ private toBackConfigSnapshot;
941
1075
  static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDynamicFormConfigEditor, [null, null, null, null, { optional: true; }]>;
942
1076
  static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicFormConfigEditor, "praxis-dynamic-form-config-editor", never, {}, {}, never, never, true, never>;
943
1077
  }
@@ -1206,6 +1340,25 @@ declare function normalizeDateArrays(data: any): any;
1206
1340
  declare const SETTINGS_PANEL_DYNAMIC_FORM_PROVIDER: Provider;
1207
1341
  declare function provideSettingsPanelDynamicForm(): Provider;
1208
1342
 
1343
+ declare function createDynamicFormAuthoringDocument(source: {
1344
+ config?: unknown;
1345
+ bindings?: unknown;
1346
+ contextSnapshot?: unknown;
1347
+ }): DynamicFormAuthoringDocument;
1348
+ declare function parseLegacyOrDynamicFormDocument(raw: unknown): DynamicFormAuthoringDocument;
1349
+ declare function normalizeDynamicFormAuthoringDocument(doc: DynamicFormAuthoringDocument): DynamicFormAuthoringDocument;
1350
+ declare function validateDynamicFormAuthoringDocument(doc: DynamicFormAuthoringDocument, context?: DynamicFormValidationContext): EditorDiagnostic[];
1351
+ declare function validateDynamicFormAuthoringInput(raw: unknown, context?: DynamicFormValidationContext): EditorDiagnostic[];
1352
+ declare function toCanonicalDynamicFormConfig(doc: DynamicFormAuthoringDocument, _context?: DynamicFormProjectionContext): FormConfig;
1353
+ declare function buildDynamicFormApplyPlan(doc: DynamicFormAuthoringDocument, runtime?: DynamicFormRuntimeContext, options?: {
1354
+ saveConfig?: boolean;
1355
+ saveBindings?: boolean;
1356
+ saveContextSnapshot?: boolean;
1357
+ attachSchemaSnapshot?: boolean;
1358
+ replaceContext?: boolean;
1359
+ }): DynamicFormApplyPlan;
1360
+ declare function serializeDynamicFormAuthoringDocument(doc: DynamicFormAuthoringDocument): unknown;
1361
+
1209
1362
  declare class CanvasToolbarComponent {
1210
1363
  selectedElement: CanvasElement | null;
1211
1364
  editMetadata: EventEmitter<void>;
@@ -1240,6 +1393,8 @@ declare class CanvasToolbarComponent {
1240
1393
  }
1241
1394
 
1242
1395
  interface EditableFormSection extends FormSection {
1396
+ appearance?: 'card' | 'plain' | 'step';
1397
+ stepLabel?: string;
1243
1398
  collapsible?: boolean;
1244
1399
  collapsed?: boolean;
1245
1400
  order?: number;
@@ -1564,5 +1719,5 @@ declare const FORM_COMPONENT_AI_CAPABILITIES: CapabilityCatalog;
1564
1719
  */
1565
1720
  declare function getFormAiCatalog(formConfig?: FormConfig): AiCapabilityCatalog;
1566
1721
 
1567
- export { ActionsEditorComponent, CanvasStateService, CanvasToolbarComponent, ColumnEditorComponent, DynamicFormLayoutService, FORM_AI_CAPABILITIES, FORM_COMPONENT_AI_CAPABILITIES, FieldConfiguratorComponent, FieldEditorComponent, FormConfigService, FormContextService, FormLayoutService, JsonConfigEditorComponent, LayoutColorToken, LayoutEditorComponent, LayoutPrefsService, PRAXIS_DYNAMIC_FORM_COMPONENT_METADATA, PraxisDynamicForm, PraxisDynamicFormConfigEditor, PraxisFilterForm, PraxisFormActionsComponent, RowConfiguratorComponent, RowEditorComponent, SETTINGS_PANEL_DYNAMIC_FORM_PROVIDER, SectionEditorComponent, TASK_PRESETS, applyVisibilityRules, formLayoutRulesToBuilderState, getFormAiCatalog, getFormCapabilities, getFormEnum, isRuleSatisfied, normalizeDateArrays, providePraxisDynamicFormMetadata, provideSettingsPanelDynamicForm, ruleBuilderStateToFormLayoutRules, stripLegacyFieldMetadata };
1568
- export type { CanvasElement, CanvasElementType, CanvasPathPart, Capability$1 as Capability, CapabilityCatalog$1 as CapabilityCatalog, CapabilityCategory$1 as CapabilityCategory, DynamicFieldRenderErrorEvent, FieldPath, FieldPathContainer, FieldPathWithIndex, Capability as FormComponentCapability, CapabilityCatalog as FormComponentCapabilityCatalog, CapabilityCategory as FormComponentCapabilityCategory, ValueKind as FormComponentValueKind, FormConfigLike, IdPath, JsonEditorEvent, JsonValidationResult, LayoutChange, LayoutResult, Operation, Path, PathWithIndex, PraxisFormActionEvent, RemovePolicy, ValidationReport, ValueKind$1 as ValueKind };
1722
+ export { ActionsEditorComponent, CanvasStateService, CanvasToolbarComponent, ColumnEditorComponent, DynamicFormLayoutService, FORM_AI_CAPABILITIES, FORM_COMPONENT_AI_CAPABILITIES, FieldConfiguratorComponent, FieldEditorComponent, FormConfigService, FormContextService, FormLayoutService, JsonConfigEditorComponent, LayoutColorToken, LayoutEditorComponent, LayoutPrefsService, PRAXIS_DYNAMIC_FORM_COMPONENT_METADATA, PraxisDynamicForm, PraxisDynamicFormConfigEditor, PraxisFilterForm, PraxisFormActionsComponent, RowConfiguratorComponent, RowEditorComponent, SETTINGS_PANEL_DYNAMIC_FORM_PROVIDER, SectionEditorComponent, TASK_PRESETS, applyVisibilityRules, buildDynamicFormApplyPlan, createDynamicFormAuthoringDocument, formLayoutRulesToBuilderState, getFormAiCatalog, getFormCapabilities, getFormEnum, isRuleSatisfied, normalizeDateArrays, normalizeDynamicFormAuthoringDocument, parseLegacyOrDynamicFormDocument, providePraxisDynamicFormMetadata, provideSettingsPanelDynamicForm, ruleBuilderStateToFormLayoutRules, serializeDynamicFormAuthoringDocument, stripLegacyFieldMetadata, toCanonicalDynamicFormConfig, validateDynamicFormAuthoringDocument, validateDynamicFormAuthoringInput };
1723
+ export type { CanvasElement, CanvasElementType, CanvasPathPart, Capability$1 as Capability, CapabilityCatalog$1 as CapabilityCatalog, CapabilityCategory$1 as CapabilityCategory, DynamicFieldRenderErrorEvent, DynamicFormApplyPlan, DynamicFormAuthoringDocument, DynamicFormBindings, DynamicFormContextSnapshot, DynamicFormMode, DynamicFormPresentationSnapshot, DynamicFormProjectionContext, DynamicFormRuntimeContext, DynamicFormSchemaPrefsSnapshot, DynamicFormValidationContext, EditorDiagnostic, EditorDocument, FieldPath, FieldPathContainer, FieldPathWithIndex, Capability as FormComponentCapability, CapabilityCatalog as FormComponentCapabilityCatalog, CapabilityCategory as FormComponentCapabilityCategory, ValueKind as FormComponentValueKind, FormConfigLike, IdPath, JsonEditorEvent, JsonValidationResult, LayoutChange, LayoutResult, Operation, Path, PathWithIndex, PraxisFormActionEvent, RemovePolicy, ValidationReport, ValueKind$1 as ValueKind };
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@praxisui/dynamic-form",
3
- "version": "1.0.0-beta.60",
3
+ "version": "1.0.0-beta.62",
4
4
  "description": "Angular dynamic form engine for Praxis UI: metadata-driven forms, hooks, and services integrating @praxisui/* packages.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^20.0.0",
7
7
  "@angular/core": "^20.0.0",
8
8
  "@angular/cdk": "^20.0.0",
9
- "@praxisui/settings-panel": "^1.0.0-beta.60",
10
- "@praxisui/visual-builder": "^1.0.0-beta.60",
11
- "@praxisui/specification-core": "^1.0.0-beta.60",
12
- "@praxisui/specification": "^1.0.0-beta.60",
13
- "@praxisui/core": "^1.0.0-beta.60",
14
- "@praxisui/cron-builder": "^1.0.0-beta.60"
9
+ "@praxisui/settings-panel": "^1.0.0-beta.62",
10
+ "@praxisui/visual-builder": "^1.0.0-beta.62",
11
+ "@praxisui/specification-core": "^1.0.0-beta.62",
12
+ "@praxisui/specification": "^1.0.0-beta.62",
13
+ "@praxisui/core": "^1.0.0-beta.62",
14
+ "@praxisui/cron-builder": "^1.0.0-beta.62"
15
15
  },
16
16
  "dependencies": {
17
17
  "tslib": "^2.3.0",
@@ -25,17 +25,18 @@
25
25
  "type": "git",
26
26
  "url": "https://github.com/codexrodrigues/praxis-ui-angular"
27
27
  },
28
- "homepage": "https://github.com/codexrodrigues/praxis-ui-angular#readme",
28
+ "homepage": "https://praxisui.dev",
29
29
  "bugs": {
30
30
  "url": "https://github.com/codexrodrigues/praxis-ui-angular/issues"
31
31
  },
32
32
  "keywords": [
33
33
  "angular",
34
34
  "praxisui",
35
- "forms",
36
35
  "dynamic-form",
37
36
  "metadata",
38
- "ui"
37
+ "schema-driven",
38
+ "forms",
39
+ "runtime-config"
39
40
  ],
40
41
  "sideEffects": false,
41
42
  "module": "fesm2022/praxisui-dynamic-form.mjs",