@praxisui/crud 9.0.0-beta.41 → 9.0.0-beta.42

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-06T18:00:15.329Z",
3
+ "generatedAt": "2026-07-07T12:05:35.013Z",
4
4
  "packageName": "@praxisui/crud",
5
- "packageVersion": "9.0.0-beta.41",
5
+ "packageVersion": "9.0.0-beta.42",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 2,
@@ -3096,6 +3096,17 @@
3096
3096
  "description": "Mapa de colunas por breakpoint xs/sm/md/lg/xl para detalhes read-only compactos em drawers, side sheets e desktop largo.",
3097
3097
  "safetyNotes": "Prefira valores simples como { lg: 3, md: 2, sm: 1 }; nao copie layout manual para sections."
3098
3098
  },
3099
+ {
3100
+ "path": "inputs.layoutPolicy.detailSummary.widthPrecedence",
3101
+ "category": "inputs",
3102
+ "valueKind": "enum",
3103
+ "allowedValues": [
3104
+ "schema",
3105
+ "summary"
3106
+ ],
3107
+ "description": "Define se larguras explicitas do schema ou a densidade do resumo controlam os spans no compactPresentation read-only.",
3108
+ "safetyNotes": "Default schema preserva x-ui.width; use summary apenas quando columns/responsiveColumns devem vencer larguras genericas do schema nessa surface."
3109
+ },
3099
3110
  {
3100
3111
  "path": "inputs.fieldIconPolicy",
3101
3112
  "category": "inputs",
@@ -3580,9 +3591,9 @@
3580
3591
  {
3581
3592
  "chunkIndex": 1,
3582
3593
  "chunkKind": "capabilities",
3583
- "content": "Component Capabilities:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).\n - Path: inputs.schemaUrl\n Category: inputs\n Kind: string\n Description: Schema canonico explicito publicado pelo backend para hosts que seguem surfaces/actions/capabilities.\n - Path: inputs.readUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de leitura publicado por surface VIEW/READ_PROJECTION para hidratar a entidade exibida.\n - Path: inputs.apiEndpointKey\n Category: inputs\n Kind: string\n Description: Endpoint canonico usado para resolver schemaUrl, readUrl e submitUrl relativos em hosts destacados.\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n - Path: inputs.submitMethod\n Category: inputs\n Kind: enum\n Description: Metodo HTTP canonico para o submit quando o backend publica operacao explicita.\n - Path: inputs.responseSchemaUrl\n Category: inputs\n Kind: string\n Description: Schema de resposta publicado pelo backend para inspeção diagnostica/read-only do host.\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n - Path: inputs.showAiAssistant\n Category: inputs\n Kind: boolean\n Description: Mostra os gatilhos do copiloto semantico Praxis para a instancia do formulario.\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n - Path: inputs.editorialContext\n Category: inputs\n Kind: object\n Description: Override de contexto editorial fornecido pelo host para os blocos hospedados antes/depois do formulario.\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n - Path: inputs.generatedLayoutPreset\n Category: inputs\n Kind: enum\n Description: Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.\n - Path: inputs.layoutPolicy\n Category: inputs\n Kind: object\n Description: Politica opt-in para materializar layout diretamente do schema atual sem depender de FormConfig.sections authoradas.\n - Path: inputs.layoutPolicy.source\n Category: inputs\n Kind: enum\n Description: Define se o layout vem de configuracao authorada ou do schema.\n - Path: inputs.layoutPolicy.preset\n Category: inputs\n Kind: enum\n Description: Preset de layout schema-driven. compactPresentation cobre detalhe read-only; groupedCommand cobre create/edit.\n - Path: inputs.layoutPolicy.intent\n Category: inputs\n Kind: enum\n Description: Intencao da surface: detalhe/apresentacao ou comando/editavel.\n - Path: inputs.layoutPolicy.lifecycle\n Category: inputs\n Kind: enum\n Description: Ciclo de materializacao do layout schema-driven.\n - Path: inputs.layoutPolicy.persistence\n Category: inputs\n Kind: enum\n Description: Define se sections geradas sao transient ou podem virar layout authorado apos detach explicito.\n - Path: inputs.layoutPolicy.detailSummary\n Category: inputs\n Kind: object\n Description: Politica declarativa para resumo read-only compacto em compactPresentation, sem FormConfig.sections locais.\n - Path: inputs.layoutPolicy.detailSummary.includeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.includeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.includeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.maxFields\n Category: inputs\n Kind: number\n Description: Limite maximo de campos materializados no primeiro painel compacto.\n - Path: inputs.layoutPolicy.detailSummary.fieldPriority\n Category: inputs\n Kind: object\n Description: Mapa campo -> prioridade para ordenar campos do resumo quando o schema publica candidatos suficientes.\n - Path: inputs.layoutPolicy.detailSummary.groupPriority\n Category: inputs\n Kind: object\n Description: Mapa grupo -> prioridade para ordenar grupos do resumo quando o schema publica agrupamento semantico.\n - Path: inputs.layoutPolicy.detailSummary.columns\n Category: inputs\n Kind: number\n Description: Quantidade base de colunas para distribuir campos de resumo schema-driven sem criar FormConfig.sections locais.\n - Path: inputs.layoutPolicy.detailSummary.responsiveColumns\n Category: inputs\n Kind: object\n Description: Mapa de colunas por breakpoint xs/sm/md/lg/xl para detalhes read-only compactos em drawers, side sheets e desktop largo.\n - Path: inputs.fieldIconPolicy\n Category: inputs\n Kind: enum\n Description: Controla se icones prefix/suffix dos metadados aparecem em todos os modos, apenas apresentacao, ou nunca.\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\nCapability Notes:\n - Este catalogo descreve inputs e outputs do componente.\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.\n",
3594
+ "content": "Component Capabilities:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).\n - Path: inputs.schemaUrl\n Category: inputs\n Kind: string\n Description: Schema canonico explicito publicado pelo backend para hosts que seguem surfaces/actions/capabilities.\n - Path: inputs.readUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de leitura publicado por surface VIEW/READ_PROJECTION para hidratar a entidade exibida.\n - Path: inputs.apiEndpointKey\n Category: inputs\n Kind: string\n Description: Endpoint canonico usado para resolver schemaUrl, readUrl e submitUrl relativos em hosts destacados.\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n - Path: inputs.submitMethod\n Category: inputs\n Kind: enum\n Description: Metodo HTTP canonico para o submit quando o backend publica operacao explicita.\n - Path: inputs.responseSchemaUrl\n Category: inputs\n Kind: string\n Description: Schema de resposta publicado pelo backend para inspeção diagnostica/read-only do host.\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n - Path: inputs.showAiAssistant\n Category: inputs\n Kind: boolean\n Description: Mostra os gatilhos do copiloto semantico Praxis para a instancia do formulario.\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n - Path: inputs.editorialContext\n Category: inputs\n Kind: object\n Description: Override de contexto editorial fornecido pelo host para os blocos hospedados antes/depois do formulario.\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n - Path: inputs.generatedLayoutPreset\n Category: inputs\n Kind: enum\n Description: Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.\n - Path: inputs.layoutPolicy\n Category: inputs\n Kind: object\n Description: Politica opt-in para materializar layout diretamente do schema atual sem depender de FormConfig.sections authoradas.\n - Path: inputs.layoutPolicy.source\n Category: inputs\n Kind: enum\n Description: Define se o layout vem de configuracao authorada ou do schema.\n - Path: inputs.layoutPolicy.preset\n Category: inputs\n Kind: enum\n Description: Preset de layout schema-driven. compactPresentation cobre detalhe read-only; groupedCommand cobre create/edit.\n - Path: inputs.layoutPolicy.intent\n Category: inputs\n Kind: enum\n Description: Intencao da surface: detalhe/apresentacao ou comando/editavel.\n - Path: inputs.layoutPolicy.lifecycle\n Category: inputs\n Kind: enum\n Description: Ciclo de materializacao do layout schema-driven.\n - Path: inputs.layoutPolicy.persistence\n Category: inputs\n Kind: enum\n Description: Define se sections geradas sao transient ou podem virar layout authorado apos detach explicito.\n - Path: inputs.layoutPolicy.detailSummary\n Category: inputs\n Kind: object\n Description: Politica declarativa para resumo read-only compacto em compactPresentation, sem FormConfig.sections locais.\n - Path: inputs.layoutPolicy.detailSummary.includeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.includeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.includeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem entrar no resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.excludeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem ficar fora do resumo read-only compacto.\n - Path: inputs.layoutPolicy.detailSummary.maxFields\n Category: inputs\n Kind: number\n Description: Limite maximo de campos materializados no primeiro painel compacto.\n - Path: inputs.layoutPolicy.detailSummary.fieldPriority\n Category: inputs\n Kind: object\n Description: Mapa campo -> prioridade para ordenar campos do resumo quando o schema publica candidatos suficientes.\n - Path: inputs.layoutPolicy.detailSummary.groupPriority\n Category: inputs\n Kind: object\n Description: Mapa grupo -> prioridade para ordenar grupos do resumo quando o schema publica agrupamento semantico.\n - Path: inputs.layoutPolicy.detailSummary.columns\n Category: inputs\n Kind: number\n Description: Quantidade base de colunas para distribuir campos de resumo schema-driven sem criar FormConfig.sections locais.\n - Path: inputs.layoutPolicy.detailSummary.responsiveColumns\n Category: inputs\n Kind: object\n Description: Mapa de colunas por breakpoint xs/sm/md/lg/xl para detalhes read-only compactos em drawers, side sheets e desktop largo.\n - Path: inputs.layoutPolicy.detailSummary.widthPrecedence\n Category: inputs\n Kind: enum\n Description: Define se larguras explicitas do schema ou a densidade do resumo controlam os spans no compactPresentation read-only.\n - Path: inputs.fieldIconPolicy\n Category: inputs\n Kind: enum\n Description: Controla se icones prefix/suffix dos metadados aparecem em todos os modos, apenas apresentacao, ou nunca.\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\nCapability Notes:\n - Este catalogo descreve inputs e outputs do componente.\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.\n",
3584
3595
  "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/dynamic-form-dialog-host.metadata.ts",
3585
- "contentHash": "c52662f0b14cddf4b6a46deb53614f17157bf86146923eee42ee4605fb69a943",
3596
+ "contentHash": "380a7bbecc3bfeb2df0eaa74f9e31d53f115029aafe03b9353d7cc09ce763460",
3586
3597
  "sourceKind": "component_definition",
3587
3598
  "sourceId": "praxis-dynamic-form-dialog-host",
3588
3599
  "corpusVersion": "1.0.0"
@@ -285,11 +285,30 @@ class CrudLauncherService {
285
285
  const formId = this.buildInferredFormId(action, metadata);
286
286
  return formId ? { ...action, formId } : action;
287
287
  }
288
+ resolveSubmitUrlTemplate(submitUrl, row, metadata) {
289
+ const template = String(submitUrl || '').trim();
290
+ if (!template || !template.includes('{')) {
291
+ return template;
292
+ }
293
+ const idField = String(metadata.resource?.idField ?? 'id');
294
+ const rowId = row?.[idField];
295
+ if (rowId == null) {
296
+ return template;
297
+ }
298
+ const encodedId = encodeURIComponent(String(rowId));
299
+ const idFieldPattern = new RegExp(`\\{${escapeRegExp(idField)}\\}`, 'g');
300
+ return template
301
+ .replace(idFieldPattern, encodedId)
302
+ .replace(/\{id\}/g, encodedId)
303
+ .replace(/\{resourceId\}/g, encodedId);
304
+ }
288
305
  resolveActionFormContract(action, row, metadata, runtime) {
289
306
  if (this.isExplicitCrudAction(action)) {
290
307
  return {
291
308
  schemaUrl: action.form?.schemaUrl ?? null,
292
- submitUrl: action.form?.submitUrl ?? null,
309
+ submitUrl: action.form?.submitUrl
310
+ ? this.resolveSubmitUrlTemplate(action.form.submitUrl, row, metadata)
311
+ : null,
293
312
  submitMethod: action.form?.submitMethod ?? null,
294
313
  apiEndpointKey: action.form?.apiEndpointKey ?? null,
295
314
  apiUrlEntry: action.form?.apiUrlEntry ?? null,
@@ -431,6 +450,9 @@ function mergeClassList(base, extra) {
431
450
  ...Object.keys(extra).filter((className) => !!extra[className]),
432
451
  ];
433
452
  }
453
+ function escapeRegExp(value) {
454
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
455
+ }
434
456
  function toCrudDrawerResult(value) {
435
457
  if (!value || typeof value !== 'object') {
436
458
  return undefined;
@@ -612,6 +634,7 @@ function normalizeCrudAction(action) {
612
634
  apiEndpointKey: trimString(action.form.apiEndpointKey) || undefined,
613
635
  apiUrlEntry: action.form.apiUrlEntry || undefined,
614
636
  initialValue: normalizeInitialValue(action.form.initialValue),
637
+ layoutPolicy: action.form.layoutPolicy ?? undefined,
615
638
  }
616
639
  : undefined,
617
640
  });
@@ -3575,6 +3598,7 @@ class PraxisCrudComponent {
3575
3598
  collectionCapabilitiesResolvedHref = null;
3576
3599
  collectionCapabilitiesRequestSeq = 0;
3577
3600
  currentAuthoringDocument;
3601
+ selectedRow = null;
3578
3602
  getResourceDiscovery() {
3579
3603
  const assigned = this.resourceDiscovery;
3580
3604
  return assigned ?? (this.resourceDiscoveryInstance ??= this.injector.get(ResourceDiscoveryService));
@@ -3601,11 +3625,27 @@ class PraxisCrudComponent {
3601
3625
  catch { }
3602
3626
  }
3603
3627
  onTableRowClick(event) {
3628
+ const row = this.extractRowFromEvent(event);
3629
+ if (row) {
3630
+ this.selectedRow = row;
3631
+ }
3604
3632
  this.rowClick.emit(event);
3605
3633
  }
3606
3634
  onTableSelectionChange(event) {
3635
+ this.selectedRow = this.extractSelectedRowFromEvent(event);
3607
3636
  this.selectionChange.emit(event);
3608
3637
  }
3638
+ async onBulkAction(event) {
3639
+ const action = String(event?.action || '').trim();
3640
+ if (!action) {
3641
+ return;
3642
+ }
3643
+ const row = this.extractSelectedRowFromBulkAction(event);
3644
+ if (row) {
3645
+ this.selectedRow = row;
3646
+ }
3647
+ await this.onAction(action, row ?? undefined, event);
3648
+ }
3609
3649
  ngOnChanges(changes) {
3610
3650
  if (!changes['metadata'] && !changes['context']) {
3611
3651
  return;
@@ -3643,6 +3683,7 @@ class PraxisCrudComponent {
3643
3683
  async onAction(action, row, runtimeEvent) {
3644
3684
  try {
3645
3685
  document.activeElement?.blur();
3686
+ const contextualRow = row ?? this.resolveSelectedRowForAction(action);
3646
3687
  let actionMeta = this.resolvedMetadata.actions?.find((candidate) => candidate.action === action);
3647
3688
  if (!actionMeta) {
3648
3689
  const ctxAction = this.tableCrudContext?.actions?.find((candidate) => candidate.action === action);
@@ -3660,16 +3701,16 @@ class PraxisCrudComponent {
3660
3701
  }
3661
3702
  const effectiveAction = (actionMeta || { action });
3662
3703
  if (!this.hasExplicitOpenBinding(effectiveAction)) {
3663
- const openedByDiscovery = await this.tryOpenDiscoveredCrudSurface(action, row, runtimeEvent);
3704
+ const openedByDiscovery = await this.tryOpenDiscoveredCrudSurface(action, contextualRow, runtimeEvent);
3664
3705
  if (openedByDiscovery) {
3665
3706
  return;
3666
3707
  }
3667
- const handledByWorkflowAction = await this.tryOpenDiscoveredWorkflowAction(action, row, runtimeEvent);
3708
+ const handledByWorkflowAction = await this.tryOpenDiscoveredWorkflowAction(action, contextualRow, runtimeEvent);
3668
3709
  if (handledByWorkflowAction) {
3669
3710
  return;
3670
3711
  }
3671
3712
  }
3672
- const handledByDelete = await this.tryHandleCanonicalDeleteAction(effectiveAction, row);
3713
+ const handledByDelete = await this.tryHandleCanonicalDeleteAction(effectiveAction, contextualRow);
3673
3714
  if (handledByDelete) {
3674
3715
  return;
3675
3716
  }
@@ -3680,7 +3721,7 @@ class PraxisCrudComponent {
3680
3721
  drawerCloseEmitted = true;
3681
3722
  this.afterClose.emit();
3682
3723
  };
3683
- const { mode, ref } = await this.launcher.launch(effectiveAction, row, this.resolvedMetadata, this.componentKeyId(), {
3724
+ const { mode, ref } = await this.launcher.launch(effectiveAction, contextualRow, this.resolvedMetadata, this.componentKeyId(), {
3684
3725
  onClose: () => emitDrawerClose(),
3685
3726
  onResult: (result) => {
3686
3727
  emitDrawerClose();
@@ -3701,7 +3742,7 @@ class PraxisCrudComponent {
3701
3742
  capabilities: effectiveAction.action === 'create'
3702
3743
  ? this.collectionCapabilities
3703
3744
  : this.collectionCapabilities,
3704
- links: this.resolveCrudRuntimeLinks(effectiveAction.action, row),
3745
+ links: this.resolveCrudRuntimeLinks(effectiveAction.action, contextualRow),
3705
3746
  });
3706
3747
  this.afterOpen.emit({ mode, action: effectiveAction.action });
3707
3748
  if (mode === 'drawer') {
@@ -3952,11 +3993,47 @@ class PraxisCrudComponent {
3952
3993
  }
3953
3994
  }
3954
3995
  resolveQueryContext(meta) {
3996
+ if (Array.isArray(meta?.data) && this.resolveResourcePath(meta).length === 0) {
3997
+ return null;
3998
+ }
3955
3999
  return this.isRecord(meta?.queryContext) ? meta.queryContext : null;
3956
4000
  }
3957
4001
  resolveFilterCriteria(meta) {
3958
4002
  return this.isRecord(meta?.filterCriteria) ? { ...meta.filterCriteria } : {};
3959
4003
  }
4004
+ extractRowFromEvent(event) {
4005
+ if (!this.isRecord(event)) {
4006
+ return null;
4007
+ }
4008
+ const row = event['row'];
4009
+ return this.isRecord(row) ? row : null;
4010
+ }
4011
+ extractSelectedRowFromEvent(event) {
4012
+ if (!this.isRecord(event)) {
4013
+ return null;
4014
+ }
4015
+ const selection = event['selection'];
4016
+ if (Array.isArray(selection)) {
4017
+ const first = selection[0];
4018
+ return this.isRecord(first) ? first : null;
4019
+ }
4020
+ const row = event['row'];
4021
+ if (this.isRecord(row)) {
4022
+ return row;
4023
+ }
4024
+ return null;
4025
+ }
4026
+ extractSelectedRowFromBulkAction(event) {
4027
+ const first = Array.isArray(event?.rows) ? event.rows[0] : null;
4028
+ return this.isRecord(first) ? first : null;
4029
+ }
4030
+ resolveSelectedRowForAction(action) {
4031
+ const normalized = String(action || '').trim().toLowerCase();
4032
+ if (!normalized || normalized === 'create' || normalized === 'add' || normalized === 'new') {
4033
+ return undefined;
4034
+ }
4035
+ return this.selectedRow ?? undefined;
4036
+ }
3960
4037
  async tryOpenDiscoveredCrudSurface(action, row, runtimeEvent) {
3961
4038
  const normalizedAction = String(action || '').trim().toLowerCase();
3962
4039
  if (!this.surfaceService) {
@@ -4693,6 +4770,7 @@ class PraxisCrudComponent {
4693
4770
  (selectionChange)="onTableSelectionChange($event)"
4694
4771
  (rowAction)="onAction($event.action, $event.row, $event)"
4695
4772
  (toolbarAction)="onAction($event.action)"
4773
+ (bulkAction)="onBulkAction($event)"
4696
4774
  (collectionLinksChange)="onCollectionLinksChange($event)"
4697
4775
  (reset)="onResetPreferences()"
4698
4776
  (metadataChange)="onTableMetadataChange()"
@@ -4730,6 +4808,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4730
4808
  (selectionChange)="onTableSelectionChange($event)"
4731
4809
  (rowAction)="onAction($event.action, $event.row, $event)"
4732
4810
  (toolbarAction)="onAction($event.action)"
4811
+ (bulkAction)="onBulkAction($event)"
4733
4812
  (collectionLinksChange)="onCollectionLinksChange($event)"
4734
4813
  (reset)="onResetPreferences()"
4735
4814
  (metadataChange)="onTableMetadataChange()"
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@praxisui/crud",
3
- "version": "9.0.0-beta.41",
3
+ "version": "9.0.0-beta.42",
4
4
  "description": "CRUD building blocks for Praxis UI: integrates dynamic forms and tables with unified configuration and services.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
- "@praxisui/dynamic-form": "^9.0.0-beta.41",
9
- "@praxisui/table": "^9.0.0-beta.41",
10
- "@praxisui/core": "^9.0.0-beta.41",
11
- "@praxisui/dynamic-fields": "^9.0.0-beta.41",
12
- "@praxisui/settings-panel": "^9.0.0-beta.41",
8
+ "@praxisui/dynamic-form": "^9.0.0-beta.42",
9
+ "@praxisui/table": "^9.0.0-beta.42",
10
+ "@praxisui/core": "^9.0.0-beta.42",
11
+ "@praxisui/dynamic-fields": "^9.0.0-beta.42",
12
+ "@praxisui/settings-panel": "^9.0.0-beta.42",
13
13
  "@angular/cdk": "^21.0.0",
14
14
  "@angular/forms": "^21.0.0",
15
15
  "@angular/material": "^21.0.0",
16
16
  "@angular/router": "^21.0.0",
17
- "@praxisui/ai": "^9.0.0-beta.41",
17
+ "@praxisui/ai": "^9.0.0-beta.42",
18
18
  "rxjs": "~7.8.0"
19
19
  },
20
20
  "dependencies": {
@@ -127,7 +127,9 @@ interface CrudValidationContext {
127
127
  }
128
128
 
129
129
  type CrudActionRuntimeEvent = {
130
+ action?: string;
130
131
  actionConfig?: ResourceActionCatalogItem | ResourceSurfaceCatalogItem | null;
132
+ rows?: Record<string, unknown>[];
131
133
  };
132
134
  type CrudContextAction = {
133
135
  action: string;
@@ -206,12 +208,14 @@ declare class PraxisCrudComponent implements OnChanges {
206
208
  private collectionCapabilitiesResolvedHref;
207
209
  private collectionCapabilitiesRequestSeq;
208
210
  private currentAuthoringDocument?;
211
+ selectedRow: Record<string, unknown> | null;
209
212
  private getResourceDiscovery;
210
213
  private getActionOpenAdapter;
211
214
  private getSurfaceOpenAdapter;
212
215
  onResetPreferences(): void;
213
216
  onTableRowClick(event: unknown): void;
214
217
  onTableSelectionChange(event: unknown): void;
218
+ onBulkAction(event: CrudActionRuntimeEvent): Promise<void>;
215
219
  ngOnChanges(changes: SimpleChanges): void;
216
220
  onAction(action: string, row?: Record<string, unknown>, runtimeEvent?: CrudActionRuntimeEvent): Promise<void>;
217
221
  private hasExplicitOpenBinding;
@@ -237,6 +241,10 @@ declare class PraxisCrudComponent implements OnChanges {
237
241
  private syncRuntimeBindings;
238
242
  private resolveQueryContext;
239
243
  private resolveFilterCriteria;
244
+ private extractRowFromEvent;
245
+ private extractSelectedRowFromEvent;
246
+ private extractSelectedRowFromBulkAction;
247
+ private resolveSelectedRowForAction;
240
248
  private tryOpenDiscoveredCrudSurface;
241
249
  private resolveDiscoveredSurfaceCatalog;
242
250
  private tryOpenDiscoveredWorkflowAction;
@@ -309,6 +317,7 @@ declare class CrudLauncherService {
309
317
  private buildRoute;
310
318
  private mapInputs;
311
319
  private resolveActionForLaunch;
320
+ private resolveSubmitUrlTemplate;
312
321
  private resolveActionFormContract;
313
322
  resolveRuntimeContract(action: CrudAction, row: Record<string, unknown> | undefined, metadata: CrudMetadata, runtime?: {
314
323
  capabilities?: ResourceCapabilitySnapshot | null;