@praxisui/table 8.0.0-beta.99 → 9.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import { firstValueFrom } from 'rxjs';
2
- import { BaseAiAdapter, createComponentAuthoringContext } from '@praxisui/ai';
2
+ import { BaseAiAdapter, sanitizePraxisAssistantText, createComponentAuthoringContext } from '@praxisui/ai';
3
3
  import { PRAXIS_GLOBAL_ACTION_CATALOG, deepMerge } from '@praxisui/core';
4
- import { G as TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS, k as PRAXIS_TABLE_AUTHORING_MANIFEST, T as TABLE_AI_CAPABILITIES, W as coerceTableComponentEditPlans, Y as compileTableComponentEditPlans, I as TASK_PRESETS, a1 as getTableComponentEditPlanCapabilities, y as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, w as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, z as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, H as TABLE_COMPONENT_EDIT_PLAN_VERSION, x as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, E as TABLE_COMPONENT_EDIT_PLAN_KIND } from './praxisui-table-praxisui-table-rz7xSDwL.mjs';
4
+ import { G as TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS, k as PRAXIS_TABLE_AUTHORING_MANIFEST, T as TABLE_AI_CAPABILITIES, W as coerceTableComponentEditPlans, Y as compileTableComponentEditPlans, I as TASK_PRESETS, a1 as getTableComponentEditPlanCapabilities, y as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, w as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, z as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, H as TABLE_COMPONENT_EDIT_PLAN_VERSION, x as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, E as TABLE_COMPONENT_EDIT_PLAN_KIND } from './praxisui-table-praxisui-table-CunEk0vb.mjs';
5
5
 
6
6
  const TABLE_COMPONENT_CONTEXT_PACK = {
7
7
  version: 'v1',
@@ -1991,6 +1991,46 @@ class TableAiAdapter extends BaseAiAdapter {
1991
1991
  isLoading: false // TODO: expose real loading flag
1992
1992
  };
1993
1993
  }
