@praxisui/table 10.0.0-rc.12 → 10.0.0-rc.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-13T20:53:39.090Z",
3
+ "generatedAt": "2026-10-14T11:31:33.532Z",
4
4
  "packageName": "@praxisui/table",
5
- "packageVersion": "10.0.0-rc.12",
5
+ "packageVersion": "10.0.0-rc.14",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 3,
@@ -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: `
@@ -22496,7 +22567,7 @@ class PraxisTable {
22496
22567
  const discovered = (this.isCollectionActionDiscoveryEnabled()
22497
22568
  ? this.collectionCapabilities?.actions || []
22498
22569
  : [])
22499
- .filter((action) => action.scope === 'COLLECTION')
22570
+ .filter((action) => action.scope === 'COLLECTION' && !action.execution?.bulk)
22500
22571
  .sort((left, right) => (left.order ?? 0) - (right.order ?? 0));
22501
22572
  const toolbar = this.config.toolbar
22502
22573
  ?? (discovered.length > 0 ? this.ensureToolbarConfigForRuntime() : null);
@@ -22544,11 +22615,17 @@ class PraxisTable {
22544
22615
  const existing = (toolbar?.actions || []);
22545
22616
  const retained = existing.filter(action => !action.__praxisBulkSyncAction);
22546
22617
  const operation = this.collectionCapabilities?.operations?.['bulk-update'];
22618
+ const hasHostBulkUpdate = Boolean(this.config?.actions?.bulk?.actions?.some((action) => action?.execution?.bulk?.mode === 'UNIFORM_UPDATE' ||
22619
+ this.normalizeActionId(action) === 'bulk-update'));
22547
22620
  let contract = null;
22548
22621
  try {
22549
- if (this.isRemoteMode() && this.isCollectionActionDiscoveryEnabled() && operation?.id === 'bulk-update'
22550
- && operation.availability?.allowed === true && operation.bulk?.mode === 'UNIFORM_UPDATE'
22551
- && operation.bulk.editableFields?.requestSchema.url) {
22622
+ if (!hasHostBulkUpdate &&
22623
+ this.isRemoteMode() &&
22624
+ this.isCollectionActionDiscoveryEnabled() &&
22625
+ operation?.id === 'bulk-update' &&
22626
+ operation.availability?.allowed === true &&
22627
+ operation.bulk?.mode === 'UNIFORM_UPDATE' &&
22628
+ operation.bulk.editableFields?.requestSchema.url) {
22552
22629
  contract = this.bulkClient.fromCapability(operation);
22553
22630
  }
22554
22631
  }
@@ -23011,7 +23088,7 @@ class PraxisTable {
23011
23088
  if (this.aiAdapter || this.aiAdapterLoadStarted)
23012
23089
  return;
23013
23090
  this.aiAdapterLoadStarted = true;
23014
- import('./praxisui-table-table-ai.adapter-nUhrYuKK.mjs')
23091
+ import('./praxisui-table-table-ai.adapter-DeqsjWq6.mjs')
23015
23092
  .then(({ TableAiAdapter }) => {
23016
23093
  if (!this.isAiAssistantEnabled()) {
23017
23094
  this.aiAssistantOpenAfterAdapterLoad = false;
@@ -23592,11 +23669,25 @@ class PraxisTable {
23592
23669
  sourceCandidateIds: ['table.appearance.compact-view'],
23593
23670
  });
23594
23671
  }
23595
- const publicViewCandidates = visibleColumns.filter((column) => column.type === 'currency'
23596
- || column.type === 'number'
23597
- || normalizedColumnText(column).includes('email')
23598
- || normalizedColumnText(column).includes('cpf')
23599
- || normalizedColumnText(column).includes('salario'));
23672
+ const schemaFieldByName = new Map();
23673
+ for (const f of this.schemaColumnFieldsSnapshot || []) {
23674
+ if (f?.name)
23675
+ schemaFieldByName.set(f.name, f);
23676
+ }
23677
+ for (const f of this.schemaFieldsSnapshot || []) {
23678
+ if (f?.name && !schemaFieldByName.has(f.name))
23679
+ schemaFieldByName.set(f.name, f);
23680
+ }
23681
+ const publicViewCandidates = visibleColumns.filter((column) => {
23682
+ const schemaField = schemaFieldByName.get(column.field);
23683
+ const format = String(column.format || schemaField?.format || '').toLowerCase();
23684
+ return (column.type === 'currency' ||
23685
+ column.type === 'number' ||
23686
+ format === 'email' ||
23687
+ format.startsWith('currency') ||
23688
+ this.isSensitiveAiAssistantField(column.field) ||
23689
+ Boolean(column.sensitive || schemaField?.sensitive || schemaField?.governance?.sensitive));
23690
+ });
23600
23691
  if (publicViewCandidates.length) {
23601
23692
  recommendations.push({
23602
23693
  id: 'table-curate-public-view',
@@ -23627,9 +23718,14 @@ class PraxisTable {
23627
23718
  sourceCandidateIds: ['table.governance.public-view', 'column.visibility.set'],
23628
23719
  });
23629
23720
  }
23630
- const booleanOrStatusColumn = columns.find((column) => column.type === 'boolean'
23631
- || normalizedColumnText(column).includes('status')
23632
- || normalizedColumnText(column).includes('ativo'));
23721
+ const booleanOrStatusColumn = columns.find((column) => {
23722
+ const schemaField = schemaFieldByName.get(column.field);
23723
+ const rendererType = column.renderer?.type;
23724
+ return (column.type === 'boolean' ||
23725
+ rendererType === 'badge' ||
23726
+ rendererType === 'status' ||
23727
+ Boolean(Array.isArray(schemaField?.options) && schemaField.options.length > 0));
23728
+ });
23633
23729
  if (booleanOrStatusColumn) {
23634
23730
  recommendations.push({
23635
23731
  id: 'table-curate-status-badges',
@@ -23643,7 +23739,7 @@ class PraxisTable {
23643
23739
  tone: 'success',
23644
23740
  action: {
23645
23741
  kind: 'submit-prompt',
23646
- prompt: t('table.assistant.recommendation.statusBadge.prompt', 'Transforme a coluna de status ou ativo em badges visuais com texto curto e cores adequadas.'),
23742
+ prompt: t('table.assistant.recommendation.statusBadge.prompt', 'Transforme a coluna de status ou estado booleano em badges visuais com texto curto e cores adequadas.'),
23647
23743
  contextHints: {
23648
23744
  source: 'table-capability-discovery-curation',
23649
23745
  opportunityId: 'table.appearance.status-badge',
@@ -23655,8 +23751,15 @@ class PraxisTable {
23655
23751
  sourceCandidateIds: ['table.appearance.status-badge', 'column.renderer.set'],
23656
23752
  });
23657
23753
  }
23658
- const categoricalColumns = visibleColumns.filter((column) => column.type === 'string'
23659
- && /departamento|department|cargo|role|categoria|category/u.test(normalizedColumnText(column)));
23754
+ const categoricalColumns = visibleColumns.filter((column) => {
23755
+ const schemaField = schemaFieldByName.get(column.field);
23756
+ const controlType = String(schemaField?.controlType || '').toLowerCase();
23757
+ return (column.type === 'string' &&
23758
+ (Boolean(Array.isArray(schemaField?.options) && schemaField.options.length > 0) ||
23759
+ controlType === 'select' ||
23760
+ controlType === 'radio' ||
23761
+ controlType === 'chip-list'));
23762
+ });
23660
23763
  if (categoricalColumns.length) {
23661
23764
  recommendations.push({
23662
23765
  id: 'table-curate-categorical-chips',
@@ -23757,7 +23860,7 @@ class PraxisTable {
23757
23860
  initializeAiAssistantController() {
23758
23861
  if (!this.aiAdapter || this.aiAssistantController)
23759
23862
  return;
23760
- import('./praxisui-table-table-agentic-authoring-turn-flow-7mVc-Xm1.mjs')
23863
+ import('./praxisui-table-table-agentic-authoring-turn-flow-CdntM1P6.mjs')
23761
23864
  .then(({ TableAgenticAuthoringTurnFlow }) => {
23762
23865
  if (this.aiAssistantController || !this.aiAdapter)
23763
23866
  return;
@@ -27236,10 +27339,23 @@ class PraxisTable {
27236
27339
  const statusGroup = [];
27237
27340
  const detailsGroup = [];
27238
27341
  for (const field of filteredFields) {
27239
- const nameLower = field.name.toLowerCase();
27240
27342
  const typeLower = (field.type || '').toLowerCase();
27241
- const isNumeric = typeLower === 'number' || typeLower === 'integer' || typeLower === 'currency' || typeLower === 'decimal' || /score|resistencia|valor|preco|custo|total|saldo|taxa|percent/i.test(nameLower);
27242
- const isStatusOrDate = typeLower === 'boolean' || typeLower.includes('date') || typeLower.includes('time') || /status|ativo|situacao|data|date|prazo/i.test(nameLower);
27343
+ const formatLower = (field.format || '').toLowerCase();
27344
+ const isNumeric = typeLower === 'number' ||
27345
+ typeLower === 'integer' ||
27346
+ typeLower === 'currency' ||
27347
+ typeLower === 'decimal' ||
27348
+ typeLower === 'percent' ||
27349
+ formatLower.startsWith('currency') ||
27350
+ formatLower === 'percent' ||
27351
+ formatLower === 'percentage';
27352
+ const isStatusOrDate = typeLower === 'boolean' ||
27353
+ typeLower === 'date' ||
27354
+ typeLower === 'datetime' ||
27355
+ typeLower === 'date-time' ||
27356
+ typeLower === 'time' ||
27357
+ formatLower === 'date' ||
27358
+ formatLower === 'date-time';
27243
27359
  if (isNumeric) {
27244
27360
  metricsGroup.push(field);
27245
27361
  }
@@ -27257,7 +27373,7 @@ class PraxisTable {
27257
27373
  if (detailsGroup.length > 0)
27258
27374
  groupMap.set('Especificações & Detalhes', detailsGroup);
27259
27375
  if (groupMap.size === 0) {
27260
- groupMap.set('Dossiê Complementar', filteredFields);
27376
+ groupMap.set('Detalhes Complementares', filteredFields);
27261
27377
  }
27262
27378
  }
27263
27379
  const cards = [];
@@ -27268,15 +27384,18 @@ class PraxisTable {
27268
27384
  const fieldName = field.name;
27269
27385
  const fieldLabel = field.label || this.humanizeFieldName(fieldName);
27270
27386
  const typeLower = (field.type || '').toLowerCase();
27271
- const nameLower = fieldName.toLowerCase();
27272
- if (typeLower === 'boolean' || /ativo|bloqueado|habilitado|urgente|critico/i.test(nameLower)) {
27387
+ const formatLower = (field.format || '').toLowerCase();
27388
+ if (typeLower === 'boolean') {
27273
27389
  items.push({
27274
27390
  type: 'badge',
27275
27391
  labelExpr: `row.${fieldName} ? '${fieldLabel}: Sim' : '${fieldLabel}: Não'`,
27276
27392
  icon: field.icon || 'check_circle',
27277
27393
  });
27278
27394
  }
27279
- else if (/score|resistencia|taxa|percent|progresso|desempenho/i.test(nameLower)) {
27395
+ else if (typeLower === 'percent' ||
27396
+ formatLower === 'percent' ||
27397
+ formatLower === 'percentage' ||
27398
+ formatLower === 'progress') {
27280
27399
  items.push({
27281
27400
  type: 'progress',
27282
27401
  label: fieldLabel,
@@ -27285,7 +27404,12 @@ class PraxisTable {
27285
27404
  showPercent: true,
27286
27405
  });
27287
27406
  }
27288
- else if (typeLower.includes('date') || typeLower.includes('time') || /data|date/i.test(nameLower)) {
27407
+ else if (typeLower === 'date' ||
27408
+ typeLower === 'datetime' ||
27409
+ typeLower === 'date-time' ||
27410
+ typeLower === 'time' ||
27411
+ formatLower === 'date' ||
27412
+ formatLower === 'date-time') {
27289
27413
  items.push({
27290
27414
  type: 'metric',
27291
27415
  label: fieldLabel,
@@ -27298,14 +27422,14 @@ class PraxisTable {
27298
27422
  type: 'metric',
27299
27423
  label: fieldLabel,
27300
27424
  valueExpr: `row.${fieldName}`,
27301
- icon: field.icon || (/descricao|motivo|observacao/i.test(nameLower) ? 'notes' : 'info'),
27425
+ icon: field.icon || 'info',
27302
27426
  });
27303
27427
  }
27304
27428
  }
27305
27429
  cards.push({
27306
27430
  id: `card-${cardIdx++}`,
27307
27431
  title: groupTitle,
27308
- subtitle: `Registros complementares de ${groupTitle.toLowerCase()}`,
27432
+ subtitle: `Atributos complementares de ${groupTitle.toLowerCase()}`,
27309
27433
  content: [
27310
27434
  {
27311
27435
  type: 'compose',
@@ -27321,7 +27445,7 @@ class PraxisTable {
27321
27445
  items: [
27322
27446
  {
27323
27447
  type: 'cardGrid',
27324
- title: 'Dossiê Detalhado & Especificações',
27448
+ title: 'Detalhes & Especificações',
27325
27449
  subtitle: 'Projeção automatizada de atributos do schema canônico',
27326
27450
  columns: Math.min(3, Math.max(1, cards.length)),
27327
27451
  minCardWidth: 260,
@@ -30116,7 +30240,7 @@ class PraxisTable {
30116
30240
  tryHandleCollectionWorkflowToolbarAction(actionId, actionConfig) {
30117
30241
  const discovered = actionConfig?.__praxisDiscoveredAction
30118
30242
  || this.collectionCapabilities?.actions?.find((candidate) => candidate.scope === 'COLLECTION' && this.normalizeActionId(candidate) === actionId.toLowerCase());
30119
- if (!discovered || discovered.scope !== 'COLLECTION')
30243
+ if (!discovered || discovered.scope !== 'COLLECTION' || discovered.execution?.bulk)
30120
30244
  return false;
30121
30245
  const idsField = String(discovered.execution?.selection.idsField ?? '').trim();
30122
30246
  const requiresSelection = Boolean(idsField)
@@ -68549,7 +68673,7 @@ class PraxisScopeBarComponent {
68549
68673
  }
68550
68674
  activeIdChange = new EventEmitter();
68551
68675
  showOmnibox = true;
68552
- omniboxPlaceholder = 'Buscar por codinome, nome, status...';
68676
+ omniboxPlaceholder = 'Buscar registros...';
68553
68677
  set omniboxValue(val) {
68554
68678
  if (val !== undefined && val !== this.currentSearchText()) {
68555
68679
  this.currentSearchText.set(val);
@@ -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-DXPvAOf8.mjs';
3
+ import { ar as setTableActionGlobalActionRef } from './praxisui-table-praxisui-table-o8A2qpuh.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-DXPvAOf8.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-o8A2qpuh.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-DXPvAOf8.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-o8A2qpuh.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.12",
3
+ "version": "10.0.0-rc.14",
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.12",
10
- "@praxisui/core": "^10.0.0-rc.12",
11
- "@praxisui/dynamic-fields": "^10.0.0-rc.12",
12
- "@praxisui/dynamic-form": "^10.0.0-rc.12",
13
- "@praxisui/metadata-editor": "^10.0.0-rc.12",
14
- "@praxisui/rich-content": "^10.0.0-rc.12",
15
- "@praxisui/settings-panel": "^10.0.0-rc.12",
16
- "@praxisui/table-rule-builder": "^10.0.0-rc.12",
9
+ "@praxisui/ai": "^10.0.0-rc.14",
10
+ "@praxisui/core": "^10.0.0-rc.14",
11
+ "@praxisui/dynamic-fields": "^10.0.0-rc.14",
12
+ "@praxisui/dynamic-form": "^10.0.0-rc.14",
13
+ "@praxisui/metadata-editor": "^10.0.0-rc.14",
14
+ "@praxisui/rich-content": "^10.0.0-rc.14",
15
+ "@praxisui/settings-panel": "^10.0.0-rc.14",
16
+ "@praxisui/table-rule-builder": "^10.0.0-rc.14",
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.12",
21
+ "@praxisui/dialog": "^10.0.0-rc.14",
22
22
  "rxjs": "~7.8.0"
23
23
  },
24
24
  "dependencies": {
@@ -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;