@praxisui/table 1.0.0-beta.48 → 1.0.0-beta.52

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 CHANGED
@@ -1,3 +1,53 @@
1
+ ---
2
+ title: "Table"
3
+ slug: "table-overview"
4
+ description: "Visao geral do @praxisui/table com TableConfig unificada, filtros, renderers, performance e integracao enterprise."
5
+ doc_type: "reference"
6
+ document_kind: "component-overview"
7
+ component: "table"
8
+ category: "components"
9
+ audience:
10
+ - "frontend"
11
+ - "host"
12
+ - "architect"
13
+ level: "intermediate"
14
+ status: "active"
15
+ owner: "praxis-ui"
16
+ tags:
17
+ - "table"
18
+ - "tableconfig"
19
+ - "filters"
20
+ - "renderers"
21
+ - "enterprise"
22
+ order: 25
23
+ icon: "table_chart"
24
+ toc: true
25
+ sidebar: true
26
+ search_boost: 1.0
27
+ reading_time: 14
28
+ estimated_setup_time: 25
29
+ version: "1.0"
30
+ related_docs:
31
+ - "dynamic-filter-architecture-overview"
32
+ - "dynamic-filter-host-integration-guide"
33
+ - "dynamic-filter-payload-contract"
34
+ - "dynamic-filter-range-filters-guide"
35
+ - "dynamic-filter-editor-settings-guide"
36
+ - "dynamic-filter-inline-catalog"
37
+ - "dynamic-filter-troubleshooting-guide"
38
+ - "dynamic-filter-backend-contract-cheatsheet"
39
+ - "adr-dynamic-filter-cross-lib-coupling-2026-03"
40
+ - "host-integration-guide"
41
+ - "consumer-integration-quickstart"
42
+ keywords:
43
+ - "TableConfig"
44
+ - "filters"
45
+ - "renderers"
46
+ - "performance"
47
+ - "dynamic filter"
48
+ last_updated: "2026-03-07"
49
+ ---
50
+
1
51
  # @praxisui/table
2
52
 
3
53
  ## 🔰 Exemplos / Quickstart
