@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 +1 -1
- package/ai/component-registry.json +2 -2
- package/docs/local-data-mode-precedence.md +21 -0
- package/fesm2022/{praxisui-table-praxisui-table-ConSKl5g.mjs → praxisui-table-praxisui-table-DgsQmMK8.mjs} +245 -111
- package/fesm2022/{praxisui-table-table-agentic-authoring-turn-flow-DmnNx_fm.mjs → praxisui-table-table-agentic-authoring-turn-flow-D9EpKvy-.mjs} +1 -1
- package/fesm2022/{praxisui-table-table-ai.adapter-vtpAb33s.mjs → praxisui-table-table-ai.adapter-DX7wpDJx.mjs} +1 -1
- package/fesm2022/praxisui-table.mjs +1 -1
- package/package.json +10 -10
- package/types/praxisui-table.d.ts +13 -5
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.
|
|
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-
|
|
3
|
+
"generatedAt": "2026-10-14T09:51:43.880Z",
|
|
4
4
|
"packageName": "@praxisui/table",
|
|
5
|
-
"packageVersion": "10.0.0-rc.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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 =
|
|
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
|
|
6637
|
-
if (PraxisAnalyticalDrawerComponent.schemaCache.has(
|
|
6638
|
-
this.resolvedRemoteConfig.set(PraxisAnalyticalDrawerComponent.schemaCache.get(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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 (
|
|
6772
|
-
return String(
|
|
6773
|
-
if (
|
|
6774
|
-
return String(
|
|
6775
|
-
if (
|
|
6776
|
-
return
|
|
6777
|
-
|
|
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 (
|
|
6793
|
-
return String(
|
|
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
|
-
'
|
|
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 || '
|
|
6855
|
+
return config?.icon || analyticalSchema?.icon || 'analytics';
|
|
6813
6856
|
}
|
|
6814
6857
|
getEvaluationContext() {
|
|
6858
|
+
const currentRow = this.rowSignal();
|
|
6815
6859
|
const combinedRelations = {
|
|
6816
|
-
...this.
|
|
6860
|
+
...this.relationsSignal(),
|
|
6817
6861
|
...this.customRelations(),
|
|
6818
6862
|
};
|
|
6819
6863
|
return {
|
|
6820
|
-
row:
|
|
6821
|
-
data:
|
|
6864
|
+
row: currentRow || {},
|
|
6865
|
+
data: currentRow || {},
|
|
6822
6866
|
relations: combinedRelations,
|
|
6823
|
-
...
|
|
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
|
|
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
|
-
|
|
6961
|
-
|
|
6962
|
-
|
|
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(
|
|
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(
|
|
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-
|
|
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
|
|
23594
|
-
|
|
23595
|
-
|
|
23596
|
-
|
|
23597
|
-
|
|
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) =>
|
|
23629
|
-
|
|
23630
|
-
|
|
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
|
|
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) =>
|
|
23657
|
-
|
|
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-
|
|
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
|
|
27240
|
-
const
|
|
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('
|
|
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
|
|
27270
|
-
if (typeLower === 'boolean'
|
|
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 (
|
|
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
|
|
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 ||
|
|
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: `
|
|
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: '
|
|
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
|
-
|
|
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'],
|
|
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
|
-
|
|
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
|
|
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'
|
|
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
|
|
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
|
|
73623
|
+
paginationStrategy;
|
|
73500
73624
|
paginationPosition = 'bottom';
|
|
73501
73625
|
paginationStyle = 'default';
|
|
73502
73626
|
sortingEnabled = true;
|
|
73503
|
-
sortingStrategy
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
73886
|
-
pagination
|
|
73887
|
-
|
|
73888
|
-
|
|
73889
|
-
|
|
73890
|
-
|
|
73891
|
-
|
|
73892
|
-
|
|
73893
|
-
|
|
73894
|
-
|
|
73895
|
-
|
|
73896
|
-
|
|
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
|
-
|
|
73902
|
-
sorting
|
|
73903
|
-
|
|
73904
|
-
|
|
73905
|
-
|
|
73906
|
-
|
|
73907
|
-
|
|
73908
|
-
|
|
73909
|
-
|
|
73910
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
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.
|
|
10
|
-
"@praxisui/core": "^10.0.0-rc.
|
|
11
|
-
"@praxisui/dynamic-fields": "^10.0.0-rc.
|
|
12
|
-
"@praxisui/dynamic-form": "^10.0.0-rc.
|
|
13
|
-
"@praxisui/metadata-editor": "^10.0.0-rc.
|
|
14
|
-
"@praxisui/rich-content": "^10.0.0-rc.
|
|
15
|
-
"@praxisui/settings-panel": "^10.0.0-rc.
|
|
16
|
-
"@praxisui/table-rule-builder": "^10.0.0-rc.
|
|
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.
|
|
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
|
-
|
|
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;
|