@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-
|
|
3
|
+
"generatedAt": "2026-07-07T12:05:35.013Z",
|
|
4
4
|
"packageName": "@praxisui/crud",
|
|
5
|
-
"packageVersion": "9.0.0-beta.
|
|
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": "
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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.
|
|
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.
|
|
9
|
-
"@praxisui/table": "^9.0.0-beta.
|
|
10
|
-
"@praxisui/core": "^9.0.0-beta.
|
|
11
|
-
"@praxisui/dynamic-fields": "^9.0.0-beta.
|
|
12
|
-
"@praxisui/settings-panel": "^9.0.0-beta.
|
|
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.
|
|
17
|
+
"@praxisui/ai": "^9.0.0-beta.42",
|
|
18
18
|
"rxjs": "~7.8.0"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
package/types/praxisui-crud.d.ts
CHANGED
|
@@ -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;
|