@praxisui/dynamic-form 9.0.67 → 9.0.68-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +142 -0
- package/ai/component-registry.json +12 -12
- package/docs/actions-optional-text-validation-2026-09-08.md +49 -0
- package/docs/dynamic-form-authoring-document-semantics.md +87 -0
- package/docs/entity-read-feedback.md +162 -0
- package/docs/layout-apply-save-reopen-2026-09-08.md +114 -0
- package/docs/layout-toolbar-accessibility-2026-09-08.md +57 -0
- package/docs/master-detail-customization-matrix-2026-09-08.md +182 -0
- package/docs/schema-loading-recovery.md +74 -0
- package/docs/section-spacing-authoring-2026-09-08.md +61 -0
- package/fesm2022/praxisui-dynamic-form.mjs +3617 -2331
- package/package.json +8 -8
- package/src/lib/config-editor/praxis-dynamic-form-config-editor.json-api.md +11 -0
- package/src/lib/layout-editor/praxis-layout-editor.json-api.md +8 -4
- package/src/lib/praxis-dynamic-form.json-api.md +11 -0
- package/types/praxisui-dynamic-form.d.ts +116 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/dynamic-form",
|
|
3
|
-
"version": "9.0.
|
|
3
|
+
"version": "9.0.68-rc.0",
|
|
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": "^21.0.0",
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
"@angular/forms": "^21.0.0",
|
|
10
10
|
"@angular/material": "^21.0.0",
|
|
11
11
|
"@angular/router": "^21.0.0",
|
|
12
|
-
"@praxisui/ai": "^9.0.
|
|
13
|
-
"@praxisui/dynamic-fields": "^9.0.
|
|
14
|
-
"@praxisui/metadata-editor": "^9.0.
|
|
15
|
-
"@praxisui/rich-content": "^9.0.
|
|
16
|
-
"@praxisui/settings-panel": "^9.0.
|
|
17
|
-
"@praxisui/visual-builder": "^9.0.
|
|
18
|
-
"@praxisui/core": "^9.0.
|
|
12
|
+
"@praxisui/ai": "^9.0.68-rc.0",
|
|
13
|
+
"@praxisui/dynamic-fields": "^9.0.68-rc.0",
|
|
14
|
+
"@praxisui/metadata-editor": "^9.0.68-rc.0",
|
|
15
|
+
"@praxisui/rich-content": "^9.0.68-rc.0",
|
|
16
|
+
"@praxisui/settings-panel": "^9.0.68-rc.0",
|
|
17
|
+
"@praxisui/visual-builder": "^9.0.68-rc.0",
|
|
18
|
+
"@praxisui/core": "^9.0.68-rc.0",
|
|
19
19
|
"rxjs": "^7.8.0"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
@@ -498,3 +498,14 @@ Correcao: e diff estrutural para UX do painel, nao auditoria de negocio.
|
|
|
498
498
|
- **Geral → Dados do formulário** separates **Criar / Editar / Visualizar** from **Automático / Campos / Apresentação**. Selecting presentation in Create/Edit keeps the operation unchanged and explains the inactive state with an explicit action to switch to View.
|
|
499
499
|
- **Estilo da apresentação** remains discoverable regardless of the current mode. It previews sample data and does not activate presentation by itself. Filter Form does not expose this tab because it has no presentation runtime.
|
|
500
500
|
- Applying or finishing widget editing updates the page draft. **Salvar página** persists the composition. Shortening sample text affects the preview only.
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
### Orientação antes da seleção de um registro
|
|
504
|
+
|
|
505
|
+
O editor nativo, em **Geral → Sem registro selecionado**, materializa o contrato existente `PraxisDynamicFormEmptyState` em `bindings.emptyState`. O wrapper Page Builder projeta esse binding para `inputs.emptyState`; Apply, Save e JSON usam o mesmo documento. Não pertence a `FormConfig` nem substitui o modo dos dados.
|
|
506
|
+
|
|
507
|
+
`title` é obrigatório e não pode conter apenas espaços. `description` e `icon` são textos opcionais; a cópia de negócio permanece literal, sem ser interpretada automaticamente como chave i18n. O seletor usa o catálogo canônico de ícones. Restaurar o ícone padrão limpa a escolha explícita. Os controles do editor usam o catálogo i18n Form; a aparência runtime usa os tokens do empty state compartilhado.
|
|
508
|
+
|
|
509
|
+
As opções de aparência ficam em disclosure avançado: `tone` (`neutral`, `primary`, `secondary`), `variant` (`card`, `inline`, `panel`, `transparent`), `alignment` (`start`, `center`), `density` (`compact`, `comfortable`) e `iconContainer` (`none`, `circle`, `soft`). Ausência de opção herda o padrão do componente; JSON inválido produz diagnóstico.
|
|
510
|
+
|
|
511
|
+
A orientação aparece somente em `mode=view`, sem registro selecionado nem snapshot local. Criar e Editar preservam a configuração sem exibi-la. Desligar grava `null`, que impede reativação por uma preferência antiga; substituir um documento que omite o binding também limpa a orientação. Em `input-first`, a página governa o valor. Filter Form não expõe essa seção, pois não possui contexto de seleção equivalente.
|
|
@@ -268,8 +268,11 @@ Use quando precisar de:
|
|
|
268
268
|
| `fieldMetadata[].formHidden` | Active | Campos ocultos não aparecem na palette. |
|
|
269
269
|
| `actions/behavior/messages/hooks/api/...` | Declared-only | Não manipulados neste editor de layout. |
|
|
270
270
|
|
|
271
|
-
|
|
272
|
-
|
|
271
|
+
O controle **Espaço após as seções** usa `sections[].gapBottom` (pixels após a
|
|
272
|
+
seção inteira). **Preencher espaços não definidos** preenche somente valores
|
|
273
|
+
ausentes/nulos, preservando valores explícitos, inclusive zero. Editar o número
|
|
274
|
+
não emite configuração; o comando explícito emite o rascunho. A marca antiga
|
|
275
|
+
`gapCustomized` não é mais gerada nem consultada para decidir elegibilidade.
|
|
273
276
|
|
|
274
277
|
### 4. Mapeamento de Comportamento
|
|
275
278
|
- Palette de campos:
|
|
@@ -330,8 +333,9 @@ Correcao: ele cobre layout; demais blocos sao editados em componentes dedicados.
|
|
|
330
333
|
5. Ignorar `select` e perder contexto de qual elemento esta em foco.
|
|
331
334
|
Correcao: conecte `select` com painel lateral/inspector quando houver.
|
|
332
335
|
|
|
333
|
-
6.
|
|
334
|
-
Correcao:
|
|
336
|
+
6. Confundir espaço após a seção com espaço entre colunas ou usar `gapCustomized`.
|
|
337
|
+
Correcao: `gapBottom` é o contrato canônico; sua ausência indica elegibilidade
|
|
338
|
+
para preenchimento. Espaçamento entre colunas pertence ao layout da linha.
|
|
335
339
|
|
|
336
340
|
### 8. Referencias Cruzadas
|
|
337
341
|
- Orquestrador superior: `projects/praxis-dynamic-form/src/lib/config-editor/praxis-dynamic-form-config-editor.ts`
|
|
@@ -1127,3 +1127,14 @@ O runtime emite `target-not-found` quando uma regra aponta para `section`, `row`
|
|
|
1127
1127
|
- **Geral → Dados do formulário** separates **Criar / Editar / Visualizar** from **Automático / Campos / Apresentação**. Selecting presentation in Create/Edit keeps the operation unchanged and explains the inactive state with an explicit action to switch to View.
|
|
1128
1128
|
- **Estilo da apresentação** remains discoverable regardless of the current mode. It previews sample data and does not activate presentation by itself. Filter Form does not expose this tab because it has no presentation runtime.
|
|
1129
1129
|
- Applying or finishing widget editing updates the page draft. **Salvar página** persists the composition. Shortening sample text affects the preview only.
|
|
1130
|
+
|
|
1131
|
+
|
|
1132
|
+
### Orientação antes da seleção de um registro
|
|
1133
|
+
|
|
1134
|
+
O editor nativo, em **Geral → Sem registro selecionado**, materializa o contrato existente `PraxisDynamicFormEmptyState` em `bindings.emptyState`. O wrapper Page Builder projeta esse binding para `inputs.emptyState`; Apply, Save e JSON usam o mesmo documento. Não pertence a `FormConfig` nem substitui o modo dos dados.
|
|
1135
|
+
|
|
1136
|
+
`title` é obrigatório e não pode conter apenas espaços. `description` e `icon` são textos opcionais; a cópia de negócio permanece literal, sem ser interpretada automaticamente como chave i18n. O seletor usa o catálogo canônico de ícones. Restaurar o ícone padrão limpa a escolha explícita. Os controles do editor usam o catálogo i18n Form; a aparência runtime usa os tokens do empty state compartilhado.
|
|
1137
|
+
|
|
1138
|
+
As opções de aparência ficam em disclosure avançado: `tone` (`neutral`, `primary`, `secondary`), `variant` (`card`, `inline`, `panel`, `transparent`), `alignment` (`start`, `center`), `density` (`compact`, `comfortable`) e `iconContainer` (`none`, `circle`, `soft`). Ausência de opção herda o padrão do componente; JSON inválido produz diagnóstico.
|
|
1139
|
+
|
|
1140
|
+
A orientação aparece somente em `mode=view`, sem registro selecionado nem snapshot local. Criar e Editar preservam a configuração sem exibi-la. Desligar grava `null`, que impede reativação por uma preferência antiga; substituir um documento que omite o binding também limpa a orientação. Em `input-first`, a página governa o valor. Filter Form não expõe essa seção, pois não possui contexto de seleção equivalente.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { OnChanges, OnDestroy, EventEmitter, SimpleChanges, OnInit, ChangeDetectorRef, NgZone, Provider, AfterViewInit, ElementRef } from '@angular/core';
|
|
3
3
|
import { HttpClient } from '@angular/common/http';
|
|
4
|
-
import { FormGroup, AbstractControl, FormBuilder, FormArray } from '@angular/forms';
|
|
4
|
+
import { FormGroup, AbstractControl, FormBuilder, FormArray, FormControl } from '@angular/forms';
|
|
5
5
|
import { Router, ActivatedRoute } from '@angular/router';
|
|
6
6
|
import { MatDialog } from '@angular/material/dialog';
|
|
7
7
|
import { MatSnackBar } from '@angular/material/snack-bar';
|
|
8
8
|
import { CdkDragStart, CdkDragMove, CdkDragEnd, CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
9
9
|
import * as _praxisui_core from '@praxisui/core';
|
|
10
|
-
import { AsyncConfigStorage, FormLayout, FieldMetadata, FormLayoutRule, FormRuleTargetType as FormRuleTargetType$1, PraxisJsonLogicService, FormSection, FormRow, FormColumn, FormConfig, FormConfigWithSections, FormLayoutItem, ReactiveDeterminationDefinition, ReactiveDeterminationExecutionEvent, FormActionButton, AiCapability, BackConfig, FormPresentationConfig,
|
|
10
|
+
import { AsyncConfigStorage, FormLayout, FieldMetadata, FormLayoutRule, FormRuleTargetType as FormRuleTargetType$1, PraxisJsonLogicService, FormSection, FormRow, FormColumn, FormConfig, FormConfigWithSections, FormLayoutItem, ReactiveDeterminationDefinition, ReactiveDeterminationExecutionEvent, FormActionButton, AiCapability, BackConfig, FormPresentationConfig, EmptyStateTone, EmptyStateVariant, EmptyStateAlignment, EmptyStateDensity, EmptyStateIconContainer, RichBlockHostCapabilities, ApiEndpoint, ApiUrlEntry, DynamicFormLayoutPolicy, FormHooksLayout, EndpointConfig, FormSubmitEvent, FormReadyEvent, FormValueChangeEvent, FormPayloadPreviewEvent, SyncResult, FormInitializationError, LoadingState, FormCustomActionEvent, FormActionConfirmationEvent, RichContentDocument, JsonLogicRecord, GenericCrudService, ConnectionStorage, DynamicFormService, ErrorMessageService, SchemaNormalizerService, ComponentMetadataRegistry, GlobalConfigService, ComponentKeyService, LoadingOrchestrator, ApiUrlConfig, PraxisLoadingRenderer, FormHooksRegistry, FormHookPreset, LoggerService, EnterpriseRuntimeContextService, FormSectionHeaderAction, FormSectionHeaderConfig, FormConfigState, JsonLogicExpression, FormHelpPresentationConfig, GlobalActionCatalogEntry, PraxisRuntimeConditionalEffectRule, PraxisRuntimeGlobalActionEffect, SurfaceOpenPayload, GlobalActionField, PraxisEffectPolicy, FieldDefinition, ComponentDocMeta, Breakpoint, DomainRuleRequestOptions, DomainRuleService, DomainRuleMaterialization, TableConfig, SurfaceOpenActionEditorComponent, IconPickerService, GlobalActionRef, AiCapabilityCategory, AiCapabilityCatalog, AiValueKind, ComponentAuthoringManifest } from '@praxisui/core';
|
|
11
11
|
import * as rxjs from 'rxjs';
|
|
12
12
|
import { Observable, Subscription, BehaviorSubject } from 'rxjs';
|
|
13
13
|
import { SettingsPanelService, SettingsValueProvider } from '@praxisui/settings-panel';
|
|
@@ -575,6 +575,8 @@ interface EditorDiagnostic {
|
|
|
575
575
|
type DynamicFormMode = 'create' | 'edit' | 'view';
|
|
576
576
|
interface DynamicFormBindings {
|
|
577
577
|
mode?: DynamicFormMode;
|
|
578
|
+
/** Opt-in view placeholder; null explicitly disables it. */
|
|
579
|
+
emptyState?: PraxisDynamicFormEmptyState | null;
|
|
578
580
|
/** true: presentation in view; false: fields; null/absent: inherit layout policy. */
|
|
579
581
|
presentationModeGlobal?: boolean | null;
|
|
580
582
|
}
|
|
@@ -631,6 +633,7 @@ interface DynamicFormApplyPlan {
|
|
|
631
633
|
rebindMode?: boolean;
|
|
632
634
|
clearMode?: boolean;
|
|
633
635
|
clearPresentationMode?: boolean;
|
|
636
|
+
clearEmptyState?: boolean;
|
|
634
637
|
rebuildForm?: boolean;
|
|
635
638
|
refreshPresentation?: boolean;
|
|
636
639
|
clearPresentation?: boolean;
|
|
@@ -658,6 +661,7 @@ interface DynamicFormConfigPatchChangeEvent {
|
|
|
658
661
|
mode?: DynamicFormMode;
|
|
659
662
|
presentationModeGlobal?: boolean | null;
|
|
660
663
|
presentation?: DynamicFormPresentationSnapshot | null;
|
|
664
|
+
emptyState?: PraxisDynamicFormEmptyState | null;
|
|
661
665
|
};
|
|
662
666
|
}
|
|
663
667
|
/**
|
|
@@ -963,9 +967,20 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
963
967
|
private ruleApplicationDiagnosticsSignature;
|
|
964
968
|
private pendingEntityId;
|
|
965
969
|
private loadedEntityId;
|
|
970
|
+
private entitySelectionCleared;
|
|
966
971
|
private hydratedEntityId;
|
|
967
972
|
private loadedEntityData;
|
|
968
973
|
protected entityHydrationPending: boolean;
|
|
974
|
+
protected entityReadFailed: boolean;
|
|
975
|
+
protected entityReadText(key: 'loading' | 'error' | 'retry' | 'region' | 'success'): string;
|
|
976
|
+
protected entityReadStatusText(): string;
|
|
977
|
+
protected retryEntityRead(focusRegion?: HTMLElement): void;
|
|
978
|
+
private readonly schemaTransportOptions;
|
|
979
|
+
private readonly schemaReadControllers;
|
|
980
|
+
private schemaInitializationCycle;
|
|
981
|
+
private cancelSchemaReads;
|
|
982
|
+
private assertSchemaInitializationCurrent;
|
|
983
|
+
private isSchemaTransportInterruption;
|
|
969
984
|
private schemaCache;
|
|
970
985
|
private lastSchemaMeta?;
|
|
971
986
|
private readonly schemaMetaPersistenceQueues;
|
|
@@ -976,6 +991,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
976
991
|
private schemaRootReactiveDeterminations;
|
|
977
992
|
private schemaRootOperationId;
|
|
978
993
|
private destroy$;
|
|
994
|
+
private readonly entityReadCancel$;
|
|
979
995
|
private isDestroyed;
|
|
980
996
|
private formValueChangesSubscription;
|
|
981
997
|
private readonly submitFieldErrorSubscriptions;
|
|
@@ -1590,6 +1606,10 @@ declare class JsonConfigEditorComponent implements OnInit, OnDestroy {
|
|
|
1590
1606
|
getCurrentConfig(): FormConfig | null;
|
|
1591
1607
|
getCurrentDocument(): DynamicFormAuthoringDocument | null;
|
|
1592
1608
|
hasChanges(): boolean;
|
|
1609
|
+
diagnosticMessage(diagnostic: {
|
|
1610
|
+
code: string;
|
|
1611
|
+
message: string;
|
|
1612
|
+
}): string;
|
|
1593
1613
|
private validateJson;
|
|
1594
1614
|
private updateValidationState;
|
|
1595
1615
|
insertHooksTemplate(): void;
|
|
@@ -1690,6 +1710,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
|
|
|
1690
1710
|
};
|
|
1691
1711
|
private initialConfig;
|
|
1692
1712
|
private initialDocument;
|
|
1713
|
+
private appliedDocument?;
|
|
1693
1714
|
private readonly openedWithCanonicalDocument;
|
|
1694
1715
|
readonly runtimeContext?: DynamicFormRuntimeContext;
|
|
1695
1716
|
readonly runtimeContract?: DynamicFormResolvedRuntimeContract;
|
|
@@ -1703,6 +1724,18 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
|
|
|
1703
1724
|
get isPresentationMode(): boolean;
|
|
1704
1725
|
supportsPresentationSettings: boolean;
|
|
1705
1726
|
inputPresentationMode: boolean | null | undefined;
|
|
1727
|
+
inputEmptyState: PraxisDynamicFormEmptyState | null | undefined;
|
|
1728
|
+
private readonly emptyStateIconPicker;
|
|
1729
|
+
readonly emptyStateOptions: {
|
|
1730
|
+
readonly tone: readonly ["neutral", "primary", "secondary"];
|
|
1731
|
+
readonly variant: readonly ["card", "inline", "panel", "transparent"];
|
|
1732
|
+
readonly alignment: readonly ["start", "center"];
|
|
1733
|
+
readonly density: readonly ["compact", "comfortable"];
|
|
1734
|
+
readonly iconContainer: readonly ["none", "circle", "soft"];
|
|
1735
|
+
};
|
|
1736
|
+
setEmptyStateEnabled(enabled: boolean): void;
|
|
1737
|
+
onEmptyStateChange(): void;
|
|
1738
|
+
pickEmptyStateIcon(): Promise<void>;
|
|
1706
1739
|
get displayMode(): 'automatic' | 'fields' | 'presentation';
|
|
1707
1740
|
onDisplayModeChange(value: 'automatic' | 'fields' | 'presentation'): void;
|
|
1708
1741
|
get displayModeHint(): string;
|
|
@@ -1748,6 +1781,11 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
|
|
|
1748
1781
|
private globalActionValidationIssues;
|
|
1749
1782
|
private readonly i18n;
|
|
1750
1783
|
readonly globalActionCatalog: GlobalActionCatalogEntry[];
|
|
1784
|
+
private readonly invalidSurfaceDrafts;
|
|
1785
|
+
get hasInvalidSurfaceDraft(): boolean;
|
|
1786
|
+
onSurfaceDraftValidity(source: {
|
|
1787
|
+
discardInvalidDrafts(): void;
|
|
1788
|
+
}, valid: boolean): void;
|
|
1751
1789
|
isDirty$: BehaviorSubject<boolean>;
|
|
1752
1790
|
isValid$: BehaviorSubject<boolean>;
|
|
1753
1791
|
isBusy$: BehaviorSubject<boolean>;
|
|
@@ -1762,6 +1800,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
|
|
|
1762
1800
|
constructor(storage: AsyncConfigStorage, configService: FormConfigService, settingsPanel: SettingsPanelService, cdr: ChangeDetectorRef, globalActionCatalogSource?: ReadonlyArray<GlobalActionCatalogEntry[]>, injectedData?: any);
|
|
1763
1801
|
ngOnInit(): void;
|
|
1764
1802
|
reset(): void;
|
|
1803
|
+
acceptAppliedValue(value: unknown): void;
|
|
1765
1804
|
updateDirtyState(reason?: string): void;
|
|
1766
1805
|
getSettingsValue(): any;
|
|
1767
1806
|
onSave(): any;
|
|
@@ -2032,6 +2071,12 @@ declare class LayoutEditorComponent implements OnInit {
|
|
|
2032
2071
|
configChange: EventEmitter<FormConfig>;
|
|
2033
2072
|
paletteCollapsed: boolean;
|
|
2034
2073
|
protected readonly prefs: LayoutPrefsService;
|
|
2074
|
+
private readonly dialog;
|
|
2075
|
+
private readonly changeDetector;
|
|
2076
|
+
private readonly host;
|
|
2077
|
+
private readonly injector;
|
|
2078
|
+
private readonly sectionEditors;
|
|
2079
|
+
protected fieldMoveError: string;
|
|
2035
2080
|
private readonly layoutService;
|
|
2036
2081
|
private readonly settingsPanel;
|
|
2037
2082
|
private readonly i18n;
|
|
@@ -2069,6 +2114,7 @@ declare class LayoutEditorComponent implements OnInit {
|
|
|
2069
2114
|
/**
|
|
2070
2115
|
* Fields that are not yet placed in any section/column of the layout.
|
|
2071
2116
|
*/
|
|
2117
|
+
get hasEligibleApiFields(): boolean;
|
|
2072
2118
|
get availableFields(): FieldMetadata[];
|
|
2073
2119
|
t(key: string, params?: Record<string, string | number | boolean | null | undefined>): string;
|
|
2074
2120
|
get columnDropListIds(): string[];
|
|
@@ -2080,6 +2126,7 @@ declare class LayoutEditorComponent implements OnInit {
|
|
|
2080
2126
|
selectSection(sectionIndex: number): void;
|
|
2081
2127
|
selectRow(sectionIndex: number, rowIndex: number): void;
|
|
2082
2128
|
selectColumn(sectionIndex: number, rowIndex: number, columnIndex: number): void;
|
|
2129
|
+
openFieldMoveDialog(event: EditFieldEvent): void;
|
|
2083
2130
|
dropField({ event }: FieldDropEvent): void;
|
|
2084
2131
|
private getColumnLayoutItemByIndex;
|
|
2085
2132
|
private getColumnTargetByIndex;
|
|
@@ -2105,6 +2152,7 @@ declare class LayoutEditorComponent implements OnInit {
|
|
|
2105
2152
|
moveVisualBlock(event: MoveVisualBlockEvent): void;
|
|
2106
2153
|
moveVisualBlockToColumn(event: MoveVisualBlockToColumnEvent): void;
|
|
2107
2154
|
removeVisualBlock(event: VisualBlockEvent): void;
|
|
2155
|
+
private focusVisualBlockSelectionAfterRender;
|
|
2108
2156
|
private emitNewConfig;
|
|
2109
2157
|
onApplyStyleToAll(patch: Partial<FormSection>): void;
|
|
2110
2158
|
trackBySection(index: number, s: FormSection & {
|
|
@@ -2199,10 +2247,10 @@ declare class RowConfiguratorComponent implements OnChanges {
|
|
|
2199
2247
|
trackLayoutItem(_: number, item: FormLayoutItem): string;
|
|
2200
2248
|
hasColumnContent(column: FormColumn): boolean;
|
|
2201
2249
|
getVisualBlockLabel(item: FormLayoutItem): string;
|
|
2202
|
-
|
|
2203
|
-
private findRichNodeLabel;
|
|
2250
|
+
formatGap(value: number | null | undefined): string;
|
|
2204
2251
|
t(key: string, params?: Record<string, string | number | boolean | null | undefined>): string;
|
|
2205
2252
|
getFieldLabel(field: FieldMetadata): string;
|
|
2253
|
+
onVisualBlockKeydown(columnIndex: number, item: FormLayoutItem, event: Event, edit: boolean): void;
|
|
2206
2254
|
selectVisualBlock(columnIndex: number, item: FormLayoutItem, event: Event): void;
|
|
2207
2255
|
openVisualBlockEditor(columnIndex: number, item: FormLayoutItem, event: Event): void;
|
|
2208
2256
|
moveVisualBlockItem(columnIndex: number, item: FormLayoutItem, direction: -1 | 1, event: Event): void;
|
|
@@ -2213,8 +2261,13 @@ declare class RowConfiguratorComponent implements OnChanges {
|
|
|
2213
2261
|
selectRow(): void;
|
|
2214
2262
|
openColumnConfig(index: number): void;
|
|
2215
2263
|
selectColumn(index: number, event: MouseEvent): void;
|
|
2216
|
-
selectField(fieldName: string, columnIndex: number, event:
|
|
2264
|
+
selectField(fieldName: string, columnIndex: number, event: Event): void;
|
|
2265
|
+
selectFieldFromKeyboard(fieldName: string, columnIndex: number, event: Event): void;
|
|
2217
2266
|
openFieldEditor(fieldName: string, columnIndex: number, event: Event): void;
|
|
2267
|
+
readonly columnPresets: {
|
|
2268
|
+
label: string;
|
|
2269
|
+
spans: number[];
|
|
2270
|
+
}[];
|
|
2218
2271
|
openRowMenu(): void;
|
|
2219
2272
|
onMenuClosed(): void;
|
|
2220
2273
|
onDropEnter(index: number): void;
|
|
@@ -2234,7 +2287,7 @@ declare class RowConfiguratorComponent implements OnChanges {
|
|
|
2234
2287
|
addFieldToColumn(index: number): void;
|
|
2235
2288
|
getColumnId(index: number): string;
|
|
2236
2289
|
private generateId;
|
|
2237
|
-
applyPreset(
|
|
2290
|
+
applyPreset(spans: number[]): void;
|
|
2238
2291
|
getColumnClass(column: any): string;
|
|
2239
2292
|
getSpanClasses(column: any): string[];
|
|
2240
2293
|
getColumnClassList(column: any): string;
|
|
@@ -2249,6 +2302,9 @@ declare class RowConfiguratorComponent implements OnChanges {
|
|
|
2249
2302
|
clearRowGap(): void;
|
|
2250
2303
|
hasMultipleColumns(): boolean;
|
|
2251
2304
|
getSpanTotal(bp?: Breakpoint): number;
|
|
2305
|
+
private participatesInRowGuidance;
|
|
2306
|
+
private getOccupiedRowUnits;
|
|
2307
|
+
getRowSpaceGuidance(): string | null;
|
|
2252
2308
|
getOffsetFor(column: any, bp?: Breakpoint): number;
|
|
2253
2309
|
setOffset(columnIndex: number, value: number): void;
|
|
2254
2310
|
adjustOffset(columnIndex: number, delta: number): void;
|
|
@@ -2259,6 +2315,8 @@ declare class RowConfiguratorComponent implements OnChanges {
|
|
|
2259
2315
|
|
|
2260
2316
|
declare class FieldConfiguratorComponent {
|
|
2261
2317
|
private readonly registry;
|
|
2318
|
+
private readonly i18n;
|
|
2319
|
+
get hiddenLabel(): string;
|
|
2262
2320
|
field: FieldMetadata;
|
|
2263
2321
|
private readonly categoryByType;
|
|
2264
2322
|
private resolveEditorialMeta;
|
|
@@ -2274,7 +2332,10 @@ declare class FieldConfiguratorComponent {
|
|
|
2274
2332
|
|
|
2275
2333
|
interface PraxisDynamicFormWidgetEditorInputs {
|
|
2276
2334
|
config?: FormConfig | null;
|
|
2335
|
+
layoutPolicy?: DynamicFormLayoutPolicy | null;
|
|
2336
|
+
configPersistenceStrategy?: 'local-first' | 'input-first';
|
|
2277
2337
|
mode?: DynamicFormMode;
|
|
2338
|
+
emptyState?: PraxisDynamicFormEmptyState | null;
|
|
2278
2339
|
presentationModeGlobal?: boolean | null;
|
|
2279
2340
|
presentation?: DynamicFormPresentationSnapshot | null;
|
|
2280
2341
|
formId?: string;
|
|
@@ -2291,23 +2352,32 @@ interface PraxisDynamicFormWidgetEditorValue {
|
|
|
2291
2352
|
declare class PraxisDynamicFormWidgetConfigEditor implements SettingsValueProvider, AfterViewInit, OnDestroy {
|
|
2292
2353
|
inputs: PraxisDynamicFormWidgetEditorInputs | null;
|
|
2293
2354
|
widgetKey?: string;
|
|
2355
|
+
appliedValues$?: Observable<unknown>;
|
|
2356
|
+
private appliedSource?;
|
|
2357
|
+
/** Runtime evidence supplied by the existing component editor context resolver. */
|
|
2358
|
+
context: Record<string, unknown>;
|
|
2294
2359
|
formEditor?: PraxisDynamicFormConfigEditor;
|
|
2295
2360
|
readonly isDirty$: BehaviorSubject<boolean>;
|
|
2296
2361
|
readonly isValid$: BehaviorSubject<boolean>;
|
|
2297
2362
|
readonly isBusy$: BehaviorSubject<boolean>;
|
|
2298
2363
|
private readonly subscription;
|
|
2299
2364
|
private initialEditorConfig?;
|
|
2365
|
+
private sourceDraft?;
|
|
2366
|
+
get configurationSource(): 'local-first' | 'input-first';
|
|
2367
|
+
changeConfigurationSource(value: string): void;
|
|
2368
|
+
private updateDirtyState;
|
|
2300
2369
|
private readonly cdr;
|
|
2301
2370
|
ngAfterViewInit(): void;
|
|
2302
2371
|
ngOnDestroy(): void;
|
|
2303
2372
|
getSettingsValue(): PraxisDynamicFormWidgetEditorValue;
|
|
2304
2373
|
onSave(): PraxisDynamicFormWidgetEditorValue;
|
|
2374
|
+
acceptAppliedValue(value: unknown): void;
|
|
2305
2375
|
reset(): void;
|
|
2306
2376
|
private initializeChildEditor;
|
|
2307
2377
|
private buildValue;
|
|
2308
2378
|
private createDocumentFromInputs;
|
|
2309
2379
|
static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDynamicFormWidgetConfigEditor, never>;
|
|
2310
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicFormWidgetConfigEditor, "praxis-dynamic-form-widget-config-editor", never, { "inputs": { "alias": "inputs"; "required": false; }; "widgetKey": { "alias": "widgetKey"; "required": false; }; }, {}, never, never, true, never>;
|
|
2380
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicFormWidgetConfigEditor, "praxis-dynamic-form-widget-config-editor", never, { "inputs": { "alias": "inputs"; "required": false; }; "widgetKey": { "alias": "widgetKey"; "required": false; }; "appliedValues$": { "alias": "appliedValues$"; "required": false; }; "context": { "alias": "context"; "required": false; }; }, {}, never, never, true, never>;
|
|
2311
2381
|
}
|
|
2312
2382
|
|
|
2313
2383
|
/** Metadata for PraxisDynamicForm component */
|
|
@@ -2525,6 +2595,9 @@ declare class SectionEditorComponent implements OnInit, AfterViewInit, OnDestroy
|
|
|
2525
2595
|
value: string;
|
|
2526
2596
|
label: string;
|
|
2527
2597
|
}>;
|
|
2598
|
+
private readonly invalidSurfaceDrafts;
|
|
2599
|
+
get hasInvalidSurfaceDraft(): boolean;
|
|
2600
|
+
onSurfaceDraftValidity(source: SurfaceOpenActionEditorComponent, valid: boolean): void;
|
|
2528
2601
|
isDirty$: BehaviorSubject<boolean>;
|
|
2529
2602
|
isValid$: BehaviorSubject<boolean>;
|
|
2530
2603
|
isBusy$: BehaviorSubject<boolean>;
|
|
@@ -2645,10 +2718,27 @@ declare class RowEditorComponent implements OnInit, OnDestroy, SettingsValueProv
|
|
|
2645
2718
|
static ɵcmp: i0.ɵɵComponentDeclaration<RowEditorComponent, "praxis-row-editor", never, {}, {}, never, never, true, never>;
|
|
2646
2719
|
}
|
|
2647
2720
|
|
|
2721
|
+
declare const COLUMN_LAYOUT_LIMITS: {
|
|
2722
|
+
readonly span: {
|
|
2723
|
+
readonly min: 1;
|
|
2724
|
+
readonly max: 12;
|
|
2725
|
+
};
|
|
2726
|
+
readonly offset: {
|
|
2727
|
+
readonly min: 0;
|
|
2728
|
+
readonly max: 11;
|
|
2729
|
+
};
|
|
2730
|
+
readonly order: {
|
|
2731
|
+
readonly min: -12;
|
|
2732
|
+
readonly max: 12;
|
|
2733
|
+
};
|
|
2734
|
+
};
|
|
2735
|
+
type ColumnLayoutNumber = keyof typeof COLUMN_LAYOUT_LIMITS;
|
|
2736
|
+
|
|
2648
2737
|
declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueProvider {
|
|
2649
2738
|
private fb;
|
|
2650
2739
|
private data;
|
|
2651
2740
|
form: FormGroup;
|
|
2741
|
+
readonly gridParts: number[];
|
|
2652
2742
|
breakpoints: Breakpoint[];
|
|
2653
2743
|
previewBreakpoint: Breakpoint;
|
|
2654
2744
|
column: FormColumn;
|
|
@@ -2661,7 +2751,24 @@ declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueP
|
|
|
2661
2751
|
private readonly i18n;
|
|
2662
2752
|
constructor(fb: FormBuilder, data: {
|
|
2663
2753
|
column: FormColumn;
|
|
2754
|
+
fieldMetadata?: FieldMetadata[];
|
|
2664
2755
|
});
|
|
2756
|
+
readonly alignmentOptions: readonly [{
|
|
2757
|
+
readonly value: "start";
|
|
2758
|
+
readonly icon: "vertical_align_top";
|
|
2759
|
+
}, {
|
|
2760
|
+
readonly value: "center";
|
|
2761
|
+
readonly icon: "vertical_align_center";
|
|
2762
|
+
}, {
|
|
2763
|
+
readonly value: "end";
|
|
2764
|
+
readonly icon: "vertical_align_bottom";
|
|
2765
|
+
}, {
|
|
2766
|
+
readonly value: "stretch";
|
|
2767
|
+
readonly icon: "height";
|
|
2768
|
+
}];
|
|
2769
|
+
alignmentLabel(value: string): string;
|
|
2770
|
+
get fieldLabels(): string[];
|
|
2771
|
+
breakpointLabel(bp: Breakpoint): string;
|
|
2665
2772
|
ngOnInit(): void;
|
|
2666
2773
|
ngOnDestroy(): void;
|
|
2667
2774
|
private applyChanges;
|
|
@@ -2676,6 +2783,8 @@ declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueP
|
|
|
2676
2783
|
adjustOffset(delta: number): void;
|
|
2677
2784
|
getOrder(bp: Breakpoint): number;
|
|
2678
2785
|
setOrder(value: number | string): void;
|
|
2786
|
+
layoutControl(property: ColumnLayoutNumber): FormControl;
|
|
2787
|
+
get invalidLayoutLocations(): string;
|
|
2679
2788
|
isHidden(bp: Breakpoint): boolean;
|
|
2680
2789
|
toggleHidden(): void;
|
|
2681
2790
|
copyToLarger(): void;
|