@praxisui/table 10.0.0-rc.11 → 10.0.0-rc.13

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
@@ -745,7 +745,7 @@ O editor de conteúdo da tabela recebe a configuração efetiva em contexto tran
745
745
 
746
746
  O editor do filtro permite selecionar o recurso e carregar seus campos pelo schema de filtro canônico. `resourcePath` e preferências visuais são persistidos; os metadados carregados permanecem derivados da API.
747
747
 
748
- Ao receber novos `filterCriteria` ou `queryContext` de outro widget, a consulta remota reinicia na página zero. Para um recurso paginado, selecione estratégia de paginação `server` no editor; a estratégia cliente continua sendo uma opção explícita para dados locais.
748
+ Ao receber novos `filterCriteria` ou `queryContext` de outro widget, a consulta remota reinicia na página zero. Com a estratégia omitida, paginação e ordenação são inferidas da origem: `server` para remoto e `client` para local. O editor oferece **Automática (pela fonte de dados)**, que remove a propriedade; escolhas explícitas são preservadas. Consulte [a precedência oficial](docs/local-data-mode-precedence.md) para as regras de round-trip e validação do total remoto.
749
749
 
750
750
  ## Filter heading and advanced-action presentation
751
751
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-13T19:31:57.571Z",
3
+ "generatedAt": "2026-10-14T09:51:43.880Z",
4
4
  "packageName": "@praxisui/table",
5
- "packageVersion": "10.0.0-rc.11",
5
+ "packageVersion": "10.0.0-rc.13",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 3,
@@ -11,6 +11,27 @@ Regras de conflito:
11
11
  - `resourcePath` + `data` ao mesmo tempo resolve para `remote`.
12
12
  - Limpar `document.bindings.resourcePath` no documento autorado é a forma explícita de remover a conexão remota via editor.
13
13
 
14
+ ## Estratégia contextual de paginação e ordenação
15
+
16
+ `pagination.strategy` e `sorting.strategy` são opcionais. Quando ausentes, o
17
+ runtime usa `server` para uma origem remota e `client` para dados locais. Os
18
+ defaults compartilhados e o reset dos editores preservam essa ausência; não
19
+ transformam uma configuração parcial em uma escolha explícita de cliente.
20
+
21
+ Os editores apresentam **Automática (pela fonte de dados)**. Essa opção
22
+ remove a propriedade do documento. As únicas estratégias públicas continuam
23
+ sendo `client` e `server`; não existe um valor serializado `auto`. Uma escolha
24
+ explícita é preservada, respeitando as restrições e diagnostics do modo local.
25
+ Uma operação parcial de authoring que omite a estratégia mantém uma escolha
26
+ anterior; omissão em um patch não significa limpar essa escolha.
27
+
28
+ Na paginação remota, o total vem da resposta do backend. O paginator e o sort
29
+ cliente do `MatTableDataSource` não devem ser anexados nessa estratégia, pois
30
+ seus callbacks assíncronos podem substituir o total pela quantidade de registros
31
+ da página e voltar o índice para zero. A prova deve aguardar esses callbacks e
32
+ as materializações de capabilities, navegar à segunda página e confirmar que o
33
+ total e o intervalo continuam corretos. Uma captura intermediária não basta.
34
+
14
35
  ## Ciclo da primeira consulta remota
15
36
 
16
37
  Quando `resourcePath`, `config` e `queryContext` chegam no primeiro ciclo de inputs, o
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { input, inject, computed, ChangeDetectionStrategy, Component, output, signal, InjectionToken, EventEmitter, ElementRef, Output, Input, ViewChild, Optional, Inject, LOCALE_ID, Injectable, HostListener, Directive, ChangeDetectorRef, DestroyRef, ENVIRONMENT_INITIALIZER, effect, booleanAttribute, HostBinding, ContentChild, TemplateRef, ViewContainerRef, numberAttribute } from '@angular/core';
3
3
  import * as i1 from '@praxisui/core';
4
- import { PraxisI18nService, BulkOperationClientService, isBulkExecutionTerminal, LoggerService, createCorporateLoggerConfig, ConsoleLoggerSink, PraxisJsonLogicService, resolveResourceAvailabilityReasonKey, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, PraxisIconDirective, PraxisIconButtonComponent, SafeExpressionEvaluator, API_URL, buildApiUrl, renderPraxisPresentationVisualizationHtml, createDefaultTableConfig, fillUndefined, deepMerge as deepMerge$1, ASYNC_CONFIG_STORAGE, providePraxisI18nConfig, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_VALUES, FieldControlType, normalizeControlTypeToken, resolveControlTypeAlias, INLINE_FILTER_ALIAS_TOKENS, SCHEMA_METADATA_CLIENT_OPTIONS, GlobalConfigService, buildSchemaId, MemoryCacheAdapter, LocalStorageCacheAdapter, SchemaMetadataClient, mapFieldDefinitionsToMetadata, resolveInlineFilterControlType, fetchWithETag, serializeEntityLookupValueForPayload, GenericCrudService, SchemaNormalizerService, ResourceQuickConnectComponent, ComponentMetadataRegistry, AnalyticsStatsRequestBuilderService, normalizePraxisDataQueryContext, normalizeUnknownError, PraxisRuntimeComponentObservationRegistryService, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, BulkSyncStateService, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PraxisWidgetEventBus, PraxisCollectionExportService, translateResourceAvailabilityReason, ResourceDiscoveryService, ResourceSurfaceOpenAdapterService, ResourceActionOpenAdapterService, CrudOperationResolutionService, SURFACE_OPEN_PRESETS, assertPraxisCollectionExportArtifact, PRAXIS_LOADING_CTX, resolveColumnTypeFromFieldDefinition as resolveColumnTypeFromFieldDefinition$1, isPraxisPresentationVisualizationTableSafe as isPraxisPresentationVisualizationTableSafe$1, resolveTextMaskFormatFromFieldDefinition as resolveTextMaskFormatFromFieldDefinition$1, translateResourceDiscoveryText, supportsImplicitValuePresentation, resolveValuePresentation, resolvePraxisMicroVisualizationTone, resolveResourceIdentityContract, materializeResourceIdentity, translateUnavailableWorkflowMessage, CONNECTION_STORAGE, PRAXIS_LOADING_RENDERER, EmptyStateCardComponent, getPraxisTableCellVisualizationGuidance, getPraxisTableCellVisualizationConstraint, isTableConfigV2, normalizePraxisPresentationVisualization, PRAXIS_GLOBAL_ACTION_CATALOG, SURFACE_OPEN_I18N_NAMESPACE, isRequiredGlobalActionPayloadMissing, getGlobalActionUiSchema, getRequiredGlobalActionPayloadKeys, hasMeaningfulGlobalActionPayloadValue, SurfaceOpenActionEditorComponent, SURFACE_OPEN_I18N_CONFIG, PraxisJsonLogicError, GLOBAL_ACTION_CATALOG, validateGlobalActionRefs, getGlobalActionCatalog, TableConfigService } from '@praxisui/core';
4
+ import { PraxisI18nService, BulkOperationClientService, isBulkExecutionTerminal, LoggerService, createCorporateLoggerConfig, ConsoleLoggerSink, PraxisJsonLogicService, resolveResourceAvailabilityReasonKey, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, PraxisIconDirective, PraxisIconButtonComponent, SafeExpressionEvaluator, API_URL, EnterpriseRuntimeContextService, buildApiUrl, renderPraxisPresentationVisualizationHtml, createDefaultTableConfig, fillUndefined, deepMerge as deepMerge$1, ASYNC_CONFIG_STORAGE, providePraxisI18nConfig, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_VALUES, FieldControlType, normalizeControlTypeToken, resolveControlTypeAlias, INLINE_FILTER_ALIAS_TOKENS, SCHEMA_METADATA_CLIENT_OPTIONS, GlobalConfigService, buildSchemaId, MemoryCacheAdapter, LocalStorageCacheAdapter, SchemaMetadataClient, mapFieldDefinitionsToMetadata, resolveInlineFilterControlType, fetchWithETag, serializeEntityLookupValueForPayload, GenericCrudService, SchemaNormalizerService, ResourceQuickConnectComponent, ComponentMetadataRegistry, AnalyticsStatsRequestBuilderService, normalizePraxisDataQueryContext, normalizeUnknownError, PraxisRuntimeComponentObservationRegistryService, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, BulkSyncStateService, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PraxisWidgetEventBus, PraxisCollectionExportService, translateResourceAvailabilityReason, ResourceDiscoveryService, ResourceSurfaceOpenAdapterService, ResourceActionOpenAdapterService, CrudOperationResolutionService, SURFACE_OPEN_PRESETS, assertPraxisCollectionExportArtifact, PRAXIS_LOADING_CTX, resolveColumnTypeFromFieldDefinition as resolveColumnTypeFromFieldDefinition$1, isPraxisPresentationVisualizationTableSafe as isPraxisPresentationVisualizationTableSafe$1, resolveTextMaskFormatFromFieldDefinition as resolveTextMaskFormatFromFieldDefinition$1, translateResourceDiscoveryText, supportsImplicitValuePresentation, resolveValuePresentation, resolvePraxisMicroVisualizationTone, resolveResourceIdentityContract, materializeResourceIdentity, translateUnavailableWorkflowMessage, CONNECTION_STORAGE, PRAXIS_LOADING_RENDERER, EmptyStateCardComponent, getPraxisTableCellVisualizationGuidance, getPraxisTableCellVisualizationConstraint, isTableConfigV2, normalizePraxisPresentationVisualization, PRAXIS_GLOBAL_ACTION_CATALOG, SURFACE_OPEN_I18N_NAMESPACE, isRequiredGlobalActionPayloadMissing, getGlobalActionUiSchema, getRequiredGlobalActionPayloadKeys, hasMeaningfulGlobalActionPayloadValue, SurfaceOpenActionEditorComponent, SURFACE_OPEN_I18N_CONFIG, PraxisJsonLogicError, GLOBAL_ACTION_CATALOG, validateGlobalActionRefs, getGlobalActionCatalog, TableConfigService } from '@praxisui/core';
5
5
  import * as i1$3 from '@angular/common/http';
