@praxisui/dynamic-form 7.0.0-beta.0 → 8.0.0-beta.1

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
@@ -280,6 +280,28 @@ interface PraxisFormActionEvent {
280
280
  }
281
281
  declare class PraxisFormActionsComponent implements OnChanges, OnDestroy {
282
282
  private shortcuts;
283
+ private readonly i18n;
284
+ private actionButtonsCache;
285
+ private actionButtonsCacheSource?;
286
+ private actionButtonsCacheOverrides?;
287
+ private formActionsClassesCacheSource?;
288
+ private formActionsClassesCache;
289
+ private viewClassMapCacheSource?;
290
+ private viewClassMapCacheEditorialContext?;
291
+ private viewClassMapCache;
292
+ private visibleButtonsCacheSource;
293
+ private visibleButtonsCache;
294
+ private collapsedButtonsCacheSource;
295
+ private collapsedButtonsCache;
296
+ private primaryButtonsCacheSource;
297
+ private primaryButtonsCache;
298
+ private secondaryButtonsCacheSource;
299
+ private secondaryButtonsCache;
300
+ private buttonClassCache;
301
+ private buttonStylesCache;
302
+ private invalidSubmitHintCacheSignature;
303
+ private invalidSubmitHintCacheValue;
304
+ private readonly invalidSubmitHint;
283
305
  /** Configuration object describing form action buttons */
284
306
  actions?: FormConfig['actions'];
285
307
  /** Whether the actions are rendered inside an editorial visual context */
@@ -290,6 +312,8 @@ declare class PraxisFormActionsComponent implements OnChanges, OnDestroy {
290
312
  formIsValid: boolean;
291
313
  /** Optional error message displayed above the actions */
292
314
  submitError?: string | null;
315
+ /** Visible required fields that currently block submit */
316
+ invalidRequiredFieldLabels: string[];
293
317
  /** Identifier used when registering keyboard shortcuts */
294
318
  formId?: string;
295
319
  /** Overrides coming from runtime rules */
@@ -308,6 +332,8 @@ declare class PraxisFormActionsComponent implements OnChanges, OnDestroy {
308
332
  };
309
333
  getMatColor(btn: FormActionButton | undefined): 'primary' | 'accent' | 'warn' | undefined;
310
334
  getActionButtons(): FormActionButton[];
335
+ private computeActionButtons;
336
+ private refreshActionButtons;
311
337
  getVisibleButtons(): FormActionButton[];
312
338
  getCollapsedButtons(): FormActionButton[];
313
339
  isSplitLayout(): boolean;
@@ -319,11 +345,13 @@ declare class PraxisFormActionsComponent implements OnChanges, OnDestroy {
319
345
  };
320
346
  getButtonStyles(button: FormActionButton): Record<string, any> | null;
321
347
  isActionButtonDisabled(button: FormActionButton): boolean;
348
+ shouldShowInvalidSubmitHint(): boolean;
349
+ getInvalidSubmitHint(): string;
322
350
  private applyOverrides;
323
351
  private registerActionShortcuts;
324
352
  private isSecondaryButton;
325
353
  static ɵfac: i0.ɵɵFactoryDeclaration<PraxisFormActionsComponent, never>;
326
- static ɵcmp: i0.ɵɵComponentDeclaration<PraxisFormActionsComponent, "praxis-form-actions", never, { "actions": { "alias": "actions"; "required": false; }; "editorialVisualContext": { "alias": "editorialVisualContext"; "required": false; }; "isSubmitting": { "alias": "isSubmitting"; "required": false; }; "formIsValid": { "alias": "formIsValid"; "required": false; }; "submitError": { "alias": "submitError"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "actionOverrides": { "alias": "actionOverrides"; "required": false; }; }, { "action": "action"; }, never, never, true, never>;
354
+ static ɵcmp: i0.ɵɵComponentDeclaration<PraxisFormActionsComponent, "praxis-form-actions", never, { "actions": { "alias": "actions"; "required": false; }; "editorialVisualContext": { "alias": "editorialVisualContext"; "required": false; }; "isSubmitting": { "alias": "isSubmitting"; "required": false; }; "formIsValid": { "alias": "formIsValid"; "required": false; }; "submitError": { "alias": "submitError"; "required": false; }; "invalidRequiredFieldLabels": { "alias": "invalidRequiredFieldLabels"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "actionOverrides": { "alias": "actionOverrides"; "required": false; }; }, { "action": "action"; }, never, never, true, never>;
327
355
  }
328
356
 
329
357
  /**
@@ -510,6 +538,11 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
510
538
  private logger?;
511
539
  private readonly i18n;
512
540
  private readonly DEBUG;
541
+ private effectiveActionsCache?;
542
+ private effectiveActionsCacheBase?;
543
+ private effectiveActionsCacheOverride?;
544
+ private invalidRequiredFieldLabelsCache;
545
+ private invalidRequiredFieldLabelsSignature;
513
546
  resourcePath?: string;
514
547
  resourceId?: string | number;
515
548
  initialValue?: Record<string, unknown> | null;
@@ -521,6 +554,8 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
521
554
  editorialContext: Record<string, unknown> | null;
522
555
  mode: 'create' | 'edit' | 'view';
523
556
  config: FormConfig;
557
+ /** Optional host-level overrides for the rendered form action bar. */
558
+ actions?: FormConfig['actions'] | null;
524
559
  /**
525
560
  * Fonte de schema para construir o formulário.
526
561
  * 'resource' (padrão) usa o schema do recurso (/{resource}/schemas -> .../all response)
@@ -584,6 +619,9 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
584
619
  visibleGlobal: boolean | null;
585
620
  get effectivePresentation(): boolean;
586
621
  get effectiveReadonly(): boolean;
622
+ get effectiveDisabledMode(): boolean | null;
623
+ get effectiveFormIsValid(): boolean;
624
+ get invalidRequiredFieldLabels(): string[];
587
625
  /** Value propagated to DynamicFieldLoader; null allows per-field metadata */
588
626
  get presentationForLoader(): boolean | null;
589
627
  /** Custom endpoints for CRUD operations */
@@ -633,6 +671,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
633
671
  private loadedEntityId;
634
672
  private hydratedEntityId;
635
673
  private loadedEntityData;
674
+ private entityHydrationPending;
636
675
  private schemaCache;
637
676
  private lastSchemaMeta?;
638
677
  private schemaRootHooks?;
@@ -640,11 +679,18 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
640
679
  private formValueChangesSubscription;
641
680
  private formBuildCycleId;
642
681
  private suppressedValueChangeBuildId;
682
+ private pendingBootstrapValueChangeBuildId;
643
683
  private readonly sectionHeaderBlobUrlCache;
644
684
  private readonly sectionHeaderObjectUrls;
645
685
  private lastCorrelationId?;
646
686
  private currentDnD?;
647
687
  private columnFieldsCache;
688
+ private rowClassesCache;
689
+ private rowStylesCache;
690
+ private sectionClassesCache;
691
+ private sectionStylesCache;
692
+ private columnClassesCache;
693
+ private columnStylesCache;
648
694
  private lastFieldPatchSig;
649
695
  private lastFieldPatchAt;
650
696
  schemaOutdated: boolean;
@@ -660,6 +706,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
660
706
  get formBlocksAfterDocument(): RichContentDocument;
661
707
  get beforeActionsPlacement(): 'insideLastSection' | 'afterSections';
662
708
  get actionPlacement(): 'insideLastSection' | 'afterSections' | 'top';
709
+ get effectiveActions(): FormConfig['actions'];
663
710
  /**
664
711
  * Precedence for editorial rich-content interpolation:
665
712
  * 1. form runtime context
@@ -736,6 +783,8 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
736
783
  private formInputsKey;
737
784
  private crudBackKey;
738
785
  private tryInitializeForm;
786
+ private hasExplicitSchemaUrl;
787
+ private hasSchemaBackedRuntime;
739
788
  private hasRenderableConfig;
740
789
  private initializeStandaloneConfig;
741
790
  private reloadForModeChange;
@@ -744,9 +793,13 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
744
793
  private blurAllInputs;
745
794
  private initializeForm;
746
795
  private handleInitializationError;
796
+ private loadConfigFailOpen;
797
+ private resolveFieldLabel;
747
798
  private getErrorMessage;
748
799
  private persistFormConfig;
749
800
  private createDefaultConfig;
801
+ private createConfigFromHostConfig;
802
+ private reconcileLoadedConfigWithServerSchema;
750
803
  private syncWithServer;
751
804
  private loadEntity;
752
805
  private buildFormFromConfig;
@@ -754,6 +807,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
754
807
  private scheduleValueChangeBootstrapRelease;
755
808
  private hasInteractiveFormState;
756
809
  private captureFormRuntimeState;
810
+ private getDirtyFieldNames;
757
811
  private buildCurrentFormRuntimeContext;
758
812
  private buildRestoreTargetContext;
759
813
  private isCompatibleRuntimeStateContext;
@@ -829,6 +883,8 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
829
883
  hasEditorialVisualContext(): boolean;
830
884
  private applyBorderPropsToStyle;
831
885
  private resolveRuleVisibility;
886
+ private resolveFieldVisibility;
887
+ private isFieldMetadataHidden;
832
888
  toggleSectionCollapse(event: Event, section: FormSection): void;
833
889
  sectionPanelId(section: FormSection, index: number): string;
834
890
  getSectionCollapsedSummary(section: FormSection): string;
@@ -836,6 +892,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
836
892
  fields: string[];
837
893
  id?: string;
838
894
  }): FieldMetadata[];
895
+ private getColumnFieldsSignature;
839
896
  private getColumnRuleProps;
840
897
  private buildFieldRuleMetadataOverrides;
841
898
  private normalizeRuleFieldOptions;
@@ -1006,12 +1063,13 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
1006
1063
  private getSchemaWithCache;
1007
1064
  private isReactiveValidationEnabled;
1008
1065
  private getReactiveValidationDebounceMs;
1066
+ private waitForGlobalConfigReadyForSchema;
1009
1067
  private setupReactiveValidation;
1010
1068
  private logRowGapsSnapshot;
1011
1069
  private applyPresentationVars;
1012
1070
  private applyPresentationConfig;
1013
1071
  static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDynamicForm, [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
1014
- static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicForm, "praxis-dynamic-form", never, { "resourcePath": { "alias": "resourcePath"; "required": false; }; "resourceId": { "alias": "resourceId"; "required": false; }; "initialValue": { "alias": "initialValue"; "required": false; }; "editorialContext": { "alias": "editorialContext"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "config": { "alias": "config"; "required": false; }; "schemaSource": { "alias": "schemaSource"; "required": false; }; "schemaUrl": { "alias": "schemaUrl"; "required": false; }; "submitUrl": { "alias": "submitUrl"; "required": false; }; "submitMethod": { "alias": "submitMethod"; "required": false; }; "responseSchemaUrl": { "alias": "responseSchemaUrl"; "required": false; }; "apiEndpointKey": { "alias": "apiEndpointKey"; "required": false; }; "apiUrlEntry": { "alias": "apiUrlEntry"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "backConfig": { "alias": "backConfig"; "required": false; }; "hooks": { "alias": "hooks"; "required": false; }; "removeEmptyContainersOnSave": { "alias": "removeEmptyContainersOnSave"; "required": false; }; "reactiveValidation": { "alias": "reactiveValidation"; "required": false; }; "reactiveValidationDebounceMs": { "alias": "reactiveValidationDebounceMs"; "required": false; }; "notifyIfOutdated": { "alias": "notifyIfOutdated"; "required": false; }; "snoozeMs": { "alias": "snoozeMs"; "required": false; }; "autoOpenSettingsOnOutdated": { "alias": "autoOpenSettingsOnOutdated"; "required": false; }; "readonlyModeGlobal": { "alias": "readonlyModeGlobal"; "required": false; }; "disabledModeGlobal": { "alias": "disabledModeGlobal"; "required": false; }; "presentationModeGlobal": { "alias": "presentationModeGlobal"; "required": false; }; "visibleGlobal": { "alias": "visibleGlobal"; "required": false; }; "customEndpoints": { "alias": "customEndpoints"; "required": false; }; }, { "formSubmit": "formSubmit"; "formCancel": "formCancel"; "formReset": "formReset"; "configChange": "configChange"; "formReady": "formReady"; "valueChange": "valueChange"; "syncCompleted": "syncCompleted"; "initializationError": "initializationError"; "loadingStateChange": "loadingStateChange"; "enableCustomizationChange": "enableCustomizationChange"; "customAction": "customAction"; "actionConfirmation": "actionConfirmation"; "schemaStatusChange": "schemaStatusChange"; "fieldRenderError": "fieldRenderError"; }, never, never, true, never>;
1072
+ static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicForm, "praxis-dynamic-form", never, { "resourcePath": { "alias": "resourcePath"; "required": false; }; "resourceId": { "alias": "resourceId"; "required": false; }; "initialValue": { "alias": "initialValue"; "required": false; }; "editorialContext": { "alias": "editorialContext"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "config": { "alias": "config"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "schemaSource": { "alias": "schemaSource"; "required": false; }; "schemaUrl": { "alias": "schemaUrl"; "required": false; }; "submitUrl": { "alias": "submitUrl"; "required": false; }; "submitMethod": { "alias": "submitMethod"; "required": false; }; "responseSchemaUrl": { "alias": "responseSchemaUrl"; "required": false; }; "apiEndpointKey": { "alias": "apiEndpointKey"; "required": false; }; "apiUrlEntry": { "alias": "apiUrlEntry"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "backConfig": { "alias": "backConfig"; "required": false; }; "hooks": { "alias": "hooks"; "required": false; }; "removeEmptyContainersOnSave": { "alias": "removeEmptyContainersOnSave"; "required": false; }; "reactiveValidation": { "alias": "reactiveValidation"; "required": false; }; "reactiveValidationDebounceMs": { "alias": "reactiveValidationDebounceMs"; "required": false; }; "notifyIfOutdated": { "alias": "notifyIfOutdated"; "required": false; }; "snoozeMs": { "alias": "snoozeMs"; "required": false; }; "autoOpenSettingsOnOutdated": { "alias": "autoOpenSettingsOnOutdated"; "required": false; }; "readonlyModeGlobal": { "alias": "readonlyModeGlobal"; "required": false; }; "disabledModeGlobal": { "alias": "disabledModeGlobal"; "required": false; }; "presentationModeGlobal": { "alias": "presentationModeGlobal"; "required": false; }; "visibleGlobal": { "alias": "visibleGlobal"; "required": false; }; "customEndpoints": { "alias": "customEndpoints"; "required": false; }; }, { "formSubmit": "formSubmit"; "formCancel": "formCancel"; "formReset": "formReset"; "configChange": "configChange"; "formReady": "formReady"; "valueChange": "valueChange"; "syncCompleted": "syncCompleted"; "initializationError": "initializationError"; "loadingStateChange": "loadingStateChange"; "enableCustomizationChange": "enableCustomizationChange"; "customAction": "customAction"; "actionConfirmation": "actionConfirmation"; "schemaStatusChange": "schemaStatusChange"; "fieldRenderError": "fieldRenderError"; }, never, never, true, never>;
1015
1073
  }
1016
1074
 
1017
1075
  declare class FormConfigService {
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@praxisui/dynamic-form",
3
- "version": "7.0.0-beta.0",
3
+ "version": "8.0.0-beta.1",
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/rich-content": "^7.0.0-beta.0",
10
- "@praxisui/settings-panel": "^7.0.0-beta.0",
11
- "@praxisui/visual-builder": "^7.0.0-beta.0",
12
- "@praxisui/core": "^7.0.0-beta.0",
13
- "@praxisui/cron-builder": "^7.0.0-beta.0"
9
+ "@praxisui/rich-content": "^8.0.0-beta.1",
10
+ "@praxisui/settings-panel": "^8.0.0-beta.1",
11
+ "@praxisui/visual-builder": "^8.0.0-beta.1",
12
+ "@praxisui/core": "^8.0.0-beta.1",
13
+ "@praxisui/cron-builder": "^8.0.0-beta.1"
14
14
  },
15
15
  "dependencies": {
16
16
  "tslib": "^2.3.0",