@praxisui/dynamic-form 9.0.66 → 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 +170 -0
- package/ai/component-registry.json +32 -16
- package/docs/actions-optional-text-validation-2026-09-08.md +49 -0
- package/docs/dynamic-form-authoring-document-semantics.md +105 -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 +3730 -2320
- package/package.json +8 -8
- package/src/lib/config-editor/praxis-dynamic-form-config-editor.json-api.md +28 -0
- package/src/lib/layout-editor/praxis-layout-editor.json-api.md +8 -4
- package/src/lib/praxis-dynamic-form.json-api.md +31 -3
- package/types/praxisui-dynamic-form.d.ts +140 -11
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": {
|
|
@@ -55,6 +55,13 @@ Este documento e a referencia canonica da API JSON de praxis-dynamic-form-config
|
|
|
55
55
|
|
|
56
56
|
## Canonical authoring semantics
|
|
57
57
|
|
|
58
|
+
- Em Geral → Dados do formulário, `Modo de dados` e `Modo de exibição` são preferências independentes.
|
|
59
|
+
- `bindings.presentationModeGlobal` reutiliza o input runtime existente: `true` = Apresentação (efetiva somente em `view`), `false` = Campos de formulário, `null`/ausência = Automático, seguindo `layoutPolicy`.
|
|
60
|
+
- Em replace-all, omitir a preferência remove o override anterior; `false` deve ser preservado. Não existe um quarto valor em `bindings.mode`.
|
|
61
|
+
- O Page Builder projeta a preferência nos inputs do widget, preservando ausência de `config` em formulários schema-driven. No editor do runtime, Apply/Save também publicam `mode` e `presentationModeGlobal` em `configPatchChange.inputPatch`.
|
|
62
|
+
- `contextSnapshot.presentation` continua reservado aos estilos (tipografia, densidade e alinhamento), editáveis nos dois caminhos pela aba Estilo da apresentação; não é o seletor de ativação. O Filter Form não oferece o seletor de exibição porque seu runtime não suporta apresentação.
|
|
63
|
+
|
|
64
|
+
|
|
58
65
|
- O editor visual e o editor JSON operam sobre `DynamicFormAuthoringDocument`.
|
|
59
66
|
- O editor JSON aceita apenas o envelope canônico; payloads legados pertencem aos caminhos de compatibilidade do runtime.
|
|
60
67
|
- `Apply` e `Save` emitem um snapshot canonico completo com semantica `replace-all`.
|
|
@@ -481,3 +488,24 @@ Correcao: e diff estrutural para UX do painel, nao auditoria de negocio.
|
|
|
481
488
|
| local-file | projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
482
489
|
| local-file | projects/praxis-settings-panel/src/lib/settings-panel.types.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
483
490
|
| local-file | projects/praxis-core/src/lib/models/form/form-config.model.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
### Presentation style projection and editor UX
|
|
494
|
+
|
|
495
|
+
- `contextSnapshot.presentation` is the canonical style snapshot. The optional runtime input `presentation: DynamicFormPresentationSnapshot | null` projects it into page widgets independently of schema-generated `config`. Explicit styles take precedence over stored style preferences; `null` restores defaults and blocks stale stored overrides; omission retains normal style resolution.
|
|
496
|
+
- Runtime editor Apply/Save emits `presentation` with `mode` and `presentationModeGlobal` in `configPatchChange.inputPatch`. Widget save/reopen preserves the same snapshot; omitting the document block clears the widget projection with `null`.
|
|
497
|
+
- Numeric font sizes and label widths are pixels. Capturing a runtime `rem` size converts it using the host root font size; opening and saving must not reinterpret `0.78rem` as `0.78px`.
|
|
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
|
+
- **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
|
+
- 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`
|
|
@@ -68,6 +68,13 @@ Este documento e a referencia canonica da API JSON de praxis-dynamic-form.
|
|
|
68
68
|
|
|
69
69
|
## Canonical authoring semantics
|
|
70
70
|
|
|
71
|
+
- Em Geral → Dados do formulário, `Modo de dados` e `Modo de exibição` são preferências independentes.
|
|
72
|
+
- `bindings.presentationModeGlobal` reutiliza o input runtime existente: `true` = Apresentação (efetiva somente em `view`), `false` = Campos de formulário, `null`/ausência = Automático, seguindo `layoutPolicy`.
|
|
73
|
+
- Em replace-all, omitir a preferência remove o override anterior; `false` deve ser preservado. Não existe um quarto valor em `bindings.mode`.
|
|
74
|
+
- O Page Builder projeta a preferência nos inputs do widget, preservando ausência de `config` em formulários schema-driven. No editor do runtime, Apply/Save também publicam `mode` e `presentationModeGlobal` em `configPatchChange.inputPatch`.
|
|
75
|
+
- `contextSnapshot.presentation` continua reservado aos estilos (tipografia, densidade e alinhamento), editáveis nos dois caminhos pela aba Estilo da apresentação; não é o seletor de ativação. O Filter Form não oferece o seletor de exibição porque seu runtime não suporta apresentação.
|
|
76
|
+
|
|
77
|
+
|
|
71
78
|
- `DynamicFormAuthoringDocument` e o snapshot canonico completo de autoria de `praxis-dynamic-form`.
|
|
72
79
|
- Quando aplicado por fluxos canonicos de editor, `config`, `bindings` e `contextSnapshot` possuem semantica `replace-all`.
|
|
73
80
|
- Ausencia de `bindings.mode` limpa o binding persistido e restaura o modo default efetivo do host.
|
|
@@ -411,7 +418,7 @@ Limites de segurança:
|
|
|
411
418
|
| `formCancel` | `void` | Acao cancelar. | Partial | Preservado da documentação anterior. |
|
|
412
419
|
| `formReset` | `void` | Acao reset. | Partial | Preservado da documentação anterior. |
|
|
413
420
|
| `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. | Partial | Preservado da documentação anterior. |
|
|
414
|
-
| `configPatchChange` | `{ inputPatch: { config
|
|
421
|
+
| `configPatchChange` | `{ inputPatch: { config?: FormConfig; resourcePath?: string \| null; mode?: DynamicFormMode; presentationModeGlobal?: boolean \| null; presentation?: DynamicFormPresentationSnapshot \| null } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. | Partial | Contrato aditivo para hosts genericos sem alterar o payload legado de `configChange`. |
|
|
415
422
|
| `formReady` | `FormReadyEvent` | Form pronto para interacao. | Partial | Preservado da documentação anterior. |
|
|
416
423
|
| `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. | Partial | Preservado da documentação anterior. |
|
|
417
424
|
| `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. | Partial | Preservado da documentação anterior. |
|
|
@@ -745,7 +752,7 @@ Validado em 2026-04-23 contra `praxis-api-quickstart` publicado no Render com
|
|
|
745
752
|
| `formCancel` | `void` | Acao cancelar. |
|
|
746
753
|
| `formReset` | `void` | Acao reset. |
|
|
747
754
|
| `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. |
|
|
748
|
-
| `configPatchChange` | `{ inputPatch: { config
|
|
755
|
+
| `configPatchChange` | `{ inputPatch: { config?: FormConfig; resourcePath?: string \| null; mode?: DynamicFormMode; presentationModeGlobal?: boolean \| null; presentation?: DynamicFormPresentationSnapshot \| null } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. |
|
|
749
756
|
| `formReady` | `FormReadyEvent` | Form pronto para interacao. |
|
|
750
757
|
| `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. |
|
|
751
758
|
| `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. |
|
|
@@ -971,7 +978,7 @@ O runtime emite `target-not-found` quando uma regra aponta para `section`, `row`
|
|
|
971
978
|
| `formCancel` | `void` | Acao cancelar. | Partial | Preservado da documentação anterior. |
|
|
972
979
|
| `formReset` | `void` | Acao reset. | Partial | Preservado da documentação anterior. |
|
|
973
980
|
| `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. | Partial | Preservado da documentação anterior. |
|
|
974
|
-
| `configPatchChange` | `{ inputPatch: { config
|
|
981
|
+
| `configPatchChange` | `{ inputPatch: { config?: FormConfig; resourcePath?: string \| null; mode?: DynamicFormMode; presentationModeGlobal?: boolean \| null; presentation?: DynamicFormPresentationSnapshot \| null } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. | Partial | Contrato aditivo para hosts genericos sem alterar o payload legado de `configChange`. |
|
|
975
982
|
| `formReady` | `FormReadyEvent` | Form pronto para interacao. | Partial | Preservado da documentação anterior. |
|
|
976
983
|
| `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. | Partial | Preservado da documentação anterior. |
|
|
977
984
|
| `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. | Partial | Preservado da documentação anterior. |
|
|
@@ -1110,3 +1117,24 @@ O runtime emite `target-not-found` quando uma regra aponta para `section`, `row`
|
|
|
1110
1117
|
| local-file | projects/praxis-dynamic-fields/src/lib/directives/dynamic-field-loader.directive.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
1111
1118
|
| local-file | projects/praxis-core/src/lib/models/form/form-config.model.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
1112
1119
|
| local-file | projects/praxis-core/src/lib/models/form/form-layout.model.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
1120
|
+
|
|
1121
|
+
|
|
1122
|
+
### Presentation style projection and editor UX
|
|
1123
|
+
|
|
1124
|
+
- `contextSnapshot.presentation` is the canonical style snapshot. The optional runtime input `presentation: DynamicFormPresentationSnapshot | null` projects it into page widgets independently of schema-generated `config`. Explicit styles take precedence over stored style preferences; `null` restores defaults and blocks stale stored overrides; omission retains normal style resolution.
|
|
1125
|
+
- Runtime editor Apply/Save emits `presentation` with `mode` and `presentationModeGlobal` in `configPatchChange.inputPatch`. Widget save/reopen preserves the same snapshot; omitting the document block clears the widget projection with `null`.
|
|
1126
|
+
- Numeric font sizes and label widths are pixels. Capturing a runtime `rem` size converts it using the host root font size; opening and saving must not reinterpret `0.78rem` as `0.78px`.
|
|
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
|
+
- **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
|
+
- 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,10 @@ 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;
|
|
580
|
+
/** true: presentation in view; false: fields; null/absent: inherit layout policy. */
|
|
581
|
+
presentationModeGlobal?: boolean | null;
|
|
578
582
|
}
|
|
579
583
|
type DynamicFormPresentationSnapshot = FormPresentationConfig;
|
|
580
584
|
interface DynamicFormSchemaPrefsSnapshot {
|
|
@@ -628,6 +632,8 @@ interface DynamicFormApplyPlan {
|
|
|
628
632
|
runtime?: {
|
|
629
633
|
rebindMode?: boolean;
|
|
630
634
|
clearMode?: boolean;
|
|
635
|
+
clearPresentationMode?: boolean;
|
|
636
|
+
clearEmptyState?: boolean;
|
|
631
637
|
rebuildForm?: boolean;
|
|
632
638
|
refreshPresentation?: boolean;
|
|
633
639
|
clearPresentation?: boolean;
|
|
@@ -650,7 +656,12 @@ interface DynamicFormApplyPlan {
|
|
|
650
656
|
|
|
651
657
|
interface DynamicFormConfigPatchChangeEvent {
|
|
652
658
|
inputPatch: {
|
|
653
|
-
config
|
|
659
|
+
config?: FormConfig;
|
|
660
|
+
resourcePath?: string | null;
|
|
661
|
+
mode?: DynamicFormMode;
|
|
662
|
+
presentationModeGlobal?: boolean | null;
|
|
663
|
+
presentation?: DynamicFormPresentationSnapshot | null;
|
|
664
|
+
emptyState?: PraxisDynamicFormEmptyState | null;
|
|
654
665
|
};
|
|
655
666
|
}
|
|
656
667
|
/**
|
|
@@ -863,6 +874,8 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
863
874
|
readonlyModeGlobal: boolean | null;
|
|
864
875
|
disabledModeGlobal: boolean | null;
|
|
865
876
|
presentationModeGlobal: boolean | null;
|
|
877
|
+
/** Projection of contextSnapshot.presentation; null clears authored style overrides. */
|
|
878
|
+
presentation?: DynamicFormPresentationSnapshot | null;
|
|
866
879
|
visibleGlobal: boolean | null;
|
|
867
880
|
fieldIconPolicy: 'all' | 'presentation-only' | 'none';
|
|
868
881
|
/** Opt-in loader for shared domain rule materializations persisted outside FormConfig. */
|
|
@@ -954,9 +967,20 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
954
967
|
private ruleApplicationDiagnosticsSignature;
|
|
955
968
|
private pendingEntityId;
|
|
956
969
|
private loadedEntityId;
|
|
970
|
+
private entitySelectionCleared;
|
|
957
971
|
private hydratedEntityId;
|
|
958
972
|
private loadedEntityData;
|
|
959
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;
|
|
960
984
|
private schemaCache;
|
|
961
985
|
private lastSchemaMeta?;
|
|
962
986
|
private readonly schemaMetaPersistenceQueues;
|
|
@@ -967,6 +991,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
967
991
|
private schemaRootReactiveDeterminations;
|
|
968
992
|
private schemaRootOperationId;
|
|
969
993
|
private destroy$;
|
|
994
|
+
private readonly entityReadCancel$;
|
|
970
995
|
private isDestroyed;
|
|
971
996
|
private formValueChangesSubscription;
|
|
972
997
|
private readonly submitFieldErrorSubscriptions;
|
|
@@ -1510,7 +1535,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
|
|
|
1510
1535
|
private applyPresentationVars;
|
|
1511
1536
|
private applyPresentationConfig;
|
|
1512
1537
|
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, null, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
|
|
1513
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicForm, "praxis-dynamic-form", never, { "resourcePath": { "alias": "resourcePath"; "required": false; }; "resourceId": { "alias": "resourceId"; "required": false; }; "initialValue": { "alias": "initialValue"; "required": false; }; "emptyState": { "alias": "emptyState"; "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; }; "readUrl": { "alias": "readUrl"; "required": false; }; "submitUrl": { "alias": "submitUrl"; "required": false; }; "submitMethod": { "alias": "submitMethod"; "required": false; }; "submitIdempotencyKey": { "alias": "submitIdempotencyKey"; "required": false; }; "submitCorrelationId": { "alias": "submitCorrelationId"; "required": false; }; "submitResourceVersion": { "alias": "submitResourceVersion"; "required": false; }; "submitResourceVersionTargetResourceKey": { "alias": "submitResourceVersionTargetResourceKey"; "required": false; }; "submitResourceVersionTargetIdField": { "alias": "submitResourceVersionTargetIdField"; "required": false; }; "responseSchemaUrl": { "alias": "responseSchemaUrl"; "required": false; }; "apiEndpointKey": { "alias": "apiEndpointKey"; "required": false; }; "apiUrlEntry": { "alias": "apiUrlEntry"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "showAiAssistant": { "alias": "showAiAssistant"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "configPersistenceStrategy": { "alias": "configPersistenceStrategy"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "generatedLayoutPreset": { "alias": "generatedLayoutPreset"; "required": false; }; "layoutPolicy": { "alias": "layoutPolicy"; "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; }; "fieldIconPolicy": { "alias": "fieldIconPolicy"; "required": false; }; "domainRules": { "alias": "domainRules"; "required": false; }; "customEndpoints": { "alias": "customEndpoints"; "required": false; }; }, { "formSubmit": "formSubmit"; "formCancel": "formCancel"; "formReset": "formReset"; "configChange": "configChange"; "configPatchChange": "configPatchChange"; "formReady": "formReady"; "valueChange": "valueChange"; "payloadPreviewChange": "payloadPreviewChange"; "syncCompleted": "syncCompleted"; "initializationError": "initializationError"; "loadingStateChange": "loadingStateChange"; "enableCustomizationChange": "enableCustomizationChange"; "customAction": "customAction"; "actionConfirmation": "actionConfirmation"; "schemaStatusChange": "schemaStatusChange"; "fieldRenderError": "fieldRenderError"; "ruleDiagnosticsChange": "ruleDiagnosticsChange"; "reactiveDeterminationExecuted": "reactiveDeterminationExecuted"; "reactiveDeterminationPendingChange": "reactiveDeterminationPendingChange"; }, never, never, true, never>;
|
|
1538
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicForm, "praxis-dynamic-form", never, { "resourcePath": { "alias": "resourcePath"; "required": false; }; "resourceId": { "alias": "resourceId"; "required": false; }; "initialValue": { "alias": "initialValue"; "required": false; }; "emptyState": { "alias": "emptyState"; "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; }; "readUrl": { "alias": "readUrl"; "required": false; }; "submitUrl": { "alias": "submitUrl"; "required": false; }; "submitMethod": { "alias": "submitMethod"; "required": false; }; "submitIdempotencyKey": { "alias": "submitIdempotencyKey"; "required": false; }; "submitCorrelationId": { "alias": "submitCorrelationId"; "required": false; }; "submitResourceVersion": { "alias": "submitResourceVersion"; "required": false; }; "submitResourceVersionTargetResourceKey": { "alias": "submitResourceVersionTargetResourceKey"; "required": false; }; "submitResourceVersionTargetIdField": { "alias": "submitResourceVersionTargetIdField"; "required": false; }; "responseSchemaUrl": { "alias": "responseSchemaUrl"; "required": false; }; "apiEndpointKey": { "alias": "apiEndpointKey"; "required": false; }; "apiUrlEntry": { "alias": "apiUrlEntry"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "showAiAssistant": { "alias": "showAiAssistant"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "configPersistenceStrategy": { "alias": "configPersistenceStrategy"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "generatedLayoutPreset": { "alias": "generatedLayoutPreset"; "required": false; }; "layoutPolicy": { "alias": "layoutPolicy"; "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; }; "presentation": { "alias": "presentation"; "required": false; }; "visibleGlobal": { "alias": "visibleGlobal"; "required": false; }; "fieldIconPolicy": { "alias": "fieldIconPolicy"; "required": false; }; "domainRules": { "alias": "domainRules"; "required": false; }; "customEndpoints": { "alias": "customEndpoints"; "required": false; }; }, { "formSubmit": "formSubmit"; "formCancel": "formCancel"; "formReset": "formReset"; "configChange": "configChange"; "configPatchChange": "configPatchChange"; "formReady": "formReady"; "valueChange": "valueChange"; "payloadPreviewChange": "payloadPreviewChange"; "syncCompleted": "syncCompleted"; "initializationError": "initializationError"; "loadingStateChange": "loadingStateChange"; "enableCustomizationChange": "enableCustomizationChange"; "customAction": "customAction"; "actionConfirmation": "actionConfirmation"; "schemaStatusChange": "schemaStatusChange"; "fieldRenderError": "fieldRenderError"; "ruleDiagnosticsChange": "ruleDiagnosticsChange"; "reactiveDeterminationExecuted": "reactiveDeterminationExecuted"; "reactiveDeterminationPendingChange": "reactiveDeterminationPendingChange"; }, never, never, true, never>;
|
|
1514
1539
|
}
|
|
1515
1540
|
|
|
1516
1541
|
declare class FormConfigService {
|
|
@@ -1581,6 +1606,10 @@ declare class JsonConfigEditorComponent implements OnInit, OnDestroy {
|
|
|
1581
1606
|
getCurrentConfig(): FormConfig | null;
|
|
1582
1607
|
getCurrentDocument(): DynamicFormAuthoringDocument | null;
|
|
1583
1608
|
hasChanges(): boolean;
|
|
1609
|
+
diagnosticMessage(diagnostic: {
|
|
1610
|
+
code: string;
|
|
1611
|
+
message: string;
|
|
1612
|
+
}): string;
|
|
1584
1613
|
private validateJson;
|
|
1585
1614
|
private updateValidationState;
|
|
1586
1615
|
insertHooksTemplate(): void;
|
|
@@ -1681,6 +1710,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
|
|
|
1681
1710
|
};
|
|
1682
1711
|
private initialConfig;
|
|
1683
1712
|
private initialDocument;
|
|
1713
|
+
private appliedDocument?;
|
|
1684
1714
|
private readonly openedWithCanonicalDocument;
|
|
1685
1715
|
readonly runtimeContext?: DynamicFormRuntimeContext;
|
|
1686
1716
|
readonly runtimeContract?: DynamicFormResolvedRuntimeContract;
|
|
@@ -1691,7 +1721,26 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
|
|
|
1691
1721
|
inputMode: 'create' | 'edit' | 'view';
|
|
1692
1722
|
private includeBindingsBlock;
|
|
1693
1723
|
private readonly editorMode;
|
|
1694
|
-
isPresentationMode: boolean;
|
|
1724
|
+
get isPresentationMode(): boolean;
|
|
1725
|
+
supportsPresentationSettings: boolean;
|
|
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>;
|
|
1739
|
+
get displayMode(): 'automatic' | 'fields' | 'presentation';
|
|
1740
|
+
onDisplayModeChange(value: 'automatic' | 'fields' | 'presentation'): void;
|
|
1741
|
+
get displayModeHint(): string;
|
|
1742
|
+
useViewMode(): void;
|
|
1743
|
+
openPresentationStyle(): void;
|
|
1695
1744
|
truncatePreview: boolean;
|
|
1696
1745
|
previewItems: Array<{
|
|
1697
1746
|
label: string;
|
|
@@ -1732,6 +1781,11 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
|
|
|
1732
1781
|
private globalActionValidationIssues;
|
|
1733
1782
|
private readonly i18n;
|
|
1734
1783
|
readonly globalActionCatalog: GlobalActionCatalogEntry[];
|
|
1784
|
+
private readonly invalidSurfaceDrafts;
|
|
1785
|
+
get hasInvalidSurfaceDraft(): boolean;
|
|
1786
|
+
onSurfaceDraftValidity(source: {
|
|
1787
|
+
discardInvalidDrafts(): void;
|
|
1788
|
+
}, valid: boolean): void;
|
|
1735
1789
|
isDirty$: BehaviorSubject<boolean>;
|
|
1736
1790
|
isValid$: BehaviorSubject<boolean>;
|
|
1737
1791
|
isBusy$: BehaviorSubject<boolean>;
|
|
@@ -1746,6 +1800,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
|
|
|
1746
1800
|
constructor(storage: AsyncConfigStorage, configService: FormConfigService, settingsPanel: SettingsPanelService, cdr: ChangeDetectorRef, globalActionCatalogSource?: ReadonlyArray<GlobalActionCatalogEntry[]>, injectedData?: any);
|
|
1747
1801
|
ngOnInit(): void;
|
|
1748
1802
|
reset(): void;
|
|
1803
|
+
acceptAppliedValue(value: unknown): void;
|
|
1749
1804
|
updateDirtyState(reason?: string): void;
|
|
1750
1805
|
getSettingsValue(): any;
|
|
1751
1806
|
onSave(): any;
|
|
@@ -1847,7 +1902,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
|
|
|
1847
1902
|
private toPresentationSnapshot;
|
|
1848
1903
|
private toSchemaPrefsSnapshot;
|
|
1849
1904
|
private toBackConfigSnapshot;
|
|
1850
|
-
tx(key: string, fallback
|
|
1905
|
+
tx(key: string, fallback?: string, params?: Record<string, string | number | boolean | null | undefined>): string;
|
|
1851
1906
|
private resolveI18n;
|
|
1852
1907
|
private interpolateFallback;
|
|
1853
1908
|
static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDynamicFormConfigEditor, [null, null, null, null, { optional: true; }, { optional: true; }]>;
|
|
@@ -2016,6 +2071,12 @@ declare class LayoutEditorComponent implements OnInit {
|
|
|
2016
2071
|
configChange: EventEmitter<FormConfig>;
|
|
2017
2072
|
paletteCollapsed: boolean;
|
|
2018
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;
|
|
2019
2080
|
private readonly layoutService;
|
|
2020
2081
|
private readonly settingsPanel;
|
|
2021
2082
|
private readonly i18n;
|
|
@@ -2053,6 +2114,7 @@ declare class LayoutEditorComponent implements OnInit {
|
|
|
2053
2114
|
/**
|
|
2054
2115
|
* Fields that are not yet placed in any section/column of the layout.
|
|
2055
2116
|
*/
|
|
2117
|
+
get hasEligibleApiFields(): boolean;
|
|
2056
2118
|
get availableFields(): FieldMetadata[];
|
|
2057
2119
|
t(key: string, params?: Record<string, string | number | boolean | null | undefined>): string;
|
|
2058
2120
|
get columnDropListIds(): string[];
|
|
@@ -2064,6 +2126,7 @@ declare class LayoutEditorComponent implements OnInit {
|
|
|
2064
2126
|
selectSection(sectionIndex: number): void;
|
|
2065
2127
|
selectRow(sectionIndex: number, rowIndex: number): void;
|
|
2066
2128
|
selectColumn(sectionIndex: number, rowIndex: number, columnIndex: number): void;
|
|
2129
|
+
openFieldMoveDialog(event: EditFieldEvent): void;
|
|
2067
2130
|
dropField({ event }: FieldDropEvent): void;
|
|
2068
2131
|
private getColumnLayoutItemByIndex;
|
|
2069
2132
|
private getColumnTargetByIndex;
|
|
@@ -2089,6 +2152,7 @@ declare class LayoutEditorComponent implements OnInit {
|
|
|
2089
2152
|
moveVisualBlock(event: MoveVisualBlockEvent): void;
|
|
2090
2153
|
moveVisualBlockToColumn(event: MoveVisualBlockToColumnEvent): void;
|
|
2091
2154
|
removeVisualBlock(event: VisualBlockEvent): void;
|
|
2155
|
+
private focusVisualBlockSelectionAfterRender;
|
|
2092
2156
|
private emitNewConfig;
|
|
2093
2157
|
onApplyStyleToAll(patch: Partial<FormSection>): void;
|
|
2094
2158
|
trackBySection(index: number, s: FormSection & {
|
|
@@ -2183,10 +2247,10 @@ declare class RowConfiguratorComponent implements OnChanges {
|
|
|
2183
2247
|
trackLayoutItem(_: number, item: FormLayoutItem): string;
|
|
2184
2248
|
hasColumnContent(column: FormColumn): boolean;
|
|
2185
2249
|
getVisualBlockLabel(item: FormLayoutItem): string;
|
|
2186
|
-
|
|
2187
|
-
private findRichNodeLabel;
|
|
2250
|
+
formatGap(value: number | null | undefined): string;
|
|
2188
2251
|
t(key: string, params?: Record<string, string | number | boolean | null | undefined>): string;
|
|
2189
2252
|
getFieldLabel(field: FieldMetadata): string;
|
|
2253
|
+
onVisualBlockKeydown(columnIndex: number, item: FormLayoutItem, event: Event, edit: boolean): void;
|
|
2190
2254
|
selectVisualBlock(columnIndex: number, item: FormLayoutItem, event: Event): void;
|
|
2191
2255
|
openVisualBlockEditor(columnIndex: number, item: FormLayoutItem, event: Event): void;
|
|
2192
2256
|
moveVisualBlockItem(columnIndex: number, item: FormLayoutItem, direction: -1 | 1, event: Event): void;
|
|
@@ -2197,8 +2261,13 @@ declare class RowConfiguratorComponent implements OnChanges {
|
|
|
2197
2261
|
selectRow(): void;
|
|
2198
2262
|
openColumnConfig(index: number): void;
|
|
2199
2263
|
selectColumn(index: number, event: MouseEvent): void;
|
|
2200
|
-
selectField(fieldName: string, columnIndex: number, event:
|
|
2264
|
+
selectField(fieldName: string, columnIndex: number, event: Event): void;
|
|
2265
|
+
selectFieldFromKeyboard(fieldName: string, columnIndex: number, event: Event): void;
|
|
2201
2266
|
openFieldEditor(fieldName: string, columnIndex: number, event: Event): void;
|
|
2267
|
+
readonly columnPresets: {
|
|
2268
|
+
label: string;
|
|
2269
|
+
spans: number[];
|
|
2270
|
+
}[];
|
|
2202
2271
|
openRowMenu(): void;
|
|
2203
2272
|
onMenuClosed(): void;
|
|
2204
2273
|
onDropEnter(index: number): void;
|
|
@@ -2218,7 +2287,7 @@ declare class RowConfiguratorComponent implements OnChanges {
|
|
|
2218
2287
|
addFieldToColumn(index: number): void;
|
|
2219
2288
|
getColumnId(index: number): string;
|
|
2220
2289
|
private generateId;
|
|
2221
|
-
applyPreset(
|
|
2290
|
+
applyPreset(spans: number[]): void;
|
|
2222
2291
|
getColumnClass(column: any): string;
|
|
2223
2292
|
getSpanClasses(column: any): string[];
|
|
2224
2293
|
getColumnClassList(column: any): string;
|
|
@@ -2233,6 +2302,9 @@ declare class RowConfiguratorComponent implements OnChanges {
|
|
|
2233
2302
|
clearRowGap(): void;
|
|
2234
2303
|
hasMultipleColumns(): boolean;
|
|
2235
2304
|
getSpanTotal(bp?: Breakpoint): number;
|
|
2305
|
+
private participatesInRowGuidance;
|
|
2306
|
+
private getOccupiedRowUnits;
|
|
2307
|
+
getRowSpaceGuidance(): string | null;
|
|
2236
2308
|
getOffsetFor(column: any, bp?: Breakpoint): number;
|
|
2237
2309
|
setOffset(columnIndex: number, value: number): void;
|
|
2238
2310
|
adjustOffset(columnIndex: number, delta: number): void;
|
|
@@ -2243,6 +2315,8 @@ declare class RowConfiguratorComponent implements OnChanges {
|
|
|
2243
2315
|
|
|
2244
2316
|
declare class FieldConfiguratorComponent {
|
|
2245
2317
|
private readonly registry;
|
|
2318
|
+
private readonly i18n;
|
|
2319
|
+
get hiddenLabel(): string;
|
|
2246
2320
|
field: FieldMetadata;
|
|
2247
2321
|
private readonly categoryByType;
|
|
2248
2322
|
private resolveEditorialMeta;
|
|
@@ -2258,7 +2332,12 @@ declare class FieldConfiguratorComponent {
|
|
|
2258
2332
|
|
|
2259
2333
|
interface PraxisDynamicFormWidgetEditorInputs {
|
|
2260
2334
|
config?: FormConfig | null;
|
|
2335
|
+
layoutPolicy?: DynamicFormLayoutPolicy | null;
|
|
2336
|
+
configPersistenceStrategy?: 'local-first' | 'input-first';
|
|
2261
2337
|
mode?: DynamicFormMode;
|
|
2338
|
+
emptyState?: PraxisDynamicFormEmptyState | null;
|
|
2339
|
+
presentationModeGlobal?: boolean | null;
|
|
2340
|
+
presentation?: DynamicFormPresentationSnapshot | null;
|
|
2262
2341
|
formId?: string;
|
|
2263
2342
|
componentInstanceId?: string;
|
|
2264
2343
|
backConfig?: BackConfig;
|
|
@@ -2273,21 +2352,32 @@ interface PraxisDynamicFormWidgetEditorValue {
|
|
|
2273
2352
|
declare class PraxisDynamicFormWidgetConfigEditor implements SettingsValueProvider, AfterViewInit, OnDestroy {
|
|
2274
2353
|
inputs: PraxisDynamicFormWidgetEditorInputs | null;
|
|
2275
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>;
|
|
2276
2359
|
formEditor?: PraxisDynamicFormConfigEditor;
|
|
2277
2360
|
readonly isDirty$: BehaviorSubject<boolean>;
|
|
2278
2361
|
readonly isValid$: BehaviorSubject<boolean>;
|
|
2279
2362
|
readonly isBusy$: BehaviorSubject<boolean>;
|
|
2280
2363
|
private readonly subscription;
|
|
2364
|
+
private initialEditorConfig?;
|
|
2365
|
+
private sourceDraft?;
|
|
2366
|
+
get configurationSource(): 'local-first' | 'input-first';
|
|
2367
|
+
changeConfigurationSource(value: string): void;
|
|
2368
|
+
private updateDirtyState;
|
|
2369
|
+
private readonly cdr;
|
|
2281
2370
|
ngAfterViewInit(): void;
|
|
2282
2371
|
ngOnDestroy(): void;
|
|
2283
2372
|
getSettingsValue(): PraxisDynamicFormWidgetEditorValue;
|
|
2284
2373
|
onSave(): PraxisDynamicFormWidgetEditorValue;
|
|
2374
|
+
acceptAppliedValue(value: unknown): void;
|
|
2285
2375
|
reset(): void;
|
|
2286
2376
|
private initializeChildEditor;
|
|
2287
2377
|
private buildValue;
|
|
2288
2378
|
private createDocumentFromInputs;
|
|
2289
2379
|
static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDynamicFormWidgetConfigEditor, never>;
|
|
2290
|
-
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>;
|
|
2291
2381
|
}
|
|
2292
2382
|
|
|
2293
2383
|
/** Metadata for PraxisDynamicForm component */
|
|
@@ -2505,6 +2595,9 @@ declare class SectionEditorComponent implements OnInit, AfterViewInit, OnDestroy
|
|
|
2505
2595
|
value: string;
|
|
2506
2596
|
label: string;
|
|
2507
2597
|
}>;
|
|
2598
|
+
private readonly invalidSurfaceDrafts;
|
|
2599
|
+
get hasInvalidSurfaceDraft(): boolean;
|
|
2600
|
+
onSurfaceDraftValidity(source: SurfaceOpenActionEditorComponent, valid: boolean): void;
|
|
2508
2601
|
isDirty$: BehaviorSubject<boolean>;
|
|
2509
2602
|
isValid$: BehaviorSubject<boolean>;
|
|
2510
2603
|
isBusy$: BehaviorSubject<boolean>;
|
|
@@ -2625,10 +2718,27 @@ declare class RowEditorComponent implements OnInit, OnDestroy, SettingsValueProv
|
|
|
2625
2718
|
static ɵcmp: i0.ɵɵComponentDeclaration<RowEditorComponent, "praxis-row-editor", never, {}, {}, never, never, true, never>;
|
|
2626
2719
|
}
|
|
2627
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
|
+
|
|
2628
2737
|
declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueProvider {
|
|
2629
2738
|
private fb;
|
|
2630
2739
|
private data;
|
|
2631
2740
|
form: FormGroup;
|
|
2741
|
+
readonly gridParts: number[];
|
|
2632
2742
|
breakpoints: Breakpoint[];
|
|
2633
2743
|
previewBreakpoint: Breakpoint;
|
|
2634
2744
|
column: FormColumn;
|
|
@@ -2641,7 +2751,24 @@ declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueP
|
|
|
2641
2751
|
private readonly i18n;
|
|
2642
2752
|
constructor(fb: FormBuilder, data: {
|
|
2643
2753
|
column: FormColumn;
|
|
2754
|
+
fieldMetadata?: FieldMetadata[];
|
|
2644
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;
|
|
2645
2772
|
ngOnInit(): void;
|
|
2646
2773
|
ngOnDestroy(): void;
|
|
2647
2774
|
private applyChanges;
|
|
@@ -2656,6 +2783,8 @@ declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueP
|
|
|
2656
2783
|
adjustOffset(delta: number): void;
|
|
2657
2784
|
getOrder(bp: Breakpoint): number;
|
|
2658
2785
|
setOrder(value: number | string): void;
|
|
2786
|
+
layoutControl(property: ColumnLayoutNumber): FormControl;
|
|
2787
|
+
get invalidLayoutLocations(): string;
|
|
2659
2788
|
isHidden(bp: Breakpoint): boolean;
|
|
2660
2789
|
toggleHidden(): void;
|
|
2661
2790
|
copyToLarger(): void;
|