1994
+ getFieldValueSamples(field, maxValues = 12) {
1995
+ const normalizedField = typeof field === 'string' ? field.trim() : '';
1996
+ if (!normalizedField || this.isSensitiveFieldForAiAssistantSamples(normalizedField))
1997
+ return [];
1998
+ const column = (this.getCurrentConfig().columns || [])
1999
+ .find((candidate) => candidate?.field === normalizedField);
2000
+ if (!column)
2001
+ return [];
2002
+ const values = new Set();
2003
+ const rows = Array.isArray(this.table.dataSource?.data) ? this.table.dataSource.data : [];
2004
+ for (const row of rows) {
2005
+ if (!row || typeof row !== 'object')
2006
+ continue;
2007
+ const displayValue = this.table.getCellValue(row, column);
2008
+ const text = this.safeAiAssistantValueText(displayValue);
2009
+ if (text)
2010
+ values.add(text);
2011
+ if (values.size >= maxValues)
2012
+ break;
2013
+ }
2014
+ return [...values];
2015
+ }
2016
+ safeAiAssistantValueText(value) {
2017
+ if (value === null || value === undefined)
2018
+ return '';
2019
+ if (value instanceof Date)
2020
+ return sanitizePraxisAssistantText(value.toISOString(), 120);
2021
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
2022
+ return sanitizePraxisAssistantText(value, 120);
2023
+ }
2024
+ try {
2025
+ return sanitizePraxisAssistantText(JSON.stringify(value), 120);
2026
+ }
2027
+ catch {
2028
+ return sanitizePraxisAssistantText(String(value), 120);
2029
+ }
2030
+ }
2031
+ isSensitiveFieldForAiAssistantSamples(field) {
2032
+ return /(?:password|senha|token|secret|api[_-]?key|authorization|bearer|blob|bytes|base64|file|payload)/i.test(field);
2033
+ }
1994
2034
  getAuthoringContext() {
1995
2035
  const filterFieldCatalog = this.buildFilterFieldCatalog();
1996
2036
  const selectedRowsContext = this.getSelectedRowsAuthoringContext();
@@ -1 +1 @@
1
- export { A as AnalyticsTableConfigAdapterService, a as AnalyticsTableContractService, b as AnalyticsTableStatsApiService, B as BOOLEAN_PRESETS, c as BehaviorConfigEditorComponent, C as CURRENCY_PRESETS, d as ColumnsConfigEditorComponent, D as DATE_PRESETS, e as DataFormatterComponent, f as DataFormattingService, F as FORMULA_TEMPLATES, g as FilterConfigService, h as FilterSettingsComponent, i as FormulaGeneratorService, J as JsonConfigEditorComponent, M as MessagesLocalizationEditorComponent, N as NUMBER_PRESETS, P as PERCENTAGE_PRESETS, j as PRAXIS_FILTER_COMPONENT_METADATA, k as PRAXIS_TABLE_AUTHORING_MANIFEST, l as PRAXIS_TABLE_COMPONENT_METADATA, m as PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, n as PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, o as PraxisFilter, p as PraxisFilterWidgetConfigEditor, q as PraxisTable, r as PraxisTableConfigEditor, s as PraxisTableInlineAuthoringEditorComponent, t as PraxisTableToolbar, u as PraxisTableWidgetConfigEditor, S as STRING_PRESETS, T as TABLE_AI_CAPABILITIES, v as TABLE_COMPONENT_AI_CAPABILITIES, w as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, x as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, y as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, z as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, E as TABLE_COMPONENT_EDIT_PLAN_KIND, H as TABLE_COMPONENT_EDIT_PLAN_VERSION, I as TASK_PRESETS, K as TableDefaultsProvider, L as TableRulesEditorComponent, O as ToolbarActionsEditorComponent, V as ValueMappingEditorComponent, Q as VisualFormulaBuilderComponent, R as buildTableApplyPlan, U as coerceTableComponentEditPlan, W as coerceTableComponentEditPlans, X as compileTableComponentEditPlan, Y as compileTableComponentEditPlans, Z as createTableAuthoringDocument, _ as getActionId, $ as getEnum, a0 as getTableCapabilities, a1 as getTableComponentEditPlanCapabilities, a2 as isTableRendererSupportedByRichContentP0, a3 as mapTableRendererToRichContentP0, a4 as normalizeTableAuthoringDocument, a5 as parseLegacyOrTableDocument, a6 as providePraxisFilterMetadata, a7 as providePraxisTableMetadata, a8 as providePraxisTableToolbarAppearance, a9 as serializeTableAuthoringDocument, aa as toCanonicalTableConfig, ab as validateTableAuthoringDocument } from './praxisui-table-praxisui-table-rz7xSDwL.mjs';
1
+ export { A as AnalyticsTableConfigAdapterService, a as AnalyticsTableContractService, b as AnalyticsTableStatsApiService, B as BOOLEAN_PRESETS, c as BehaviorConfigEditorComponent, C as CURRENCY_PRESETS, d as ColumnsConfigEditorComponent, D as DATE_PRESETS, e as DataFormatterComponent, f as DataFormattingService, F as FORMULA_TEMPLATES, g as FilterConfigService, h as FilterSettingsComponent, i as FormulaGeneratorService, J as JsonConfigEditorComponent, M as MessagesLocalizationEditorComponent, N as NUMBER_PRESETS, P as PERCENTAGE_PRESETS, j as PRAXIS_FILTER_COMPONENT_METADATA, k as PRAXIS_TABLE_AUTHORING_MANIFEST, l as PRAXIS_TABLE_COMPONENT_METADATA, m as PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, n as PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, o as PraxisFilter, p as PraxisFilterWidgetConfigEditor, q as PraxisTable, r as PraxisTableConfigEditor, s as PraxisTableInlineAuthoringEditorComponent, t as PraxisTableToolbar, u as PraxisTableWidgetConfigEditor, S as STRING_PRESETS, T as TABLE_AI_CAPABILITIES, v as TABLE_COMPONENT_AI_CAPABILITIES, w as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, x as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, y as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, z as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, E as TABLE_COMPONENT_EDIT_PLAN_KIND, H as TABLE_COMPONENT_EDIT_PLAN_VERSION, I as TASK_PRESETS, K as TableDefaultsProvider, L as TableRulesEditorComponent, O as ToolbarActionsEditorComponent, V as ValueMappingEditorComponent, Q as VisualFormulaBuilderComponent, R as buildTableApplyPlan, U as coerceTableComponentEditPlan, W as coerceTableComponentEditPlans, X as compileTableComponentEditPlan, Y as compileTableComponentEditPlans, Z as createTableAuthoringDocument, _ as getActionId, $ as getEnum, a0 as getTableCapabilities, a1 as getTableComponentEditPlanCapabilities, a2 as isTableRendererSupportedByRichContentP0, a3 as mapTableRendererToRichContentP0, a4 as normalizeTableAuthoringDocument, a5 as parseLegacyOrTableDocument, a6 as providePraxisFilterMetadata, a7 as providePraxisTableMetadata, a8 as providePraxisTableToolbarAppearance, a9 as serializeTableAuthoringDocument, aa as toCanonicalTableConfig, ab as validateTableAuthoringDocument } from './praxisui-table-praxisui-table-CunEk0vb.mjs';
package/package.json CHANGED
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "name": "@praxisui/table",
3
- "version": "8.0.0-beta.99",
3
+ "version": "9.0.0-beta.0",
4
4
  "description": "Advanced data table for Angular (Praxis UI) with editing, filtering, sorting, virtualization, and settings panel integration.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
- "@praxisui/ai": "^8.0.0-beta.99",
9
- "@praxisui/core": "^8.0.0-beta.99",
10
- "@praxisui/dynamic-fields": "^8.0.0-beta.99",
11
- "@praxisui/dynamic-form": "^8.0.0-beta.99",
12
- "@praxisui/metadata-editor": "^8.0.0-beta.99",
13
- "@praxisui/rich-content": "^8.0.0-beta.99",
14
- "@praxisui/settings-panel": "^8.0.0-beta.99",
15
- "@praxisui/table-rule-builder": "^8.0.0-beta.99",
8
+ "@praxisui/ai": "^9.0.0-beta.0",
9
+ "@praxisui/core": "^9.0.0-beta.0",
10
+ "@praxisui/dynamic-fields": "^9.0.0-beta.0",
11
+ "@praxisui/dynamic-form": "^9.0.0-beta.0",
12
+ "@praxisui/metadata-editor": "^9.0.0-beta.0",
13
+ "@praxisui/rich-content": "^9.0.0-beta.0",
14
+ "@praxisui/settings-panel": "^9.0.0-beta.0",
15
+ "@praxisui/table-rule-builder": "^9.0.0-beta.0",
16
16
  "@angular/cdk": "^21.0.0",
17
17
  "@angular/forms": "^21.0.0",
18
18
  "@angular/material": "^21.0.0",
19
19
  "@angular/router": "^21.0.0",
20
- "@praxisui/dialog": "^8.0.0-beta.99",
20
+ "@praxisui/dialog": "^9.0.0-beta.0",
21
21
  "rxjs": "~7.8.0"
22
22
  },