@@ -50,7 +100,7 @@ Nota: a classe de tema é decisão do host (`.dark-theme` ou `.theme-dark`/`.the
50
100
 
51
101
  ### 📄 Contrato Inline do Filtro
52
102
 
53
- - Referencia canonica: `projects/praxis-dynamic-fields/docs/filter-inline-components-guide.md`
103
+ - Referencia canonica: `projects/praxis-dynamic-fields/docs/filter-inline-components-guide.md` (slug publicado: `dynamic-fields-filter-inline-components-guide`)
54
104
  - No contexto da tabela, use este contrato para definir `controlType` inline e politica de compatibilidade (canonica vs legado).
55
105
 
56
106
  ### 🧭 Decisoes de Arquitetura (ADR)
@@ -313,7 +363,7 @@ Neste exemplo:
313
363
 
314
364
  - `resourcePath="human-resources/departamentos"` instrui a tabela a se comunicar com o endpoint `/api/human-resources/departamentos`.
315
365
  - A tabela fará requisições como `POST /api/human-resources/departamentos/filter` para obter os dados e `GET /api/human-resources/departamentos/schemas` para obter a configuração das colunas.
316
- - `[editModeEnabled]="true"` permite a edição visual da configuração da tabela em tempo real.
366
+ - `editModeEnabled` controla explicitamente o gate de edição visual. No runtime atual o default já é `true`; declare `[editModeEnabled]="false"` quando o host precisar publicar a tabela em modo estritamente read-only.
317
367
 
318
368
  ### Empty State + Quick Connect (sem `resourcePath`)
319
369
 
@@ -628,12 +678,13 @@ sequenceDiagram
628
678
 
629
679
  - Inputs (efetivos apenas quando `editModeEnabled = true`):
630
680
  - `notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both'`
631
- - `snoozeMs: number = 86400000` (24h)
681
+ - `snoozeMs: number = 86400000`
632
682
  - `autoOpenSettingsOnOutdated: boolean = false`
683
+ - `dslFunctionRegistry: FunctionRegistry<any> | null = null`
633
684
  - Outputs:
634
- - `schemaStatusChange: { outdated: boolean; serverHash?: string; lastVerifiedAt?: string; resourcePath?: string }`
685
+ - `schemaStatusChange: { outdated: boolean; serverHash?: string; lastVerifiedAt?: string; trigger?: string; tableId?: string }`
635
686
  - Emitido tanto na verificação leve (304/200) quanto no bootstrap do schema (primeira carga via `loadSchema()`).
636
- - `metadataChange: { meta: any; reason: 'bootstrap'|'verification'|'applied' }`
687
+ - `metadataChange: { trigger: string; meta: any; tableId?: string }`
637
688
  - Emitido quando `config.meta` é atualizado (ex.: após bootstrap ou verificação ETag). Útil para sincronizar sidebars/bridges de metadados.
638
689
 
639
690
  ### Fallback Global (opcional)
@@ -889,7 +940,7 @@ sequenceDiagram
889
940
 
890
941
  ## 🎨 Edição Visual da Tabela: O Poder do Low-Code
891
942
 
892
- A `<praxis-table>` vem com um poderoso editor de configuração visual que permite personalizar quase todos os aspectos da sua tabela em tempo real, sem escrever uma única linha de código. Ative o editor passando a propriedade `[editModeEnabled]="true"` para o componente.
943
+ A `<praxis-table>` vem com um poderoso editor de configuração visual que permite personalizar quase todos os aspectos da sua tabela em tempo real, sem escrever uma única linha de código. No runtime atual, o editor nasce habilitado por padrão; use `[editModeEnabled]="false"` quando o host precisar bloquear customização e manter a tabela em modo estritamente operacional.
893
944
 
894
945
  A seguir, veja os principais recursos que você pode configurar visualmente:
895
946
 
@@ -1361,11 +1412,12 @@ Veja também: `docs/host-crud-integration.md` (guia operacional host) e `project
1361
1412
 
1362
1413
  - Inputs (efetivos apenas quando `editModeEnabled = true`):
1363
1414
  - `editModeEnabled: boolean` — habilita o gate de customização para notificações de schema.
1364
- - `notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both'` — canal de notificação quando o schema muda.
1415
+ - `notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both'` — seleciona como o runtime publica avisos de drift quando a política operacional estiver habilitada.
1365
1416
  - `snoozeMs: number = 86400000` — tempo de soneca para avisos (ms).
1366
1417
  - `autoOpenSettingsOnOutdated: boolean = false` — abre Configurações ao detectar schema desatualizado.
1418
+ - `dslFunctionRegistry: FunctionRegistry<any> | null = null` — adiciona funções DSL custom sem substituir o registry nativo.
1367
1419
  - Output:
1368
- - `schemaStatusChange: { outdated: boolean; serverHash?: string; lastVerifiedAt?: string; formId?: string }` — emitido após verificação leve (304/200).
1420
+ - `schemaStatusChange: { outdated: boolean; serverHash?: string; lastVerifiedAt?: string; tableId?: string }` — emitido após verificação leve (304/200).
1369
1421
 
1370
1422
  #### Fallback Global (opcional)
1371
1423
 
@@ -21146,7 +21146,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
21146
21146
  type: Output
21147
21147
  }] } });
21148
21148
 
