@praxisui/table 9.0.0-beta.62 → 9.0.0-beta.64

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
@@ -144,6 +144,8 @@ Use `config.ai.assistant.enabled = false` when a host needs to disable the embed
144
144
 
145
145
  Use `behavior.emptyState` for table-owned no-data copy and presentation. `message` remains the required backward-compatible text. When `title` is omitted, `message` is used as the empty-state title. When `title` is provided, `message` is rendered as the description unless `description` is explicitly set.
146
146
 
147
+ When the host does not provide `behavior.emptyState` or legacy `messages.states` copy, the table uses localized runtime defaults for the initial empty collection and for the filtered/search no-results state. Context-specific entries in `behavior.emptyState.contexts.initial`, `behavior.emptyState.contexts.filtered`, and `behavior.emptyState.contexts.searched` still override the base empty state for those modes.
148
+
147
149
  ```ts
148
150
  const config: TableConfig = {
149
151
  behavior: {
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-09T14:19:11.232Z",
3
+ "generatedAt": "2026-07-09T17:49:20.835Z",
4
4
  "packageName": "@praxisui/table",
5
- "packageVersion": "9.0.0-beta.62",
5
+ "packageVersion": "9.0.0-beta.64",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 3,
@@ -118,6 +118,10 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
118
118
  'table.chrome.collectionActions.create': 'Novo',
119
119
  'table.chrome.collectionActions.createTooltip': 'Criar novo registro',
120
120
  'table.chrome.collectionActions.createUnavailable': 'Criação indisponível no contexto atual',
121
+ 'table.emptyState.initial.title': 'Nenhum registro disponível.',
122
+ 'table.emptyState.initial.description': 'Use as ações disponíveis para iniciar a próxima operação.',
123
+ 'table.emptyState.filtered.title': 'Nenhum resultado encontrado.',
124
+ 'table.emptyState.filtered.description': 'Revise os filtros ou ajuste o termo de busca.',
121
125
  'table.chrome.actions.disabled.noSelection': 'Selecione ao menos um registro para executar esta ação.',
122
126
  'table.chrome.actions.disabled.minSelection': 'Selecione ao menos {min} registros para executar esta ação.',
123
127
  'table.chrome.actions.disabled.maxSelection': 'A seleção atual excede o limite permitido para esta ação.',
@@ -249,6 +253,10 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
249
253
  'table.chrome.collectionActions.create': 'New',
250
254
  'table.chrome.collectionActions.createTooltip': 'Create a new record',
251
255
  'table.chrome.collectionActions.createUnavailable': 'Create is unavailable in the current context',
256
+ 'table.emptyState.initial.title': 'No records available.',
257
+ 'table.emptyState.initial.description': 'Use the available actions to start the next operation.',
258
+ 'table.emptyState.filtered.title': 'No results found.',
259
+ 'table.emptyState.filtered.description': 'Review the filters or adjust the search term.',
252
260
  'table.chrome.actions.disabled.noSelection': 'Select at least one record to run this action.',
253
261
  'table.chrome.actions.disabled.minSelection': 'Select at least {min} records to run this action.',
254
262
  'table.chrome.actions.disabled.maxSelection': 'The current selection exceeds the allowed limit for this action.',
@@ -40336,9 +40344,9 @@ class PraxisTable {
40336
40344
  if (!actions.length) {
40337
40345
  return undefined;
40338
40346
  }
40339
- return this.hasActiveDataFilters()
40340
- ? 'Ajuste os filtros ou abra outra carteira operacional.'
40341
- : 'Use a ação principal para iniciar a próxima operação.';
40347
+ return this.hasActiveEmptyStateFilters()
40348
+ ? translateTableRuntimeText(this.i18n, 'table.emptyState.filtered.description', 'Revise os filtros ou ajuste o termo de busca.')
40349
+ : translateTableRuntimeText(this.i18n, 'table.emptyState.initial.description', 'Use as ações disponíveis para iniciar a próxima operação.');
40342
40350
  }
40343
40351
  getTableSettingsLabel() {
40344
40352
  return translateTableRuntimeText(this.i18n, 'table.chrome.settings', 'Configurações');
@@ -41852,7 +41860,7 @@ class PraxisTable {
41852
41860
  if (this.aiAdapter || this.aiAdapterLoadStarted)
41853
41861
  return;
41854
41862
  this.aiAdapterLoadStarted = true;
41855
- import('./praxisui-table-table-ai.adapter-DE5WpZ-t.mjs')
41863
+ import('./praxisui-table-table-ai.adapter-l2wfwinc.mjs')
41856
41864
  .then(({ TableAiAdapter }) => {
41857
41865
  if (!this.isAiAssistantEnabled()) {
41858
41866
  this.aiAssistantOpenAfterAdapterLoad = false;
@@ -43130,6 +43138,20 @@ class PraxisTable {
43130
43138
  }
43131
43139
  hasActiveDataFilters() {
43132
43140
  const criteria = this.getEffectiveFilterCriteria();
43141
+ return this.hasMeaningfulFilterCriteria(criteria);
43142
+ }
43143
+ hasActiveEmptyStateFilters() {
43144
+ const criteria = { ...this.getEffectiveFilterCriteria() };
43145
+ const meta = this.queryContext?.meta;
43146
+ const parentFilterField = typeof meta?.['parentFilterField'] === 'string'
43147
+ ? String(meta['parentFilterField']).trim()
43148
+ : '';
43149
+ if (meta?.['relatedResource'] === true && parentFilterField) {
43150
+ delete criteria[parentFilterField];
43151
+ }
43152
+ return this.hasMeaningfulFilterCriteria(criteria);
43153
+ }
43154
+ hasMeaningfulFilterCriteria(criteria) {
43133
43155
  const values = Object.values(criteria || {});
43134
43156
  return values.some((value) => this.hasMeaningfulFilterValue(value));
43135
43157
  }
@@ -43150,20 +43172,28 @@ class PraxisTable {
43150
43172
  }
43151
43173
  resolveNoDataStateConfig() {
43152
43174
  const baseEmptyState = this.config?.behavior?.emptyState;
43153
- const contextualEmptyState = this.hasActiveDataFilters()
43175
+ const hasActiveFilters = this.hasActiveEmptyStateFilters();
43176
+ const contextualEmptyState = hasActiveFilters
43154
43177
  ? (baseEmptyState?.contexts?.filtered ?? baseEmptyState?.contexts?.searched)
43155
43178
  : baseEmptyState?.contexts?.initial;
43156
43179
  const merged = {
43157
43180
  ...(baseEmptyState || {}),
43158
43181
  ...(contextualEmptyState || {}),
43159
43182
  };
43160
- const fallbackMessage = this.hasActiveDataFilters()
43161
- ? this.config?.messages?.states?.noResults || 'Nenhum resultado encontrado.'
43162
- : this.config?.messages?.states?.empty || 'Nenhum dado disponivel.';
43183
+ const hasExplicitEmptyStateCopy = typeof merged.title === 'string'
43184
+ || typeof merged.message === 'string'
43185
+ || typeof merged.description === 'string';
43186
+ const fallbackMessage = hasActiveFilters
43187
+ ? this.config?.messages?.states?.noResults || translateTableRuntimeText(this.i18n, 'table.emptyState.filtered.title', 'Nenhum resultado encontrado.')
43188
+ : this.config?.messages?.states?.empty || translateTableRuntimeText(this.i18n, 'table.emptyState.initial.title', 'Nenhum registro disponível.');
43163
43189
  return {
43164
43190
  title: typeof merged.title === 'string' ? merged.title : undefined,
43165
43191
  message: String(merged.message || fallbackMessage),
43166
- description: typeof merged.description === 'string' ? merged.description : undefined,
43192
+ description: typeof merged.description === 'string'
43193
+ ? merged.description
43194
+ : hasActiveFilters && !hasExplicitEmptyStateCopy
43195
+ ? translateTableRuntimeText(this.i18n, 'table.emptyState.filtered.description', 'Revise os filtros ou ajuste o termo de busca.')
43196
+ : undefined,
43167
43197
  icon: typeof merged.icon === 'string' ? merged.icon : undefined,
43168
43198
  tone: this.isEmptyStateTone(merged.tone) ? merged.tone : undefined,
43169
43199
  variant: this.isEmptyStateVariant(merged.variant) ? merged.variant : undefined,
@@ -1,7 +1,7 @@
1
1
  import { firstValueFrom } from 'rxjs';
2
2
  import { BaseAiAdapter, sanitizePraxisAssistantText, createComponentAuthoringContext } from '@praxisui/ai';
3
3
  import { PRAXIS_GLOBAL_ACTION_CATALOG, deepMerge } from '@praxisui/core';
4
- import { H as TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS, k as PRAXIS_TABLE_AUTHORING_MANIFEST, T as TABLE_AI_CAPABILITIES, X as coerceTableComponentEditPlans, Z as compileTableComponentEditPlans, K as TASK_PRESETS, a2 as getTableComponentEditPlanCapabilities, z as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, x as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, E as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, I as TABLE_COMPONENT_EDIT_PLAN_VERSION, y as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, G as TABLE_COMPONENT_EDIT_PLAN_KIND } from './praxisui-table-praxisui-table-D5UThmhh.mjs';
4
+ import { H as TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS, k as PRAXIS_TABLE_AUTHORING_MANIFEST, T as TABLE_AI_CAPABILITIES, X as coerceTableComponentEditPlans, Z as compileTableComponentEditPlans, K as TASK_PRESETS, a2 as getTableComponentEditPlanCapabilities, z as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, x as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, E as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, I as TABLE_COMPONENT_EDIT_PLAN_VERSION, y as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, G as TABLE_COMPONENT_EDIT_PLAN_KIND } from './praxisui-table-praxisui-table-Du0PxQhk.mjs';
5
5
 
6
6
  const TABLE_ROW_EXPRESSION_CONTEXT_OPTION = {
7
7
  mode: 'expression',
@@ -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_APPEARANCE_PRESETS, n as PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, o as PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, p as PraxisFilter, q as PraxisFilterWidgetConfigEditor, r as PraxisTable, s as PraxisTableConfigEditor, t as PraxisTableInlineAuthoringEditorComponent, u as PraxisTableToolbar, v as PraxisTableWidgetConfigEditor, S as STRING_PRESETS, T as TABLE_AI_CAPABILITIES, w as TABLE_COMPONENT_AI_CAPABILITIES, x as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, y as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, z as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, E as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, G as TABLE_COMPONENT_EDIT_PLAN_KIND, I as TABLE_COMPONENT_EDIT_PLAN_VERSION, K as TASK_PRESETS, L as TableDefaultsProvider, O as TableRulesEditorComponent, Q as ToolbarActionsEditorComponent, V as ValueMappingEditorComponent, R as VisualFormulaBuilderComponent, U as buildTableApplyPlan, W as coerceTableComponentEditPlan, X as coerceTableComponentEditPlans, Y as compileTableComponentEditPlan, Z as compileTableComponentEditPlans, _ as createTableAuthoringDocument, $ as getActionId, a0 as getEnum, a1 as getTableCapabilities, a2 as getTableComponentEditPlanCapabilities, a3 as isTableRendererSupportedByRichContentP0, a4 as mapTableRendererToRichContentP0, a5 as normalizeTableAuthoringDocument, a6 as parseLegacyOrTableDocument, a7 as providePraxisFilterMetadata, a8 as providePraxisTableMetadata, a9 as providePraxisTableToolbarAppearance, aa as serializeTableAuthoringDocument, ab as toCanonicalTableConfig, ac as validateTableAuthoringDocument } from './praxisui-table-praxisui-table-D5UThmhh.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_APPEARANCE_PRESETS, n as PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, o as PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, p as PraxisFilter, q as PraxisFilterWidgetConfigEditor, r as PraxisTable, s as PraxisTableConfigEditor, t as PraxisTableInlineAuthoringEditorComponent, u as PraxisTableToolbar, v as PraxisTableWidgetConfigEditor, S as STRING_PRESETS, T as TABLE_AI_CAPABILITIES, w as TABLE_COMPONENT_AI_CAPABILITIES, x as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, y as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, z as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, E as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, G as TABLE_COMPONENT_EDIT_PLAN_KIND, I as TABLE_COMPONENT_EDIT_PLAN_VERSION, K as TASK_PRESETS, L as TableDefaultsProvider, O as TableRulesEditorComponent, Q as ToolbarActionsEditorComponent, V as ValueMappingEditorComponent, R as VisualFormulaBuilderComponent, U as buildTableApplyPlan, W as coerceTableComponentEditPlan, X as coerceTableComponentEditPlans, Y as compileTableComponentEditPlan, Z as compileTableComponentEditPlans, _ as createTableAuthoringDocument, $ as getActionId, a0 as getEnum, a1 as getTableCapabilities, a2 as getTableComponentEditPlanCapabilities, a3 as isTableRendererSupportedByRichContentP0, a4 as mapTableRendererToRichContentP0, a5 as normalizeTableAuthoringDocument, a6 as parseLegacyOrTableDocument, a7 as providePraxisFilterMetadata, a8 as providePraxisTableMetadata, a9 as providePraxisTableToolbarAppearance, aa as serializeTableAuthoringDocument, ab as toCanonicalTableConfig, ac as validateTableAuthoringDocument } from './praxisui-table-praxisui-table-Du0PxQhk.mjs';
package/package.json CHANGED
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "name": "@praxisui/table",
3
- "version": "9.0.0-beta.62",
3
+ "version": "9.0.0-beta.64",
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
8
  "@angular/platform-browser": "^21.0.0",
9
- "@praxisui/ai": "^9.0.0-beta.62",
10
- "@praxisui/core": "^9.0.0-beta.62",
11
- "@praxisui/dynamic-fields": "^9.0.0-beta.62",
12
- "@praxisui/dynamic-form": "^9.0.0-beta.62",
13
- "@praxisui/metadata-editor": "^9.0.0-beta.62",
14
- "@praxisui/rich-content": "^9.0.0-beta.62",
15
- "@praxisui/settings-panel": "^9.0.0-beta.62",
16
- "@praxisui/table-rule-builder": "^9.0.0-beta.62",
9
+ "@praxisui/ai": "^9.0.0-beta.64",
10
+ "@praxisui/core": "^9.0.0-beta.64",
11
+ "@praxisui/dynamic-fields": "^9.0.0-beta.64",
12
+ "@praxisui/dynamic-form": "^9.0.0-beta.64",
13
+ "@praxisui/metadata-editor": "^9.0.0-beta.64",
14
+ "@praxisui/rich-content": "^9.0.0-beta.64",
15
+ "@praxisui/settings-panel": "^9.0.0-beta.64",
16
+ "@praxisui/table-rule-builder": "^9.0.0-beta.64",
17
17
  "@angular/cdk": "^21.0.0",
18
18
  "@angular/forms": "^21.0.0",
19
19
  "@angular/material": "^21.0.0",
20
20
  "@angular/router": "^21.0.0",
21
- "@praxisui/dialog": "^9.0.0-beta.62",
21
+ "@praxisui/dialog": "^9.0.0-beta.64",
22
22
  "rxjs": "~7.8.0"
23
23
  },
24
24
  "dependencies": {
@@ -1516,6 +1516,8 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
1516
1516
  private isTableDataLoading;
1517
1517
  private getRenderedRowCount;
1518
1518
  private hasActiveDataFilters;
1519
+ private hasActiveEmptyStateFilters;
1520
+ private hasMeaningfulFilterCriteria;
1519
1521
  private hasMeaningfulFilterValue;
1520
1522
  private resolveNoDataStateConfig;
1521
1523
  private isEmptyStateTone;