23
23
  "dependencies": {
@@ -92,6 +92,16 @@ Este documento e a referencia canonica da API JSON de praxis-table.
92
92
  - Para exportar apenas a selecao, combine `behavior.selection.enabled`, `config.export.general.scope: "selected"` e uma bulk action visivel apenas quando `selectedCount > 0`.
93
93
  - Quando `config.export.general.scope` e `"selected"`, a exportacao sem linhas selecionadas e bloqueada com feedback de usuario em vez de gerar um arquivo vazio.
94
94
 
95
+ ## Columns visibility dropdown
96
+
97
+ - `config.toolbar.columnsVisibility.enabled` controla a exibição do botão de visibilidade de colunas na barra de ferramentas.
98
+ - Por padrão, o botão de visibilidade rápida de colunas estará habilitado caso a toolbar esteja visível.
99
+ - **Guardrail de UX**: O último controle ativo no dropdown de colunas é automaticamente desabilitado quando apenas 1 coluna permanece visível, para impedir que o usuário oculte todas as colunas de dados da tabela.
100
+ - A desativação rápida de colunas reflete instantaneamente no layout visual (`displayedColumns`) e emite o evento `configChange`.
101
+
102
+ > [!WARNING]
103
+ > **Segurança Corporativa em Cenários Corporativos**: A visibilidade de colunas via dropdown da toolbar é um recurso estritamente visual (layout de apresentação do lado do cliente). A ocultação de colunas **não** protege o dado sensível da transmissão de rede nem de inspeção técnica. Se determinados campos (ex: salários, senhas ou tokens) forem confidenciais para o nível de permissão do usuário atual, a restrição de dados deve ser realizada obrigatoriamente no lado do servidor (através da filtragem de propriedades nas APIs de CRUD e consulta), e nunca por meio de ocultação puramente visual na tabela.
104
+
95
105
  ## Rich content convergence
96
106
 
97
107
  - `mapTableRendererToRichContentP0(...)` e a ponte publica e restrita entre a taxonomia atual de cell renderers do `praxis-table` e o vocabulario compartilhado `1.0` de rich content em `@praxisui/core`.
@@ -331,7 +341,7 @@ Este arquivo foi adaptado para o padrao canonico atual sem remover conteudo tecn
331
341
  - O bloco `toolbar` continua parte do contrato público principal.
332
342
  - Use `toolbar.actions[]` para quick actions e `toolbar.search` para busca quando o host não injeta shell própria.
333
343
  - Use `toolbar.appearance` para personalizar o chrome da toolbar por contrato governado. O runtime materializa `variant`, `density`, `shape`, `divider` e `tokens` como classes e CSS custom properties públicas; o host pode trocar aparência sem redefinir intenção, capability ou roteamento.
334
- - Tokens públicos suportados em `toolbar.appearance.tokens`: `bg`, `fg`, `borderColor`, `borderWidth`, `radius`, `shadow`, `paddingBlock`, `paddingInline`, `minHeight`, `gap`, `actionsGap`, `dividerColor`, `actionSize`, `actionRadius`, `actionBg`, `actionFg`, `actionHoverBg`, `actionActiveBg`, `actionFocusRing`, `aiAccentColor` e `statusFg`.
344
+ - Tokens públicos suportados em `toolbar.appearance.tokens`: `bg`, `fg`, `borderColor`, `borderWidth`, `radius`, `shadow`, `paddingBlock`, `paddingInline`, `minHeight`, `gap`, `actionsGap`, `dividerColor`, `actionSize`, `actionRadius`, `actionBg`, `actionFg`, `actionHoverBg`, `actionActiveBg`, `actionFocusRing`, `aiAccentColor`, `statusFg`, `titleFg`, `subtitleFg`, `iconFg`, `titleFontSize`, `subtitleFontSize`, `titleFontWeight`, `identityGap`, `identityFilterGap`, `identityMinHeight`, `identityMarginBottom`, `identityIconSize` e `identityIconRadius`.
335
345
  - Para localizar paths específicos de toolbar, complemente a leitura com o `Appendix: JSON path index`.
336
346
 
337
347
  ### Messages contract
@@ -349,6 +359,7 @@ Este arquivo foi adaptado para o padrao canonico atual sem remover conteudo tecn
349
359
  | `data` | `any[] \| null` | No | component-input | `dataSource.data = data` | Ativa caminho de dados locais. |
350
360
  | `tableId` | `string` | Yes | component-input | trim + component key builder | Necessário para persistência/configuração por instância. |
351
361
  | `componentInstanceId` | `string \| undefined` | No | component-input | component key scoping | Isola preferências por instância em mesma rota. |
362
+ | `configPersistenceStrategy` | `'local-first' \| 'input-first' \| 'volatile'` | No | component-input | default `local-first` | Controla a hidratação de preferências persistidas. `volatile` renderiza apenas por inputs/runtime e não consulta nem grava `ASYNC_CONFIG_STORAGE`, útil para surfaces executivas efêmeras abertas por `surface.open`. |
352
363
  | `title` | `string` | No | component-input | host-surface passthrough | Título opcional consumido por superfícies auxiliares, quick connect e contextos host. |
353
364
  | `subtitle` | `string` | No | component-input | host-surface passthrough | Subtítulo opcional para contexto operacional do host. |
354
365
  | `icon` | `string` | No | component-input | host-surface passthrough | Ícone opcional usado em affordances auxiliares do runtime. |
@@ -424,7 +435,7 @@ degraded filter.
424
435
 
425
436
  | Channel | Direction | Contract | Failure mode | Notes |
426
437
  | --- | --- | --- | --- | --- |
427
- | `ASYNC_CONFIG_STORAGE` | bidirectional | `loadConfig/saveConfig/clearConfig` | fail-open | Persistência de config e inputs por `tableId`/instância. |
438
+ | `ASYNC_CONFIG_STORAGE` | bidirectional | `loadConfig/saveConfig/clearConfig` | fail-open | Persistência de config e inputs por `tableId`/instância; não é acessado quando `configPersistenceStrategy='volatile'`. |
428
439
  | `CONNECTION_STORAGE` | bidirectional | `loadConnection/saveConnection` | fail-open | Persistência de `resourcePath` para quick-connect. |
429
440
  | `SettingsPanelService` | bidirectional | `open(...).applied$/saved$` | fail-open | Canal de edição em runtime (quick connect/editor). |
430
441
  | `Global resolver: PAX_EXPANSION_DETAIL_RESOURCE_RESOLVER` | outbound call | function contract | fail-closed | Resolução externa de detail schema por `resource`. |
@@ -549,81 +560,79 @@ Referencia canonica da API JSON do `praxis-table`.
549
560
  - **Deprecated**
550
561
 
551
562
  ### Overview
552
- `praxis-table` nao e apenas um grid ou uma tabela convencional. Ele funciona
553
- como um motor de renderizacao dinamico orientado a contrato (`TableConfig`).
554
- Em vez de criar um template para cada tela de listagem, voce entrega a planta
555
- (JSON) e o runtime monta a obra em tempo de execucao.
556
-
557
- Em arquiteturas tradicionais, cada variacao de colunas, acoes e filtros costuma
558
- virar nova camada de HTML + estado + condicionais. Aqui, a estrategia e inverter
559
- o custo: a mudanca fica na configuracao. Quando o requisito muda, o contrato muda
560
- e a interface se adapta sem reescrever o componente.
561
-
562
- Em linguagem simples: o JSON e a planta; a tabela e a obra. Troque a planta e o
563
- resultado muda sem retrabalho de template.
563
+ `praxis-table` é uma superfície operacional para dados corporativos. Com uma
564
+ declaração pequena, a aplicação consegue exibir dados reais, paginação, colunas,
565
+ filtros, ações, mensagens e regras visuais sem reconstruir a tela a cada novo
566
+ cenário. A primeira renderização pode nascer do recurso publicado pelo backend;
567
+ os refinamentos podem vir da aplicação, do editor visual ou das preferências
568
+ persistidas.
569
+
570
+ Em arquiteturas tradicionais, cada variação de colunas, ações e filtros costuma
571
+ virar uma nova camada de HTML, estado e condicionais. Aqui, a estratégia é
572
+ inverter esse custo: a mudança entra em uma configuração governada. Quando o
573
+ requisito muda, a experiência evolui sem transformar cada ajuste em uma nova
574
+ implementação de tabela.
564
575
 
565
576
  Conceitos-chave:
566
577
 
567
- - UI declarativa / schema-driven: um contrato JSON define estrutura, dados e UX.
568
- - Self-describing APIs: backend pode publicar OpenAPI + `x-ui` para derivar UI.
569
- - Separacao de dados e apresentacao: `columns` descreve dado; `appearance` e
570
- `behavior` definem como apresentar/interagir.
571
- - Motor de regras condicional: JSON Logic como contrato canonico para estilos, visibilidade e renderizacao sem
572
- ifs espalhados no template.
573
- - Pipeline de dados: fluxo remoto/local com estrategias de pagina, ordenacao e filtro.
574
-
575
- #### Porque este componente e diferente
576
- `praxis-table` nao e apenas um grid. E um runtime configuravel que interpreta um
577
- contrato JSON extenso e coordena varias superficies ao mesmo tempo. Em tabelas
578
- convencionais, cada mudanca de coluna, filtro, acao ou visual pede codigo e
579
- template; aqui, essas mudancas entram no JSON e o runtime responde na hora:
580
-
581
- - Configuracao declarativa profunda (TableConfig) que governa UI, dados e regras.
582
- - Dois modos de dados (remoto/local) com pipelines diferentes e impactos no UX.
583
- - Editor e runtime convivendo (settings panel, reconciliacao e marcadores).
584
- - JSON Logic para regras de estilos, renderizacao e comportamento condicional.
585
- - Persistencia e identidade atraves de `tableId` + `componentInstanceId`.
586
-
587
- O resultado e um componente "plataforma": cada bloco do contrato vira um modulo
588
- do runtime, e as interacoes entre esses modulos tornam o comportamento realmente
589
- disruptivo.
590
-
591
- #### Pitch de 30 segundos (valor)
592
- Uma tabela que vira plataforma. `praxis-table` transforma configuracao em
593
- experiencia: colunas, acoes, filtros, mensagens e regras vivem no mesmo contrato
594
- JSON, pronto para dados remotos ou locais, sem retrabalho de template.
595
-
596
- - **Entrega rapida**: ajuste comportamento e visual por JSON.
597
- - **Padrao de UX**: regras, acoes e mensagens consistentes entre telas.
598
- - **Escalavel**: JSON Logic e actions permitem crescer a complexidade sem fork do runtime.
599
-
600
- #### O fim do boilerplate
601
- Uma tabela que vira plataforma. Em vez de programar features de grade do zero,
602
- voce ativa capacidades nativas via contrato:
603
-
604
- - **Zero-code iteration**: adicionar botoes, trocar densidade, ajustar colunas,
605
- filtros e dialogs apenas alterando JSON.
606
- - **Logica desacoplada (rules engine)**: destaque de linha, visibilidade de acao
607
- e variacao de renderer ficam em expressoes condicionais canonicas, nao em `*ngIf` espalhado.
608
- - **Ecossistema embutido**: paginacao remota, virtual scroll, reorder de colunas,
609
- exportacao e `praxis-filter` avancado como capacidades prontas.
610
- - **Eventos estruturados**: `rowAction`, `bulkAction`, `toolbarAction`, `exportAction`,
611
- `columnReorder` e eventos de delete padronizam a integracao com o host.
612
- - **Governanca de estado**: `tableId` + `componentInstanceId` organizam
613
- persistencia, reconciliacao e isolamento de instancia.
614
-
615
- #### Receitas de impacto para o overview (live-first)
616
- Para o overview no estilo Angular Material (`demo vivo + view code` na mesma
617
- card), a melhor estrategia e mostrar poucos cenarios com alta densidade de
618
- valor. Sugestao de ordem para a primeira dobra:
578
+ - Uma declaração publicada define estrutura, dados e experiência.
579
+ - O backend pode descrever o recurso para que a tabela derive a primeira leitura.
580
+ - Dados, apresentação e interação ficam separados, mas evoluem no mesmo contrato.
581
+ - Regras condicionais governam estilos, visibilidade e renderização sem espalhar decisões pelo template.
582
+ - Fluxos remotos ou locais preservam paginação, ordenação e filtros de forma previsível.
583
+
584
+ #### Por que este componente é diferente
585
+ O valor da Table aparece quando a tela deixa de ser um template isolado e passa
586
+ a ser uma superfície governada por contrato. Em tabelas convencionais, cada
587
+ mudança de coluna, filtro, ação ou visual pede código e template; aqui, essas
588
+ mudanças entram em uma configuração declarativa e o componente responde de forma consistente:
589
+
590
+ - A configuração da tabela governa visual, dados e regras sem espalhar decisões pelo template.
591
+ - Dados remotos e dados locais têm estratégias próprias, com impacto claro na experiência.
592
+ - O editor visual convive com a tabela renderizada para permitir autoria governada.
593
+ - Regras condicionais cobrem destaque visual, renderização e comportamento sem duplicar tela.
594
+ - Identidade estável permite persistir preferências e reconciliar instâncias com segurança.
595
+
596
+ O resultado é um componente "plataforma": cada bloco do contrato vira um módulo
597
+ do componente, e as interações entre esses módulos permitem evoluir experiências
598
+ corporativas sem transformar cada nova regra em uma nova implementação de tela.
599
+
600
+ #### Valor em uma leitura rápida
601
+ Uma tabela que vira plataforma. `praxis-table` transforma decisões declarativas
602
+ em experiência: colunas, ações, filtros, mensagens e regras vivem no mesmo
603
+ contrato operacional, pronto para dados remotos ou locais, sem retrabalho de
604
+ template.
605
+
606
+ - **Entrega rápida**: ajuste comportamento e visual por configuração governada.
607
+ - **Padrão de UX**: regras, ações e mensagens consistentes entre telas.
608
+ - **Escalável**: regras e comandos estruturados permitem crescer a complexidade sem criar forks de tela.
609
+
610
+ #### Menos código de tela, mais contrato
611
+ Uma tabela que vira plataforma. Em vez de programar cada capacidade de tabela
612
+ do zero, você ativa recursos nativos via contrato:
613
+
614
+ - **Iteração sem código de tela**: adicionar botões, trocar densidade, ajustar
615
+ colunas, filtros e diálogos por configuração governada.
616
+ - **Lógica desacoplada**: destaque de linha, visibilidade de ação
617
+ e variação visual ficam em regras condicionais, não em `*ngIf` espalhado.
618
+ - **Ecossistema embutido**: paginação remota, virtual scroll, reorder de colunas,
619
+ exportação e `praxis-filter` avançado como capacidades prontas.
620
+ - **Eventos estruturados**: ações de linha, lote, toolbar, exportação e reordenação
621
+ entregam intenções claras para a aplicação.
622
+ - **Governança de estado**: identidade estável organiza persistência,
623
+ reconciliação e isolamento de instância.
624
+
625
+ #### Receitas de impacto
626
+ As receitas abaixo mostram capacidades que normalmente exigiriam código de tela,
627
+ mas que a Table materializa a partir do contrato. Elas funcionam como portas de
628
+ entrada para o leitor entender o valor antes de mergulhar na matriz completa da
629
+ API.
619
630
 
620
631
  1. **Dashboard financeiro**: prova `computed` + densidade + regra visual.
621
632
  2. **Micro-layout compose (CRM)**: prova poder de layout sem componente custom.
622
- 3. **Backoffice seguro**: prova bulk com travas de negocio e confirmacao.
633
+ 3. **Backoffice seguro**: prova bulk com travas de negócio e confirmação.
623
634
  4. **Rastreador de SLA**: prova de regra temporal em JSON Logic + alerta visual declarativo.
624
635
 
625
- Snippets curtos (prontos para cards de overview):
626
-
627
636
  **Receita 1 - Dashboard Financeiro**
628
637
  ```json
629
638
  {
@@ -669,7 +678,7 @@ Snippets curtos (prontos para cards de overview):
669
678
  }
670
679
  ```
671
680
 
672
- **Receita 3 - Backoffice Seguro (acoes em lote)**
681
+ **Receita 3 - Backoffice Seguro (ações em lote)**
673
682
  ```json
674
683
  {
675
684
  "actions": {
@@ -710,10 +719,10 @@ Snippets curtos (prontos para cards de overview):
710
719
 
711
720
  ### Internal route global action
712
721
 
713
- Configuracoes novas devem persistir a integracao em `effects[].globalAction`. O runtime e os validadores tambem
722
+ Configurações novas devem persistir a integração em `effects[].globalAction`. O runtime e os validadores também
714
723
  leem `globalAction` plano para documentos existentes, mas editores e AI manifest devem tratar esse campo como
715
724
  compatibilidade. O adapter da Table preserva `payload`/`payloadExpr` ao reabrir e re-selecionar a mesma `actionId`,
716
- e limpa payloads ao trocar de global action para evitar semantica cruzada.
725
+ e limpa payloads ao trocar de global action para evitar semântica cruzada.
717
726
 
718
727
  ```json
719
728
  {
@@ -769,106 +778,104 @@ e limpa payloads ao trocar de global action para evitar semantica cruzada.
769
778
  { "!==": [{ "var": "status" }, "RESOLVIDO"] }
770
779
  ]
771
780
  },
