@praxisui/crud 10.0.0-rc.31 → 10.0.0-rc.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-16T17:45:27.774Z",
3
+ "generatedAt": "2026-10-17T14:44:09.509Z",
4
4
  "packageName": "@praxisui/crud",
5
- "packageVersion": "10.0.0-rc.31",
5
+ "packageVersion": "10.0.0-rc.32",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 2,
@@ -10,7 +10,7 @@ import { MatSnackBar } from '@angular/material/snack-bar';
10
10
  import { Subscription, firstValueFrom, BehaviorSubject } from 'rxjs';
11
11
  import { take, filter } from 'rxjs/operators';
12
12
  import * as i2$1 from '@praxisui/core';
13
- import { PraxisBulkClientService, PraxisI18nService, generateBulkIdempotencyKey, isBulkExecutionTerminal, API_URL, SafeExpressionEvaluator, buildApiUrl, ASYNC_CONFIG_STORAGE, GlobalConfigService, CrudOperationResolutionService, LoggerService, SurfaceNavigationError, fillUndefined, GenericCrudService, SETTINGS_PANEL_DATA, buildBaseColumnFromDef, PraxisIconDirective, providePraxisI18nConfig, SchemaNormalizerService, createDefaultTableConfig, PraxisWidgetEventBus, EnterpriseRuntimeContextService, GLOBAL_SURFACE_SERVICE, SurfaceOutletRegistryService, ComponentKeyService, ResourceDiscoveryService, ResourceActionOpenAdapterService, ResourceSurfaceOpenAdapterService, composeHeadersWithVersion, normalizeSurfaceOperationContext, SURFACE_DRAWER_REF, translateUnavailableWorkflowMessage, isSurfaceNavigationError, translateSurfaceNavigationRejected, normalizeUnknownError, EmptyStateCardComponent, RESOURCE_DISCOVERY_I18N_CONFIG, SURFACE_DRAWER_CONTENT_DATA, PraxisIconButtonComponent, PraxisResourceIdentityComponent, ComponentMetadataRegistry, PraxisCustomizationModeService } from '@praxisui/core';
13
+ import { PraxisBulkClientService, PraxisI18nService, generateBulkIdempotencyKey, isBulkExecutionTerminal, API_URL, SafeExpressionEvaluator, buildApiUrl, ASYNC_CONFIG_STORAGE, GlobalConfigService, CrudOperationResolutionService, LoggerService, SurfaceNavigationError, fillUndefined, GenericCrudService, SETTINGS_PANEL_DATA, buildBaseColumnFromDef, PraxisIconDirective, providePraxisI18nConfig, SchemaNormalizerService, PraxisWidgetEventBus, EnterpriseRuntimeContextService, GLOBAL_SURFACE_SERVICE, SurfaceOutletRegistryService, ComponentKeyService, ResourceDiscoveryService, ResourceActionOpenAdapterService, ResourceSurfaceOpenAdapterService, composeHeadersWithVersion, normalizeSurfaceOperationContext, createDefaultTableConfig, SURFACE_DRAWER_REF, translateUnavailableWorkflowMessage, isSurfaceNavigationError, translateSurfaceNavigationRejected, normalizeUnknownError, EmptyStateCardComponent, RESOURCE_DISCOVERY_I18N_CONFIG, SURFACE_DRAWER_CONTENT_DATA, PraxisIconButtonComponent, PraxisResourceIdentityComponent, ComponentMetadataRegistry, PraxisCustomizationModeService } from '@praxisui/core';
14
14
  export { createDynamicRecord, extractRecordId, isDynamicDataRecord, resolveDataField } from '@praxisui/core';
15
15
  import * as i1 from '@angular/common';
16
16
  import { CommonModule } from '@angular/common';