6
6
  import { HttpErrorResponse, HttpClient, HttpContext } from '@angular/common/http';
7
7
  import * as i3 from '@angular/material/button';
@@ -42,7 +42,7 @@ import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
42
42
  import { PraxisRichContent, validateRichContentDocument, isSafeRichContentClassName, PraxisRichContentConfigEditor } from '@praxisui/rich-content';
43
43
  import * as i2 from '@angular/material/toolbar';
44
44
  import { MatToolbarModule } from '@angular/material/toolbar';
45
- import { map, catchError, take as take$1, startWith, takeUntil as takeUntil$1, debounceTime, distinctUntilChanged } from 'rxjs/operators';
45
+ import { map, catchError, finalize, take as take$1, startWith, takeUntil as takeUntil$1, debounceTime, distinctUntilChanged } from 'rxjs/operators';
46
46
  import * as i3$1 from '@angular/material/input';
47
47
  import { MatInputModule } from '@angular/material/input';
48
48
  import * as i15 from '@angular/material/chips';
@@ -6445,6 +6445,7 @@ class PraxisAnalyticalDrawerComponent {
6445
6445
  _drawerConfig = null;
6446
6446
  set drawerConfig(value) {
6447
6447
  this._drawerConfig = value;
6448
+ this.drawerConfigSignal.set(value);
6448
6449
  this.syncActiveTab();
6449
6450
  if (this._isOpen && this._row) {
6450
6451
  this.fetchConfiguredRelations();
@@ -6457,6 +6458,7 @@ class PraxisAnalyticalDrawerComponent {
6457
6458
  set row(value) {
6458
6459
  const prev = this._row;
6459
6460
  this._row = value;
6461
+ this.rowSignal.set(value);
6460
6462
  this.syncActiveTab();
6461
6463
  if (this._isOpen && value && value !== prev) {
6462
6464
  this.fetchConfiguredRelations();
@@ -6465,11 +6467,21 @@ class PraxisAnalyticalDrawerComponent {
6465
6467
  get row() {
6466
6468
  return this._row;
6467
6469
  }
6468
- relations = {};
6470
+ _relations = {};
6471
+ set relations(value) {
6472
+ this._relations = value || {};
6473
+ this.relationsSignal.set(this._relations);
6474
+ }
6475
+ get relations() {
6476
+ return this._relations;
6477
+ }
6469
6478
  loadingRelations = false;
6470
6479
  closeDrawer = new EventEmitter();
6471
6480
  tabChange = new EventEmitter();
6472
6481
  relationFetch = new EventEmitter();
6482
+ drawerConfigSignal = signal(null, ...(ngDevMode ? [{ debugName: "drawerConfigSignal" }] : /* istanbul ignore next */ []));
6483
+ rowSignal = signal(null, ...(ngDevMode ? [{ debugName: "rowSignal" }] : /* istanbul ignore next */ []));
6484
+ relationsSignal = signal({}, ...(ngDevMode ? [{ debugName: "relationsSignal" }] : /* istanbul ignore next */ []));
6473
6485
  activeTabId = signal('', ...(ngDevMode ? [{ debugName: "activeTabId" }] : /* istanbul ignore next */ []));
6474
6486
  customRelations = signal({}, ...(ngDevMode ? [{ debugName: "customRelations" }] : /* istanbul ignore next */ []));
6475
6487
  isFetchingRelations = signal(false, ...(ngDevMode ? [{ debugName: "isFetchingRelations" }] : /* istanbul ignore next */ []));
@@ -6479,10 +6491,12 @@ class PraxisAnalyticalDrawerComponent {
6479
6491
  http = inject(HttpClient, { optional: true });
6480
6492
  drawerRegistry = inject(AnalyticalDrawerRegistryService, { optional: true });
6481
6493
  apiUrl = inject(API_URL, { optional: true });
6494
+ runtimeContext = inject(EnterpriseRuntimeContextService, { optional: true });
6482
6495
  sanitizer = inject(DomSanitizer);
6483
6496
  formattingService = inject(DataFormattingService, { optional: true });
6484
6497
  relationSubs = [];
6485
6498
  schemaSub;
6499
+ contextSub;
6486
6500
  static urlCache = new Map();
6487
6501
  static schemaCache = new Map();
6488
6502
  lastFetchedKey = null;
@@ -6491,6 +6505,16 @@ class PraxisAnalyticalDrawerComponent {
6491
6505
  PraxisAnalyticalDrawerComponent.urlCache.clear();
6492
6506
  PraxisAnalyticalDrawerComponent.schemaCache.clear();
6493
6507
  }
6508
+ getContextScopePrefix() {
6509
+ const snap = this.runtimeContext?.snapshot;
6510
+ if (!snap)
6511
+ return 'default';
6512
+ const effective = this.runtimeContext?.effectiveContext;
6513
+ const tenant = effective?.activeTenant?.tenantId ?? 'anon';
6514
+ const user = snap.user?.userId ?? 'anon';
6515
+ const env = effective?.environment ?? 'default';
6516
+ return `${tenant}:${user}:${env}`;
6517
+ }
6494
6518
  resolveUrl(rawUrl) {
6495
6519
  if (!rawUrl)
6496
6520
  return '';
@@ -6506,6 +6530,20 @@ class PraxisAnalyticalDrawerComponent {
6506
6530
  return `${base}${cleanPath}`;
6507
6531
  }
6508
6532
  ngOnInit() {
6533
+ let initializedContext = false;
6534
+ this.contextSub = this.runtimeContext?.contextChanges$.subscribe(() => {
6535
+ if (!initializedContext) {
6536
+ initializedContext = true;
6537
+ return;
6538
+ }
6539
+ this.lastResolvingKey = null;
6540
+ this.lastFetchedKey = null;
6541
+ this.resolvedRemoteConfig.set(null);
6542
+ this.resolveRemoteDrawerMetadata();
6543
+ if (this.isOpen && this.row) {
6544
+ this.fetchConfiguredRelations();
6545
+ }
6546
+ });
6509
6547
  this.resolveRemoteDrawerMetadata();
6510
6548
  this.syncActiveTab();
6511
6549
  if (this.isOpen && this.row) {
@@ -6526,9 +6564,10 @@ class PraxisAnalyticalDrawerComponent {
6526
6564
  ngOnDestroy() {
6527
6565
  this.cancelRelationRequests();
6528
6566
  this.schemaSub?.unsubscribe();
6567
+ this.contextSub?.unsubscribe();
6529
6568
  }
6530
6569
  getEffectiveDrawerConfig() {
6531
- const local = this.drawerConfig;
6570
+ const local = this.drawerConfigSignal();
6532
6571
  const remote = this.resolvedRemoteConfig();
6533
6572
  if (!local && !remote)
6534
6573
  return null;
@@ -6615,11 +6654,12 @@ class PraxisAnalyticalDrawerComponent {
6615
6654
  .toLowerCase();
6616
6655
  if (!key)
6617
6656
  return;
6618
- if (this.lastResolvingKey === key &&
6657
+ const scopedSchemaKey = `${this.getContextScopePrefix()}::${key}`;
6658
+ if (this.lastResolvingKey === scopedSchemaKey &&
6619
6659
  (this.resolvedRemoteConfig() !== null || this.isResolvingSchema())) {
6620
6660
  return;
6621
6661
  }
6622
- this.lastResolvingKey = key;
6662
+ this.lastResolvingKey = scopedSchemaKey;
6623
6663
  // 1. Check DI registry
6624
6664
  const registered = this.drawerRegistry?.get(key);
6625
6665
  if (registered) {
@@ -6633,9 +6673,9 @@ class PraxisAnalyticalDrawerComponent {
6633
6673
  }
6634
6674
  return;
6635
6675
  }
6636
- // 2. Check Static in-memory cache
6637
- if (PraxisAnalyticalDrawerComponent.schemaCache.has(key)) {
6638
- this.resolvedRemoteConfig.set(PraxisAnalyticalDrawerComponent.schemaCache.get(key));
6676
+ // 2. Check tenant-scoped in-memory cache
6677
+ if (PraxisAnalyticalDrawerComponent.schemaCache.has(scopedSchemaKey)) {
6678
+ this.resolvedRemoteConfig.set(PraxisAnalyticalDrawerComponent.schemaCache.get(scopedSchemaKey));
6639
6679
  this.syncActiveTab();
6640
6680
  if (this.isOpen && this.row) {
6641
6681
  this.fetchConfiguredRelations();
@@ -6684,7 +6724,7 @@ class PraxisAnalyticalDrawerComponent {
6684
6724
  const configToSet = isAnalyticalDrawerSchema(resolved)
6685
6725
  ? { enabled: true, schema: resolved }
6686
6726
  : resolved;
6687
- PraxisAnalyticalDrawerComponent.schemaCache.set(key, configToSet);
6727
+ PraxisAnalyticalDrawerComponent.schemaCache.set(scopedSchemaKey, configToSet);
6688
6728
  this.resolvedRemoteConfig.set(configToSet);
6689
6729
  this.syncActiveTab();
6690
6730
  if (this.isOpen && this.row) {
@@ -6737,10 +6777,11 @@ class PraxisAnalyticalDrawerComponent {
6737
6777
  ];
6738
6778
  }, ...(ngDevMode ? [{ debugName: "resolvedTabs" }] : /* istanbul ignore next */ []));
6739
6779
  generateAutoOverviewProperties() {
6740
- if (!this.row || typeof this.row !== 'object')
6780
+ const currentRow = this.rowSignal();
6781
+ if (!currentRow || typeof currentRow !== 'object')
6741
6782
  return [];
6742
6783
  const ignoredKeys = new Set(['_links', 'resourceVersion', '__proto__', 'constructor']);
6743
- const entries = Object.entries(this.row).filter(([k, v]) => !ignoredKeys.has(k) && v !== null && v !== undefined && typeof v !== 'function' && typeof v !== 'object');
6784
+ const entries = Object.entries(currentRow).filter(([k, v]) => !ignoredKeys.has(k) && v !== null && v !== undefined && typeof v !== 'function' && typeof v !== 'object');
6744
6785
  if (entries.length === 0)
6745
6786
  return [];
6746
6787
  return entries.map(([key, val]) => ({
@@ -6758,6 +6799,7 @@ class PraxisAnalyticalDrawerComponent {
6758
6799
  resolvedTitle = computed(() => {
6759
6800
  const config = this.getEffectiveDrawerConfig();
6760
6801
  const analyticalSchema = this.getAnalyticalSchema();
6802
+ const currentRow = this.rowSignal();
6761
6803
  const context = this.getEvaluationContext();
6762
6804
  const titleExpr = config?.titleExpr || analyticalSchema?.titleExpr;
6763
6805
  if (titleExpr) {
@@ -6768,17 +6810,20 @@ class PraxisAnalyticalDrawerComponent {
6768
6810
  }
6769
6811
  if (config?.title)
6770
6812
  return config.title;
6771
- if (this.row?.title)
6772
- return String(this.row.title);
6773
- if (this.row?.descricao)
6774
- return String(this.row.descricao);
6775
- if (this.row?.id)
6776
- return `Registro #${this.row.id}`;
6777
- return 'Dossiê de Detalhe';
6813
+ if (currentRow?.title)
6814
+ return String(currentRow.title);
6815
+ if (currentRow?.name)
6816
+ return String(currentRow.name);
6817
+ if (currentRow?.label)
6818
+ return String(currentRow.label);
6819
+ if (currentRow?.id)
6820
+ return `Registro #${currentRow.id}`;
6821
+ return 'Detalhes do Registro';
6778
6822
  }, ...(ngDevMode ? [{ debugName: "resolvedTitle" }] : /* istanbul ignore next */ []));
6779
6823
  resolvedSubtitle = computed(() => {
6780
6824
  const config = this.getEffectiveDrawerConfig();
6781
6825
  const analyticalSchema = this.getAnalyticalSchema();
6826
+ const currentRow = this.rowSignal();
6782
6827
  const context = this.getEvaluationContext();
6783
6828
  const subtitleExpr = config?.subtitleExpr || analyticalSchema?.subtitleExpr;
6784
6829
  if (subtitleExpr) {
@@ -6789,10 +6834,8 @@ class PraxisAnalyticalDrawerComponent {
6789
6834
  }
6790
6835
  if (config?.subtitle)
6791
6836
  return config.subtitle;
6792
- if (this.row?.local)
6793
- return String(this.row.local);
6794
- if (this.row?.departamento)
6795
- return String(this.row.departamento);
6837
+ if (currentRow?.subtitle)
6838
+ return String(currentRow.subtitle);
6796
6839
  return '';
6797
6840
  }, ...(ngDevMode ? [{ debugName: "resolvedSubtitle" }] : /* istanbul ignore next */ []));
6798
6841
  resolvedClassificationPill = computed(() => {
@@ -6800,7 +6843,7 @@ class PraxisAnalyticalDrawerComponent {
6800
6843
  const analyticalSchema = this.getAnalyticalSchema();
6801
6844
  return (config?.classificationPill ||
6802
6845
  analyticalSchema?.classificationPill ||
6803
- 'DOSSIÊ DE DETALHE · PRAXIS GOVERNED');
6846
+ 'DETALHES DO REGISTRO');
6804
6847
  }, ...(ngDevMode ? [{ debugName: "resolvedClassificationPill" }] : /* istanbul ignore next */ []));
6805
6848
  resolvedWidth = computed(() => {
6806
6849
  const config = this.getEffectiveDrawerConfig();
@@ -6809,18 +6852,19 @@ class PraxisAnalyticalDrawerComponent {
6809
6852
  getDrawerIcon() {
6810
6853
  const config = this.getEffectiveDrawerConfig();
6811
6854
  const analyticalSchema = this.getAnalyticalSchema();
6812
- return config?.icon || analyticalSchema?.icon || 'crisis_alert';
6855
+ return config?.icon || analyticalSchema?.icon || 'analytics';
6813
6856
  }
6814
6857
  getEvaluationContext() {
6858
+ const currentRow = this.rowSignal();
6815
6859
  const combinedRelations = {
6816
- ...this.relations,
6860
+ ...this.relationsSignal(),
6817
6861
  ...this.customRelations(),
6818
6862
  };
6819
6863
  return {
6820
- row: this.row || {},
6821
- data: this.row || {},
6864
+ row: currentRow || {},
6865
+ data: currentRow || {},
6822
6866
  relations: combinedRelations,
6823
- ...this.row,
6867
+ ...currentRow,
6824
6868
  ...combinedRelations,
6825
6869
  };
6826
6870
  }
@@ -6874,6 +6918,14 @@ class PraxisAnalyticalDrawerComponent {
6874
6918
  const format = String(item.format || '').trim();
6875
6919
  if (format.startsWith('currency')) {
6876
6920
  const curr = format.includes(':') ? format.split(':')[1] : 'BRL';
6921
+ if (this.formattingService) {
6922
+ try {
6923
+ return this.formattingService.formatValue(Number(rawVal), 'currency', `${curr}|symbol|2`);
6924
+ }
6925
+ catch {
6926
+ // fallback below
6927
+ }
6928
+ }
6877
6929
  try {
6878
6930
  return Number(rawVal).toLocaleString('pt-BR', { style: 'currency', currency: curr });
6879
6931
  }
@@ -6935,21 +6987,32 @@ class PraxisAnalyticalDrawerComponent {
6935
6987
  fetchConfiguredRelations() {
6936
6988
  const config = this.getEffectiveDrawerConfig();
6937
6989
  const analyticalSchema = this.getAnalyticalSchema();
6938
- const relationsList = [
6939
- ...(Array.isArray(config?.relations) ? config.relations : []),
6990
+ const rawRelations = [
6940
6991
  ...(Array.isArray(analyticalSchema?.relations) ? analyticalSchema.relations : []),
6992
+ ...(Array.isArray(config?.relations) ? config.relations : []),
6941
6993
  ];
6994
+ const deduplicatedMap = new Map();
6995
+ for (const rel of rawRelations) {
6996
+ if (rel?.key) {
6997
+ deduplicatedMap.set(rel.key, {
6998
+ ...(deduplicatedMap.get(rel.key) || {}),
6999
+ ...rel,
7000
+ });
7001
+ }
7002
+ }
7003
+ const relationsList = Array.from(deduplicatedMap.values());
6942
7004
  if (!relationsList.length || !this.row)
6943
7005
  return;
7006
+ const scopePrefix = this.getContextScopePrefix();
6944
7007
  const rowKey = String(this.row?.id ?? this.row?._id ?? JSON.stringify(this.row));
6945
- const currentKey = `${rowKey}::${relationsList.map((r) => r.key + ':' + r.endpoint).join(';')}`;
7008
+ const currentKey = `${scopePrefix}::${rowKey}::${relationsList.map((r) => r.key + ':' + r.endpoint).join(';')}`;
6946
7009
  if (this.lastFetchedKey === currentKey) {
6947
7010
  return;
6948
7011
  }
6949
7012
  this.lastFetchedKey = currentKey;
6950
7013
  this.cancelRelationRequests();
6951
- this.isFetchingRelations.set(true);
6952
7014
  const pendingMap = {};
7015
+ let activeRequests = 0;
6953
7016
  relationsList.forEach((rel) => {
6954
7017
  const { url, hasMissingTokens } = interpolateRelationEndpoint(rel.endpoint, this.row);
6955
7018
  if (hasMissingTokens || !url) {
@@ -6957,15 +7020,17 @@ class PraxisAnalyticalDrawerComponent {
6957
7020
  return;
6958
7021
  }
6959
7022
  this.relationFetch.emit({ key: rel.key, endpoint: url });
6960
- // Cache check
6961
- if (rel.cache !== false && PraxisAnalyticalDrawerComponent.urlCache.has(url)) {
6962
- pendingMap[rel.key] = PraxisAnalyticalDrawerComponent.urlCache.get(url);
7023
+ const scopedUrlKey = `${scopePrefix}::${url}`;
7024
+ // Tenant-scoped cache check
7025
+ if (rel.cache !== false && PraxisAnalyticalDrawerComponent.urlCache.has(scopedUrlKey)) {
7026
+ pendingMap[rel.key] = PraxisAnalyticalDrawerComponent.urlCache.get(scopedUrlKey);
6963
7027
  return;
6964
7028
  }
6965
7029
  if (!this.http) {
6966
7030
  pendingMap[rel.key] = null;
6967
7031
  return;
6968
7032
  }
7033
+ activeRequests++;
6969
7034
  const method = (rel.method || 'GET').toUpperCase();
6970
7035
  const effectiveUrl = this.resolveUrl(url);
6971
7036
  const req$ = method === 'POST'
@@ -6981,10 +7046,15 @@ class PraxisAnalyticalDrawerComponent {
6981
7046
  resultData = resultData.length > 0 ? resultData[0] : null;
6982
7047
  }
6983
7048
  return resultData;
6984
- }), catchError(() => [null]))
7049
+ }), catchError(() => [null]), finalize(() => {
7050
+ activeRequests = Math.max(0, activeRequests - 1);
7051
+ if (activeRequests === 0) {
7052
+ this.isFetchingRelations.set(false);
7053
+ }
7054
+ }))
6985
7055
  .subscribe((resolvedData) => {
6986
7056
  if (rel.cache !== false && resolvedData !== null) {
6987
- PraxisAnalyticalDrawerComponent.urlCache.set(url, resolvedData);
7057
+ PraxisAnalyticalDrawerComponent.urlCache.set(scopedUrlKey, resolvedData);
6988
7058
  }
6989
7059
  this.customRelations.update((prev) => ({
6990
7060
  ...prev,
@@ -6994,11 +7064,12 @@ class PraxisAnalyticalDrawerComponent {
6994
7064
  this.relationSubs.push(sub);
6995
7065
  });
6996
7066
  this.customRelations.set(pendingMap);
6997
- this.isFetchingRelations.set(false);
7067
+ this.isFetchingRelations.set(activeRequests > 0);
6998
7068
  }
6999
7069
  cancelRelationRequests() {
7000
7070
  this.relationSubs.forEach((sub) => sub.unsubscribe());
7001
7071
  this.relationSubs = [];
7072
+ this.isFetchingRelations.set(false);
7002
7073
  }
7003
7074
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisAnalyticalDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7004
7075
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisAnalyticalDrawerComponent, isStandalone: true, selector: "praxis-analytical-drawer", inputs: { isOpen: "isOpen", resourcePath: "resourcePath", surfaceName: "surfaceName", drawerConfig: "drawerConfig", row: "row", relations: "relations", loadingRelations: "loadingRelations" }, outputs: { closeDrawer: "closeDrawer", tabChange: "tabChange", relationFetch: "relationFetch" }, host: { listeners: { "document:keydown.escape": "handleDocumentEscape($event)" } }, usesOnChanges: true, ngImport: i0, template: `
@@ -8500,6 +8571,7 @@ const PRAXIS_TABLE_EDITOR_I18N_CONFIG = {
8500
8571
  'behavior.pagination.title': 'Paginacao',
8501
8572
  'behavior.pagination.description': 'Configure como os dados sao divididos em paginas',
8502
8573
  'behavior.pagination.enabled': 'Habilitar paginacao',
8574
+ 'behavior.strategy.auto': 'Automática (pela fonte de dados)',
8503
8575
  'behavior.pagination.strategy': 'Estrategia de paginacao',
8504
8576
  'behavior.pagination.pageSize': 'Itens por pagina',
8505
8577
  'behavior.pagination.pageSizeHint': 'Número de registros exibidos por pagina.',
@@ -9831,6 +9903,7 @@ const PRAXIS_TABLE_EDITOR_I18N_CONFIG = {
9831
9903
  'behavior.pagination.title': 'Pagination',
9832
9904
  'behavior.pagination.description': 'Configure how data is divided into pages',
9833
9905
  'behavior.pagination.enabled': 'Enable pagination',
9906
+ 'behavior.strategy.auto': 'Automatic (by data source)',
9834
9907
  'behavior.pagination.strategy': 'Pagination strategy',
9835
9908
  'behavior.pagination.pageSize': 'Items per page',
9836
9909
  'behavior.pagination.pageSizeHint': 'Number of records displayed per page.',
@@ -23009,7 +23082,7 @@ class PraxisTable {
23009
23082
  if (this.aiAdapter || this.aiAdapterLoadStarted)
23010
23083
  return;
23011
23084
  this.aiAdapterLoadStarted = true;
23012
- import('./praxisui-table-table-ai.adapter-vtpAb33s.mjs')
23085
+ import('./praxisui-table-table-ai.adapter-DX7wpDJx.mjs')
23013
23086
  .then(({ TableAiAdapter }) => {
23014
23087
  if (!this.isAiAssistantEnabled()) {
23015
23088
  this.aiAssistantOpenAfterAdapterLoad = false;
@@ -23590,11 +23663,25 @@ class PraxisTable {
23590
23663
  sourceCandidateIds: ['table.appearance.compact-view'],
23591
23664
  });
23592
23665
  }
23593
- const publicViewCandidates = visibleColumns.filter((column) => column.type === 'currency'
23594
- || column.type === 'number'
23595
- || normalizedColumnText(column).includes('email')
23596
- || normalizedColumnText(column).includes('cpf')
23597
- || normalizedColumnText(column).includes('salario'));
23666
+ const schemaFieldByName = new Map();
23667
+ for (const f of this.schemaColumnFieldsSnapshot || []) {
23668
+ if (f?.name)
23669
+ schemaFieldByName.set(f.name, f);
23670
+ }
23671
+ for (const f of this.schemaFieldsSnapshot || []) {
23672
+ if (f?.name && !schemaFieldByName.has(f.name))
23673
+ schemaFieldByName.set(f.name, f);
23674
+ }
23675
+ const publicViewCandidates = visibleColumns.filter((column) => {
23676
+ const schemaField = schemaFieldByName.get(column.field);
23677
+ const format = String(column.format || schemaField?.format || '').toLowerCase();
23678
+ return (column.type === 'currency' ||
23679
+ column.type === 'number' ||
23680
+ format === 'email' ||
23681
+ format.startsWith('currency') ||
23682
+ this.isSensitiveAiAssistantField(column.field) ||
23683
+ Boolean(column.sensitive || schemaField?.sensitive || schemaField?.governance?.sensitive));
23684
+ });
23598
23685
  if (publicViewCandidates.length) {
23599
23686
  recommendations.push({
23600
23687
  id: 'table-curate-public-view',
@@ -23625,9 +23712,14 @@ class PraxisTable {
23625
23712
  sourceCandidateIds: ['table.governance.public-view', 'column.visibility.set'],
23626
23713
  });
23627
23714
  }
23628
- const booleanOrStatusColumn = columns.find((column) => column.type === 'boolean'
23629
- || normalizedColumnText(column).includes('status')
23630
- || normalizedColumnText(column).includes('ativo'));
23715
+ const booleanOrStatusColumn = columns.find((column) => {
23716
+ const schemaField = schemaFieldByName.get(column.field);
23717
+ const rendererType = column.renderer?.type;
23718
+ return (column.type === 'boolean' ||
23719
+ rendererType === 'badge' ||
23720
+ rendererType === 'status' ||
23721
+ Boolean(Array.isArray(schemaField?.options) && schemaField.options.length > 0));
23722
+ });
23631
23723
  if (booleanOrStatusColumn) {
23632
23724
  recommendations.push({
23633
23725
  id: 'table-curate-status-badges',
@@ -23641,7 +23733,7 @@ class PraxisTable {
23641
23733
  tone: 'success',
23642
23734
  action: {
23643
23735
  kind: 'submit-prompt',
23644
- prompt: t('table.assistant.recommendation.statusBadge.prompt', 'Transforme a coluna de status ou ativo em badges visuais com texto curto e cores adequadas.'),
23736
+ prompt: t('table.assistant.recommendation.statusBadge.prompt', 'Transforme a coluna de status ou estado booleano em badges visuais com texto curto e cores adequadas.'),
23645
23737
  contextHints: {
23646
23738
  source: 'table-capability-discovery-curation',
23647
23739
  opportunityId: 'table.appearance.status-badge',
@@ -23653,8 +23745,15 @@ class PraxisTable {
23653
23745
  sourceCandidateIds: ['table.appearance.status-badge', 'column.renderer.set'],
23654
23746
  });
23655
23747
  }
23656
- const categoricalColumns = visibleColumns.filter((column) => column.type === 'string'
23657
- && /departamento|department|cargo|role|categoria|category/u.test(normalizedColumnText(column)));
23748
+ const categoricalColumns = visibleColumns.filter((column) => {
23749
+ const schemaField = schemaFieldByName.get(column.field);
23750
+ const controlType = String(schemaField?.controlType || '').toLowerCase();
23751
+ return (column.type === 'string' &&
23752
+ (Boolean(Array.isArray(schemaField?.options) && schemaField.options.length > 0) ||
23753
+ controlType === 'select' ||
23754
+ controlType === 'radio' ||
23755
+ controlType === 'chip-list'));
23756
+ });
23658
23757
  if (categoricalColumns.length) {
23659
23758
  recommendations.push({
23660
23759
  id: 'table-curate-categorical-chips',
@@ -23755,7 +23854,7 @@ class PraxisTable {
23755
23854
  initializeAiAssistantController() {
23756
23855
  if (!this.aiAdapter || this.aiAssistantController)
23757
23856
  return;
23758
- import('./praxisui-table-table-agentic-authoring-turn-flow-DmnNx_fm.mjs')
23857
+ import('./praxisui-table-table-agentic-authoring-turn-flow-D9EpKvy-.mjs')
23759
23858
  .then(({ TableAgenticAuthoringTurnFlow }) => {
23760
23859
  if (this.aiAssistantController || !this.aiAdapter)
23761
23860
  return;
@@ -27234,10 +27333,23 @@ class PraxisTable {
27234
27333
  const statusGroup = [];
27235
27334
  const detailsGroup = [];
27236
27335
  for (const field of filteredFields) {
27237
- const nameLower = field.name.toLowerCase();
27238
27336
  const typeLower = (field.type || '').toLowerCase();
27239
- const isNumeric = typeLower === 'number' || typeLower === 'integer' || typeLower === 'currency' || typeLower === 'decimal' || /score|resistencia|valor|preco|custo|total|saldo|taxa|percent/i.test(nameLower);
27240
- const isStatusOrDate = typeLower === 'boolean' || typeLower.includes('date') || typeLower.includes('time') || /status|ativo|situacao|data|date|prazo/i.test(nameLower);
27337
+ const formatLower = (field.format || '').toLowerCase();
27338
+ const isNumeric = typeLower === 'number' ||
27339
+ typeLower === 'integer' ||
27340
+ typeLower === 'currency' ||
27341
+ typeLower === 'decimal' ||
27342
+ typeLower === 'percent' ||
27343
+ formatLower.startsWith('currency') ||
27344
+ formatLower === 'percent' ||
27345
+ formatLower === 'percentage';
27346
+ const isStatusOrDate = typeLower === 'boolean' ||
27347
+ typeLower === 'date' ||
27348
+ typeLower === 'datetime' ||
27349
+ typeLower === 'date-time' ||
27350
+ typeLower === 'time' ||
27351
+ formatLower === 'date' ||
27352
+ formatLower === 'date-time';
27241
27353
  if (isNumeric) {
27242
27354
  metricsGroup.push(field);
27243
27355
  }
@@ -27255,7 +27367,7 @@ class PraxisTable {
27255
27367
  if (detailsGroup.length > 0)
27256
27368
  groupMap.set('Especificações & Detalhes', detailsGroup);
27257
27369
  if (groupMap.size === 0) {
27258
- groupMap.set('Dossiê Complementar', filteredFields);
27370
+ groupMap.set('Detalhes Complementares', filteredFields);
27259
27371
  }
27260
27372
  }
27261
27373
  const cards = [];
@@ -27266,15 +27378,18 @@ class PraxisTable {
27266
27378
  const fieldName = field.name;
27267
27379
  const fieldLabel = field.label || this.humanizeFieldName(fieldName);
27268
27380
  const typeLower = (field.type || '').toLowerCase();
27269
- const nameLower = fieldName.toLowerCase();
27270
- if (typeLower === 'boolean' || /ativo|bloqueado|habilitado|urgente|critico/i.test(nameLower)) {
27381
+ const formatLower = (field.format || '').toLowerCase();
27382
+ if (typeLower === 'boolean') {
27271
27383
  items.push({
27272
27384
  type: 'badge',
27273
27385
  labelExpr: `row.${fieldName} ? '${fieldLabel}: Sim' : '${fieldLabel}: Não'`,
27274
27386
  icon: field.icon || 'check_circle',
27275
27387
  });
27276
27388
  }
27277
- else if (/score|resistencia|taxa|percent|progresso|desempenho/i.test(nameLower)) {
27389
+ else if (typeLower === 'percent' ||
27390
+ formatLower === 'percent' ||
27391
+ formatLower === 'percentage' ||
27392
+ formatLower === 'progress') {
27278
27393
  items.push({
27279
27394
  type: 'progress',
27280
27395
  label: fieldLabel,
@@ -27283,7 +27398,12 @@ class PraxisTable {
27283
27398
  showPercent: true,
27284
27399
  });
27285
27400
  }
27286
- else if (typeLower.includes('date') || typeLower.includes('time') || /data|date/i.test(nameLower)) {
27401
+ else if (typeLower === 'date' ||
27402
+ typeLower === 'datetime' ||
27403
+ typeLower === 'date-time' ||
27404
+ typeLower === 'time' ||
27405
+ formatLower === 'date' ||
27406
+ formatLower === 'date-time') {
27287
27407
  items.push({
27288
27408
  type: 'metric',
27289
27409
  label: fieldLabel,
@@ -27296,14 +27416,14 @@ class PraxisTable {
27296
27416
  type: 'metric',
27297
27417
  label: fieldLabel,
27298
27418
  valueExpr: `row.${fieldName}`,
27299
- icon: field.icon || (/descricao|motivo|observacao/i.test(nameLower) ? 'notes' : 'info'),
27419
+ icon: field.icon || 'info',
27300
27420
  });
27301
27421
  }
27302
27422
  }
27303
27423
  cards.push({
27304
27424
  id: `card-${cardIdx++}`,
27305
27425
  title: groupTitle,
27306
- subtitle: `Registros complementares de ${groupTitle.toLowerCase()}`,
27426
+ subtitle: `Atributos complementares de ${groupTitle.toLowerCase()}`,
27307
27427
  content: [
27308
27428
  {
27309
27429
  type: 'compose',
@@ -27319,7 +27439,7 @@ class PraxisTable {
27319
27439
  items: [
27320
27440
  {
27321
27441
  type: 'cardGrid',
27322
- title: 'Dossiê Detalhado & Especificações',
27442
+ title: 'Detalhes & Especificações',
27323
27443
  subtitle: 'Projeção automatizada de atributos do schema canônico',
27324
27444
  columns: Math.min(3, Math.max(1, cards.length)),
27325
27445
  minCardWidth: 260,
@@ -51819,14 +51939,13 @@ class BehaviorConfigEditorComponent {
51819
51939
  this.arrayToString(pagination.pageSizeOptions || [5, 10, 25, 50]),
51820
51940
  ],
51821
51941
  showFirstLastButtons: [pagination.showFirstLastButtons !== false],
51822
- // Default adaptado: se houver resourcePath e não houver override, usar 'server'
51823
- paginationStrategy: [this.resourcePath ? 'server' : 'client'], // V2 only
51942
+ paginationStrategy: [this.isV2 ? null : (this.resourcePath ? 'server' : 'client')],
51824
51943
  paginationPosition: ['bottom'],
51825
51944
  paginationStyle: ['default'],
51826
51945
  // Sorting
51827
51946
  sortingEnabled: [gridOptions.sortable !== false],
51828
51947
  multiSort: [false], // V2 only
51829
- sortingStrategy: ['client'], // V2 only
51948
+ sortingStrategy: [this.isV2 ? null : 'client'],
51830
51949
  allowClearSort: [true], // V2 only
51831
51950
  defaultSortField: [''],
51832
51951
  defaultSortDirection: ['asc'],
@@ -51919,8 +52038,7 @@ class BehaviorConfigEditorComponent {
51919
52038
  pageSize: behavior.pagination.pageSize || 10,
51920
52039
  pageSizeOptions: this.arrayToString(behavior.pagination.pageSizeOptions || [5, 10, 25, 50]),
51921
52040
  showFirstLastButtons: behavior.pagination.showFirstLastButtons !== false,
51922
- // Se a estratégia não estiver definida, respeitar contexto de resourcePath
51923
- paginationStrategy: behavior.pagination.strategy ?? (this.resourcePath ? 'server' : 'client'),
52041
+ paginationStrategy: behavior.pagination.strategy ?? null,
51924
52042
  paginationPosition: behavior.pagination.position || 'bottom',
51925
52043
  paginationStyle: behavior.pagination.style || 'default',
51926
52044
  });
@@ -51929,7 +52047,7 @@ class BehaviorConfigEditorComponent {
51929
52047
  this.behaviorForm.patchValue({
51930
52048
  sortingEnabled: behavior.sorting.enabled !== false,
51931
52049
  multiSort: behavior.sorting.multiSort || false,
51932
- sortingStrategy: behavior.sorting.strategy || 'client',
52050
+ sortingStrategy: behavior.sorting.strategy ?? null,
51933
52051
  allowClearSort: behavior.sorting.allowClearSort !== false,
51934
52052
  defaultSortField: (Array.isArray(behavior.sorting.defaultSort) ? behavior.sorting.defaultSort[0]?.column : behavior.sorting.defaultSort?.column) || '',
51935
52053
  defaultSortDirection: (Array.isArray(behavior.sorting.defaultSort) ? behavior.sorting.defaultSort[0]?.direction : behavior.sorting.defaultSort?.direction) || 'asc',
@@ -52108,6 +52226,8 @@ class BehaviorConfigEditorComponent {
52108
52226
  position: values.paginationPosition || 'bottom',
52109
52227
  style: values.paginationStyle || 'default',
52110
52228
  };
52229
+ if (paginationStrategy === undefined)
52230
+ delete v2Config.behavior.pagination.strategy;
52111
52231
  // Sorting
52112
52232
  v2Config.behavior.sorting = {
52113
52233
  enabled: values.sortingEnabled,
@@ -52117,6 +52237,8 @@ class BehaviorConfigEditorComponent {
52117
52237
  showSortIndicators: true,
52118
52238
  indicatorPosition: 'end',
52119
52239
  };
52240
+ if (sortingStrategy === undefined)
52241
+ delete v2Config.behavior.sorting.strategy;
52120
52242
  const dfField = (values.defaultSortField || '').trim();
52121
52243
  const dfDir = values.defaultSortDirection;
52122
52244
  if (dfField) {
@@ -52364,7 +52486,7 @@ class BehaviorConfigEditorComponent {
52364
52486
  resolveStrategy(value) {
52365
52487
  if (this.forceClientStrategies)
52366
52488
  return 'client';
52367
- return value === 'server' ? 'server' : 'client';
52489
+ return value === 'server' || value === 'client' ? value : undefined;
52368
52490
  }
52369
52491
  enforceStrategyConstraints(emitEvent) {
52370
52492
  if (!this.isV2 || !this.forceClientStrategies || !this.behaviorForm) {
@@ -52667,7 +52789,8 @@ class BehaviorConfigEditorComponent {
52667
52789
 
52668
52790
  @if (isV2) { <mat-form-field appearance="outline">
52669
52791
  <mat-label>{{ tx('behavior.pagination.strategy', 'Pagination strategy') }}</mat-label>
52670
- <mat-select formControlName="paginationStrategy">
52792
+ <mat-select formControlName="paginationStrategy" [canSelectNullableOptions]="true">
52793
+ @if (!forceClientStrategies) { <mat-option [value]="null">{{ tx('behavior.strategy.auto', 'Automatic (by data source)') }}</mat-option> }
52671
52794
  <mat-option value="client">{{ tx('behavior.pagination.strategy.client', 'Client (local data)') }}</mat-option>
52672
52795
  <mat-option value="server" [disabled]="forceClientStrategies"
52673
52796
  >{{ tx('behavior.pagination.strategy.server', 'Server (remote pagination)') }}</mat-option
@@ -52755,7 +52878,8 @@ class BehaviorConfigEditorComponent {
52755
52878
 
52756
52879
  <mat-form-field appearance="outline">
52757
52880
  <mat-label>{{ tx('behavior.sorting.strategy', 'Sorting strategy') }}</mat-label>
52758
- <mat-select formControlName="sortingStrategy">
52881
+ <mat-select formControlName="sortingStrategy" [canSelectNullableOptions]="true">
52882
+ @if (!forceClientStrategies) { <mat-option [value]="null">{{ tx('behavior.strategy.auto', 'Automatic (by data source)') }}</mat-option> }
52759
52883
  <mat-option value="client"
52760
52884
  >{{ tx('behavior.sorting.strategy.client', 'Client (local sorting)') }}</mat-option
52761
52885
  >
@@ -53689,7 +53813,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
53689
53813
 
53690
53814
  @if (isV2) { <mat-form-field appearance="outline">
53691
53815
  <mat-label>{{ tx('behavior.pagination.strategy', 'Pagination strategy') }}</mat-label>
53692
- <mat-select formControlName="paginationStrategy">
53816
+ <mat-select formControlName="paginationStrategy" [canSelectNullableOptions]="true">
53817
+ @if (!forceClientStrategies) { <mat-option [value]="null">{{ tx('behavior.strategy.auto', 'Automatic (by data source)') }}</mat-option> }
53693
53818
  <mat-option value="client">{{ tx('behavior.pagination.strategy.client', 'Client (local data)') }}</mat-option>
53694
53819
  <mat-option value="server" [disabled]="forceClientStrategies"
53695
53820
  >{{ tx('behavior.pagination.strategy.server', 'Server (remote pagination)') }}</mat-option
@@ -53777,7 +53902,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
53777
53902
 
53778
53903
  <mat-form-field appearance="outline">
53779
53904
  <mat-label>{{ tx('behavior.sorting.strategy', 'Sorting strategy') }}</mat-label>
53780
- <mat-select formControlName="sortingStrategy">
53905
+ <mat-select formControlName="sortingStrategy" [canSelectNullableOptions]="true">
53906
+ @if (!forceClientStrategies) { <mat-option [value]="null">{{ tx('behavior.strategy.auto', 'Automatic (by data source)') }}</mat-option> }
53781
53907
  <mat-option value="client"
53782
53908
  >{{ tx('behavior.sorting.strategy.client', 'Client (local sorting)') }}</mat-option
53783
53909
  >
@@ -67848,7 +67974,6 @@ class PraxisTableConfigEditor {
67848
67974
  sorting: {
67849
67975
  enabled: true,
67850
67976
  multiSort: false,
67851
- strategy: 'client',
67852
67977
  showSortIndicators: true,
67853
67978
  indicatorPosition: 'end',
67854
67979
  allowClearSort: true,
@@ -67867,7 +67992,6 @@ class PraxisTableConfigEditor {
67867
67992
  showPageInfo: true,
67868
67993
  position: 'bottom',
67869
67994
  style: 'default',
67870
- strategy: 'client',
67871
67995
  },
67872
67996
  },
67873
67997
  toolbar: {
@@ -68543,7 +68667,7 @@ class PraxisScopeBarComponent {
68543
68667
  }
68544
68668
  activeIdChange = new EventEmitter();
68545
68669
  showOmnibox = true;
68546
- omniboxPlaceholder = 'Buscar por codinome, nome, status...';
68670
+ omniboxPlaceholder = 'Buscar registros...';
68547
68671
  set omniboxValue(val) {
68548
68672
  if (val !== undefined && val !== this.currentSearchText()) {
68549
68673
  this.currentSearchText.set(val);
@@ -73496,11 +73620,11 @@ class PraxisTableInlineAuthoringEditorComponent {
73496
73620
  pageSize = 10;
73497
73621
  pageSizeOptionsText = '5, 10, 25, 50';
73498
73622
  showFirstLastButtons = true;
73499
- paginationStrategy = 'client';
73623
+ paginationStrategy;
73500
73624
  paginationPosition = 'bottom';
73501
73625
  paginationStyle = 'default';
73502
73626
  sortingEnabled = true;
73503
- sortingStrategy = 'client';
73627
+ sortingStrategy;
73504
73628
  allowClearSort = true;
73505
73629
  defaultSortField = '';
73506
73630
  defaultSortDirection = 'asc';
@@ -73543,11 +73667,11 @@ class PraxisTableInlineAuthoringEditorComponent {
73543
73667
  this.pageSizeOptionsText = this.arrayToString(this.workingConfig.behavior?.pagination?.pageSizeOptions || [5, 10, 25, 50]);
73544
73668
  this.showFirstLastButtons =
73545
73669
  this.workingConfig.behavior?.pagination?.showFirstLastButtons !== false;
73546
- this.paginationStrategy = this.workingConfig.behavior?.pagination?.strategy || 'client';
73670
+ this.paginationStrategy = this.workingConfig.behavior?.pagination?.strategy;
73547
73671
  this.paginationPosition = this.workingConfig.behavior?.pagination?.position || 'bottom';
73548
73672
  this.paginationStyle = this.workingConfig.behavior?.pagination?.style || 'default';
73549
73673
  this.sortingEnabled = this.workingConfig.behavior?.sorting?.enabled !== false;
73550
- this.sortingStrategy = this.workingConfig.behavior?.sorting?.strategy || 'client';
73674
+ this.sortingStrategy = this.workingConfig.behavior?.sorting?.strategy;
73551
73675
  this.allowClearSort = this.workingConfig.behavior?.sorting?.allowClearSort !== false;
73552
73676
  this.defaultSortField = this.getDefaultSortField(this.workingConfig);
73553
73677
  this.defaultSortDirection = this.getDefaultSortDirection(this.workingConfig);
@@ -73659,7 +73783,7 @@ class PraxisTableInlineAuthoringEditorComponent {
73659
73783
  this.patchPagination();
73660
73784
  }
73661
73785
  setPaginationStrategy(value) {
73662
- this.paginationStrategy = value || 'client';
73786
+ this.paginationStrategy = value;
73663
73787
  this.patchPagination();
73664
73788
  }
73665
73789
  setPaginationPosition(value) {
@@ -73675,7 +73799,7 @@ class PraxisTableInlineAuthoringEditorComponent {
73675
73799
  this.patchSorting();
73676
73800
  }
73677
73801
  setSortingStrategy(value) {
73678
- this.sortingStrategy = value || 'client';
73802
+ this.sortingStrategy = value;
73679
73803
  this.patchSorting();
73680
73804
  }
73681
73805
  setSortingAllowClear(value) {
@@ -73734,11 +73858,11 @@ class PraxisTableInlineAuthoringEditorComponent {
73734
73858
  this.pageSizeOptionsText = this.arrayToString(this.workingConfig.behavior?.pagination?.pageSizeOptions || [5, 10, 25, 50]);
73735
73859
  this.showFirstLastButtons =
73736
73860
  this.workingConfig.behavior?.pagination?.showFirstLastButtons !== false;
73737
- this.paginationStrategy = this.workingConfig.behavior?.pagination?.strategy || 'client';
73861
+ this.paginationStrategy = this.workingConfig.behavior?.pagination?.strategy;
73738
73862
  this.paginationPosition = this.workingConfig.behavior?.pagination?.position || 'bottom';
73739
73863
  this.paginationStyle = this.workingConfig.behavior?.pagination?.style || 'default';
73740
73864
  this.sortingEnabled = this.workingConfig.behavior?.sorting?.enabled !== false;
73741
- this.sortingStrategy = this.workingConfig.behavior?.sorting?.strategy || 'client';
73865
+ this.sortingStrategy = this.workingConfig.behavior?.sorting?.strategy;
73742
73866
  this.allowClearSort = this.workingConfig.behavior?.sorting?.allowClearSort !== false;
73743
73867
  this.defaultSortField = this.getDefaultSortField(this.workingConfig);
73744
73868
  this.defaultSortDirection = this.getDefaultSortDirection(this.workingConfig);
@@ -73882,34 +74006,36 @@ class PraxisTableInlineAuthoringEditorComponent {
73882
74006
  this.emitConfig();
73883
74007
  }
73884
74008
  patchPagination() {
73885
- this.patchBehavior({
73886
- pagination: {
73887
- ...(this.workingConfig.behavior?.pagination || {}),
73888
- enabled: this.paginationEnabled,
73889
- pageSize: this.pageSize,
73890
- pageSizeOptions: this.parseNumberList(this.pageSizeOptionsText, [5, 10, 25, 50]),
73891
- showFirstLastButtons: this.showFirstLastButtons,
73892
- showPageNumbers: this.workingConfig.behavior?.pagination?.showPageNumbers ?? true,
73893
- showPageInfo: this.workingConfig.behavior?.pagination?.showPageInfo ?? true,
73894
- position: this.paginationPosition,
73895
- style: this.paginationStyle,
73896
- strategy: this.paginationStrategy,
73897
- },
73898
- });
74009
+ const pagination = {
74010
+ ...(this.workingConfig.behavior?.pagination || {}),
74011
+ enabled: this.paginationEnabled,
74012
+ pageSize: this.pageSize,
74013
+ pageSizeOptions: this.parseNumberList(this.pageSizeOptionsText, [5, 10, 25, 50]),
74014
+ showFirstLastButtons: this.showFirstLastButtons,
74015
+ showPageNumbers: this.workingConfig.behavior?.pagination?.showPageNumbers ?? true,
74016
+ showPageInfo: this.workingConfig.behavior?.pagination?.showPageInfo ?? true,
74017
+ position: this.paginationPosition,
74018
+ style: this.paginationStyle,
74019
+ strategy: this.paginationStrategy,
74020
+ };
74021
+ if (this.paginationStrategy === undefined)
74022
+ delete pagination.strategy;
74023
+ this.patchBehavior({ pagination });
73899
74024
  }
73900
74025
  patchSorting() {
73901
- this.patchBehavior({
73902
- sorting: {
73903
- ...(this.workingConfig.behavior?.sorting || {}),
73904
- enabled: this.sortingEnabled,
73905
- strategy: this.sortingStrategy,
73906
- allowClearSort: this.allowClearSort,
73907
- multiSort: this.workingConfig.behavior?.sorting?.multiSort ?? false,
73908
- showSortIndicators: this.workingConfig.behavior?.sorting?.showSortIndicators ?? true,
73909
- indicatorPosition: this.workingConfig.behavior?.sorting?.indicatorPosition || 'end',
73910
- defaultSort: this.buildDefaultSort(),
73911
- },
73912
- });
74026
+ const sorting = {
74027
+ ...(this.workingConfig.behavior?.sorting || {}),
74028
+ enabled: this.sortingEnabled,
74029
+ strategy: this.sortingStrategy,
74030
+ allowClearSort: this.allowClearSort,
74031
+ multiSort: this.workingConfig.behavior?.sorting?.multiSort ?? false,
74032
+ showSortIndicators: this.workingConfig.behavior?.sorting?.showSortIndicators ?? true,
74033
+ indicatorPosition: this.workingConfig.behavior?.sorting?.indicatorPosition || 'end',
74034
+ defaultSort: this.buildDefaultSort(),
74035
+ };
74036
+ if (this.sortingStrategy === undefined)
74037
+ delete sorting.strategy;
74038
+ this.patchBehavior({ sorting });
73913
74039
  }
73914
74040
  patchMessages(patch) {
73915
74041
  this.workingConfig = {
@@ -74251,10 +74377,12 @@ class PraxisTableInlineAuthoringEditorComponent {
74251
74377
  <mat-label>{{ tx('behavior.pagination.strategy', 'Pagination strategy') }}</mat-label>
74252
74378
  <mat-select
74253
74379
  data-testid="table-inline-editor-pagination-strategy"
74380
+ [canSelectNullableOptions]="true"
74254
74381
  [ngModel]="paginationStrategy"
74255
74382
  (ngModelChange)="setPaginationStrategy($event)"
74256
74383
  [disabled]="readonly || !paginationEnabled"
74257
74384
  >
74385
+ <mat-option [value]="undefined">{{ tx('behavior.strategy.auto', 'Automatic (by data source)') }}</mat-option>
74258
74386
  <mat-option value="client">{{ tx('behavior.pagination.strategy.client', 'Client (local data)') }}</mat-option>
74259
74387
  <mat-option value="server">{{ tx('behavior.pagination.strategy.server', 'Server (remote pagination)') }}</mat-option>
74260
74388
  </mat-select>
@@ -74302,10 +74430,12 @@ class PraxisTableInlineAuthoringEditorComponent {
74302
74430
  <mat-label>{{ tx('behavior.sorting.strategy', 'Sorting strategy') }}</mat-label>
74303
74431
  <mat-select
74304
74432
  data-testid="table-inline-editor-sorting-strategy"
74433
+ [canSelectNullableOptions]="true"
74305
74434
  [ngModel]="sortingStrategy"
74306
74435
  (ngModelChange)="setSortingStrategy($event)"
74307
74436
  [disabled]="readonly || !sortingEnabled"
74308
74437
  >
74438
+ <mat-option [value]="undefined">{{ tx('behavior.strategy.auto', 'Automatic (by data source)') }}</mat-option>
74309
74439
  <mat-option value="client">{{ tx('behavior.sorting.strategy.client', 'Client (local sorting)') }}</mat-option>
74310
74440
  <mat-option value="server">{{ tx('behavior.sorting.strategy.server', 'Server (remote sorting)') }}</mat-option>
74311
74441
  </mat-select>
@@ -74734,10 +74864,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
74734
74864
  <mat-label>{{ tx('behavior.pagination.strategy', 'Pagination strategy') }}</mat-label>
74735
74865
  <mat-select
74736
74866
  data-testid="table-inline-editor-pagination-strategy"
74867
+ [canSelectNullableOptions]="true"
74737
74868
  [ngModel]="paginationStrategy"
74738
74869
  (ngModelChange)="setPaginationStrategy($event)"
74739
74870
  [disabled]="readonly || !paginationEnabled"
74740
74871
  >
74872
+ <mat-option [value]="undefined">{{ tx('behavior.strategy.auto', 'Automatic (by data source)') }}</mat-option>
74741
74873
  <mat-option value="client">{{ tx('behavior.pagination.strategy.client', 'Client (local data)') }}</mat-option>
74742
74874
  <mat-option value="server">{{ tx('behavior.pagination.strategy.server', 'Server (remote pagination)') }}</mat-option>
74743
74875
  </mat-select>
@@ -74785,10 +74917,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
74785
74917
  <mat-label>{{ tx('behavior.sorting.strategy', 'Sorting strategy') }}</mat-label>
74786
74918
  <mat-select
74787
74919
  data-testid="table-inline-editor-sorting-strategy"
74920
+ [canSelectNullableOptions]="true"
74788
74921
  [ngModel]="sortingStrategy"
74789
74922
  (ngModelChange)="setSortingStrategy($event)"
74790
74923
  [disabled]="readonly || !sortingEnabled"
74791
74924
  >
74925
+ <mat-option [value]="undefined">{{ tx('behavior.strategy.auto', 'Automatic (by data source)') }}</mat-option>
74792
74926
  <mat-option value="client">{{ tx('behavior.sorting.strategy.client', 'Client (local sorting)') }}</mat-option>
74793
74927
  <mat-option value="server">{{ tx('behavior.sorting.strategy.server', 'Server (remote sorting)') }}</mat-option>
74794
74928
  </mat-select>
@@ -1,6 +1,6 @@
1
1
  import { Observable, firstValueFrom } from 'rxjs';
2
2
  import { withAuthoringScopePolicy } from '@praxisui/ai';
3
- import { ar as setTableActionGlobalActionRef } from './praxisui-table-praxisui-table-ConSKl5g.mjs';
3
+ import { ar as setTableActionGlobalActionRef } from './praxisui-table-praxisui-table-DgsQmMK8.mjs';
4
4
 
5
5
  class TableAgenticAuthoringTurnFlow {
6
6
  adapter;
@@ -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 { W as TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS, p as PRAXIS_TABLE_AUTHORING_MANIFEST, T as TABLE_AI_CAPABILITIES, a6 as coerceTableComponentEditPlans, a8 as compileTableComponentEditPlans, Y as TASK_PRESETS, ae as getTableComponentEditPlanCapabilities, R as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, O as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, U as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, X as TABLE_COMPONENT_EDIT_PLAN_VERSION, Q as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, V as TABLE_COMPONENT_EDIT_PLAN_KIND } from './praxisui-table-praxisui-table-ConSKl5g.mjs';
4
+ import { W as TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS, p as PRAXIS_TABLE_AUTHORING_MANIFEST, T as TABLE_AI_CAPABILITIES, a6 as coerceTableComponentEditPlans, a8 as compileTableComponentEditPlans, Y as TASK_PRESETS, ae as getTableComponentEditPlanCapabilities, R as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, O as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, U as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, X as TABLE_COMPONENT_EDIT_PLAN_VERSION, Q as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, V as TABLE_COMPONENT_EDIT_PLAN_KIND } from './praxisui-table-praxisui-table-DgsQmMK8.mjs';
5
5
 
6
6
  const TABLE_ROW_EXPRESSION_CONTEXT_OPTION = {
7
7
  mode: 'expression',
@@ -1,2 +1,2 @@
1
- export { A as ANALYTICS_TABLE_ROW_KEY_FIELD, a as AnalyticalDrawerRegistryService, b as AnalyticsTableConfigAdapterService, c as AnalyticsTableContractService, d as AnalyticsTableStatsApiService, B as BOOLEAN_PRESETS, e as BehaviorConfigEditorComponent, C as CURRENCY_PRESETS, f as ColumnsConfigEditorComponent, D as DATE_PRESETS, g as DataFormatterComponent, h as DataFormattingService, F as FORMULA_TEMPLATES, i as FilterConfigService, j as FilterSettingsComponent, k as FormulaGeneratorService, J as JsonConfigEditorComponent, M as MessagesLocalizationEditorComponent, N as NUMBER_PRESETS, P as PERCENTAGE_PRESETS, l as PRAXIS_ANALYTICAL_DRAWER_SCHEMAS, m as PRAXIS_FILTER_AUTHORING_MANIFEST, n as PRAXIS_FILTER_COMPONENT_METADATA, o as PRAXIS_FILTER_VIEW_CONTEXT_SCHEMA_VERSION, p as PRAXIS_TABLE_AUTHORING_MANIFEST, q as PRAXIS_TABLE_COMPONENT_METADATA, r as PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS, s as PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, t as PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, u as PraxisAnalyticalDrawerComponent, v as PraxisFilter, w as PraxisFilterOutletComponent, x as PraxisFilterOutletDirective, y as PraxisFilterWidgetConfigEditor, z as PraxisScopeBarComponent, E as PraxisTable, G as PraxisTableConfigEditor, H as PraxisTableInlineAuthoringEditorComponent, I as PraxisTableToolbar, K as PraxisTableWidgetConfigEditor, S as STRING_PRESETS, T as TABLE_AI_CAPABILITIES, L as TABLE_COMPONENT_AI_CAPABILITIES, O as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, Q as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, R as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, U as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, V as TABLE_COMPONENT_EDIT_PLAN_KIND, X as TABLE_COMPONENT_EDIT_PLAN_VERSION, Y as TASK_PRESETS, Z as TableDefaultsProvider, _ as TableRulesEditorComponent, $ as ToolbarActionsEditorComponent, a0 as ValueMappingEditorComponent, a1 as VisualFormulaBuilderComponent, a2 as analyticsComparisonMetricField, a3 as applyComputedFieldsToRows, a4 as buildTableApplyPlan, a5 as coerceTableComponentEditPlan, a6 as coerceTableComponentEditPlans, a7 as compileTableComponentEditPlan, a8 as compileTableComponentEditPlans, a9 as createTableAuthoringDocument, aa as formatComputedFieldValue, ab as getActionId, ac as getEnum, ad as getTableCapabilities, ae as getTableComponentEditPlanCapabilities, af as interpolateRelationEndpoint, ag as isAnalyticalDrawerSchema, ah as isTableRendererSupportedByRichContentP0, ai as mapTableRendererToRichContentP0, aj as normalizeComputedFieldDefinition, ak as normalizeTableAuthoringDocument, al as parseLegacyOrTableDocument, am as providePraxisAnalyticalDrawerSchemas, an as providePraxisFilterMetadata, ao as providePraxisTableMetadata, ap as providePraxisTableToolbarAppearance, aq as serializeTableAuthoringDocument, as as toCanonicalTableConfig, at as validateTableAuthoringDocument } from './praxisui-table-praxisui-table-ConSKl5g.mjs';
1
+ export { A as ANALYTICS_TABLE_ROW_KEY_FIELD, a as AnalyticalDrawerRegistryService, b as AnalyticsTableConfigAdapterService, c as AnalyticsTableContractService, d as AnalyticsTableStatsApiService, B as BOOLEAN_PRESETS, e as BehaviorConfigEditorComponent, C as CURRENCY_PRESETS, f as ColumnsConfigEditorComponent, D as DATE_PRESETS, g as DataFormatterComponent, h as DataFormattingService, F as FORMULA_TEMPLATES, i as FilterConfigService, j as FilterSettingsComponent, k as FormulaGeneratorService, J as JsonConfigEditorComponent, M as MessagesLocalizationEditorComponent, N as NUMBER_PRESETS, P as PERCENTAGE_PRESETS, l as PRAXIS_ANALYTICAL_DRAWER_SCHEMAS, m as PRAXIS_FILTER_AUTHORING_MANIFEST, n as PRAXIS_FILTER_COMPONENT_METADATA, o as PRAXIS_FILTER_VIEW_CONTEXT_SCHEMA_VERSION, p as PRAXIS_TABLE_AUTHORING_MANIFEST, q as PRAXIS_TABLE_COMPONENT_METADATA, r as PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS, s as PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, t as PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, u as PraxisAnalyticalDrawerComponent, v as PraxisFilter, w as PraxisFilterOutletComponent, x as PraxisFilterOutletDirective, y as PraxisFilterWidgetConfigEditor, z as PraxisScopeBarComponent, E as PraxisTable, G as PraxisTableConfigEditor, H as PraxisTableInlineAuthoringEditorComponent, I as PraxisTableToolbar, K as PraxisTableWidgetConfigEditor, S as STRING_PRESETS, T as TABLE_AI_CAPABILITIES, L as TABLE_COMPONENT_AI_CAPABILITIES, O as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, Q as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, R as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, U as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, V as TABLE_COMPONENT_EDIT_PLAN_KIND, X as TABLE_COMPONENT_EDIT_PLAN_VERSION, Y as TASK_PRESETS, Z as TableDefaultsProvider, _ as TableRulesEditorComponent, $ as ToolbarActionsEditorComponent, a0 as ValueMappingEditorComponent, a1 as VisualFormulaBuilderComponent, a2 as analyticsComparisonMetricField, a3 as applyComputedFieldsToRows, a4 as buildTableApplyPlan, a5 as coerceTableComponentEditPlan, a6 as coerceTableComponentEditPlans, a7 as compileTableComponentEditPlan, a8 as compileTableComponentEditPlans, a9 as createTableAuthoringDocument, aa as formatComputedFieldValue, ab as getActionId, ac as getEnum, ad as getTableCapabilities, ae as getTableComponentEditPlanCapabilities, af as interpolateRelationEndpoint, ag as isAnalyticalDrawerSchema, ah as isTableRendererSupportedByRichContentP0, ai as mapTableRendererToRichContentP0, aj as normalizeComputedFieldDefinition, ak as normalizeTableAuthoringDocument, al as parseLegacyOrTableDocument, am as providePraxisAnalyticalDrawerSchemas, an as providePraxisFilterMetadata, ao as providePraxisTableMetadata, ap as providePraxisTableToolbarAppearance, aq as serializeTableAuthoringDocument, as as toCanonicalTableConfig, at as validateTableAuthoringDocument } from './praxisui-table-praxisui-table-DgsQmMK8.mjs';
2
2
  export { createDynamicRecord, extractRecordId, isDynamicDataRecord, resolveDataField } from '@praxisui/core';
package/package.json CHANGED
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "name": "@praxisui/table",
3
- "version": "10.0.0-rc.11",
3
+ "version": "10.0.0-rc.13",
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": "^10.0.0-rc.11",
10
- "@praxisui/core": "^10.0.0-rc.11",
11
- "@praxisui/dynamic-fields": "^10.0.0-rc.11",
12
- "@praxisui/dynamic-form": "^10.0.0-rc.11",
13
- "@praxisui/metadata-editor": "^10.0.0-rc.11",
14
- "@praxisui/rich-content": "^10.0.0-rc.11",
15
- "@praxisui/settings-panel": "^10.0.0-rc.11",
16
- "@praxisui/table-rule-builder": "^10.0.0-rc.11",
9
+ "@praxisui/ai": "^10.0.0-rc.13",
10
+ "@praxisui/core": "^10.0.0-rc.13",
11
+ "@praxisui/dynamic-fields": "^10.0.0-rc.13",
12
+ "@praxisui/dynamic-form": "^10.0.0-rc.13",
13
+ "@praxisui/metadata-editor": "^10.0.0-rc.13",
14
+ "@praxisui/rich-content": "^10.0.0-rc.13",
15
+ "@praxisui/settings-panel": "^10.0.0-rc.13",
16
+ "@praxisui/table-rule-builder": "^10.0.0-rc.13",
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": "^10.0.0-rc.11",
21
+ "@praxisui/dialog": "^10.0.0-rc.13",
22
22
  "rxjs": "~7.8.0"
23
23
  },
24
24
  "dependencies": {
@@ -5090,11 +5090,11 @@ declare class PraxisTableInlineAuthoringEditorComponent implements OnChanges {
5090
5090
  pageSize: number;
5091
5091
  pageSizeOptionsText: string;
5092
5092
  showFirstLastButtons: boolean;
5093
- paginationStrategy: 'client' | 'server';
5093
+ paginationStrategy: 'client' | 'server' | undefined;
5094
5094
  paginationPosition: 'top' | 'bottom' | 'both';
5095
5095
  paginationStyle: 'default' | 'simple' | 'advanced' | 'compact';
5096
5096
  sortingEnabled: boolean;
5097
- sortingStrategy: 'client' | 'server';
5097
+ sortingStrategy: 'client' | 'server' | undefined;
5098
5098
  allowClearSort: boolean;
5099
5099
  defaultSortField: string;
5100
5100
  defaultSortDirection: 'asc' | 'desc';
@@ -5122,11 +5122,11 @@ declare class PraxisTableInlineAuthoringEditorComponent implements OnChanges {
5122
5122
  setPaginationPageSize(value: number | string): void;
5123
5123
  setPaginationPageSizeOptions(value: string): void;
5124
5124
  setPaginationShowFirstLastButtons(value: boolean): void;
5125
- setPaginationStrategy(value: 'client' | 'server'): void;
5125
+ setPaginationStrategy(value: 'client' | 'server' | undefined): void;
5126
5126
  setPaginationPosition(value: 'top' | 'bottom' | 'both'): void;
5127
5127
  setPaginationStyle(value: 'default' | 'simple' | 'advanced' | 'compact'): void;
5128
5128
  setSortingEnabled(value: boolean): void;
5129
- setSortingStrategy(value: 'client' | 'server'): void;
5129
+ setSortingStrategy(value: 'client' | 'server' | undefined): void;
5130
5130
  setSortingAllowClear(value: boolean): void;
5131
5131
  setSortingDefaultField(value: string): void;
5132
5132
  setSortingDefaultDirection(value: 'asc' | 'desc'): void;
@@ -5771,7 +5771,9 @@ declare class PraxisAnalyticalDrawerComponent implements OnInit, OnChanges, OnDe
5771
5771
  private _row;
5772
5772
  set row(value: any | null);
5773
5773
  get row(): any | null;
5774
- relations: Record<string, unknown>;
5774
+ private _relations;
5775
+ set relations(value: Record<string, unknown>);
5776
+ get relations(): Record<string, unknown>;
5775
5777
  loadingRelations: boolean;
5776
5778
  closeDrawer: EventEmitter<void>;
5777
5779
  tabChange: EventEmitter<string>;
@@ -5779,6 +5781,9 @@ declare class PraxisAnalyticalDrawerComponent implements OnInit, OnChanges, OnDe
5779
5781
  key: string;
5780
5782
  endpoint: string;
5781
5783
  }>;
5784
+ protected readonly drawerConfigSignal: i0.WritableSignal<TableDrawerConfig | null>;
5785
+ protected readonly rowSignal: i0.WritableSignal<any>;
5786
+ protected readonly relationsSignal: i0.WritableSignal<Record<string, unknown>>;
5782
5787
  protected readonly activeTabId: i0.WritableSignal<string>;
5783
5788
  protected readonly customRelations: i0.WritableSignal<Record<string, unknown>>;
5784
5789
  protected readonly isFetchingRelations: i0.WritableSignal<boolean>;
@@ -5788,15 +5793,18 @@ declare class PraxisAnalyticalDrawerComponent implements OnInit, OnChanges, OnDe
5788
5793
  private readonly http;
5789
5794
  private readonly drawerRegistry;
5790
5795
  private readonly apiUrl;
5796
+ private readonly runtimeContext;
5791
5797
  private readonly sanitizer;
5792
5798
  private readonly formattingService;
5793
5799
  private relationSubs;
5794
5800
  private schemaSub?;
5801
+ private contextSub?;
5795
5802
  private static readonly urlCache;
5796
5803
  private static readonly schemaCache;
5797
5804
  private lastFetchedKey;
5798
5805
  private lastResolvingKey;
5799
5806
  static clearCache(): void;
5807
+ private getContextScopePrefix;
5800
5808
  private resolveUrl;
5801
5809
  ngOnInit(): void;
5802
5810
  ngOnChanges(changes: SimpleChanges): void;