772
- "tooltip": { "text": "SLA violado: acao imediata necessaria", "position": "top" },
781
+ "tooltip": { "text": "SLA violado: ação imediata necessária", "position": "top" },
773
782
  "animation": { "preset": "warning-attention", "repeat": 3 }
774
783
  }
775
784
  ]
776
785
  }
777
786
  ```
778
787
 
779
- Para manter o overview leve, publique somente essas 4 receitas na landing da
780
- doc. Os demais casos (filtros avancados, logs massivos, overrides CRUD, etc.)
781
- ficam na aba de exemplos completos.
788
+ Essas quatro receitas cobrem o primeiro impacto. Cenários mais longos, como
789
+ filtros avançados, logs massivos e overrides CRUD, pertencem à trilha de exemplos
790
+ completos para não diluir a tese principal do runtime.
782
791
 
783
792
  #### Dominando a cauda longa das interfaces
784
- Em sistemas corporativos e aplicacoes complexas, o esforco de engenharia
785
- raramente esta nos fluxos principais. O custo aparece na cauda longa dos
786
- requisitos de UI: variacoes de regras condicionais, formatacoes especificas,
787
- tooltips baseados em estado e permissoes de acao que mudam por linha ou usuario.
793
+ Em sistemas corporativos e aplicações complexas, o esforço de engenharia
794
+ raramente está nos fluxos principais. O custo aparece na cauda longa dos
795
+ requisitos de UI: variações de regras condicionais, formatações específicas,
796
+ mensagens baseadas em estado e permissões de ação que mudam por linha, perfil
797
+ ou contexto operacional.
788
798
 
789
799
  `praxis-table` foi desenhado para reduzir drasticamente esse custo de
790
- manutencao. Em vez de espalhar condicionais `*ngIf` no codigo, o componente
791
- move o poder de decisao para uma API de regras em JSON Logic e renderizadores
792
- condicionais/compostos. Quem define o contrato ganha controle fino da
793
- experiencia, com mais autonomia para produto e menos acoplamento no frontend.
800
+ manutenção. Em vez de espalhar condicionais pelo código da tela, o componente
801
+ move essas decisões para uma configuração governada. Quem define a experiência
802
+ ganha controle fino sobre leitura visual, ações, filtros e mensagens, com mais
803
+ autonomia para produto e menos acoplamento no frontend.
794
804
 
795
- Impacto pratico:
805
+ Impacto prático:
796
806
 
797
- - Menos ramificacao de codigo no front.
798
- - Mais autonomia para evoluir UX por configuracao.
799
- - Menor risco de regressao ao escalar regras condicionais.
807
+ - Menos ramificação de código no frontend.
808
+ - Mais autonomia para evoluir UX por configuração.
809
+ - Menor risco de regressão ao escalar regras condicionais.
800
810
 
801
- #### Mapa de contrato e superficies
802
- O contrato governa 6 superficies principais:
811
+ #### Mapa de contrato e superfícies
812
+ O contrato governa 6 áreas principais:
803
813
 
804
- | Superficie | O que governa no JSON/API | Impacto no runtime |
814
+ | Área | O que governa | Impacto na experiência |
805
815
  | --- | --- | --- |
806
- | Declarativa (UI e UX) | `columns`, `appearance`, `behavior`, `messages`, `localization` | Define estrutura visual, densidade, textos, ordenacao e comportamento base da tabela. |
807
- | Dados e operacao | `resourcePath`, `data[]`, `behavior.pagination.*`, `behavior.filtering.*`, `behavior.localDataMode.*` | Resolve modo (`remote/local/empty`), estrategia de pagina/filtro/sort e pipeline de dados. |
808
- | Regras condicionais | `rules`, `conditionalStyles`, `rowConditionalStyles`, `conditionalRenderers` | Avalia JSON Logic por linha/celula para estilo, visibilidade e renderer dinamico. |
809
- | Acoes e jornada | `actions`, `toolbar`, `dialogs`, `export` | Materializa acoes de linha/lote/toolbar e fluxos de confirmacao/export. |
810
- | Integracao externa | `tableId`, `componentInstanceId`, overrides CRUD, marcadores de painel | Conecta persistencia, reconciliacao e extensoes de host sem quebrar o contrato base. |
811
- | Eventos de saida | `rowAction`, `bulkAction`, `toolbarAction`, `exportAction`, `columnReorder`, `schemaStatusChange` | Entrega intencoes do usuario como eventos padronizados para o app hospedeiro reagir. |
816
+ | Estrutura e leitura | Colunas, aparência, comportamento, mensagens e localização | Define densidade, textos, ordenação e comportamento base da tabela. |
817
+ | Dados e operação | Recurso remoto, dados locais, paginação, filtros e ordenação | Decide como a tabela busca, pagina, filtra e apresenta os registros. |
818
+ | Regras condicionais | Regras de destaque, visibilidade e variação visual | Transforma estado operacional em sinais visuais consistentes. |
819
+ | Ações e jornada | Toolbar, ações de linha, ações em lote, diálogos e exportação | Materializa comandos e confirmações sem duplicar fluxo em cada tela. |
820
+ | Integração externa | Identidade da instância, preferências e reconciliação | Preserva persistência e isolamento entre telas, usuários e contextos. |
821
+ | Eventos de saída | Intenções estruturadas do usuário | Entrega comandos claros para a aplicação executar navegação, auditoria e regra de negócio. |
812
822
 
813
- A API detalha cada superficie e explicita onde o runtime realmente consome
814
- (Active/Partial/Declared-only/Schema-only).
823
+ A API detalha cada área e explicita onde o comportamento está ativo, parcial,
824
+ declarado ou dependente de schema.
815
825
 
816
826
  #### Arquitetura orientada a contrato (como funciona)
817
- O componente separa estritamente dados, apresentacao e interacao, operando em
818
- dois eixos principais: motor interno da tabela e integracoes externas.
827
+ O componente separa estritamente dados, apresentação e interação, operando em
828
+ dois eixos principais: motor interno da tabela e integrações externas.
819
829
 
820
- Fluxo simplificado de execucao:
830
+ Fluxo simplificado de execução:
821
831
 
822
- 1. **Interpretacao do contrato**: le `TableConfig` e resolve o modo de operacao
823
- (`remote` via API, `local` via array, ou `empty`).
824
- 2. **Montagem da superficie**: renderiza colunas, toolbar, filtros e
825
- comportamentos visuais definidos em `appearance` e `behavior`.
832
+ 1. **Interpretação da configuração**: resolve se a tabela usará dados remotos,
833
+ dados locais ou estado vazio.
834
+ 2. **Montagem da superfície**: renderiza colunas, toolbar, filtros e
835
+ comportamentos visuais definidos pela configuração.
826
836
  3. **Pipeline de dados + motor de regras**:
827
- - remoto: integra `crudService` + estrategia de pagina/sort/filtro;
828
- - local: aplica `computeLocalViewPipeline()` + filtros avancados;
829
- - regras: executa JSON Logic para estilos condicionais, visibilidade de acoes e
830
- renderizadores dinamicos por linha.
831
- 4. **Ciclo de eventos**: emite acoes estruturadas (`rowAction`, `bulkAction`,
832
- `toolbarAction`, etc.) para que a aplicacao hospedeira reaja as intencoes do usuario.
837
+ - remoto: consulta a operação publicada pelo backend;
838
+ - local: aplica paginação, ordenação e filtros no conjunto recebido;
839
+ - regras: avalia destaque visual, visibilidade de ações e variações por linha.
840
+ 4. **Ciclo de eventos**: emite ações estruturadas para que a aplicação reaja às
841
+ intenções do usuário.
833
842
 
834
- #### Integracao com ecossistema Praxis (frontend e backend)
835
- `praxis-table` compoe o ecossistema Praxis de ponta a ponta. O mapa de
836
- integracao cobre frontend, contratos e backend.
843
+ #### Integração com ecossistema Praxis (frontend e backend)
844
+ `praxis-table` compõe o ecossistema Praxis de ponta a ponta. O mapa de
845
+ integração cobre frontend, contratos e backend.
837
846
 
838
847
  Frontend (UI):
839
848
 
840
- | Componente | Papel na experiencia | Como se conecta |
849
+ | Componente | Papel na experiência | Como se conecta |
841
850
  | --- | --- | --- |
842
- | `praxis-table-toolbar` | Barra superior/inferior com acoes, bulk e export | `toolbar`, `actions`, `export`, `behavior.filtering.*` |
843
- | `praxis-filter` | Filtro avancado acoplado a toolbar | `behavior.filtering.advancedFilters.*`, `behavior.filtering.debounceTime`, `resourcePath` |
844
- | `praxis-empty-state-card` | Estado inicial quando nao ha conexao remota | exibido quando nao ha `resourcePath` valido |
845
- | `PraxisAiAssistantShellComponent` | Copiloto semântico opcional nos slots de toolbar | habilitado pelo runtime com turn orchestration e contexto seguro; ao minimizar, a sessao fica no registry com `presence: "origin-anchor"` e o affordance volta ao gatilho da tabela (nao exposto no JSON) |
846
- | Angular Material + CDK | Base de tabela, menus, selecao e virtual scroll | `behavior.pagination.*`, `behavior.selection.*`, `behavior.virtualization.*`, `appearance.spacing.*` |
851
+ | `praxis-table-toolbar` | Barra superior/inferior com ações, bulk e export | `toolbar`, `actions`, `export`, `behavior.filtering.*` |
852
+ | `praxis-filter` | Filtro avançado acoplado à toolbar | `behavior.filtering.advancedFilters.*`, `behavior.filtering.debounceTime`, `resourcePath` |
853
+ | `praxis-empty-state-card` | Estado inicial quando não conexão remota | exibido quando não `resourcePath` válido |
854
+ | `PraxisAiAssistantShellComponent` | Copiloto semântico opcional nos slots de toolbar | habilitado pelo runtime com turn orchestration e contexto seguro; ao minimizar, a sessão fica no registry com `presence: "origin-anchor"` e o affordance volta ao gatilho da tabela (não exposto no JSON) |
855
+ | Angular Material + CDK | Base de tabela, menus, seleção e virtual scroll | `behavior.pagination.*`, `behavior.selection.*`, `behavior.virtualization.*`, `appearance.spacing.*` |
847
856
 
848
857
  Backend e contratos:
849
858
 
850
- | Componente | Papel na experiencia | Como se conecta |
859
+ | Componente | Papel na experiência | Como se conecta |
851
860
  | --- | --- | --- |
852
- | `praxis-metadata-starter` | Publica OpenAPI + `x-ui` e o endpoint `GET /schemas/filtered` | A tabela deriva colunas, filtros e validacoes a partir do contrato |
861
+ | `praxis-metadata-starter` | Publica OpenAPI + `x-ui` e o endpoint `GET /schemas/filtered` | A tabela deriva colunas, filtros e validações a partir do contrato |
853
862
  | `praxis-api-quickstart` | Exemplo pronto com recursos, filtros e CRUD padronizados | Demonstra o fluxo completo com `resourcePath` apontando para a API |
854
863
 
855
- No modo de edicao (quando `enableCustomization` esta ativo), a tabela exibe o painel
856
- de configuracao para ajustar colunas, behavior, appearance e regras sem editar
857
- codigo. Esse painel usa editores internos (`praxis-table-config-editor`,
858
- `behavior-config-editor`, `columns-config-editor`, `toolbar-actions-editor`,
859
- `messages-localization-editor`, etc.) para compor o JSON com consistencia e evitar
860
- divergencia entre UI e contrato.
864
+ No modo de edição, quando a aplicação habilita customização, a tabela exibe o
865
+ editor visual para ajustar colunas, comportamento, aparência e regras sem editar
866
+ código de tela. Esse editor compõe a configuração com consistência e evita
867
+ divergência entre o que o usuário authora e o que a tabela renderiza.
861
868
 
862
- #### Checklist de integracao (pre-flight)
863
- Antes de plugar a tabela em um host, valide estes pontos:
869
+ #### Checklist de integração (pre-flight)
870
+ Antes de plugar a tabela em uma aplicação, valide estes pontos:
864
871
 
865
- - `tableId` esta definido e estavel (persiste e evita colisao de storage).
866
- - Modo de dados decidido: `resourcePath` (remoto) ou `data[]` + flag local.
867
- - `columns[]` descreve o dataset real e define renderers coerentes.
868
- - Acoes e toolbar estao alinhadas com o roteamento `bulkAction` vs `toolbarAction`.
869
- - Regras condicionais: JSON Logic é o contrato canônico.
870
- - UX e mensagens: configure `appearance`, `messages` e `localization` para evitar
871
- inconsistencias entre defaults e o comportamento esperado.
872
+ - A instância tem identidade estável para persistir preferências sem colisão.
873
+ - O modo de dados está decidido: recurso remoto ou conjunto local informado pela aplicação.
874
+ - As colunas descrevem o conjunto de dados real e usam apresentação coerente.
875
+ - Ações de linha, lote e toolbar estão alinhadas com os comandos da aplicação.
876
+ - Regras condicionais têm fonte clara e não ficam espalhadas pelo template.
877
+ - Aparência, mensagens e localização foram revisadas para evitar inconsistências
878
+ entre padrões globais e comportamento esperado.
872
879
 
873
880
  ### Top-level contract
874
881
 
@@ -1160,7 +1167,24 @@ A superficie usa `horizontalScroll` com classes:
1160
1167
  | `columns[]` | `TableColumnConfig[]` | Yes | `[]` | Active | Definicao de colunas, renderers e regras de exibicao. |
1161
1168
  | `behavior` | `TableBehaviorConfig` | No | defaults do runtime | Partial | Inclui paginacao, filtro, selecao e expansao por blocos. |
1162
1169
  | `toolbar.actions[]` | `ToolbarActionConfig[]` | No | `[]` | Partial | Acoes de toolbar com roteamento para `toolbarAction` e `bulkAction`. |
1170
+ | `toolbar.title` | `string` | No | `undefined` | Active | Titulo renderizado na regiao de identidade da toolbar principal, antes de filtros e acoes. |
1171
+ | `toolbar.subtitle` | `string` | No | `undefined` | Active | Texto auxiliar renderizado abaixo do titulo quando houver espaco. |
1172
+ | `toolbar.icon` | `string` | No | `undefined` | Active | Icone semantico renderizado junto ao titulo da toolbar via `PraxisIconDirective`. |
1173
+ | `toolbar.textAlign` | `'start' \| 'center' \| 'end'` | No | `'start'` | Active | Alinhamento textual do bloco de identidade da toolbar. |
1163
1174
  | `toolbar.appearance` | `TableToolbarAppearanceConfig` | No | fallback M3 | Active | Chrome visual governado da toolbar; tokens viram `--p-table-toolbar-*` no runtime. |
1175
+ | `toolbar.appearance.tokens.titleFg` | `string` | No | fallback M3 | Active | Cor do titulo na identidade da toolbar; use tokens semanticos do host para suportar tema claro/escuro. |
1176
+ | `toolbar.appearance.tokens.subtitleFg` | `string` | No | fallback M3 | Active | Cor do subtitulo na identidade da toolbar. |
1177
+ | `toolbar.appearance.tokens.iconFg` | `string` | No | fallback M3 | Active | Cor do icone da identidade; o fundo tonal e derivado dessa cor para manter contraste suave. |
1178
+ | `toolbar.appearance.tokens.titleFontSize` | `string` | No | `14px` | Active | Tamanho tipografico do titulo da identidade. |
1179
+ | `toolbar.appearance.tokens.subtitleFontSize` | `string` | No | `11.5px` | Active | Tamanho tipografico do subtitulo da identidade. |
1180
+ | `toolbar.appearance.tokens.titleFontWeight` | `string` | No | `700` | Active | Peso tipografico do titulo da identidade. |
1181
+ | `toolbar.appearance.tokens.identityGap` | `string` | No | `8px` | Active | Espaco entre icone e copy da identidade da toolbar. |
1182
+ | `toolbar.appearance.tokens.identityFilterGap` | `string` | No | `8px` | Active | Respiro vertical entre identidade e filtros/controles quando a identidade ocupa linha propria. |
1183
+ | `toolbar.appearance.tokens.identityMinHeight` | `string` | No | `30px` | Active | Altura minima do bloco de identidade da toolbar. |
1184
+ | `toolbar.appearance.tokens.identityMarginBottom` | `string` | No | `2px` | Active | Espacamento inferior complementar da identidade da toolbar. |
1185
+ | `toolbar.appearance.tokens.identityIconSize` | `string` | No | `28px` | Active | Tamanho do container do icone da identidade. |
1186
+ | `toolbar.appearance.tokens.identityIconRadius` | `string` | No | `8px` | Active | Raio do container do icone da identidade. |
1187
+ | `toolbar.columnsVisibility` | `object` | No | habilitado se a toolbar estiver ativa | Active | Controle rápido de visibilidade de colunas no toolbar (dropdown). |
1164
1188
  | `messages` | `TableMessagesConfig` | No | defaults internos | Partial | Overrides de i18n e mensagens operacionais. |
1165
1189
  | `data` | `TableDataConfig` | No | modo local/remoto autodetectado | Partial | Integra origem local ou remota conforme `resourcePath`/inputs. |
1166
1190