21149
- const { SELECT: FILTER_INLINE_SELECT_CONTROL_TYPE$1, SEARCHABLE_SELECT: FILTER_INLINE_SEARCHABLE_SELECT_CONTROL_TYPE$1, MULTI_SELECT: FILTER_INLINE_MULTI_SELECT_CONTROL_TYPE$1, INPUT: FILTER_INLINE_INPUT_CONTROL_TYPE$1, TOGGLE: FILTER_INLINE_TOGGLE_CONTROL_TYPE$1, RANGE: FILTER_INLINE_RANGE_CONTROL_TYPE$1, ASYNC_SELECT: FILTER_INLINE_ASYNC_SELECT_CONTROL_TYPE$1, ENTITY_LOOKUP: FILTER_INLINE_ENTITY_LOOKUP_CONTROL_TYPE$1, AUTOCOMPLETE: FILTER_INLINE_AUTOCOMPLETE_CONTROL_TYPE$1, NUMBER: FILTER_INLINE_NUMBER_CONTROL_TYPE$1, CURRENCY: FILTER_INLINE_CURRENCY_CONTROL_TYPE$1, CURRENCY_RANGE: FILTER_INLINE_CURRENCY_RANGE_CONTROL_TYPE$1, DATE: FILTER_INLINE_DATE_CONTROL_TYPE$1, DATE_RANGE: FILTER_INLINE_DATE_RANGE_CONTROL_TYPE$1, TIME: FILTER_INLINE_TIME_CONTROL_TYPE$1, TIME_RANGE: FILTER_INLINE_TIME_RANGE_CONTROL_TYPE$1, TREE_SELECT: FILTER_INLINE_TREE_SELECT_CONTROL_TYPE$1, RATING: FILTER_INLINE_RATING_CONTROL_TYPE$1, DISTANCE_RADIUS: FILTER_INLINE_DISTANCE_RADIUS_CONTROL_TYPE$1, PIPELINE_STATUS: FILTER_INLINE_PIPELINE_STATUS_CONTROL_TYPE$1, SCORE_PRIORITY: FILTER_INLINE_SCORE_PRIORITY_CONTROL_TYPE$1, RELATIVE_PERIOD: FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE, SENTIMENT: FILTER_INLINE_SENTIMENT_CONTROL_TYPE, COLOR_LABEL: FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE, } = INLINE_FILTER_CONTROL_TYPES;
21149
+ const { SELECT: FILTER_INLINE_SELECT_CONTROL_TYPE$1, SEARCHABLE_SELECT: FILTER_INLINE_SEARCHABLE_SELECT_CONTROL_TYPE$1, MULTI_SELECT: FILTER_INLINE_MULTI_SELECT_CONTROL_TYPE$1, INPUT: FILTER_INLINE_INPUT_CONTROL_TYPE$1, TOGGLE: FILTER_INLINE_TOGGLE_CONTROL_TYPE$1, RANGE: FILTER_INLINE_RANGE_CONTROL_TYPE$1, ASYNC_SELECT: FILTER_INLINE_ASYNC_SELECT_CONTROL_TYPE$1, ENTITY_LOOKUP: FILTER_INLINE_ENTITY_LOOKUP_CONTROL_TYPE$1, AUTOCOMPLETE: FILTER_INLINE_AUTOCOMPLETE_CONTROL_TYPE$1, NUMBER: FILTER_INLINE_NUMBER_CONTROL_TYPE$1, CURRENCY: FILTER_INLINE_CURRENCY_CONTROL_TYPE$1, CURRENCY_RANGE: FILTER_INLINE_CURRENCY_RANGE_CONTROL_TYPE$1, DATE: FILTER_INLINE_DATE_CONTROL_TYPE$1, DATE_RANGE: FILTER_INLINE_DATE_RANGE_CONTROL_TYPE$1, TIME: FILTER_INLINE_TIME_CONTROL_TYPE$1, TIME_RANGE: FILTER_INLINE_TIME_RANGE_CONTROL_TYPE$1, TREE_SELECT: FILTER_INLINE_TREE_SELECT_CONTROL_TYPE$1, RATING: FILTER_INLINE_RATING_CONTROL_TYPE$1, DISTANCE_RADIUS: FILTER_INLINE_DISTANCE_RADIUS_CONTROL_TYPE$1, PIPELINE_STATUS: FILTER_INLINE_PIPELINE_STATUS_CONTROL_TYPE$1, SCORE_PRIORITY: FILTER_INLINE_SCORE_PRIORITY_CONTROL_TYPE$1, RELATIVE_PERIOD: FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE$1, SENTIMENT: FILTER_INLINE_SENTIMENT_CONTROL_TYPE$1, COLOR_LABEL: FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE$1, } = INLINE_FILTER_CONTROL_TYPES;
21150
21150
  const KNOWN_FILTER_SETTINGS_CONTROL_TYPES = new Set([
21151
21151
  ...Object.values(FieldControlType).map((type) => String(type).toLowerCase()),
21152
21152
  ...INLINE_FILTER_CONTROL_TYPE_VALUES,
@@ -21201,9 +21201,9 @@ const CONTROL_TYPE_LABELS = {
21201
21201
  [FILTER_INLINE_DISTANCE_RADIUS_CONTROL_TYPE$1]: 'Raio de distancia inline',
21202
21202
  [FILTER_INLINE_PIPELINE_STATUS_CONTROL_TYPE$1]: 'Pipeline de status inline',
21203
21203
  [FILTER_INLINE_SCORE_PRIORITY_CONTROL_TYPE$1]: 'Score/prioridade inline',
21204
- [FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE]: 'Periodo relativo inline',
21205
- [FILTER_INLINE_SENTIMENT_CONTROL_TYPE]: 'Sentimento inline',
21206
- [FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE]: 'Cor/label inline',
21204
+ [FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE$1]: 'Periodo relativo inline',
21205
+ [FILTER_INLINE_SENTIMENT_CONTROL_TYPE$1]: 'Sentimento inline',
21206
+ [FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE$1]: 'Cor/label inline',
21207
21207
  [String(FieldControlType.CURRENCY_INPUT).toLowerCase()]: 'Moeda',
21208
21208
  [String(FieldControlType.PRICE_RANGE).toLowerCase()]: 'Faixa monetária',
21209
21209
  [String(FieldControlType.TOGGLE).toLowerCase()]: 'Toggle',
@@ -21253,9 +21253,9 @@ const CONTROL_TYPE_WIDTH_HINTS = {
21253
21253
  [FILTER_INLINE_DISTANCE_RADIUS_CONTROL_TYPE$1]: '188-360px',
21254
21254
  [FILTER_INLINE_PIPELINE_STATUS_CONTROL_TYPE$1]: '188-420px',
21255
21255
  [FILTER_INLINE_SCORE_PRIORITY_CONTROL_TYPE$1]: '182-340px',
21256
- [FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE]: '186-360px',
21257
- [FILTER_INLINE_SENTIMENT_CONTROL_TYPE]: '186-360px',
21258
- [FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE]: '186-360px',
21256
+ [FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE$1]: '186-360px',
21257
+ [FILTER_INLINE_SENTIMENT_CONTROL_TYPE$1]: '186-360px',
21258
+ [FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE$1]: '186-360px',
21259
21259
  [FILTER_INLINE_MULTI_SELECT_CONTROL_TYPE$1]: '100-320px',
21260
21260
  [FILTER_INLINE_RANGE_CONTROL_TYPE$1]: '120-300px',
21261
21261
  [FILTER_INLINE_TOGGLE_CONTROL_TYPE$1]: '76-320px',
@@ -22053,6 +22053,18 @@ class FilterSettingsComponent {
22053
22053
  token === normalizeControlTypeToken('filter-inline-score-priority')) {
22054
22054
  return FILTER_INLINE_SCORE_PRIORITY_CONTROL_TYPE$1;
22055
22055
  }
22056
+ if (token === normalizeControlTypeToken(FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE$1) ||
22057
+ token === normalizeControlTypeToken('filter-inline-relative-period')) {
22058
+ return FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE$1;
22059
+ }
22060
+ if (token === normalizeControlTypeToken(FILTER_INLINE_SENTIMENT_CONTROL_TYPE$1) ||
22061
+ token === normalizeControlTypeToken('filter-inline-sentiment')) {
22062
+ return FILTER_INLINE_SENTIMENT_CONTROL_TYPE$1;
22063
+ }
22064
+ if (token === normalizeControlTypeToken(FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE$1) ||
22065
+ token === normalizeControlTypeToken('filter-inline-color-label')) {
22066
+ return FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE$1;
22067
+ }
22056
22068
  if (token === selectToken)
22057
22069
  return FILTER_INLINE_SELECT_CONTROL_TYPE$1;
22058
22070
  if (token === searchableSelectToken ||
@@ -28934,7 +28946,7 @@ const DEFAULT_I18N = {
28934
28946
  shortcutRemoved: 'Atalho removido',
28935
28947
  undo: 'Desfazer',
28936
28948
  };
28937
- const { SELECT: FILTER_INLINE_SELECT_CONTROL_TYPE, SEARCHABLE_SELECT: FILTER_INLINE_SEARCHABLE_SELECT_CONTROL_TYPE, MULTI_SELECT: FILTER_INLINE_MULTI_SELECT_CONTROL_TYPE, INPUT: FILTER_INLINE_INPUT_CONTROL_TYPE, TOGGLE: FILTER_INLINE_TOGGLE_CONTROL_TYPE, RANGE: FILTER_INLINE_RANGE_CONTROL_TYPE, DATE: FILTER_INLINE_DATE_CONTROL_TYPE, DATE_RANGE: FILTER_INLINE_DATE_RANGE_CONTROL_TYPE, ASYNC_SELECT: FILTER_INLINE_ASYNC_SELECT_CONTROL_TYPE, ENTITY_LOOKUP: FILTER_INLINE_ENTITY_LOOKUP_CONTROL_TYPE, AUTOCOMPLETE: FILTER_INLINE_AUTOCOMPLETE_CONTROL_TYPE, NUMBER: FILTER_INLINE_NUMBER_CONTROL_TYPE, CURRENCY: FILTER_INLINE_CURRENCY_CONTROL_TYPE, CURRENCY_RANGE: FILTER_INLINE_CURRENCY_RANGE_CONTROL_TYPE, TIME: FILTER_INLINE_TIME_CONTROL_TYPE, TIME_RANGE: FILTER_INLINE_TIME_RANGE_CONTROL_TYPE, TREE_SELECT: FILTER_INLINE_TREE_SELECT_CONTROL_TYPE, RATING: FILTER_INLINE_RATING_CONTROL_TYPE, DISTANCE_RADIUS: FILTER_INLINE_DISTANCE_RADIUS_CONTROL_TYPE, PIPELINE_STATUS: FILTER_INLINE_PIPELINE_STATUS_CONTROL_TYPE, SCORE_PRIORITY: FILTER_INLINE_SCORE_PRIORITY_CONTROL_TYPE, } = INLINE_FILTER_CONTROL_TYPES;
28949
+ const { SELECT: FILTER_INLINE_SELECT_CONTROL_TYPE, SEARCHABLE_SELECT: FILTER_INLINE_SEARCHABLE_SELECT_CONTROL_TYPE, MULTI_SELECT: FILTER_INLINE_MULTI_SELECT_CONTROL_TYPE, INPUT: FILTER_INLINE_INPUT_CONTROL_TYPE, TOGGLE: FILTER_INLINE_TOGGLE_CONTROL_TYPE, RANGE: FILTER_INLINE_RANGE_CONTROL_TYPE, DATE: FILTER_INLINE_DATE_CONTROL_TYPE, DATE_RANGE: FILTER_INLINE_DATE_RANGE_CONTROL_TYPE, ASYNC_SELECT: FILTER_INLINE_ASYNC_SELECT_CONTROL_TYPE, ENTITY_LOOKUP: FILTER_INLINE_ENTITY_LOOKUP_CONTROL_TYPE, AUTOCOMPLETE: FILTER_INLINE_AUTOCOMPLETE_CONTROL_TYPE, NUMBER: FILTER_INLINE_NUMBER_CONTROL_TYPE, CURRENCY: FILTER_INLINE_CURRENCY_CONTROL_TYPE, CURRENCY_RANGE: FILTER_INLINE_CURRENCY_RANGE_CONTROL_TYPE, TIME: FILTER_INLINE_TIME_CONTROL_TYPE, TIME_RANGE: FILTER_INLINE_TIME_RANGE_CONTROL_TYPE, TREE_SELECT: FILTER_INLINE_TREE_SELECT_CONTROL_TYPE, RATING: FILTER_INLINE_RATING_CONTROL_TYPE, DISTANCE_RADIUS: FILTER_INLINE_DISTANCE_RADIUS_CONTROL_TYPE, PIPELINE_STATUS: FILTER_INLINE_PIPELINE_STATUS_CONTROL_TYPE, SCORE_PRIORITY: FILTER_INLINE_SCORE_PRIORITY_CONTROL_TYPE, RELATIVE_PERIOD: FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE, SENTIMENT: FILTER_INLINE_SENTIMENT_CONTROL_TYPE, COLOR_LABEL: FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE, } = INLINE_FILTER_CONTROL_TYPES;
28938
28950
  const INLINE_DATE_RANGE_CORPORATE_SHORTCUTS = [
28939
28951
  'today',
28940
28952
  'thisWeek',
@@ -30757,6 +30769,18 @@ class PraxisFilter {
30757
30769
  normalizedControlType === 'filter-inline-score-priority' ||
30758
30770
  controlTypeToken === 'filterscorepriorityinline' ||
30759
30771
  controlTypeToken === 'filterinlinescorepriority';
30772
+ const isInlineRelativePeriodExplicit = normalizedControlType === FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE ||
30773
+ normalizedControlType === 'filter-inline-relative-period' ||
30774
+ controlTypeToken === 'filterrelativeperiodinline' ||
30775
+ controlTypeToken === 'filterinlinerelativeperiod';
30776
+ const isInlineSentimentExplicit = normalizedControlType === FILTER_INLINE_SENTIMENT_CONTROL_TYPE ||
30777
+ normalizedControlType === 'filter-inline-sentiment' ||
30778
+ controlTypeToken === 'filtersentimentinline' ||
30779
+ controlTypeToken === 'filterinlinesentiment';
30780
+ const isInlineColorLabelExplicit = normalizedControlType === FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE ||
30781
+ normalizedControlType === 'filter-inline-color-label' ||
30782
+ controlTypeToken === 'filtercolorlabelinline' ||
30783
+ controlTypeToken === 'filterinlinecolorlabel';
30760
30784
  const shouldUseInlineSearchableSelect = this.useInlineSearchableSelectVariant && isSearchableSelect;
30761
30785
  const shouldUseInlineAsyncSelect = this.useInlineSearchableSelectVariant && isAsyncSelect;
30762
30786
  const shouldUseInlineAutocomplete = this.useInlineSearchableSelectVariant && isAutocomplete;
@@ -30833,21 +30857,27 @@ class PraxisFilter {
30833
30857
  ? FILTER_INLINE_PIPELINE_STATUS_CONTROL_TYPE
30834
30858
  : isInlineScorePriorityExplicit
30835
30859
  ? FILTER_INLINE_SCORE_PRIORITY_CONTROL_TYPE
30836
- : shouldUseInlineToggle
30837
- ? FILTER_INLINE_TOGGLE_CONTROL_TYPE
30838
- : shouldUseInlineRange
30839
- ? FILTER_INLINE_RANGE_CONTROL_TYPE
30840
- : shouldUseInlineDate
30841
- ? FILTER_INLINE_DATE_CONTROL_TYPE
30842
- : shouldUseInlineDateRange
30843
- ? FILTER_INLINE_DATE_RANGE_CONTROL_TYPE
30844
- : shouldUseInlineTime
30845
- ? FILTER_INLINE_TIME_CONTROL_TYPE
30846
- : shouldUseInlineTimeRange
30847
- ? FILTER_INLINE_TIME_RANGE_CONTROL_TYPE
30848
- : shouldUseInlineTreeSelect
30849
- ? FILTER_INLINE_TREE_SELECT_CONTROL_TYPE
30850
- : controlType;
30860
+ : isInlineRelativePeriodExplicit
30861
+ ? FILTER_INLINE_RELATIVE_PERIOD_CONTROL_TYPE
30862
+ : isInlineSentimentExplicit
30863
+ ? FILTER_INLINE_SENTIMENT_CONTROL_TYPE
30864
+ : isInlineColorLabelExplicit
30865
+ ? FILTER_INLINE_COLOR_LABEL_CONTROL_TYPE
30866
+ : shouldUseInlineToggle
30867
+ ? FILTER_INLINE_TOGGLE_CONTROL_TYPE
30868
+ : shouldUseInlineRange
30869
+ ? FILTER_INLINE_RANGE_CONTROL_TYPE
30870
+ : shouldUseInlineDate
30871
+ ? FILTER_INLINE_DATE_CONTROL_TYPE
30872
+ : shouldUseInlineDateRange
30873
+ ? FILTER_INLINE_DATE_RANGE_CONTROL_TYPE
30874
+ : shouldUseInlineTime
30875
+ ? FILTER_INLINE_TIME_CONTROL_TYPE
30876
+ : shouldUseInlineTimeRange
30877
+ ? FILTER_INLINE_TIME_RANGE_CONTROL_TYPE
30878
+ : shouldUseInlineTreeSelect
30879
+ ? FILTER_INLINE_TREE_SELECT_CONTROL_TYPE
30880
+ : controlType;
30851
30881
  const supportsInlineClear = supportsClearButtonControlType(inlineControlType) ||
30852
30882
  supportsClearButtonControlType(controlType);
30853
30883
  const existingClear = meta.clearButton;
@@ -32916,8 +32946,8 @@ class PraxisTable {
32916
32946
  subtitle;
32917
32947
  icon;
32918
32948
  autoDelete = false;
32919
- notifyIfOutdated = false;
32920
- snoozeMs = 0;
32949
+ notifyIfOutdated = 'both';
32950
+ snoozeMs = 24 * 60 * 60 * 1000;
32921
32951
  autoOpenSettingsOnOutdated = false;
32922
32952
  crudContext;
32923
32953
  dslFunctionRegistry = null;
@@ -40445,7 +40475,9 @@ class PraxisTable {
40445
40475
  catch (e) { /* Ignore 404 */ }
40446
40476
  if (w && typeof w === 'object') {
40447
40477
  // Heuristic: if component inputs equal library defaults, allow widget prefs to override
40448
- const inputsAreDefaults = (this.notifyIfOutdated === false) && (this.snoozeMs === 0) && (this.autoOpenSettingsOnOutdated === false);
40478
+ const inputsAreDefaults = (this.notifyIfOutdated === 'both') &&
40479
+ (this.snoozeMs === 24 * 60 * 60 * 1000) &&
40480
+ (this.autoOpenSettingsOnOutdated === false);
40449
40481
  if (inputsAreDefaults) {
40450
40482
  resolved = {
40451
40483
  notifyIfOutdated: w.notifyIfOutdated ?? resolved.notifyIfOutdated,
@@ -40462,9 +40494,9 @@ class PraxisTable {
40462
40494
  const g = this.global.getSchemaPrefsGlobal?.();
40463
40495
  if (g && typeof g === 'object') {
40464
40496
  resolved = {
40465
- notifyIfOutdated: (resolved.notifyIfOutdated ?? g.notifyIfOutdated) || 'both',
40466
- snoozeMs: (resolved.snoozeMs ?? g.snoozeMs) || 24 * 60 * 60 * 1000,
40467
- autoOpenSettingsOnOutdated: (resolved.autoOpenSettingsOnOutdated ?? g.autoOpenSettingsOnOutdated) || false,
40497
+ notifyIfOutdated: (resolved.notifyIfOutdated ?? g.notifyIfOutdated) ?? 'both',
40498
+ snoozeMs: (resolved.snoozeMs ?? g.snoozeMs) ?? 24 * 60 * 60 * 1000,
40499
+ autoOpenSettingsOnOutdated: (resolved.autoOpenSettingsOnOutdated ?? g.autoOpenSettingsOnOutdated) ?? false,
40468
40500
  };
40469
40501
  }
40470
40502
  }
@@ -40504,7 +40536,13 @@ class PraxisTable {
40504
40536
  }
40505
40537
  shouldShowOutdatedInline() {
40506
40538
  const hash = this.config?.meta?.serverHash;
40507
- return this.schemaOutdated && this.editModeEnabled && !!hash && !this.isOutdatedIgnored(hash) && !this.wasOutdatedNotified(hash);
40539
+ const inlineEnabled = this.resolvedPrefs.notifyIfOutdated === 'inline' || this.resolvedPrefs.notifyIfOutdated === 'both';
40540
+ return (inlineEnabled &&
40541
+ this.schemaOutdated &&
40542
+ this.editModeEnabled &&
40543
+ !!hash &&
40544
+ !this.isOutdatedIgnored(hash) &&
40545
+ !this.wasOutdatedNotified(hash));
40508
40546
  }
40509
40547
  onReconcileRequested() {
40510
40548
  this.verifyServerSchemaVersion().catch(() => { });
@@ -40513,7 +40551,7 @@ class PraxisTable {
40513
40551
  const hash = this.config?.meta?.serverHash;
40514
40552
  if (hash) {
40515
40553
  // Default snooze 24h
40516
- const until = new Date(Date.now() + (this.snoozeMs || 24 * 60 * 60 * 1000));
40554
+ const until = new Date(Date.now() + (this.snoozeMs ?? 24 * 60 * 60 * 1000));
40517
40555
  this.setOutdatedSnooze(hash, until);
40518
40556
  }
40519
40557
  this.schemaOutdated = false;
@@ -41136,25 +41174,6 @@ const PRAXIS_TABLE_COMPONENT_METADATA = {
41136
41174
  description: 'Dataset local para modo client-side quando não há resourcePath',
41137
41175
  default: null,
41138
41176
  },
41139
- {
41140
- name: 'filterCriteria',
41141
- type: 'any',
41142
- label: 'Filtro',
41143
- description: 'Filtros aplicados às consultas (JSON)',
41144
- default: {},
41145
- },
41146
- {
41147
- name: 'showToolbar',
41148
- type: 'boolean',
41149
- default: false,
41150
- description: 'Exibe barra de ferramentas',
41151
- },
41152
- {
41153
- name: 'toolbarV2',
41154
- type: 'boolean',
41155
- default: true,
41156
- description: 'Ativa layout da toolbar v2',
41157
- },
41158
41177
  {
41159
41178
  name: 'autoDelete',
41160
41179
  type: 'boolean',
@@ -41164,7 +41183,7 @@ const PRAXIS_TABLE_COMPONENT_METADATA = {
41164
41183
  {
41165
41184
  name: 'editModeEnabled',
41166
41185
  type: 'boolean',
41167
- default: false,
41186
+ default: true,
41168
41187
  description: 'Permite edição de layout',
41169
41188
  },
41170
41189
  {
@@ -41185,6 +41204,51 @@ const PRAXIS_TABLE_COMPONENT_METADATA = {
41185
41204
  type: 'string',
41186
41205
  description: 'Identificador estável para instâncias múltiplas da tabela',
41187
41206
  },
41207
+ {
41208
+ name: 'title',
41209
+ type: 'string',
41210
+ description: 'Título opcional usado por toolbar, quick connect e surfaces de configuração.',
41211
+ },
41212
+ {
41213
+ name: 'subtitle',
41214
+ type: 'string',
41215
+ description: 'Subtítulo opcional exibido em surfaces auxiliares do runtime.',
41216
+ },
41217
+ {
41218
+ name: 'icon',
41219
+ type: 'string',
41220
+ description: 'Ícone opcional usado em quick connect, settings e affordances do host.',
41221
+ },
41222
+ {
41223
+ name: 'notifyIfOutdated',
41224
+ type: "'inline' | 'snackbar' | 'both' | 'none'",
41225
+ default: 'both',
41226
+ description: 'Publica avisos de drift de schema quando o host habilita notificação operacional.',
41227
+ },
41228
+ {
41229
+ name: 'snoozeMs',
41230
+ type: 'number',
41231
+ default: 86400000,
41232
+ description: 'Janela de snooze para avisos de drift quando a política operacional estiver habilitada.',
41233
+ },
41234
+ {
41235
+ name: 'autoOpenSettingsOnOutdated',
41236
+ type: 'boolean',
41237
+ default: false,
41238
+ description: 'Abre automaticamente o settings panel quando o runtime detecta schema desatualizado.',
41239
+ },
41240
+ {
41241
+ name: 'dslFunctionRegistry',
41242
+ type: 'FunctionRegistry<any> | null',
41243
+ default: null,
41244
+ description: 'Registro adicional de funções DSL para regras, ações e expressões seguras.',
41245
+ },
41246
+ {
41247
+ name: 'crudContext',
41248
+ type: 'any',
41249
+ default: null,
41250
+ description: 'Contexto operacional opcional para overrides de CRUD, incluindo resolução de idField.',
41251
+ },
41188
41252
  ],
41189
41253
  outputs: [
41190
41254
  {
@@ -41261,6 +41325,21 @@ const PRAXIS_TABLE_COMPONENT_METADATA = {
41261
41325
  type: '{ rows: any[]; error: unknown }',
41262
41326
  description: 'Erro ao deletar múltiplas linhas',
41263
41327
  },
41328
+ {
41329
+ name: 'schemaStatusChange',
41330
+ type: '{ outdated: boolean; serverHash?: string; lastVerifiedAt?: string; trigger?: string; tableId?: string }',
41331
+ description: 'Emitido quando o runtime verifica drift de schema ou atualiza o status de reconciliação',
41332
+ },
41333
+ {
41334
+ name: 'metadataChange',
41335
+ type: '{ trigger: string; meta: any; tableId?: string }',
41336
+ description: 'Emitido quando o runtime atualiza config.meta durante bootstrap, verificação ou aplicação',
41337
+ },
41338
+ {
41339
+ name: 'loadingStateChange',
41340
+ type: 'LoadingState',
41341
+ description: 'Emitido quando a tabela muda de fase de carregamento no runtime',
41342
+ },
41264
41343
  ],
41265
41344
  actions: [
41266
41345
  {