
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
@praxisui/dynamic-form
Advanced tools
Angular dynamic form engine for Praxis UI: metadata-driven forms, hooks, and services integrating @praxisui/* packages.
Standalone dynamic form component with schema-driven UI, native field cascades, settings integration, and a built-in configuration editor.
Para ver esta biblioteca em funcionamento em uma aplicação completa, utilize o projeto de exemplo (Quickstart):
@praxisui/* em um app Angular, incluindo instalação, configuração e uso em telas reais.npm i @praxisui/dynamic-form
Peer dependencies (Angular v20):
@angular/core ^20.0.0@angular/common ^20.0.0@angular/cdk ^20.0.0@praxisui/core ^0.0.1@praxisui/specification-core ^0.0.1@praxisui/specification ^0.0.1@praxisui/visual-builder ^0.0.1@praxisui/settings-panel ^0.0.1@praxisui/cron-builder ^0.0.1import { Component } from '@angular/core';
import { PraxisDynamicForm } from '@praxisui/dynamic-form';
import type { FormConfig } from '@praxisui/core';
@Component({
selector: 'app-form-demo',
standalone: true,
imports: [PraxisDynamicForm],
template: `
<praxis-dynamic-form
[config]="config"
[mode]="'create'"
[editModeEnabled]="true"
(formSubmit)="onSubmit($event)"
></praxis-dynamic-form>
`,
})
export class FormDemoComponent {
config: FormConfig = {
sections: [
{
id: 'main',
label: 'Employee',
rows: [
{
columns: [
{ fields: [{ name: 'fullName', label: 'Full Name', controlType: 'text' }] },
{ fields: [{ name: 'email', label: 'E-mail', controlType: 'email' }] },
],
},
],
},
],
} as any;
onSubmit(evt: any) {
console.log('Submitted:', evt);
}
}
Tip: connect to a backend resource by setting resourcePath/resourceId. The component can fetch schemas and reconcile local layout with server metadata when editModeEnabled is true.
Use the standalone editor directly to edit and reconcile the form configuration.
import { Component } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { PraxisDynamicFormConfigEditor } from '@praxisui/dynamic-form';
import type { FormConfig } from '@praxisui/core';
@Component({
selector: 'app-form-editor-launcher',
standalone: true,
template: `<button (click)="openEditor()">Open Config Editor</button>`,
})
export class FormEditorLauncherComponent {
constructor(private dialog: MatDialog) {}
openEditor() {
const initial: FormConfig = { sections: [] } as any;
this.dialog.open(PraxisDynamicFormConfigEditor, {
width: '1024px',
data: { formConfig: initial, formId: 'employees-form', mode: 'edit' },
});
}
}
Alternatively, when editModeEnabled is true, praxis-dynamic-form renders a gear button that opens the editor internally.
PraxisDynamicForm, PraxisDynamicFormConfigEditor, JsonConfigEditorComponent, LayoutEditorComponentFormConfigService, FormLayoutService, DynamicFormLayoutService, FormContextServiceprovidePraxisDynamicFormMetadataSee public exports: projects/praxis-dynamic-form/src/public-api.ts.
Quando o componente não recebe uma FormConfig prévia (primeira execução), ele gera um layout padrão a partir do metadata do backend:
base = floor(12 / fieldsPerRow).mat-form-field { width: 100% } dentro do praxis-dynamic-form, garantindo que o campo ocupe toda a coluna.FormConfig no storage do host.FormConfig completa via [config].A barra de ações (onde ficam "ENVIAR", "Cancelar", etc.) é configurável via config.actions e pelo Editor (aba "Ações").
Defaults
ENVIAR.afterSections (renderiza abaixo da última seção).right.horizontal.normal.containerStyles ou containerClassName se desejar uma superfície própria.Estrutura (parcial)
interface FormActionsLayout {
submit: FormActionButton; // id, label, color, type, variant, shortcut, etc.
cancel: FormActionButton;
reset: FormActionButton;
custom?: FormActionButton[]; // botões extras
// Layout/posicionamento
placement?: 'afterSections' | 'insideLastSection' | 'top';
position?: 'left' | 'center' | 'right' | 'justified' | 'split';
orientation?: 'horizontal' | 'vertical';
spacing?: 'compact' | 'normal' | 'spacious';
sticky?: boolean; // fixa a barra (bottom)
// Estilização do container
containerClassName?: string; // adiciona classe ao container
containerStyles?: { [k: string]: any }; // estilos inline (camelCase)
// Mobile
mobile?: { position?: 'left'|'center'|'right'|'justified'; orientation?: 'horizontal'|'vertical'; collapseToMenu?: boolean };
}
Exemplo (config)
config.actions = {
submit: { visible: true, label: 'ENVIAR', type: 'submit', color: 'primary', variant: 'raised', shortcut: 'ctrl+s' },
cancel: { visible: true, label: 'Cancelar', type: 'button', color: 'basic' },
reset: { visible: false, label: 'Reset' },
placement: 'afterSections',
position: 'right',
orientation: 'horizontal',
spacing: 'normal',
sticky: false,
containerClassName: 'my-form-actions',
containerStyles: {
background: 'var(--md-sys-color-surface-container)',
border: '1px solid var(--md-sys-color-outline-variant)',
borderRadius: '12px',
padding: '12px 16px'
},
mobile: { collapseToMenu: true }
};
CSS por classe (opcional)
.my-form-actions {
background: var(--md-sys-color-surface-container);
border: 1px solid var(--md-sys-color-outline-variant);
border-radius: 12px;
padding: 12px 16px;
}
Dicas
color = primary|accent|warn|basic (respeitam o tema Material).--mat-sys-* / --md-sys-* para cores/superfícies.collapseToMenu para colapsar botões extras em menu nas telas pequenas.O título de seção usa por padrão margin: 0 0 6px 0. Você pode ajustar globalmente via CSS var:
/* Global (app host) */
:root { --pfx-section-title-mb: 10px; } // ex.: 10px abaixo do título
Ou por seção, via metadado titleGapBottom (em pixels), que aplica inline somente naquela seção.
@praxisui/dynamic-form 0.0.x → Angular 20.xESM2022Apache-2.0 – see the LICENSE packaged with this library or the repository root.
Connections (dot‑path)
inputs.config.* do widget do formulário, inclusive metadados de campos (ex.: inputs.config.fieldMetadata[i].filterCriteria).Cascata nativa (campo→campo, intra‑form)
dependencyFields, resetOnDependentChange, etc.).FormControl.valueChanges dos campos dependentes, aplica filterCriteria e recarrega conforme estratégia (loadOn, dependencyLoadOnChange).filterCriteria de um campo, considere desativar a cascata nativa nesse campo (enableDependencyCascade: false) ou usar dependencyLoadOnChange: 'manual' (cascata só atualiza filtros e Connections disparam o load).dependencyMergeStrategy: 'merge' para preservar chaves vindas de Connections.docs/schemas/fluxo-schema.mddocs/CASCADE-NATIVA.mddocs/DEVS-GENERIC-CRUD-SERVICE.mdeditModeEnabled=true):
notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both'snoozeMs: number = 86400000autoOpenSettingsOnOutdated: boolean = falseschemaStatusChange: { outdated: boolean; serverHash?: string; lastVerifiedAt?: string; formId?: string }form-schema-meta:{formId} → { serverHash?: string; lastVerifiedAt?: string }form-schema-prefs:{formId} → { notifyIfOutdated?, snoozeMs?, autoOpenSettingsOnOutdated? }schemaIgnore:{formId}:{hash}, schemaSnooze:{formId}:{hash}, schemaNotified:{formId}:{hash}config.sections.length > 0), o componente faz uma verificação leve via /schemas/filtered com If-None-Match.lastVerifiedAt e emite schemaStatusChange(outdated=false).serverHash/lastVerifiedAt, define schemaOutdated = editModeEnabled && hadBase, emite schemaStatusChange. Não aplica schema automaticamente.form-schema-meta:{formId}.API_URL.default.baseUrl for relativo (ex.: '/api'), a lib resolve a origem a partir de location.origin no browser. Isso cobre o cenário comum com proxy de dev (/api, /schemas).location.origin), configure baseUrl absoluto (ex.: https://api.acme.com/api) para evitar erros do tipo “Invalid URL” ao construir chamadas de /schemas/filtered.GenericCrudService.getSchemasFilteredBaseUrl() retorna sempre uma URL absoluta; o SchemaMetadataClient também aceita baseUrl relativo quando há origin disponível.FAQs
Angular dynamic form engine for Praxis UI: metadata-driven forms, hooks, and services integrating @praxisui/* packages.
We found that @praxisui/dynamic-form demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.