@praxisui/dynamic-form 8.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)
@@ -586,6 +621,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
586
621
  get effectiveReadonly(): boolean;
587
622
  get effectiveDisabledMode(): boolean | null;
588
623
  get effectiveFormIsValid(): boolean;
624
+ get invalidRequiredFieldLabels(): string[];
589
625
  /** Value propagated to DynamicFieldLoader; null allows per-field metadata */
590
626
  get presentationForLoader(): boolean | null;
591
627
  /** Custom endpoints for CRUD operations */
@@ -649,6 +685,12 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
649
685
  private lastCorrelationId?;
650
686
  private currentDnD?;
651
687
  private columnFieldsCache;
688
+ private rowClassesCache;
689
+ private rowStylesCache;
690
+ private sectionClassesCache;
691
+ private sectionStylesCache;
692
+ private columnClassesCache;
693
+ private columnStylesCache;
652
694
  private lastFieldPatchSig;
653
695
  private lastFieldPatchAt;
654
696
  schemaOutdated: boolean;
@@ -664,6 +706,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
664
706
  get formBlocksAfterDocument(): RichContentDocument;
665
707
  get beforeActionsPlacement(): 'insideLastSection' | 'afterSections';
666
708
  get actionPlacement(): 'insideLastSection' | 'afterSections' | 'top';
709
+ get effectiveActions(): FormConfig['actions'];
667
710
  /**
668
711
  * Precedence for editorial rich-content interpolation:
669
712
  * 1. form runtime context
@@ -740,6 +783,8 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
740
783
  private formInputsKey;
741
784
  private crudBackKey;
742
785
  private tryInitializeForm;
786
+ private hasExplicitSchemaUrl;
787
+ private hasSchemaBackedRuntime;
743
788
  private hasRenderableConfig;
744
789
  private initializeStandaloneConfig;
745
790
  private reloadForModeChange;
@@ -748,9 +793,13 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
748
793
  private blurAllInputs;
749
794
  private initializeForm;
750
795
  private handleInitializationError;
796
+ private loadConfigFailOpen;
797
+ private resolveFieldLabel;
751
798
  private getErrorMessage;
752
799
  private persistFormConfig;
753
800
  private createDefaultConfig;
801
+ private createConfigFromHostConfig;
802
+ private reconcileLoadedConfigWithServerSchema;
754
803
  private syncWithServer;
755
804
  private loadEntity;
756
805
  private buildFormFromConfig;
@@ -758,6 +807,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
758
807
  private scheduleValueChangeBootstrapRelease;
759
808
  private hasInteractiveFormState;
760
809
  private captureFormRuntimeState;
810
+ private getDirtyFieldNames;
761
811
  private buildCurrentFormRuntimeContext;
762
812
  private buildRestoreTargetContext;
763
813
  private isCompatibleRuntimeStateContext;
@@ -833,6 +883,8 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
833
883
  hasEditorialVisualContext(): boolean;
834
884
  private applyBorderPropsToStyle;
835
885
  private resolveRuleVisibility;
886
+ private resolveFieldVisibility;
887
+ private isFieldMetadataHidden;
836
888
  toggleSectionCollapse(event: Event, section: FormSection): void;
837
889
  sectionPanelId(section: FormSection, index: number): string;
838
890
  getSectionCollapsedSummary(section: FormSection): string;
@@ -840,6 +892,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
840
892
  fields: string[];
841
893
  id?: string;
842
894
  }): FieldMetadata[];
895
+ private getColumnFieldsSignature;
843
896
  private getColumnRuleProps;
844
897
  private buildFieldRuleMetadataOverrides;
845
898
  private normalizeRuleFieldOptions;
@@ -1010,12 +1063,13 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
1010
1063
  private getSchemaWithCache;
1011
1064
  private isReactiveValidationEnabled;
1012
1065
  private getReactiveValidationDebounceMs;
1066
+ private waitForGlobalConfigReadyForSchema;
1013
1067
  private setupReactiveValidation;
1014
1068
  private logRowGapsSnapshot;
1015
1069
  private applyPresentationVars;
1016
1070
  private applyPresentationConfig;
1017
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; }]>;
1018
- 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>;
1019
1073
  }
1020
1074
 
1021
1075
  declare class FormConfigService {
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@praxisui/dynamic-form",
3
- "version": "8.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": "^8.0.0-beta.0",
10
- "@praxisui/settings-panel": "^8.0.0-beta.0",
11
- "@praxisui/visual-builder": "^8.0.0-beta.0",
12
- "@praxisui/core": "^8.0.0-beta.0",
13
- "@praxisui/cron-builder": "^8.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",