@@ -9631,6 +9631,12 @@ class PraxisCrudComponent {
9631
9631
  filterTeleport = false;
9632
9632
  /** Desabilita auto-abertura da gaveta analítica no clique de linha (Issue #39) */
9633
9633
  disableAutoDrawer = false;
9634
+ tableSignal = signal(undefined, ...(ngDevMode ? [{ debugName: "tableSignal" }] : /* istanbul ignore next */ []));
9635
+ /** Signal reativo do TemplateRef de filtro da tabela interna (usado por PraxisFilterOutlet) */
9636
+ filterTemplateSignal = computed(() => {
9637
+ const tbl = this.tableSignal();
9638
+ return tbl ? tbl.filterTemplateSignal() : undefined;
9639
+ }, ...(ngDevMode ? [{ debugName: "filterTemplateSignal" }] : /* istanbul ignore next */ []));
9634
9640
  get filterTemplate() {
9635
9641
  return this.table?.filterTemplate;
9636
9642
  }
@@ -9664,6 +9670,8 @@ class PraxisCrudComponent {
9664
9670
  drawerClose = new EventEmitter();
9665
9671
  crudAuthoringDocumentApplied = new EventEmitter();
9666
9672
  crudAuthoringDocumentSaved = new EventEmitter();
9673
+ /** Emite sempre que os critérios de filtro ativos na tabela interna são alterados pelo usuário */
9674
+ filterCriteriaChange = new EventEmitter();
9667
9675
  /** Evento emitido ao clicar em um card da faixa declarativa de KPIs (Issue #33) */
9668
9676
  kpiCardClick = new EventEmitter();
9669
9677
  get resolvedKpiBandConfig() {
@@ -9698,12 +9706,13 @@ class PraxisCrudComponent {
9698
9706
  if (this.table) {
9699
9707
  this.table.applyAdvancedFilterCriteria(this.tableFilterCriteria);
9700
9708
  }
9709
+ this.filterCriteriaChange.emit({ ...this.tableFilterCriteria });
9701
9710
  this.cdr.markForCheck();
9702
9711
  }
9703
9712
  }
9704
9713
  resolvedMetadata;
9705
9714
  effectiveTableConfig;
9706
- tableConfigForBinding = createDefaultTableConfig();
9715
+ tableConfigForBinding = { columns: [] };
9707
9716
  tableQueryContext = null;
9708
9717
  tableFilterCriteria = {};
9709
9718
  tableCrudContext;
@@ -9713,7 +9722,14 @@ class PraxisCrudComponent {
9713
9722
  destroyRef = inject(DestroyRef);
9714
9723
  cdr = inject(ChangeDetectorRef);
9715
9724
  widgetEventBus = inject(PraxisWidgetEventBus, { optional: true });
9716
- table;
9725
+ _table;
9726
+ set table(value) {
9727
+ this._table = value;
9728
+ this.tableSignal.set(value);
9729
+ }
9730
+ get table() {
9731
+ return this._table;
9732
+ }
9717
9733
  storage = inject(ASYNC_CONFIG_STORAGE);
9718
9734
  settingsPanel = inject(SettingsPanelService);
9719
9735
  enterpriseRuntimeContext = inject(EnterpriseRuntimeContextService, { optional: true });
@@ -10911,7 +10927,7 @@ class PraxisCrudComponent {
10911
10927
  applyResolvedCrudState(meta) {
10912
10928
  this.effectiveTableConfig = this.buildEffectiveTableConfig(meta, this.collectionCapabilities);
10913
10929
  const nextTableConfig = this.effectiveTableConfig ||
10914
- (meta.table ?? createDefaultTableConfig());
10930
+ (meta.table ?? { columns: [] });
10915
10931
  this.assignTableConfigForBinding(nextTableConfig);
10916
10932
  this.assignTableCrudContext(this.buildTableCrudContext(meta, this.collectionCapabilities));
10917
10933
  this.lastAppliedResourceIdentity = this.resolveCrudResourceIdentity(meta);
@@ -10958,18 +10974,40 @@ class PraxisCrudComponent {
10958
10974
  return this.isRecord(meta?.queryContext) ? meta.queryContext : null;
10959
10975
  }
10960
10976
  resolveFilterCriteria(meta) {
10961
- const fromInput = this.isRecord(this.filterCriteria) ? { ...this.filterCriteria } : {};
10962
- const fromMeta = this.isRecord(meta?.filterCriteria) ? { ...meta.filterCriteria } : {};
10963
- return { ...fromMeta, ...fromInput };
10977
+ if (this.isRecord(this.filterCriteria)) {
10978
+ return { ...this.filterCriteria };
10979
+ }
10980
+ return this.isRecord(meta?.filterCriteria) ? { ...meta.filterCriteria } : {};
10981
+ }
10982
+ areFilterCriteriaEquivalent(a, b) {
10983
+ const normA = a || {};
10984
+ const normB = b || {};
10985
+ const keysA = Object.keys(normA).sort();
10986
+ const keysB = Object.keys(normB).sort();
10987
+ if (keysA.length !== keysB.length)
10988
+ return false;
10989
+ return keysA.every((k, idx) => k === keysB[idx] && JSON.stringify(normA[k]) === JSON.stringify(normB[k]));
10990
+ }
10991
+ onTableFilterCriteriaChange(criteria) {
10992
+ const next = this.isRecord(criteria) ? { ...criteria } : {};
10993
+ if (this.areFilterCriteriaEquivalent(this.tableFilterCriteria, next)) {
10994
+ return;
10995
+ }
10996
+ this.tableFilterCriteria = next;
10997
+ this.filterCriteriaChange.emit({ ...next });
10998
+ this.cdr.markForCheck();
10964
10999
  }
10965
11000
  /**
10966
11001
  * Aplica critérios de busca avançada na tabela interna do CRUD (Issue #11).
10967
11002
  */
10968
11003
  applyFilterCriteria(criteria) {
10969
- this.tableFilterCriteria = {
10970
- ...this.resolveFilterCriteria(this.resolvedMetadata),
10971
- ...(criteria || {}),
10972
- };
11004
+ const nextCriteria = this.isRecord(criteria)
11005
+ ? { ...criteria }
11006
+ : this.resolveFilterCriteria(this.resolvedMetadata);
11007
+ if (this.areFilterCriteriaEquivalent(this.tableFilterCriteria, nextCriteria)) {
11008
+ return;
11009
+ }
11010
+ this.tableFilterCriteria = nextCriteria;
10973
11011
  if (this.table) {
10974
11012
  this.table.applyAdvancedFilterCriteria(this.tableFilterCriteria);
10975
11013
  }
@@ -10983,6 +11021,7 @@ class PraxisCrudComponent {
10983
11021
  if (this.table) {
10984
11022
  this.table.clearAdvancedFilter();
10985
11023
  }
11024
+ this.filterCriteriaChange.emit({});
10986
11025
  this.cdr.markForCheck();
10987
11026
  }
10988
11027
  extractRowFromEvent(event) {
@@ -11545,7 +11584,7 @@ class PraxisCrudComponent {
11545
11584
  const nextResourceIdentity = this.resolveCrudResourceIdentity(meta);
11546
11585
  const cfg = base
11547
11586
  ? JSON.parse(JSON.stringify(base))
11548
- : createDefaultTableConfig();
11587
+ : { columns: [] };
11549
11588
  let changed = false;
11550
11589
  if (this.isInspectOnly(meta)) {
11551
11590
  return this.buildInspectOnlyTableConfig(cfg);
@@ -11573,7 +11612,7 @@ class PraxisCrudComponent {
11573
11612
  }
11574
11613
  const ensureToolbar = () => {
11575
11614
  if (!cfg.toolbar) {
11576
- cfg.toolbar = { visible: true, position: 'top' };
11615
+ cfg.toolbar = { visible: true };
11577
11616
  }
11578
11617
  return cfg.toolbar;
11579
11618
  };
@@ -11581,7 +11620,7 @@ class PraxisCrudComponent {
11581
11620
  const fb = meta.filterBar;
11582
11621
  const toolbar = ensureToolbar();
11583
11622
  toolbar.visible = true;
11584
- toolbar.filters = toolbar.filters || { enabled: true, showAdvancedButton: true };
11623
+ toolbar.filters = toolbar.filters || { enabled: true };
11585
11624
  toolbar.filters.enabled = true;
11586
11625
  if (fb.showAdvanced !== undefined) {
11587
11626
  toolbar.filters.showAdvancedButton = fb.showAdvanced;
@@ -11597,11 +11636,12 @@ class PraxisCrudComponent {
11597
11636
  }
11598
11637
  if (Array.isArray(fb.inlineFields) && fb.inlineFields.length > 0) {
11599
11638
  const behavior = (cfg.behavior = cfg.behavior || {});
11600
- const filtering = (behavior.filtering = behavior.filtering || {
11601
- enabled: true,
11602
- strategy: 'server',
11603
- debounceTime: 300,
11604
- });
11639
+ const filtering = (behavior.filtering =
11640
+ behavior.filtering ||
11641
+ {
11642
+ enabled: true,
11643
+ strategy: 'server',
11644
+ });
11605
11645
  filtering.enabled = true;
11606
11646
  const advancedFilters = (filtering.advancedFilters = filtering.advancedFilters || { enabled: true });
11607
11647
  advancedFilters.enabled = true;
@@ -11626,7 +11666,7 @@ class PraxisCrudComponent {
11626
11666
  else if (this.supportsFilterCapability(capabilities) && !cfg.toolbar?.filters && !cfg.behavior?.filtering?.advancedFilters) {
11627
11667
  const toolbar = ensureToolbar();
11628
11668
  toolbar.visible = true;
11629
- toolbar.filters = toolbar.filters || { enabled: true, showAdvancedButton: true };
11669
+ toolbar.filters = toolbar.filters || { enabled: true };
11630
11670
  toolbar.filters.enabled = true;
11631
11671
  changed = true;
11632
11672
  }
@@ -11651,7 +11691,7 @@ class PraxisCrudComponent {
11651
11691
  changed = true;
11652
11692
  }
11653
11693
  if (!toolbar.filters) {
11654
- toolbar.filters = { enabled: true, showAdvancedButton: true };
11694
+ toolbar.filters = { enabled: true };
11655
11695
  changed = true;
11656
11696
  }
11657
11697
  else if (toolbar.filters.enabled === undefined) {
@@ -11803,11 +11843,10 @@ class PraxisCrudComponent {
11803
11843
  const discoveredBulkActions = this.resolveDiscoveredBulkTableActions(capabilities);
11804
11844
  if (discoveredBulkActions.length > 0) {
11805
11845
  cfg.actions = cfg.actions || {};
11806
- const existingBulk = cfg.actions.bulk || {
11846
+ const existingBulk = (cfg.actions.bulk || {
11807
11847
  enabled: true,
11808
- position: 'both',
11809
11848
  actions: [],
11810
- };
11849
+ });
11811
11850
  const mergedActions = Array.isArray(existingBulk.actions) ? [...existingBulk.actions] : [];
11812
11851
  for (const discovered of discoveredBulkActions) {
11813
11852
  const idx = mergedActions.findIndex((candidate) => String(candidate?.action || candidate?.id || '').trim().toLowerCase() ===
@@ -11823,9 +11862,10 @@ class PraxisCrudComponent {
11823
11862
  mergedActions.push(discovered);
11824
11863
  }
11825
11864
  }
11865
+ const globalBulkPosition = this.global?.get('table.actions.bulk.position');
11826
11866
  cfg.actions.bulk = {
11827
11867
  ...existingBulk,
11828
- position: existingBulk.position || 'both',
11868
+ position: existingBulk.position || globalBulkPosition || 'both',
11829
11869
  enabled: existingBulk.enabled !== false,
11830
11870
  actions: mergedActions,
11831
11871
  };
@@ -11836,11 +11876,19 @@ class PraxisCrudComponent {
11836
11876
  ...prevSelection,
11837
11877
  enabled: true,
11838
11878
  type: prevSelection?.type || 'multiple',
11839
- mode: prevSelection?.mode || 'checkbox',
11840
- allowSelectAll: prevSelection?.allowSelectAll ?? true,
11841
- checkboxPosition: prevSelection?.checkboxPosition || 'start',
11842
- persistSelection: prevSelection?.persistSelection ?? true,
11843
- persistOnDataUpdate: prevSelection?.persistOnDataUpdate ?? true,
11879
+ ...(prevSelection?.mode ? { mode: prevSelection.mode } : {}),
11880
+ ...(prevSelection?.allowSelectAll !== undefined
11881
+ ? { allowSelectAll: prevSelection.allowSelectAll }
11882
+ : {}),
11883
+ ...(prevSelection?.checkboxPosition
11884
+ ? { checkboxPosition: prevSelection.checkboxPosition }
11885
+ : {}),
11886
+ ...(prevSelection?.persistSelection !== undefined
11887
+ ? { persistSelection: prevSelection.persistSelection }
11888
+ : {}),
11889
+ ...(prevSelection?.persistOnDataUpdate !== undefined
11890
+ ? { persistOnDataUpdate: prevSelection.persistOnDataUpdate }
11891
+ : {}),
11844
11892
  };
11845
11893
  }
11846
11894
  changed = true;
@@ -12391,7 +12439,7 @@ class PraxisCrudComponent {
12391
12439
  return Object.entries(params).reduce((current, [name, value]) => current.split(`{${name}}`).join(value), text);
12392
12440
  }
12393
12441
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisCrudComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12394
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisCrudComponent, isStandalone: true, selector: "praxis-crud", inputs: { metadata: "metadata", crudId: "crudId", resource: "resource", componentInstanceId: "componentInstanceId", tableConfigPersistenceStrategy: "tableConfigPersistenceStrategy", context: "context", enableCustomization: "enableCustomization", showResourceIdentityKey: "showResourceIdentityKey", authoringCapability: "authoringCapability", filterCriteria: "filterCriteria", filterTeleport: ["filterTeleport", "filterTeleport", booleanAttribute], disableAutoDrawer: ["disableAutoDrawer", "disableAutoDrawer", booleanAttribute] }, outputs: { configureRequested: "configureRequested", afterOpen: "afterOpen", afterClose: "afterClose", afterSave: "afterSave", afterDelete: "afterDelete", reactiveDeterminationExecuted: "reactiveDeterminationExecuted", reactiveDeterminationPendingChange: "reactiveDeterminationPendingChange", reactiveDeterminationStabilityChange: "reactiveDeterminationStabilityChange", error: "error", rowClick: "rowClick", rowAction: "rowAction", selectionChange: "selectionChange", resourceEvent: "resourceEvent", tableRuntimeConfigChange: "tableRuntimeConfigChange", drawerOpen: "drawerOpen", drawerClose: "drawerClose", crudAuthoringDocumentApplied: "crudAuthoringDocumentApplied", crudAuthoringDocumentSaved: "crudAuthoringDocumentSaved", kpiCardClick: "kpiCardClick" }, providers: [
12442
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisCrudComponent, isStandalone: true, selector: "praxis-crud", inputs: { metadata: "metadata", crudId: "crudId", resource: "resource", componentInstanceId: "componentInstanceId", tableConfigPersistenceStrategy: "tableConfigPersistenceStrategy", context: "context", enableCustomization: "enableCustomization", showResourceIdentityKey: "showResourceIdentityKey", authoringCapability: "authoringCapability", filterCriteria: "filterCriteria", filterTeleport: ["filterTeleport", "filterTeleport", booleanAttribute], disableAutoDrawer: ["disableAutoDrawer", "disableAutoDrawer", booleanAttribute] }, outputs: { configureRequested: "configureRequested", afterOpen: "afterOpen", afterClose: "afterClose", afterSave: "afterSave", afterDelete: "afterDelete", reactiveDeterminationExecuted: "reactiveDeterminationExecuted", reactiveDeterminationPendingChange: "reactiveDeterminationPendingChange", reactiveDeterminationStabilityChange: "reactiveDeterminationStabilityChange", error: "error", rowClick: "rowClick", rowAction: "rowAction", selectionChange: "selectionChange", resourceEvent: "resourceEvent", tableRuntimeConfigChange: "tableRuntimeConfigChange", drawerOpen: "drawerOpen", drawerClose: "drawerClose", crudAuthoringDocumentApplied: "crudAuthoringDocumentApplied", crudAuthoringDocumentSaved: "crudAuthoringDocumentSaved", filterCriteriaChange: "filterCriteriaChange", kpiCardClick: "kpiCardClick" }, providers: [
12395
12443
  providePraxisI18nConfig(RESOURCE_DISCOVERY_I18N_CONFIG),
12396
12444
  providePraxisI18nConfig(PRAXIS_CRUD_RUNTIME_I18N_CONFIG),
12397
12445
  ], viewQueries: [{ propertyName: "table", first: true, predicate: PraxisTable, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
@@ -12437,6 +12485,7 @@ class PraxisCrudComponent {
12437
12485
  (loadingStateChange)="onTableLoadingStateChange($event)"
12438
12486
  (drawerOpen)="onTableDrawerOpen($event)"
12439
12487
  (drawerClose)="onTableDrawerClose()"
12488
+ (filterCriteriaChange)="onTableFilterCriteriaChange($event)"
12440
12489
  ></praxis-table>
12441
12490
  } @else {
12442
12491
  @if (isCustomizationAvailable()) {
@@ -12449,7 +12498,7 @@ class PraxisCrudComponent {
12449
12498
  }
12450
12499
  }
12451
12500
  </div>
12452
- `, isInline: true, styles: [":host{display:block;width:100%;min-width:0;max-width:100%}.praxis-crud-runtime{position:relative;min-width:0}.praxis-crud-opening-status{position:absolute;z-index:6;top:.7rem;right:.7rem;display:inline-flex;align-items:center;gap:.55rem;min-height:2.25rem;max-width:min(24rem,calc(100% - 1.4rem));padding:.48rem .72rem;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #3f51b5) 32%,transparent);border-radius:999px;color:var(--md-sys-color-on-surface, currentColor);background:color-mix(in srgb,var(--md-sys-color-surface-container-high, #fff) 94%,transparent);box-shadow:0 10px 28px #0f172a29;font-size:.82rem;font-weight:650;line-height:1.25;pointer-events:none}.praxis-crud-opening-status__spinner{width:.95rem;height:.95rem;flex:0 0 auto;border:2px solid color-mix(in srgb,var(--md-sys-color-primary, #3f51b5) 26%,transparent);border-top-color:var(--md-sys-color-primary, #3f51b5);border-radius:50%;animation:praxis-crud-opening-spin .72s linear infinite}@keyframes praxis-crud-opening-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.praxis-crud-opening-status__spinner{animation:none;border-top-color:currentColor}}\n"], dependencies: [{ kind: "component", type: PraxisTable, selector: "praxis-table", inputs: ["config", "resourcePath", "data", "tableId", "componentInstanceId", "configPersistenceStrategy", "title", "subtitle", "icon", "autoDelete", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "crudContext", "filterCriteria", "filterTeleport", "widgetId", "queryContext", "aiContext", "aiAssistantVoiceInputMode", "aiAssistantVoiceLanguage", "horizontalScroll", "enableCustomization", "authoringCapability", "dense"], outputs: ["queryContextClear", "queryContextChange", "rowClick", "widgetEvent", "resourceEvent", "rowDoubleClick", "rowExpansionChange", "rowAction", "toolbarAction", "bulkAction", "exportAction", "columnReorder", "columnReorderAttempt", "columnResize", "beforeDelete", "afterDelete", "deleteError", "beforeBulkDelete", "afterBulkDelete", "bulkDeleteError", "schemaStatusChange", "configChange", "metadataChange", "loadingStateChange", "collectionLinksChange", "selectionChange", "drawerOpen", "drawerClose", "drawerTabChange"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone", "variant", "alignment", "density", "iconContainer"] }, { kind: "component", type: PraxisKpiBandComponent, selector: "praxis-kpi-band", inputs: ["config", "dataContext", "isInteractiveHost", "activeFilter"], outputs: ["cardClick", "statsLoaded", "statsError", "refreshClick"] }] });
12501
+ `, isInline: true, styles: [":host{display:block;width:100%;min-width:0;max-width:100%}.praxis-crud-runtime{position:relative;min-width:0}.praxis-crud-opening-status{position:absolute;z-index:6;top:.7rem;right:.7rem;display:inline-flex;align-items:center;gap:.55rem;min-height:2.25rem;max-width:min(24rem,calc(100% - 1.4rem));padding:.48rem .72rem;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #3f51b5) 32%,transparent);border-radius:999px;color:var(--md-sys-color-on-surface, currentColor);background:color-mix(in srgb,var(--md-sys-color-surface-container-high, #fff) 94%,transparent);box-shadow:0 10px 28px #0f172a29;font-size:.82rem;font-weight:650;line-height:1.25;pointer-events:none}.praxis-crud-opening-status__spinner{width:.95rem;height:.95rem;flex:0 0 auto;border:2px solid color-mix(in srgb,var(--md-sys-color-primary, #3f51b5) 26%,transparent);border-top-color:var(--md-sys-color-primary, #3f51b5);border-radius:50%;animation:praxis-crud-opening-spin .72s linear infinite}@keyframes praxis-crud-opening-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.praxis-crud-opening-status__spinner{animation:none;border-top-color:currentColor}}\n"], dependencies: [{ kind: "component", type: PraxisTable, selector: "praxis-table", inputs: ["config", "resourcePath", "data", "tableId", "componentInstanceId", "configPersistenceStrategy", "title", "subtitle", "icon", "autoDelete", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "crudContext", "filterCriteria", "filterTeleport", "widgetId", "queryContext", "aiContext", "aiAssistantVoiceInputMode", "aiAssistantVoiceLanguage", "horizontalScroll", "enableCustomization", "authoringCapability", "dense"], outputs: ["filterCriteriaChange", "queryContextClear", "queryContextChange", "rowClick", "widgetEvent", "resourceEvent", "rowDoubleClick", "rowExpansionChange", "rowAction", "toolbarAction", "bulkAction", "exportAction", "columnReorder", "columnReorderAttempt", "columnResize", "beforeDelete", "afterDelete", "deleteError", "beforeBulkDelete", "afterBulkDelete", "bulkDeleteError", "schemaStatusChange", "configChange", "metadataChange", "loadingStateChange", "collectionLinksChange", "selectionChange", "drawerOpen", "drawerClose", "drawerTabChange"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone", "variant", "alignment", "density", "iconContainer"] }, { kind: "component", type: PraxisKpiBandComponent, selector: "praxis-kpi-band", inputs: ["config", "dataContext", "isInteractiveHost", "activeFilter"], outputs: ["cardClick", "statsLoaded", "statsError", "refreshClick"] }] });
12453
12502
  }
12454
12503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisCrudComponent, decorators: [{
12455
12504
  type: Component,
@@ -12499,6 +12548,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12499
12548
  (loadingStateChange)="onTableLoadingStateChange($event)"
12500
12549
  (drawerOpen)="onTableDrawerOpen($event)"
12501
12550
  (drawerClose)="onTableDrawerClose()"
12551
+ (filterCriteriaChange)="onTableFilterCriteriaChange($event)"
12502
12552
  ></praxis-table>
12503
12553
  } @else {
12504
12554
  @if (isCustomizationAvailable()) {
@@ -12572,6 +12622,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12572
12622
  type: Output
12573
12623
  }], crudAuthoringDocumentSaved: [{
12574
12624
  type: Output
12625
+ }], filterCriteriaChange: [{
12626
+ type: Output
12575
12627
  }], kpiCardClick: [{
12576
12628
  type: Output
12577
12629
  }], table: [{
@@ -15580,7 +15632,7 @@ class PraxisResourcePage {
15580
15632
  }
15581
15633
  }
15582
15634
  </div>
15583
- `, isInline: true, styles: [":host{display:block;width:100%;min-height:100%;box-sizing:border-box}.praxis-resource-page{width:100%;display:flex;flex-direction:column;gap:20px;padding:var(--praxis-page-padding, 24px);box-sizing:border-box;max-width:1540px;margin:0 auto}.praxis-resource-page__header{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap}.praxis-resource-page__header-main{min-width:0;display:flex;flex-direction:column}.praxis-resource-page__domain-badge{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:9999px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px;align-self:flex-start;background:var(--praxis-domain-badge-bg, rgba(255, 255, 255, .08));color:var(--praxis-domain-badge-color, inherit);border:1px solid var(--praxis-domain-badge-border, rgba(255, 255, 255, .1))}.praxis-resource-page__domain-badge.tone-primary,.praxis-resource-page__domain-badge.tone-info{background:color-mix(in srgb,var(--praxis-info, #0284c7) 14%,transparent);color:var(--praxis-info, #38bdf8);border-color:color-mix(in srgb,var(--praxis-info, #0284c7) 30%,transparent)}.praxis-resource-page__domain-badge.tone-success{background:color-mix(in srgb,var(--praxis-success, #059669) 14%,transparent);color:var(--praxis-success, #34d399);border-color:color-mix(in srgb,var(--praxis-success, #059669) 30%,transparent)}.praxis-resource-page__domain-badge.tone-warning{background:color-mix(in srgb,var(--praxis-warning, #d97706) 14%,transparent);color:var(--praxis-warning, #fbbf24);border-color:color-mix(in srgb,var(--praxis-warning, #d97706) 30%,transparent)}.praxis-resource-page__domain-badge.tone-danger,.praxis-resource-page__domain-badge.tone-error{background:color-mix(in srgb,var(--praxis-error, #dc2626) 14%,transparent);color:var(--praxis-error, #f87171);border-color:color-mix(in srgb,var(--praxis-error, #dc2626) 30%,transparent)}.praxis-resource-page__domain-badge span.material-symbols-outlined{font-size:14px}.praxis-resource-page__title{margin:0 0 6px;font-size:var(--praxis-page-title-size, 2rem);font-weight:800;letter-spacing:-.02em;color:var(--praxis-page-title-color, var(--foreground, inherit));line-height:1.2}.praxis-resource-page__subtitle{margin:0;font-size:var(--praxis-page-subtitle-size, .9rem);color:var(--muted-foreground, #94a3b8);max-width:800px;line-height:1.5}.praxis-resource-page__header-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.praxis-resource-page__configure-btn{display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 14px;border-radius:10px;border:1px solid color-mix(in srgb,var(--praxis-primary, #6366f1) 35%,transparent);background:color-mix(in srgb,var(--praxis-primary, #6366f1) 14%,transparent);color:var(--praxis-primary, #818cf8);font-size:13px;font-weight:600;cursor:pointer;transition:all .16s ease}.praxis-resource-page__configure-btn:hover{background:color-mix(in srgb,var(--praxis-primary, #6366f1) 22%,transparent)}.praxis-resource-page__configure-btn .material-symbols-outlined{font-size:18px}.praxis-resource-page__crud-surface{width:100%;border-radius:var(--praxis-surface-radius, 16px);overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PraxisCrudComponent, selector: "praxis-crud", inputs: ["metadata", "crudId", "resource", "componentInstanceId", "tableConfigPersistenceStrategy", "context", "enableCustomization", "showResourceIdentityKey", "authoringCapability", "filterCriteria", "filterTeleport", "disableAutoDrawer"], outputs: ["configureRequested", "afterOpen", "afterClose", "afterSave", "afterDelete", "reactiveDeterminationExecuted", "reactiveDeterminationPendingChange", "reactiveDeterminationStabilityChange", "error", "rowClick", "rowAction", "selectionChange", "resourceEvent", "tableRuntimeConfigChange", "drawerOpen", "drawerClose", "crudAuthoringDocumentApplied", "crudAuthoringDocumentSaved", "kpiCardClick"] }, { kind: "component", type: PraxisScopeBarComponent, selector: "praxis-scope-bar", inputs: ["items", "activeId", "showOmnibox", "omniboxPlaceholder", "omniboxValue", "omniboxDebounceMs", "leadIcon", "leadLabel", "showClearButton", "clearLabel", "target", "targetWidgetId", "scopeBarId", "searchField"], outputs: ["activeIdChange", "omniboxValueChange", "scopeChange", "searchChange", "filterCriteriaChange", "clear"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15635
+ `, isInline: true, styles: [":host{display:block;width:100%;min-height:100%;box-sizing:border-box}.praxis-resource-page{width:100%;display:flex;flex-direction:column;gap:20px;padding:var(--praxis-page-padding, 24px);box-sizing:border-box;max-width:1540px;margin:0 auto}.praxis-resource-page__header{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap}.praxis-resource-page__header-main{min-width:0;display:flex;flex-direction:column}.praxis-resource-page__domain-badge{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:9999px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px;align-self:flex-start;background:var(--praxis-domain-badge-bg, rgba(255, 255, 255, .08));color:var(--praxis-domain-badge-color, inherit);border:1px solid var(--praxis-domain-badge-border, rgba(255, 255, 255, .1))}.praxis-resource-page__domain-badge.tone-primary,.praxis-resource-page__domain-badge.tone-info{background:color-mix(in srgb,var(--praxis-info, #0284c7) 14%,transparent);color:var(--praxis-info, #38bdf8);border-color:color-mix(in srgb,var(--praxis-info, #0284c7) 30%,transparent)}.praxis-resource-page__domain-badge.tone-success{background:color-mix(in srgb,var(--praxis-success, #059669) 14%,transparent);color:var(--praxis-success, #34d399);border-color:color-mix(in srgb,var(--praxis-success, #059669) 30%,transparent)}.praxis-resource-page__domain-badge.tone-warning{background:color-mix(in srgb,var(--praxis-warning, #d97706) 14%,transparent);color:var(--praxis-warning, #fbbf24);border-color:color-mix(in srgb,var(--praxis-warning, #d97706) 30%,transparent)}.praxis-resource-page__domain-badge.tone-danger,.praxis-resource-page__domain-badge.tone-error{background:color-mix(in srgb,var(--praxis-error, #dc2626) 14%,transparent);color:var(--praxis-error, #f87171);border-color:color-mix(in srgb,var(--praxis-error, #dc2626) 30%,transparent)}.praxis-resource-page__domain-badge span.material-symbols-outlined{font-size:14px}.praxis-resource-page__title{margin:0 0 6px;font-size:var(--praxis-page-title-size, 2rem);font-weight:800;letter-spacing:-.02em;color:var(--praxis-page-title-color, var(--foreground, inherit));line-height:1.2}.praxis-resource-page__subtitle{margin:0;font-size:var(--praxis-page-subtitle-size, .9rem);color:var(--muted-foreground, #94a3b8);max-width:800px;line-height:1.5}.praxis-resource-page__header-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.praxis-resource-page__configure-btn{display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 14px;border-radius:10px;border:1px solid color-mix(in srgb,var(--praxis-primary, #6366f1) 35%,transparent);background:color-mix(in srgb,var(--praxis-primary, #6366f1) 14%,transparent);color:var(--praxis-primary, #818cf8);font-size:13px;font-weight:600;cursor:pointer;transition:all .16s ease}.praxis-resource-page__configure-btn:hover{background:color-mix(in srgb,var(--praxis-primary, #6366f1) 22%,transparent)}.praxis-resource-page__configure-btn .material-symbols-outlined{font-size:18px}.praxis-resource-page__crud-surface{width:100%;border-radius:var(--praxis-surface-radius, 16px);overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PraxisCrudComponent, selector: "praxis-crud", inputs: ["metadata", "crudId", "resource", "componentInstanceId", "tableConfigPersistenceStrategy", "context", "enableCustomization", "showResourceIdentityKey", "authoringCapability", "filterCriteria", "filterTeleport", "disableAutoDrawer"], outputs: ["configureRequested", "afterOpen", "afterClose", "afterSave", "afterDelete", "reactiveDeterminationExecuted", "reactiveDeterminationPendingChange", "reactiveDeterminationStabilityChange", "error", "rowClick", "rowAction", "selectionChange", "resourceEvent", "tableRuntimeConfigChange", "drawerOpen", "drawerClose", "crudAuthoringDocumentApplied", "crudAuthoringDocumentSaved", "filterCriteriaChange", "kpiCardClick"] }, { kind: "component", type: PraxisScopeBarComponent, selector: "praxis-scope-bar", inputs: ["items", "activeId", "showOmnibox", "omniboxPlaceholder", "omniboxValue", "omniboxDebounceMs", "leadIcon", "leadLabel", "showClearButton", "clearLabel", "target", "targetWidgetId", "scopeBarId", "searchField"], outputs: ["activeIdChange", "omniboxValueChange", "scopeChange", "searchChange", "filterCriteriaChange", "clear"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15584
15636
  }
15585
15637
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisResourcePage, decorators: [{
15586
15638
  type: Component,
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@praxisui/crud",
3
- "version": "10.0.0-rc.31",
3
+ "version": "10.0.0-rc.32",
4
4
  "description": "CRUD building blocks for Praxis UI: integrates dynamic forms and tables with unified configuration and services.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
- "@praxisui/dynamic-form": "^10.0.0-rc.31",
9
- "@praxisui/table": "^10.0.0-rc.31",
10
- "@praxisui/core": "^10.0.0-rc.31",
11
- "@praxisui/dynamic-fields": "^10.0.0-rc.31",
12
- "@praxisui/settings-panel": "^10.0.0-rc.31",
8
+ "@praxisui/dynamic-form": "^10.0.0-rc.32",
9
+ "@praxisui/table": "^10.0.0-rc.32",
10
+ "@praxisui/core": "^10.0.0-rc.32",
11
+ "@praxisui/dynamic-fields": "^10.0.0-rc.32",
12
+ "@praxisui/settings-panel": "^10.0.0-rc.32",
13
13
  "@angular/cdk": "^21.0.0",
14
14
  "@angular/forms": "^21.0.0",
15
15
  "@angular/material": "^21.0.0",
16
16
  "@angular/router": "^21.0.0",
17
- "@praxisui/ai": "^10.0.0-rc.31",
17
+ "@praxisui/ai": "^10.0.0-rc.32",
18
18
  "rxjs": "~7.8.0"
19
19
  },
20
20
  "dependencies": {
@@ -1,5 +1,5 @@
1
1
  import * as _praxisui_core from '@praxisui/core';
2
- import { RowAction, ToolbarAction, ApiEndpoint, ApiUrlEntry, DynamicFormLayoutPolicy, BackConfig, ResourceBulkExecutionContract, ResourceSurfaceCatalogItem, MaterializedResourceIdentity, TableConfig, PraxisKpiBandConfig, PraxisKpiBandCard, PraxisDataQueryContext, FormConfig, ReactiveDeterminationExecutionEvent, DynamicDataRecord, PraxisResourceEvent, LoadingState, RestApiLinks, ResourceCapabilitySnapshot, SurfaceDrawerRef, GenericCrudService, AsyncConfigStorage, ComponentDocMeta, AiCapabilityCatalog, AiCapability, AiCapabilityCategory, AiValueKind, ComponentAuthoringManifest, SettingsValueProvider, ColumnDefinition, ResourceActionCatalogItem, ResourceBulkTarget, BulkProposalItemResult, BulkItemResult, ResourceBulkProposalDiagnostic } from '@praxisui/core';
2
+ import { RowAction, ToolbarAction, ApiEndpoint, ApiUrlEntry, DynamicFormLayoutPolicy, BackConfig, ResourceBulkExecutionContract, ResourceSurfaceCatalogItem, MaterializedResourceIdentity, TableConfigInput, PraxisKpiBandConfig, PraxisKpiBandCard, PraxisDataQueryContext, FormConfig, ReactiveDeterminationExecutionEvent, DynamicDataRecord, PraxisResourceEvent, TableConfig, LoadingState, RestApiLinks, ResourceCapabilitySnapshot, SurfaceDrawerRef, GenericCrudService, AsyncConfigStorage, ComponentDocMeta, AiCapabilityCatalog, AiCapability, AiCapabilityCategory, AiValueKind, ComponentAuthoringManifest, SettingsValueProvider, ColumnDefinition, ResourceActionCatalogItem, ResourceBulkTarget, BulkProposalItemResult, BulkItemResult, ResourceBulkProposalDiagnostic } from '@praxisui/core';
3
3
  export { BackConfig, DynamicDataCollection, DynamicDataRecord, createDynamicRecord, extractRecordId, isDynamicDataRecord, resolveDataField } from '@praxisui/core';
4
4
  import * as _angular_core from '@angular/core';
5
5
  import { NgZone, OnChanges, TemplateRef, EventEmitter, SimpleChanges, Injector, OnInit, AfterViewInit, Provider, OnDestroy } from '@angular/core';
@@ -149,11 +149,14 @@ interface CrudFilterBarConfig {
149
149
  quickFilters?: boolean | CrudFilterBarQuickFilter[];
150
150
  /** Exibir botão para abrir o construtor de filtros avançados (padrão: true) */
151
151
  showAdvanced?: boolean;
152
+ /**
153
+ * Define onde a barra de filtros inline e avançados (`<praxis-filter>`) deve ser exibida:
154
+ * - `'table-toolbar'` (padrão): na barra de ferramentas da tabela dinâmica.
155
+ * - `'scope-bar'`: teleportada para dentro do card `<praxis-scope-bar>` superior.
156
+ */
157
+ placement?: 'table-toolbar' | 'scope-bar';
152
158
  }
153
- type CrudTableConfig = Omit<TableConfig, 'columns'> & {
154
- /** Definições de colunas (opcional no CrudMetadata quando columnProjection estiver presente ou colunas forem providas via schema) */
155
- columns?: TableConfig['columns'];
156
- };
159
+ type CrudTableConfig = TableConfigInput;
157
160
  interface CrudMetadata {
158
161
  component: 'praxis-crud';
159
162
  /**
@@ -251,6 +254,9 @@ declare class PraxisCrudComponent implements OnChanges {
251
254
  filterTeleport: boolean;
252
255
  /** Desabilita auto-abertura da gaveta analítica no clique de linha (Issue #39) */
253
256
  disableAutoDrawer: boolean;
257
+ private readonly tableSignal;
258
+ /** Signal reativo do TemplateRef de filtro da tabela interna (usado por PraxisFilterOutlet) */
259
+ readonly filterTemplateSignal: _angular_core.Signal<TemplateRef<unknown> | undefined>;
254
260
  get filterTemplate(): TemplateRef<unknown> | undefined;
255
261
  get internalTable(): PraxisTable | undefined;
256
262
  openAnalyticalDrawer(row: any, tabId?: string): void;
@@ -290,6 +296,8 @@ declare class PraxisCrudComponent implements OnChanges {
290
296
  drawerClose: EventEmitter<void>;
291
297
  crudAuthoringDocumentApplied: EventEmitter<CrudAuthoringWidgetPersistenceEvent>;
292
298
  crudAuthoringDocumentSaved: EventEmitter<CrudAuthoringWidgetPersistenceEvent>;
299
+ /** Emite sempre que os critérios de filtro ativos na tabela interna são alterados pelo usuário */
300
+ filterCriteriaChange: EventEmitter<Record<string, unknown>>;
293
301
  /** Evento emitido ao clicar em um card da faixa declarativa de KPIs (Issue #33) */
294
302
  kpiCardClick: EventEmitter<{
295
303
  card: PraxisKpiBandCard;
@@ -316,7 +324,9 @@ declare class PraxisCrudComponent implements OnChanges {
316
324
  private readonly destroyRef;
317
325
  private readonly cdr;
318
326
  private readonly widgetEventBus;
319
- private table;
327
+ private _table?;
328
+ private set table(value);
329
+ private get table();
320
330
  private readonly storage;
321
331
  private readonly settingsPanel;
322
332
  private readonly enterpriseRuntimeContext;
@@ -408,6 +418,8 @@ declare class PraxisCrudComponent implements OnChanges {
408
418
  private syncRuntimeBindings;
409
419
  private resolveQueryContext;
410
420
  private resolveFilterCriteria;
421
+ private areFilterCriteriaEquivalent;
422
+ onTableFilterCriteriaChange(criteria: Record<string, unknown>): void;
411
423
  /**
412
424
  * Aplica critérios de busca avançada na tabela interna do CRUD (Issue #11).
413
425
  */
@@ -492,7 +504,7 @@ declare class PraxisCrudComponent implements OnChanges {
492
504
  private txWithParams;
493
505
  private interpolateTranslationParams;
494
506
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisCrudComponent, never>;
495
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisCrudComponent, "praxis-crud", never, { "metadata": { "alias": "metadata"; "required": false; }; "crudId": { "alias": "crudId"; "required": false; }; "resource": { "alias": "resource"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "tableConfigPersistenceStrategy": { "alias": "tableConfigPersistenceStrategy"; "required": false; }; "context": { "alias": "context"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "showResourceIdentityKey": { "alias": "showResourceIdentityKey"; "required": false; }; "authoringCapability": { "alias": "authoringCapability"; "required": false; }; "filterCriteria": { "alias": "filterCriteria"; "required": false; }; "filterTeleport": { "alias": "filterTeleport"; "required": false; }; "disableAutoDrawer": { "alias": "disableAutoDrawer"; "required": false; }; }, { "configureRequested": "configureRequested"; "afterOpen": "afterOpen"; "afterClose": "afterClose"; "afterSave": "afterSave"; "afterDelete": "afterDelete"; "reactiveDeterminationExecuted": "reactiveDeterminationExecuted"; "reactiveDeterminationPendingChange": "reactiveDeterminationPendingChange"; "reactiveDeterminationStabilityChange": "reactiveDeterminationStabilityChange"; "error": "error"; "rowClick": "rowClick"; "rowAction": "rowAction"; "selectionChange": "selectionChange"; "resourceEvent": "resourceEvent"; "tableRuntimeConfigChange": "tableRuntimeConfigChange"; "drawerOpen": "drawerOpen"; "drawerClose": "drawerClose"; "crudAuthoringDocumentApplied": "crudAuthoringDocumentApplied"; "crudAuthoringDocumentSaved": "crudAuthoringDocumentSaved"; "kpiCardClick": "kpiCardClick"; }, never, never, true, never>;
507
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisCrudComponent, "praxis-crud", never, { "metadata": { "alias": "metadata"; "required": false; }; "crudId": { "alias": "crudId"; "required": false; }; "resource": { "alias": "resource"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "tableConfigPersistenceStrategy": { "alias": "tableConfigPersistenceStrategy"; "required": false; }; "context": { "alias": "context"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "showResourceIdentityKey": { "alias": "showResourceIdentityKey"; "required": false; }; "authoringCapability": { "alias": "authoringCapability"; "required": false; }; "filterCriteria": { "alias": "filterCriteria"; "required": false; }; "filterTeleport": { "alias": "filterTeleport"; "required": false; }; "disableAutoDrawer": { "alias": "disableAutoDrawer"; "required": false; }; }, { "configureRequested": "configureRequested"; "afterOpen": "afterOpen"; "afterClose": "afterClose"; "afterSave": "afterSave"; "afterDelete": "afterDelete"; "reactiveDeterminationExecuted": "reactiveDeterminationExecuted"; "reactiveDeterminationPendingChange": "reactiveDeterminationPendingChange"; "reactiveDeterminationStabilityChange": "reactiveDeterminationStabilityChange"; "error": "error"; "rowClick": "rowClick"; "rowAction": "rowAction"; "selectionChange": "selectionChange"; "resourceEvent": "resourceEvent"; "tableRuntimeConfigChange": "tableRuntimeConfigChange"; "drawerOpen": "drawerOpen"; "drawerClose": "drawerClose"; "crudAuthoringDocumentApplied": "crudAuthoringDocumentApplied"; "crudAuthoringDocumentSaved": "crudAuthoringDocumentSaved"; "filterCriteriaChange": "filterCriteriaChange"; "kpiCardClick": "kpiCardClick"; }, never, never, true, never>;
496
508
  static ngAcceptInputType_filterTeleport: unknown;
497
509
  static ngAcceptInputType_disableAutoDrawer: unknown;
498
510
  }