@praxisui/table 9.0.0-beta.73 → 9.0.0-beta.75

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-07-12T01:34:40.567Z",
3
+ "generatedAt": "2026-07-16T21:37:28.607Z",
4
4
  "packageName": "@praxisui/table",
5
- "packageVersion": "9.0.0-beta.73",
5
+ "packageVersion": "9.0.0-beta.75",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 3,
@@ -127,6 +127,11 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
127
127
  'table.chrome.actions.disabled.minSelection': 'Selecione ao menos {min} registros para executar esta ação.',
128
128
  'table.chrome.actions.disabled.maxSelection': 'A seleção atual excede o limite permitido para esta ação.',
129
129
  'table.chrome.actions.disabled.generic': 'Ação indisponível no contexto atual.',
130
+ 'table.analytics.comparison.current': 'Atual',
131
+ 'table.analytics.comparison.previous': 'Anterior',
132
+ 'table.analytics.comparison.delta': 'Variação',
133
+ 'table.analytics.comparison.deltaPercent': 'Variação percentual',
134
+ 'table.analytics.comparison.baselineMissing': 'Baseline indisponível',
130
135
  'table.assistant.context.selectedRecords.label': 'Registros selecionados',
131
136
  'table.assistant.context.selectedRecords.value': '{count} registro(s) selecionado(s){ids}',
132
137
  'table.assistant.context.selectedRecords.value.singular': '{count} registro selecionado{ids}',
@@ -262,6 +267,11 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
262
267
  'table.chrome.actions.disabled.minSelection': 'Select at least {min} records to run this action.',
263
268
  'table.chrome.actions.disabled.maxSelection': 'The current selection exceeds the allowed limit for this action.',
264
269
  'table.chrome.actions.disabled.generic': 'Action unavailable in the current context.',
270
+ 'table.analytics.comparison.current': 'Current',
271
+ 'table.analytics.comparison.previous': 'Previous',
272
+ 'table.analytics.comparison.delta': 'Change',
273
+ 'table.analytics.comparison.deltaPercent': 'Percent change',
274
+ 'table.analytics.comparison.baselineMissing': 'Baseline unavailable',
265
275
  'table.assistant.context.selectedRecords.label': 'Selected records',
266
276
  'table.assistant.context.selectedRecords.value': '{count} selected record(s){ids}',
267
277
  'table.assistant.context.selectedRecords.value.singular': '{count} selected record{ids}',
