@praxisui/table 8.0.0-beta.99 → 9.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/docs/dynamic-filter-host-integration-guide.md +7 -0
- package/fesm2022/{praxisui-table-praxisui-table-rz7xSDwL.mjs → praxisui-table-praxisui-table-CunEk0vb.mjs} +2502 -488
- package/fesm2022/{praxisui-table-table-agentic-authoring-turn-flow-CwklX13T.mjs → praxisui-table-table-agentic-authoring-turn-flow-DL9l0XF7.mjs} +1616 -195
- package/fesm2022/{praxisui-table-table-ai.adapter-C96CotWq.mjs → praxisui-table-table-ai.adapter-BvaMq2CS.mjs} +42 -2
- package/fesm2022/praxisui-table.mjs +1 -1
- package/package.json +10 -10
- package/src/lib/praxis-table.json-api.md +162 -138
- package/types/praxisui-table.d.ts +131 -21
|
@@ -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-
|
|
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-
|
|
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": "
|
|
3
|
+
"version": "9.0.0-beta.1",
|
|
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": "^
|
|
9
|
-
"@praxisui/core": "^
|
|
10
|
-
"@praxisui/dynamic-fields": "^
|
|
11
|
-
"@praxisui/dynamic-form": "^
|
|
12
|
-
"@praxisui/metadata-editor": "^
|
|
13
|
-
"@praxisui/rich-content": "^
|
|
14
|
-
"@praxisui/settings-panel": "^
|
|
15
|
-
"@praxisui/table-rule-builder": "^
|
|
8
|
+
"@praxisui/ai": "^9.0.0-beta.1",
|
|
9
|
+
"@praxisui/core": "^9.0.0-beta.1",
|
|
10
|
+
"@praxisui/dynamic-fields": "^9.0.0-beta.1",
|
|
11
|
+
"@praxisui/dynamic-form": "^9.0.0-beta.1",
|
|
12
|
+
"@praxisui/metadata-editor": "^9.0.0-beta.1",
|
|
13
|
+
"@praxisui/rich-content": "^9.0.0-beta.1",
|
|
14
|
+
"@praxisui/settings-panel": "^9.0.0-beta.1",
|
|
15
|
+
"@praxisui/table-rule-builder": "^9.0.0-beta.1",
|
|
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": "^
|
|
20
|
+
"@praxisui/dialog": "^9.0.0-beta.1",
|
|
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 `
|
|
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`
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
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
|
-
-
|
|
568
|
-
-
|
|
569
|
-
-
|
|
570
|
-
|
|
571
|
-
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
-
|
|
582
|
-
-
|
|
583
|
-
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
- **
|
|
597
|
-
- **
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
780
|
-
|
|
781
|
-
|
|
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
|
|
785
|
-
raramente
|
|
786
|
-
requisitos de UI:
|
|
787
|
-
|
|
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
|
-
|
|
791
|
-
move
|
|
792
|
-
|
|
793
|
-
|
|
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
|
|
805
|
+
Impacto prático:
|
|
796
806
|
|
|
797
|
-
- Menos
|
|
798
|
-
- Mais autonomia para evoluir UX por
|
|
799
|
-
- Menor risco de
|
|
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
|
|
802
|
-
O contrato governa 6
|
|
811
|
+
#### Mapa de contrato e superfícies
|
|
812
|
+
O contrato governa 6 áreas principais:
|
|
803
813
|
|
|
804
|
-
|
|
|
814
|
+
| Área | O que governa | Impacto na experiência |
|
|
805
815
|
| --- | --- | --- |
|
|
806
|
-
|
|
|
807
|
-
| Dados e
|
|
808
|
-
| Regras condicionais |
|
|
809
|
-
|
|
|
810
|
-
|
|
|
811
|
-
| Eventos de
|
|
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
|
|
814
|
-
|
|
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,
|
|
818
|
-
dois eixos principais: motor interno da tabela e
|
|
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
|
|
830
|
+
Fluxo simplificado de execução:
|
|
821
831
|
|
|
822
|
-
1. **
|
|
823
|
-
|
|
824
|
-
2. **Montagem da
|
|
825
|
-
comportamentos visuais definidos
|
|
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:
|
|
828
|
-
- local: aplica
|
|
829
|
-
- regras:
|
|
830
|
-
|
|
831
|
-
|
|
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
|
-
####
|
|
835
|
-
`praxis-table`
|
|
836
|
-
|
|
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
|
|
849
|
+
| Componente | Papel na experiência | Como se conecta |
|
|
841
850
|
| --- | --- | --- |
|
|
842
|
-
| `praxis-table-toolbar` | Barra superior/inferior com
|
|
843
|
-
| `praxis-filter` | Filtro
|
|
844
|
-
| `praxis-empty-state-card` | Estado inicial quando
|
|
845
|
-
| `PraxisAiAssistantShellComponent` | Copiloto semântico opcional nos slots de toolbar | habilitado pelo runtime com turn orchestration e contexto seguro; ao minimizar, a
|
|
846
|
-
| Angular Material + CDK | Base de tabela, menus,
|
|
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 há conexão remota | exibido quando não há `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
|
|
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
|
|
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
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
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
|
|
863
|
-
Antes de plugar a tabela em
|
|
869
|
+
#### Checklist de integração (pre-flight)
|
|
870
|
+
Antes de plugar a tabela em uma aplicação, valide estes pontos:
|
|
864
871
|
|
|
865
|
-
-
|
|
866
|
-
-
|
|
867
|
-
-
|
|
868
|
-
-
|
|
869
|
-
- Regras condicionais
|
|
870
|
-
-
|
|
871
|
-
|
|
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
|
|