@@ -394,13 +404,13 @@ function resolveTableRuntimeFallback(key, locale) {
394
404
  function translateTableRuntimeText(i18n, key, fallback, params, locale) {
395
405
  const explicitLocale = typeof locale === 'string' && locale.trim() ? locale.trim() : '';
396
406
  const runtimeFallback = resolveTableRuntimeFallback(key, explicitLocale)
397
- || resolveTableRuntimeFallback(key, explicitLocale || i18n.getLocale?.() || i18n.getFallbackLocale?.() || 'pt-BR')
407
+ || resolveTableRuntimeFallback(key, explicitLocale || i18n?.getLocale?.() || i18n?.getFallbackLocale?.() || 'pt-BR')
398
408
  || fallback
399
409
  || key;
400
410
  if (explicitLocale) {
401
411
  return interpolateTableRuntimeText(runtimeFallback, params);
402
412
  }
403
- return i18n.t(key, params, runtimeFallback, PRAXIS_TABLE_RUNTIME_I18N_NAMESPACE);
413
+ return i18n?.t(key, params, runtimeFallback, PRAXIS_TABLE_RUNTIME_I18N_NAMESPACE) || runtimeFallback;
404
414
  }
405
415
  function interpolateTableRuntimeText(template, params) {
406
416
  if (!params)
@@ -8323,6 +8333,13 @@ const PRAXIS_TABLE_EDITOR_I18N_CONFIG = {
8323
8333
  'inlineAuthoring.readonlyHint': 'Esta superfície de authoring está somente leitura no contexto atual.',
8324
8334
  'connect.resource': 'Recurso',
8325
8335
  'connect.resource.placeholder': 'ex.: employees',
8336
+ 'connect.tableResource': 'Recurso da tabela',
8337
+ 'connect.noResource': 'Nenhum recurso selecionado',
8338
+ 'connect.changeResource': 'Alterar recurso',
8339
+ 'connect.cancelResourceChange': 'Cancelar alteração',
8340
+ 'connect.governedCatalogSource': 'Catálogo governado',
8341
+ 'connect.manualSource': 'Rota técnica atual',
8342
+ 'connect.resourceDecisionHint': 'Escolha um recurso publicado pelo backend para manter schema, filtros e ações alinhados.',
8326
8343
  'connect.primaryKey': 'Chave primária',
8327
8344
  'connect.primaryKey.placeholder': 'ex.: id, uuid, código',
8328
8345
  'connect.primaryKey.empty': 'Nenhum campo correspondente encontrado.',
@@ -19667,7 +19684,16 @@ function getTableActionGlobalActionRef(action) {
19667
19684
  }
19668
19685
  function setTableActionGlobalActionRef(action, ref) {
19669
19686
  action.globalAction = ref;
19670
- action.effects = [{ kind: 'global-action', globalAction: ref }];
19687
+ const effects = Array.isArray(action.effects) ? action.effects : [];
19688
+ const nextEffect = { kind: 'global-action', globalAction: ref };
19689
+ const firstGlobalActionEffectIndex = effects.findIndex((effect) => effect?.kind === 'global-action');
19690
+ if (firstGlobalActionEffectIndex === -1) {
19691
+ action.effects = [...effects, nextEffect];
19692
+ return;
19693
+ }
19694
+ action.effects = effects.map((effect, index) => index === firstGlobalActionEffectIndex
19695
+ ? { ...effect, kind: 'global-action', globalAction: ref }
19696
+ : effect);
19671
19697
  }
19672
19698
  function preserveTableActionGlobalActionRefPayload(ref, actionId) {
19673
19699
  if (ref?.actionId !== actionId) {
@@ -30564,12 +30590,9 @@ class TableRulesEditorComponent {
30564
30590
  return exprOk && hasEffect;
30565
30591
  }
30566
30592
  toPersistedCellClassAndStyle(effect) {
30567
- const raw = toCellClassAndStyle(effect);
30568
- const classList = (raw.classList || []).filter((token) => !String(token || '').startsWith('anim--'));
30593
+ const raw = toCellClassAndStyle(effect, { includeAnimationPreview: false });
30594
+ const classList = raw.classList || [];
30569
30595
  const style = { ...(raw.style || {}) };
30570
- delete style['animation-duration'];
30571
- delete style['animation-delay'];
30572
- delete style['animation-iteration-count'];
30573
30596
  const background = effect.background || {};
30574
30597
  if (!background.color && !background.gradient && style['background'] === 'transparent') {
30575
30598
  delete style['background'];
@@ -30661,19 +30684,16 @@ class TableRulesEditorComponent {
30661
30684
  if (this.scope === 'row') {
30662
30685
  cloned.rowConditionalStyles = this.rulesRow.filter((r) => r.enabled).map(({ enabled, ...rest }) => rest);
30663
30686
  // Build row-level conditional renderers (tooltip/animation)
30664
- const fromEditorTag = '__fromRulesEditor';
30665
30687
  const existingRowRens = Array.isArray(cloned.rowConditionalRenderers) ? cloned.rowConditionalRenderers : [];
30666
- const keepRow = existingRowRens.filter((it) => !it || it[fromEditorTag] !== true);
30667
30688
  const rowNewcomers = [];
30668
30689
  for (const r of this.rulesRow) {
30669
30690
  if (!r.enabled)
30670
30691
  continue;
30671
30692
  const rr = this.buildRowRendererOverrideFromRule(r);
30672
- if (rr) {
30673
- rr[fromEditorTag] = true;
30693
+ if (rr)
30674
30694
  rowNewcomers.push(rr);
30675
- }
30676
30695
  }
30696
+ const keepRow = existingRowRens.filter((it) => !this.isGeneratedRendererMatch(it, rowNewcomers));
30677
30697
  cloned.rowConditionalRenderers = [...keepRow, ...rowNewcomers];
30678
30698
  }
30679
30699
  else {
@@ -30682,24 +30702,42 @@ class TableRulesEditorComponent {
30682
30702
  const col = cloned.columns[idx];
30683
30703
  col.conditionalStyles = this.rulesColumn.filter((r) => r.enabled).map(({ enabled, ...rest }) => rest);
30684
30704
  // Build conditionalRenderers from rule effects (renderer and/or animation)
30685
- const fromEditorTag = '__fromRulesEditor';
30686
30705
  const existing = Array.isArray(col.conditionalRenderers) ? col.conditionalRenderers : [];
30687
- const keep = existing.filter((it) => !it || it[fromEditorTag] !== true);
30688
30706
  const newcomers = [];
30689
30707
  for (const r of this.rulesColumn) {
30690
30708
  if (!r.enabled)
30691
30709
  continue;
30692
30710
  const ren = this.buildRendererOverrideFromRule(r);
30693
- if (ren) {
30694
- ren[fromEditorTag] = true;
30711
+ if (ren)
30695
30712
  newcomers.push(ren);
30696
- }
30697
30713
  }
30714
+ const keep = existing.filter((it) => !this.isGeneratedRendererMatch(it, newcomers));
30698
30715
  col.conditionalRenderers = [...keep, ...newcomers];
30699
30716
  }
30700
30717
  }
30701
30718
  return cloned;
30702
30719
  }
30720
+ isGeneratedRendererMatch(candidate, generated) {
30721
+ return generated.some((renderer) => (this.stableRendererSignature(candidate) === this.stableRendererSignature(renderer)));
30722
+ }
30723
+ stableRendererSignature(value) {
30724
+ return JSON.stringify(this.stripRulesEditorMarker(value));
30725
+ }
30726
+ stripRulesEditorMarker(value) {
30727
+ if (Array.isArray(value)) {
30728
+ return value.map((item) => this.stripRulesEditorMarker(item));
30729
+ }
30730
+ if (!value || typeof value !== 'object') {
30731
+ return value;
30732
+ }
30733
+ const out = {};
30734
+ for (const [key, child] of Object.entries(value)) {
30735
+ if (key === '__fromRulesEditor')
30736
+ continue;
30737
+ out[key] = this.stripRulesEditorMarker(child);
30738
+ }
30739
+ return out;
30740
+ }
30703
30741
  onApply() {
30704
30742
  this.emitRulesConfigChange();
30705
30743
  }
@@ -39669,6 +39707,16 @@ function toBooleanValue(value) {
39669
39707
  return null;
39670
39708
  }
39671
39709
 
39710
+ /**
39711
+ * Stable backend bucket identity retained on analytics rows for cross-filtering.
39712
+ * It is intentionally not materialized as a visible table column.
39713
+ */
39714
+ const ANALYTICS_TABLE_ROW_KEY_FIELD = '__praxisAnalyticsKey';
39715
+ /** Returns the deterministic local-data field for one comparison metric value. */
39716
+ function analyticsComparisonMetricField(metricField, valueKind) {
39717
+ return `__praxisAnalyticsComparison_${metricField}_${valueKind}`;
39718
+ }
39719
+
39672
39720
  class AnalyticsTableStatsApiService {
39673
39721
  http;
39674
39722
  apiUrl;
@@ -39698,6 +39746,13 @@ class AnalyticsTableStatsApiService {
39698
39746
  ...(projection.bindings.primaryMetrics ?? []),
39699
39747
  ...(projection.bindings.secondaryMetrics ?? []),
39700
39748
  ].map((metric) => metric.field);
39749
+ if (this.isComparisonResponse(response)) {
39750
+ return response.buckets.map((bucket) => ({
39751
+ [ANALYTICS_TABLE_ROW_KEY_FIELD]: this.resolveBucketKey(bucket),
39752
+ [dimensionField]: this.resolveBucketCategory(bucket),
39753
+ ...this.projectComparisonMetricValues(metricFields, bucket.values),
39754
+ }));
39755
+ }
39701
39756
  if ('points' in response) {
39702
39757
  return response.points.map((point) => ({
39703
39758
  [dimensionField]: this.resolveTimeSeriesCategory(point),
@@ -39706,6 +39761,7 @@ class AnalyticsTableStatsApiService {
39706
39761
  }
39707
39762
  if ('buckets' in response) {
39708
39763
  return response.buckets.map((bucket) => ({
39764
+ [ANALYTICS_TABLE_ROW_KEY_FIELD]: this.resolveBucketKey(bucket),
39709
39765
  [dimensionField]: this.resolveBucketCategory(bucket),
39710
39766
  ...this.projectMetricValues(metricFields, bucket.values, bucket.value, bucket.count),
39711
39767
  }));
@@ -39730,6 +39786,26 @@ class AnalyticsTableStatsApiService {
39730
39786
  }
39731
39787
  return '';
39732
39788
  }
39789
+ resolveBucketKey(bucket) {
39790
+ if (typeof bucket.key === 'string' || typeof bucket.key === 'number') {
39791
+ return bucket.key;
39792
+ }
39793
+ return null;
39794
+ }
39795
+ projectComparisonMetricValues(metricFields, values) {
39796
+ return metricFields.reduce((acc, field) => {
39797
+ const metric = values?.[field];
39798
+ acc[analyticsComparisonMetricField(field, 'current')] = this.resolveMetricValue(metric?.current, undefined, false);
39799
+ acc[analyticsComparisonMetricField(field, 'previous')] = this.resolveMetricValue(metric?.previous, undefined, false);
39800
+ acc[analyticsComparisonMetricField(field, 'delta')] = this.resolveMetricValue(metric?.delta, undefined, false);
39801
+ acc[analyticsComparisonMetricField(field, 'deltaPercent')] = this.resolveMetricValue(metric?.deltaPercent, undefined, false);
39802
+ acc[analyticsComparisonMetricField(field, 'baselineMissing')] = metric?.baselineMissing === true;
39803
+ return acc;
39804
+ }, {});
39805
+ }
39806
+ isComparisonResponse(response) {
39807
+ return 'periodField' in response;
39808
+ }
39733
39809
  projectMetricValues(metricFields, values, primaryValue, count) {
39734
39810
  return metricFields.reduce((acc, field, index) => {
39735
39811
  const rawValue = values?.[field];
@@ -42016,7 +42092,7 @@ class PraxisTable {
42016
42092
  if (this.aiAdapter || this.aiAdapterLoadStarted)
42017
42093
  return;
42018
42094
  this.aiAdapterLoadStarted = true;
42019
- import('./praxisui-table-table-ai.adapter-BNA88l5o.mjs')
42095
+ import('./praxisui-table-table-ai.adapter-K3pols7h.mjs')
42020
42096
  .then(({ TableAiAdapter }) => {
42021
42097
  if (!this.isAiAssistantEnabled()) {
42022
42098
  this.aiAssistantOpenAfterAdapterLoad = false;
@@ -42762,7 +42838,7 @@ class PraxisTable {
42762
42838
  initializeAiAssistantController() {
42763
42839
  if (!this.aiAdapter || this.aiAssistantController)
42764
42840
  return;
42765
- import('./praxisui-table-table-agentic-authoring-turn-flow-Ch_ORcol.mjs')
42841
+ import('./praxisui-table-table-agentic-authoring-turn-flow-BxISrwqj.mjs')
42766
42842
  .then(({ TableAgenticAuthoringTurnFlow }) => {
42767
42843
  if (this.aiAssistantController || !this.aiAdapter)
42768
42844
  return;
@@ -43033,6 +43109,9 @@ class PraxisTable {
43033
43109
  };
43034
43110
  }
43035
43111
  buildRuntimeObservationStateDigest(rowsRendered, selectionDigest) {
43112
+ const filterCriteriaCount = Object.keys(this.filterCriteria ?? {}).length;
43113
+ const queryContextFilterCount = Object.keys(this.queryContext?.filters ?? {}).length;
43114
+ const effectiveFilterCount = Object.keys(this.getEffectiveFilterCriteria()).length;
43036
43115
  return {
43037
43116
  tableId: this.tableId || undefined,
43038
43117
  rowsRendered,
@@ -43042,19 +43121,123 @@ class PraxisTable {
43042
43121
  sort: this.sortState?.active
43043
43122
  ? { active: this.sortState.active, direction: this.sortState.direction || '' }
43044
43123
  : undefined,
43045
- filtersApplied: Object.keys(this.filterCriteria ?? {}).length > 0,
43124
+ filtersApplied: effectiveFilterCount > 0,
43125
+ filterCriteriaCount,
43126
+ queryContextFilterCount,
43127
+ effectiveFilterCount,
43046
43128
  advancedFilterFieldsVisible: this.advancedFilterRuntimeVisibleFields.length,
43047
43129
  selectedCount: Number(selectionDigest?.['selectedCount']) || 0,
43130
+ rendererState: this.buildRuntimeObservationRendererStateDigest(),
43131
+ };
43132
+ }
43133
+ buildRuntimeObservationRendererStateDigest() {
43134
+ const columns = Array.isArray(this.visibleColumns) && this.visibleColumns.length
43135
+ ? this.visibleColumns
43136
+ : Array.isArray(this.config?.columns)
43137
+ ? this.config.columns
43138
+ : [];
43139
+ const rendererTypes = new Set();
43140
+ let configuredRendererColumns = 0;
43141
+ let conditionalRendererColumns = 0;
43142
+ let conditionalStyleColumns = 0;
43143
+ let conditionalRendererRuleCount = 0;
43144
+ let conditionalStyleRuleCount = 0;
43145
+ let effectRuleCount = 0;
43146
+ let animationRuleCount = 0;
43147
+ const registerAnimation = (value) => {
43148
+ if (value && typeof value === 'object') {
43149
+ animationRuleCount += 1;
43150
+ }
43151
+ };
43152
+ const registerEffects = (value) => {
43153
+ const effects = Array.isArray(value)
43154
+ ? value
43155
+ : value && typeof value === 'object'
43156
+ ? [value]
43157
+ : [];
43158
+ if (!effects.length)
43159
+ return;
43160
+ effectRuleCount += 1;
43161
+ for (const effect of effects) {
43162
+ if (effect && typeof effect === 'object' && effect['animation']) {
43163
+ registerAnimation(effect['animation']);
43164
+ }
43165
+ }
43166
+ };
43167
+ for (const column of columns) {
43168
+ const renderer = column['renderer'];
43169
+ if (renderer && typeof renderer === 'object') {
43170
+ const rendererType = String(renderer['type'] || '').trim();
43171
+ if (rendererType) {
43172
+ configuredRendererColumns += 1;
43173
+ rendererTypes.add(rendererType);
43174
+ }
43175
+ }
43176
+ const conditionalRenderers = Array.isArray(column['conditionalRenderers'])
43177
+ ? column['conditionalRenderers']
43178
+ : [];
43179
+ if (conditionalRenderers.length) {
43180
+ conditionalRendererColumns += 1;
43181
+ conditionalRendererRuleCount += conditionalRenderers.length;
43182
+ }
43183
+ for (const rule of conditionalRenderers) {
43184
+ const ruleRenderer = rule?.['renderer'];
43185
+ if (ruleRenderer && typeof ruleRenderer === 'object') {
43186
+ const rendererType = String(ruleRenderer['type'] || '').trim();
43187
+ if (rendererType)
43188
+ rendererTypes.add(rendererType);
43189
+ }
43190
+ registerAnimation(rule?.['animation']);
43191
+ registerEffects(rule?.['effects']);
43192
+ }
43193
+ const conditionalStyles = Array.isArray(column['conditionalStyles'])
43194
+ ? column['conditionalStyles']
43195
+ : [];
43196
+ if (conditionalStyles.length) {
43197
+ conditionalStyleColumns += 1;
43198
+ conditionalStyleRuleCount += conditionalStyles.length;
43199
+ }
43200
+ for (const rule of conditionalStyles) {
43201
+ registerEffects(rule?.['effects']);
43202
+ }
43203
+ }
43204
+ const configRecord = this.config;
43205
+ const rowConditionalRenderers = Array.isArray(configRecord?.['rowConditionalRenderers'])
43206
+ ? configRecord['rowConditionalRenderers']
43207
+ : [];
43208
+ for (const rule of rowConditionalRenderers) {
43209
+ registerAnimation(rule?.['animation']);
43210
+ registerEffects(rule?.['effects']);
43211
+ }
43212
+ const rowConditionalStyles = Array.isArray(configRecord?.['rowConditionalStyles'])
43213
+ ? configRecord['rowConditionalStyles']
43214
+ : [];
43215
+ for (const rule of rowConditionalStyles) {
43216
+ registerEffects(rule?.['effects']);
43217
+ }
43218
+ return {
43219
+ configuredRendererColumns,
43220
+ conditionalRendererColumns,
43221
+ conditionalStyleColumns,
43222
+ conditionalRendererRuleCount,
43223
+ conditionalStyleRuleCount,
43224
+ rowConditionalRendererRuleCount: rowConditionalRenderers.length,
43225
+ rowConditionalStyleRuleCount: rowConditionalStyles.length,
43226
+ effectRuleCount,
43227
+ animationRuleCount,
43228
+ rendererTypes: [...rendererTypes].sort().slice(0, 40),
43048
43229
  };
43049
43230
  }
43050
43231
  buildRuntimeObservationDataProfileDigest(rowsRendered, selectionDigest) {
43232
+ const dataMode = this.getDataMode();
43051
43233
  return {
43052
- source: this.hasLocalDataInput() ? 'local-data' : this.resourcePath ? 'resource' : 'empty',
43234
+ source: dataMode === 'remote' ? 'resource' : dataMode === 'local' ? 'local-data' : 'empty',
43053
43235
  rowsRendered,
43054
43236
  visibleColumnCount: this.visibleColumns.length,
43055
43237
  schemaFieldCount: this.schemaFieldsSnapshot.length,
43056
43238
  selectedCount: Number(selectionDigest?.['selectedCount']) || 0,
43057
43239
  hasResourcePath: !!this.resourcePath,
43240
+ hasLocalDataInput: this.hasLocalDataInput(),
43058
43241
  };
43059
43242
  }
43060
43243
  getRuntimeObservationSchemaFieldRefs() {
@@ -47931,6 +48114,8 @@ class PraxisTable {
47931
48114
  metadata: {
47932
48115
  tableId: this.tableId,
47933
48116
  dataMode: this.isLocalDataModeActive() ? 'local' : this.isRemoteMode() ? 'remote' : 'empty',
48117
+ configuredScope: scope,
48118
+ effectiveScope,
47934
48119
  },
47935
48120
  };
47936
48121
  }
@@ -50334,7 +50519,10 @@ class PraxisTable {
50334
50519
  const httpContext = new HttpContext().set(PRAXIS_LOADING_CTX, schemaCtx);
50335
50520
  this.emitLoadingState('schema', 'loading', 'Carregando schema da tabela...');
50336
50521
  this.crudService
50337
- .getSchema({ httpContext })
50522
+ .getSchema({
50523
+ httpContext,
50524
+ idField: this.getIdField(),
50525
+ })
50338
50526
  .pipe(take$1(1))
50339
50527
  .subscribe({
50340
50528
  next: (fields) => {
@@ -50498,6 +50686,10 @@ class PraxisTable {
50498
50686
  if (!field)
50499
50687
  continue;
50500
50688
  this.applySchemaFieldPresentation(field, column);
50689
+ try {
50690
+ this.applyAutoRenderer(field, column);
50691
+ }
50692
+ catch { }
50501
50693
  }
50502
50694
  }
50503
50695
  applySchemaFieldPresentation(field, col) {
@@ -50550,6 +50742,13 @@ class PraxisTable {
50550
50742
  if (col.type === 'boolean' && !col.format) {
50551
50743
  col.format = this.resolveSchemaBooleanFormat(field);
50552
50744
  }
50745
+ const schemaDataType = this.normalizePresentationToken(field.type);
50746
+ const schemaFormat = this.normalizePresentationToken(field.format);
50747
+ if (col.type === 'number' &&
50748
+ !col.format &&
50749
+ (schemaDataType === 'integer' || schemaFormat === 'int32' || schemaFormat === 'int64')) {
50750
+ col.format = '1.0-0';
50751
+ }
50553
50752
  const textMaskFormat = resolveTextMaskFormatFromFieldDefinition(field);
50554
50753
  const maskResolvedType = resolveColumnTypeFromFieldDefinition(field, col.type);
50555
50754
  if (textMaskFormat && maskResolvedType === 'string') {
@@ -56930,6 +57129,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
56930
57129
  }] } });
56931
57130
 
56932
57131
  class AnalyticsTableConfigAdapterService {
57132
+ i18n;
57133
+ constructor(i18n) {
57134
+ this.i18n = i18n;
57135
+ }
56933
57136
  toTableConfig(projection, options) {
56934
57137
  const dimension = projection.bindings.primaryDimension;
56935
57138
  const metrics = this.getDisplayMetrics(projection);
@@ -56969,13 +57172,15 @@ class AnalyticsTableConfigAdapterService {
56969
57172
  }
56970
57173
  buildColumns(projection) {
56971
57174
  const dimension = projection.bindings.primaryDimension;
56972
- const metricColumns = this.getDisplayMetrics(projection).map((metric) => ({
56973
- field: metric.field,
56974
- header: metric.label ?? metric.field,
56975
- type: 'number',
56976
- align: 'right',
56977
- sortable: true,
56978
- }));
57175
+ const metricColumns = projection.source.operation === 'comparison'
57176
+ ? this.getDisplayMetrics(projection).flatMap((metric) => this.buildComparisonMetricColumns(metric.field, metric.label ?? metric.field))
57177
+ : this.getDisplayMetrics(projection).map((metric) => ({
57178
+ field: metric.field,
57179
+ header: metric.label ?? metric.field,
57180
+ type: 'number',
57181
+ align: 'right',
57182
+ sortable: true,
57183
+ }));
56979
57184
  return [
56980
57185
  {
56981
57186
  field: dimension.field,
@@ -56986,6 +57191,18 @@ class AnalyticsTableConfigAdapterService {
56986
57191
  ...metricColumns,
56987
57192
  ];
56988
57193
  }
57194
+ buildComparisonMetricColumns(metricField, metricLabel) {
57195
+ return ['current', 'previous', 'delta', 'deltaPercent', 'baselineMissing'].map((valueKind) => ({
57196
+ field: analyticsComparisonMetricField(metricField, valueKind),
57197
+ header: `${metricLabel} - ${this.comparisonValueLabel(valueKind)}`,
57198
+ type: valueKind === 'baselineMissing' ? 'boolean' : valueKind === 'deltaPercent' ? 'percentage' : 'number',
57199
+ align: valueKind === 'baselineMissing' ? 'center' : 'right',
57200
+ sortable: true,
57201
+ }));
57202
+ }
57203
+ comparisonValueLabel(valueKind) {
57204
+ return translateTableRuntimeText(this.i18n, `table.analytics.comparison.${valueKind}`);
57205
+ }
56989
57206
  getDisplayMetrics(projection) {
56990
57207
  return [
56991
57208
  ...(projection.bindings.primaryMetrics ?? []),
@@ -57001,13 +57218,15 @@ class AnalyticsTableConfigAdapterService {
57001
57218
  }
57002
57219
  return value.text ?? value.key ?? undefined;
57003
57220
  }
57004
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: AnalyticsTableConfigAdapterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
57221
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: AnalyticsTableConfigAdapterService, deps: [{ token: i1.PraxisI18nService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
57005
57222
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: AnalyticsTableConfigAdapterService, providedIn: 'root' });
57006
57223
  }
57007
57224
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: AnalyticsTableConfigAdapterService, decorators: [{
57008
57225
  type: Injectable,
57009
57226
  args: [{ providedIn: 'root' }]
57010
- }] });
57227
+ }], ctorParameters: () => [{ type: i1.PraxisI18nService, decorators: [{
57228
+ type: Optional
57229
+ }] }] });
57011
57230
 
57012
57231
  class AnalyticsTableContractService {
57013
57232
  analyticsSchema;
@@ -57027,6 +57246,7 @@ class AnalyticsTableContractService {
57027
57246
  title: definition.title,
57028
57247
  subtitle: definition.subtitle,
57029
57248
  data: definition.fallbackRows ?? [],
57249
+ source: 'fallback',
57030
57250
  });
57031
57251
  return acc;
57032
57252
  }, {});
@@ -57056,6 +57276,7 @@ class AnalyticsTableContractService {
57056
57276
  title: definition.title,
57057
57277
  subtitle: definition.subtitle,
57058
57278
  data: definition.fallbackRows ?? [],
57279
+ source: 'fallback',
57059
57280
  });
57060
57281
  try {
57061
57282
  const analytics = await this.analyticsSchema.getAnalytics({
@@ -57076,15 +57297,20 @@ class AnalyticsTableContractService {
57076
57297
  title: definition.title,
57077
57298
  subtitle: definition.subtitle,
57078
57299
  data,
57300
+ source: 'remote',
57079
57301
  }),
57080
57302
  };
57081
57303
  }
57082
57304
  catch (error) {
57305
+ const normalizedError = normalizeError(error);
57083
57306
  return {
57084
57307
  key: definition.key,
57085
57308
  source: 'fallback',
57086
- view: fallbackView,
57087
- error: normalizeError(error),
57309
+ view: {
57310
+ ...fallbackView,
57311
+ error: normalizedError,
57312
+ },
57313
+ error: normalizedError,
57088
57314
  };
57089
57315
  }
57090
57316
  }
@@ -57096,6 +57322,8 @@ class AnalyticsTableContractService {
57096
57322
  subtitle: params.subtitle,
57097
57323
  }),
57098
57324
  data: params.data,
57325
+ projectionId: params.projection.id,
57326
+ source: params.source,
57099
57327
  };
57100
57328
  }
57101
57329
  assertAnalyticTableProjection(projection) {
@@ -65412,4 +65640,4 @@ function isSupportedJsonLogicComputedOperator(operator) {
65412
65640
  * Generated bundle index. Do not edit.
65413
65641
  */
65414
65642
 
65415
- export { getActionId as $, AnalyticsTableConfigAdapterService as A, BOOLEAN_PRESETS as B, CURRENCY_PRESETS as C, DATE_PRESETS as D, TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA as E, FORMULA_TEMPLATES as F, TABLE_COMPONENT_EDIT_PLAN_KIND as G, TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS as H, TABLE_COMPONENT_EDIT_PLAN_VERSION as I, JsonConfigEditorComponent as J, TASK_PRESETS as K, TableDefaultsProvider as L, MessagesLocalizationEditorComponent as M, NUMBER_PRESETS as N, TableRulesEditorComponent as O, PERCENTAGE_PRESETS as P, ToolbarActionsEditorComponent as Q, VisualFormulaBuilderComponent as R, STRING_PRESETS as S, TABLE_AI_CAPABILITIES as T, buildTableApplyPlan as U, ValueMappingEditorComponent as V, coerceTableComponentEditPlan as W, coerceTableComponentEditPlans as X, compileTableComponentEditPlan as Y, compileTableComponentEditPlans as Z, createTableAuthoringDocument as _, AnalyticsTableContractService as a, getEnum as a0, getTableCapabilities as a1, getTableComponentEditPlanCapabilities as a2, isTableRendererSupportedByRichContentP0 as a3, mapTableRendererToRichContentP0 as a4, normalizeTableAuthoringDocument as a5, parseLegacyOrTableDocument as a6, providePraxisFilterMetadata as a7, providePraxisTableMetadata as a8, providePraxisTableToolbarAppearance as a9, serializeTableAuthoringDocument as aa, toCanonicalTableConfig as ab, validateTableAuthoringDocument as ac, AnalyticsTableStatsApiService as b, BehaviorConfigEditorComponent as c, ColumnsConfigEditorComponent as d, DataFormatterComponent as e, DataFormattingService as f, FilterConfigService as g, FilterSettingsComponent as h, FormulaGeneratorService as i, PRAXIS_FILTER_COMPONENT_METADATA as j, PRAXIS_TABLE_AUTHORING_MANIFEST as k, PRAXIS_TABLE_COMPONENT_METADATA as l, PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS as m, PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE as n, PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS as o, PraxisFilter as p, PraxisFilterWidgetConfigEditor as q, PraxisTable as r, PraxisTableConfigEditor as s, PraxisTableInlineAuthoringEditorComponent as t, PraxisTableToolbar as u, PraxisTableWidgetConfigEditor as v, TABLE_COMPONENT_AI_CAPABILITIES as w, TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS as x, TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND as y, TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS as z };
65643
+ export { compileTableComponentEditPlans as $, ANALYTICS_TABLE_ROW_KEY_FIELD as A, BOOLEAN_PRESETS as B, CURRENCY_PRESETS as C, DATE_PRESETS as D, TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS as E, FORMULA_TEMPLATES as F, TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA as G, TABLE_COMPONENT_EDIT_PLAN_KIND as H, TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS as I, JsonConfigEditorComponent as J, TABLE_COMPONENT_EDIT_PLAN_VERSION as K, TASK_PRESETS as L, MessagesLocalizationEditorComponent as M, NUMBER_PRESETS as N, TableDefaultsProvider as O, PERCENTAGE_PRESETS as P, TableRulesEditorComponent as Q, ToolbarActionsEditorComponent as R, STRING_PRESETS as S, TABLE_AI_CAPABILITIES as T, VisualFormulaBuilderComponent as U, ValueMappingEditorComponent as V, analyticsComparisonMetricField as W, buildTableApplyPlan as X, coerceTableComponentEditPlan as Y, coerceTableComponentEditPlans as Z, compileTableComponentEditPlan as _, AnalyticsTableConfigAdapterService as a, createTableAuthoringDocument as a0, getActionId as a1, getEnum as a2, getTableCapabilities as a3, getTableComponentEditPlanCapabilities as a4, isTableRendererSupportedByRichContentP0 as a5, mapTableRendererToRichContentP0 as a6, normalizeTableAuthoringDocument as a7, parseLegacyOrTableDocument as a8, providePraxisFilterMetadata as a9, providePraxisTableMetadata as aa, providePraxisTableToolbarAppearance as ab, serializeTableAuthoringDocument as ac, setTableActionGlobalActionRef as ad, toCanonicalTableConfig as ae, validateTableAuthoringDocument as af, AnalyticsTableContractService as b, AnalyticsTableStatsApiService as c, BehaviorConfigEditorComponent as d, ColumnsConfigEditorComponent as e, DataFormatterComponent as f, DataFormattingService as g, FilterConfigService as h, FilterSettingsComponent as i, FormulaGeneratorService as j, PRAXIS_FILTER_COMPONENT_METADATA as k, PRAXIS_TABLE_AUTHORING_MANIFEST as l, PRAXIS_TABLE_COMPONENT_METADATA as m, PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS as n, PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE as o, PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS as p, PraxisFilter as q, PraxisFilterWidgetConfigEditor as r, PraxisTable as s, PraxisTableConfigEditor as t, PraxisTableInlineAuthoringEditorComponent as u, PraxisTableToolbar as v, PraxisTableWidgetConfigEditor as w, TABLE_COMPONENT_AI_CAPABILITIES as x, TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS as y, TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND as z };
@@ -1,5 +1,6 @@
1
1
  import { Observable, firstValueFrom } from 'rxjs';
2
2
  import { withAuthoringScopePolicy } from '@praxisui/ai';
3
+ import { ad as setTableActionGlobalActionRef } from './praxisui-table-praxisui-table-GKe2af3P.mjs';
3
4
 
4
5
  class TableAgenticAuthoringTurnFlow {
5
6
  adapter;
@@ -3966,8 +3967,7 @@ class TableAgenticAuthoringTurnFlow {
3966
3967
  query: { ids: '${runtime.selectedIds}' },
3967
3968
  },
3968
3969
  };
3969
- action.globalAction = globalAction;
3970
- action.effects = [{ kind: 'global-action', globalAction }];
3970
+ setTableActionGlobalActionRef(action, globalAction);
3971
3971
  if (!this.stringValue(action.action)) {
3972
3972
  action.action = 'navigation.openRoute';
3973
3973
  }
@@ -1,7 +1,7 @@
1
1
  import { firstValueFrom } from 'rxjs';
2
2
  import { BaseAiAdapter, sanitizePraxisAssistantText, createComponentAuthoringContext } from '@praxisui/ai';
3
3
  import { PRAXIS_GLOBAL_ACTION_CATALOG, deepMerge } from '@praxisui/core';
4
- import { H as TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS, k as PRAXIS_TABLE_AUTHORING_MANIFEST, T as TABLE_AI_CAPABILITIES, X as coerceTableComponentEditPlans, Z as compileTableComponentEditPlans, K as TASK_PRESETS, a2 as getTableComponentEditPlanCapabilities, z as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, x as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, E as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, I as TABLE_COMPONENT_EDIT_PLAN_VERSION, y as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, G as TABLE_COMPONENT_EDIT_PLAN_KIND } from './praxisui-table-praxisui-table-sX8ASIFR.mjs';
4
+ import { I as TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS, l as PRAXIS_TABLE_AUTHORING_MANIFEST, T as TABLE_AI_CAPABILITIES, Z as coerceTableComponentEditPlans, $ as compileTableComponentEditPlans, L as TASK_PRESETS, a4 as getTableComponentEditPlanCapabilities, E as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, y as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, G as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, K as TABLE_COMPONENT_EDIT_PLAN_VERSION, z as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, H as TABLE_COMPONENT_EDIT_PLAN_KIND } from './praxisui-table-praxisui-table-GKe2af3P.mjs';
5
5
 
6
6
  const TABLE_ROW_EXPRESSION_CONTEXT_OPTION = {
7
7
  mode: 'expression',
@@ -1 +1 @@
1
- export { A as AnalyticsTableConfigAdapterService, a as AnalyticsTableContractService, b as AnalyticsTableStatsApiService, B as BOOLEAN_PRESETS, c as BehaviorConfigEditorComponent, C as CURRENCY_PRESETS, d as ColumnsConfigEditorComponent, D as DATE_PRESETS, e as DataFormatterComponent, f as DataFormattingService, F as FORMULA_TEMPLATES, g as FilterConfigService, h as FilterSettingsComponent, i as FormulaGeneratorService, J as JsonConfigEditorComponent, M as MessagesLocalizationEditorComponent, N as NUMBER_PRESETS, P as PERCENTAGE_PRESETS, j as PRAXIS_FILTER_COMPONENT_METADATA, k as PRAXIS_TABLE_AUTHORING_MANIFEST, l as PRAXIS_TABLE_COMPONENT_METADATA, m as PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS, n as PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, o as PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, p as PraxisFilter, q as PraxisFilterWidgetConfigEditor, r as PraxisTable, s as PraxisTableConfigEditor, t as PraxisTableInlineAuthoringEditorComponent, u as PraxisTableToolbar, v as PraxisTableWidgetConfigEditor, S as STRING_PRESETS, T as TABLE_AI_CAPABILITIES, w as TABLE_COMPONENT_AI_CAPABILITIES, x as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, y as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, z as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, E as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, G as TABLE_COMPONENT_EDIT_PLAN_KIND, I as TABLE_COMPONENT_EDIT_PLAN_VERSION, K as TASK_PRESETS, L as TableDefaultsProvider, O as TableRulesEditorComponent, Q as ToolbarActionsEditorComponent, V as ValueMappingEditorComponent, R as VisualFormulaBuilderComponent, U as buildTableApplyPlan, W as coerceTableComponentEditPlan, X as coerceTableComponentEditPlans, Y as compileTableComponentEditPlan, Z as compileTableComponentEditPlans, _ as createTableAuthoringDocument, $ as getActionId, a0 as getEnum, a1 as getTableCapabilities, a2 as getTableComponentEditPlanCapabilities, a3 as isTableRendererSupportedByRichContentP0, a4 as mapTableRendererToRichContentP0, a5 as normalizeTableAuthoringDocument, a6 as parseLegacyOrTableDocument, a7 as providePraxisFilterMetadata, a8 as providePraxisTableMetadata, a9 as providePraxisTableToolbarAppearance, aa as serializeTableAuthoringDocument, ab as toCanonicalTableConfig, ac as validateTableAuthoringDocument } from './praxisui-table-praxisui-table-sX8ASIFR.mjs';
1
+ export { A as ANALYTICS_TABLE_ROW_KEY_FIELD, a as AnalyticsTableConfigAdapterService, b as AnalyticsTableContractService, c as AnalyticsTableStatsApiService, B as BOOLEAN_PRESETS, d as BehaviorConfigEditorComponent, C as CURRENCY_PRESETS, e as ColumnsConfigEditorComponent, D as DATE_PRESETS, f as DataFormatterComponent, g as DataFormattingService, F as FORMULA_TEMPLATES, h as FilterConfigService, i as FilterSettingsComponent, j as FormulaGeneratorService, J as JsonConfigEditorComponent, M as MessagesLocalizationEditorComponent, N as NUMBER_PRESETS, P as PERCENTAGE_PRESETS, k as PRAXIS_FILTER_COMPONENT_METADATA, l as PRAXIS_TABLE_AUTHORING_MANIFEST, m as PRAXIS_TABLE_COMPONENT_METADATA, n as PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS, o as PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, p as PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, q as PraxisFilter, r as PraxisFilterWidgetConfigEditor, s as PraxisTable, t as PraxisTableConfigEditor, u as PraxisTableInlineAuthoringEditorComponent, v as PraxisTableToolbar, w as PraxisTableWidgetConfigEditor, S as STRING_PRESETS, T as TABLE_AI_CAPABILITIES, x as TABLE_COMPONENT_AI_CAPABILITIES, y as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, z as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, E as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, G as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, H as TABLE_COMPONENT_EDIT_PLAN_KIND, K as TABLE_COMPONENT_EDIT_PLAN_VERSION, L as TASK_PRESETS, O as TableDefaultsProvider, Q as TableRulesEditorComponent, R as ToolbarActionsEditorComponent, V as ValueMappingEditorComponent, U as VisualFormulaBuilderComponent, W as analyticsComparisonMetricField, X as buildTableApplyPlan, Y as coerceTableComponentEditPlan, Z as coerceTableComponentEditPlans, _ as compileTableComponentEditPlan, $ as compileTableComponentEditPlans, a0 as createTableAuthoringDocument, a1 as getActionId, a2 as getEnum, a3 as getTableCapabilities, a4 as getTableComponentEditPlanCapabilities, a5 as isTableRendererSupportedByRichContentP0, a6 as mapTableRendererToRichContentP0, a7 as normalizeTableAuthoringDocument, a8 as parseLegacyOrTableDocument, a9 as providePraxisFilterMetadata, aa as providePraxisTableMetadata, ab as providePraxisTableToolbarAppearance, ac as serializeTableAuthoringDocument, ae as toCanonicalTableConfig, af as validateTableAuthoringDocument } from './praxisui-table-praxisui-table-GKe2af3P.mjs';
package/package.json CHANGED
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "name": "@praxisui/table",
3
- "version": "9.0.0-beta.73",
3
+ "version": "9.0.0-beta.75",
4
4
  "description": "Advanced data table for Angular (Praxis UI) with editing, filtering, sorting, virtualization, and settings panel integration.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
8
  "@angular/platform-browser": "^21.0.0",
9
- "@praxisui/ai": "^9.0.0-beta.73",
10
- "@praxisui/core": "^9.0.0-beta.73",
11
- "@praxisui/dynamic-fields": "^9.0.0-beta.73",
12
- "@praxisui/dynamic-form": "^9.0.0-beta.73",
13
- "@praxisui/metadata-editor": "^9.0.0-beta.73",
14
- "@praxisui/rich-content": "^9.0.0-beta.73",
15
- "@praxisui/settings-panel": "^9.0.0-beta.73",
16
- "@praxisui/table-rule-builder": "^9.0.0-beta.73",
9
+ "@praxisui/ai": "^9.0.0-beta.75",
10
+ "@praxisui/core": "^9.0.0-beta.75",
11
+ "@praxisui/dynamic-fields": "^9.0.0-beta.75",
12
+ "@praxisui/dynamic-form": "^9.0.0-beta.75",
13
+ "@praxisui/metadata-editor": "^9.0.0-beta.75",
14
+ "@praxisui/rich-content": "^9.0.0-beta.75",
15
+ "@praxisui/settings-panel": "^9.0.0-beta.75",
16
+ "@praxisui/table-rule-builder": "^9.0.0-beta.75",
17
17
  "@angular/cdk": "^21.0.0",
18
18
  "@angular/forms": "^21.0.0",
19
19
  "@angular/material": "^21.0.0",
20
20
  "@angular/router": "^21.0.0",
21
- "@praxisui/dialog": "^9.0.0-beta.73",
21
+ "@praxisui/dialog": "^9.0.0-beta.75",
22
22
  "rxjs": "~7.8.0"
23
23
  },
24
24
  "dependencies": {
@@ -918,9 +918,20 @@ declare function providePraxisFilterMetadata(): Provider;
918
918
 
919
919
  type AnalyticsTableRow = Record<string, string | number | boolean | null>;
920
920
  type AnalyticsTableContractSource = 'remote' | 'fallback';
921
+ /**
922
+ * Stable backend bucket identity retained on analytics rows for cross-filtering.
923
+ * It is intentionally not materialized as a visible table column.
924
+ */
925
+ declare const ANALYTICS_TABLE_ROW_KEY_FIELD = "__praxisAnalyticsKey";
926
+ type AnalyticsComparisonMetricValueKind = 'current' | 'previous' | 'delta' | 'deltaPercent' | 'baselineMissing';
927
+ /** Returns the deterministic local-data field for one comparison metric value. */
928
+ declare function analyticsComparisonMetricField(metricField: string, valueKind: AnalyticsComparisonMetricValueKind): string;
921
929
  interface AnalyticsTableViewModel {
922
930
  config: TableConfig;
923
931
  data: AnalyticsTableRow[];
932
+ projectionId?: string;
933
+ source?: AnalyticsTableContractSource;
934
+ error?: string;
924
935
  }
925
936
  interface AnalyticsTableContractDefinition<TKey extends string = string> {
926
937
  key: TKey;
@@ -950,6 +961,9 @@ declare class AnalyticsTableStatsApiService {
950
961
  private toTableRows;
951
962
  private resolveTimeSeriesCategory;
952
963
  private resolveBucketCategory;
964
+ private resolveBucketKey;
965
+ private projectComparisonMetricValues;
966
+ private isComparisonResponse;
953
967
  private projectMetricValues;
954
968
  private resolveMetricValue;
955
969
  private buildStatsUrl;
@@ -1543,6 +1557,7 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
1543
1557
  private getActiveRuntimeObservationSelectedRows;
1544
1558
  private buildRuntimeObservationSelectionDigest;
1545
1559
  private buildRuntimeObservationStateDigest;
1560
+ private buildRuntimeObservationRendererStateDigest;
1546
1561
  private buildRuntimeObservationDataProfileDigest;
1547
1562
  private getRuntimeObservationSchemaFieldRefs;
1548
1563
  private getRuntimeObservationSchemaFieldDescriptors;
@@ -3633,6 +3648,9 @@ declare class TableRulesEditorComponent implements OnChanges, OnInit, OnDestroy
3633
3648
  onRuleToggle(): void;
3634
3649
  private emitRulesConfigChange;
3635
3650
  buildAppliedConfig(baseConfig?: TableConfig): TableConfig;
3651
+ private isGeneratedRendererMatch;
3652
+ private stableRendererSignature;
3653
+ private stripRulesEditorMarker;
3636
3654
  onApply(): void;
3637
3655
  isValid(): boolean;
3638
3656
  onExportRules(): void;
@@ -4101,11 +4119,15 @@ interface AnalyticsTableConfigAdapterOptions {
4101
4119
  subtitle?: PraxisTextValue;
4102
4120
  }
4103
4121
  declare class AnalyticsTableConfigAdapterService {
4122
+ private readonly i18n?;
4123
+ constructor(i18n?: PraxisI18nService | undefined);
4104
4124
  toTableConfig(projection: PraxisAnalyticsProjection, options?: AnalyticsTableConfigAdapterOptions): TableConfig;
4105
4125
  private buildColumns;
4126
+ private buildComparisonMetricColumns;
4127
+ private comparisonValueLabel;
4106
4128
  private getDisplayMetrics;
4107
4129
  private resolveTextValue;
4108
- static ɵfac: i0.ɵɵFactoryDeclaration<AnalyticsTableConfigAdapterService, never>;
4130
+ static ɵfac: i0.ɵɵFactoryDeclaration<AnalyticsTableConfigAdapterService, [{ optional: true; }]>;
4109
4131
  static ɵprov: i0.ɵɵInjectableDeclaration<AnalyticsTableConfigAdapterService>;
4110
4132
  }
4111
4133
 
@@ -4818,5 +4840,5 @@ declare function coerceTableComponentEditPlan(value: unknown): TableComponentEdi
4818
4840
  declare function compileTableComponentEditPlans(plans: TableComponentEditPlan[], currentConfig: TableConfig): TableComponentEditPlanCompileResult;
4819
4841
  declare function compileTableComponentEditPlan(plan: TableComponentEditPlan, currentConfig: TableConfig): TableComponentEditPlanCompileResult;
4820
4842
 
4821
- export { AnalyticsTableConfigAdapterService, AnalyticsTableContractService, AnalyticsTableStatsApiService, BOOLEAN_PRESETS, BehaviorConfigEditorComponent, CURRENCY_PRESETS, ColumnsConfigEditorComponent, DATE_PRESETS, DataFormatterComponent, DataFormattingService, FORMULA_TEMPLATES, FilterConfigService, FilterSettingsComponent, FormulaGeneratorService, JsonConfigEditorComponent, MessagesLocalizationEditorComponent, NUMBER_PRESETS, PERCENTAGE_PRESETS, PRAXIS_FILTER_COMPONENT_METADATA, PRAXIS_TABLE_AUTHORING_MANIFEST, PRAXIS_TABLE_COMPONENT_METADATA, PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS, PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, PraxisFilter, PraxisFilterWidgetConfigEditor, PraxisTable, PraxisTableConfigEditor, PraxisTableInlineAuthoringEditorComponent, PraxisTableToolbar, PraxisTableWidgetConfigEditor, STRING_PRESETS, TABLE_AI_CAPABILITIES, TABLE_COMPONENT_AI_CAPABILITIES, TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, TABLE_COMPONENT_EDIT_PLAN_KIND, TABLE_COMPONENT_EDIT_PLAN_VERSION, TASK_PRESETS, TableDefaultsProvider, TableRulesEditorComponent, ToolbarActionsEditorComponent, ValueMappingEditorComponent, VisualFormulaBuilderComponent, buildTableApplyPlan, coerceTableComponentEditPlan, coerceTableComponentEditPlans, compileTableComponentEditPlan, compileTableComponentEditPlans, createTableAuthoringDocument, getActionId, getEnum, getTableCapabilities, getTableComponentEditPlanCapabilities, isTableRendererSupportedByRichContentP0, mapTableRendererToRichContentP0, normalizeTableAuthoringDocument, parseLegacyOrTableDocument, providePraxisFilterMetadata, providePraxisTableMetadata, providePraxisTableToolbarAppearance, serializeTableAuthoringDocument, toCanonicalTableConfig, validateTableAuthoringDocument };
4822
- export type { ActionLike, AnalyticsTableConfigAdapterOptions, AnalyticsTableContractDefinition, AnalyticsTableContractLoadOptions, AnalyticsTableContractLoadResult, AnalyticsTableContractSource, AnalyticsTableRow, AnalyticsTableViewModel, ArithmeticParams, BehaviorConfigChange, BooleanFormatterOptions, BulkAction, Capability$1 as Capability, CapabilityCatalog$1 as CapabilityCatalog, CapabilityCategory$1 as CapabilityCategory, ColumnChange, ColumnDataType$1 as ColumnDataType, ConcatenationParams, ConditionalMappingParams, CurrencyFormatterOptions, DataFormattingOptions, DataMode, DateFormatterOptions, DefaultValueParams, EditorDiagnostic, EditorDocument, FieldSchema, FilterConfig, FilterTag, FormatPreset, FormatterConfig, FormulaDefinition, FormulaParameterSchema, FormulaParams, FormulaTemplate, FormulaType, I18n, JsonEditorEvent, JsonValidationResult, MessagesLocalizationChange, NestedPropertyParams, NumberFormatterOptions, PercentageFormatterOptions, PraxisFilterWidgetEditorInputs, PraxisFilterWidgetEditorValue, PraxisTableWidgetEditorInputs, PraxisTableWidgetEditorValue, ResourcePathIntent, RowAction, RowExpansionChangeBase, RowExpansionChangeEvent, RowExpansionReasonCode, RowExpansionTrigger, StringFormatterOptions, TableAiContext, TableAiNavigationContextPack, TableAiNavigationDestinationContext, TableApplyPlan, TableAuthoringDocument, TableBindings, Capability as TableComponentCapability, CapabilityCatalog as TableComponentCapabilityCatalog, CapabilityCategory as TableComponentCapabilityCategory, TableComponentEditChangeKind, TableComponentEditPlan, TableComponentEditPlanCompileResult, ValueKind as TableComponentValueKind, TableConfigPersistenceStrategy, TableHorizontalScroll, TableProjectionContext, TableRichContentP0Node, TableRuntimeContext, TableValidationContext, ToolbarAction, ToolbarActionsChange, ValueKind$1 as ValueKind, ValueMappingPair };
4843
+ export { ANALYTICS_TABLE_ROW_KEY_FIELD, AnalyticsTableConfigAdapterService, AnalyticsTableContractService, AnalyticsTableStatsApiService, BOOLEAN_PRESETS, BehaviorConfigEditorComponent, CURRENCY_PRESETS, ColumnsConfigEditorComponent, DATE_PRESETS, DataFormatterComponent, DataFormattingService, FORMULA_TEMPLATES, FilterConfigService, FilterSettingsComponent, FormulaGeneratorService, JsonConfigEditorComponent, MessagesLocalizationEditorComponent, NUMBER_PRESETS, PERCENTAGE_PRESETS, PRAXIS_FILTER_COMPONENT_METADATA, PRAXIS_TABLE_AUTHORING_MANIFEST, PRAXIS_TABLE_COMPONENT_METADATA, PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS, PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, PraxisFilter, PraxisFilterWidgetConfigEditor, PraxisTable, PraxisTableConfigEditor, PraxisTableInlineAuthoringEditorComponent, PraxisTableToolbar, PraxisTableWidgetConfigEditor, STRING_PRESETS, TABLE_AI_CAPABILITIES, TABLE_COMPONENT_AI_CAPABILITIES, TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, TABLE_COMPONENT_EDIT_PLAN_KIND, TABLE_COMPONENT_EDIT_PLAN_VERSION, TASK_PRESETS, TableDefaultsProvider, TableRulesEditorComponent, ToolbarActionsEditorComponent, ValueMappingEditorComponent, VisualFormulaBuilderComponent, analyticsComparisonMetricField, buildTableApplyPlan, coerceTableComponentEditPlan, coerceTableComponentEditPlans, compileTableComponentEditPlan, compileTableComponentEditPlans, createTableAuthoringDocument, getActionId, getEnum, getTableCapabilities, getTableComponentEditPlanCapabilities, isTableRendererSupportedByRichContentP0, mapTableRendererToRichContentP0, normalizeTableAuthoringDocument, parseLegacyOrTableDocument, providePraxisFilterMetadata, providePraxisTableMetadata, providePraxisTableToolbarAppearance, serializeTableAuthoringDocument, toCanonicalTableConfig, validateTableAuthoringDocument };
4844
+ export type { ActionLike, AnalyticsComparisonMetricValueKind, AnalyticsTableConfigAdapterOptions, AnalyticsTableContractDefinition, AnalyticsTableContractLoadOptions, AnalyticsTableContractLoadResult, AnalyticsTableContractSource, AnalyticsTableRow, AnalyticsTableViewModel, ArithmeticParams, BehaviorConfigChange, BooleanFormatterOptions, BulkAction, Capability$1 as Capability, CapabilityCatalog$1 as CapabilityCatalog, CapabilityCategory$1 as CapabilityCategory, ColumnChange, ColumnDataType$1 as ColumnDataType, ConcatenationParams, ConditionalMappingParams, CurrencyFormatterOptions, DataFormattingOptions, DataMode, DateFormatterOptions, DefaultValueParams, EditorDiagnostic, EditorDocument, FieldSchema, FilterConfig, FilterTag, FormatPreset, FormatterConfig, FormulaDefinition, FormulaParameterSchema, FormulaParams, FormulaTemplate, FormulaType, I18n, JsonEditorEvent, JsonValidationResult, MessagesLocalizationChange, NestedPropertyParams, NumberFormatterOptions, PercentageFormatterOptions, PraxisFilterWidgetEditorInputs, PraxisFilterWidgetEditorValue, PraxisTableWidgetEditorInputs, PraxisTableWidgetEditorValue, ResourcePathIntent, RowAction, RowExpansionChangeBase, RowExpansionChangeEvent, RowExpansionReasonCode, RowExpansionTrigger, StringFormatterOptions, TableAiContext, TableAiNavigationContextPack, TableAiNavigationDestinationContext, TableApplyPlan, TableAuthoringDocument, TableBindings, Capability as TableComponentCapability, CapabilityCatalog as TableComponentCapabilityCatalog, CapabilityCategory as TableComponentCapabilityCategory, TableComponentEditChangeKind, TableComponentEditPlan, TableComponentEditPlanCompileResult, ValueKind as TableComponentValueKind, TableConfigPersistenceStrategy, TableHorizontalScroll, TableProjectionContext, TableRichContentP0Node, TableRuntimeContext, TableValidationContext, ToolbarAction, ToolbarActionsChange, ValueKind$1 as ValueKind, ValueMappingPair };