@praxisui/core 9.0.0-beta.36 → 9.0.0-beta.38

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,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, InjectionToken, Injectable, inject, Inject, Optional, makeEnvironmentProviders, APP_INITIALIZER, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, ErrorHandler, EventEmitter, Output, Input, ChangeDetectionStrategy, Directive, SecurityContext, ViewContainerRef, SimpleChange, ContentChild, HostBinding, HostListener, ViewChildren, ViewChild } from '@angular/core';
2
+ import { Component, InjectionToken, Injectable, inject, Inject, Optional, makeEnvironmentProviders, APP_INITIALIZER, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, ErrorHandler, EventEmitter, Output, Input, ChangeDetectionStrategy, Directive, SecurityContext, ViewContainerRef, SimpleChange, ContentChild, HostBinding, HostListener, ViewChildren, ViewChild, Injector, input, output, effect } from '@angular/core';
3
3
  import * as i1 from '@angular/common/http';
4
4
  import { HttpHeaders, HttpClient, HttpParams, HttpResponse, HttpContextToken, HTTP_INTERCEPTORS, withInterceptors } from '@angular/common/http';
5
5
  import { of, defer, throwError, from, EMPTY, BehaviorSubject, firstValueFrom, Subject, map as map$1, switchMap as switchMap$1 } from 'rxjs';
@@ -27,6 +27,8 @@ import { MatTooltipModule } from '@angular/material/tooltip';
27
27
  import { DomSanitizer } from '@angular/platform-browser';
28
28
  import * as i4$1 from '@angular/material/menu';
29
29
  import { MatMenuModule } from '@angular/material/menu';
30
+ import * as i3$2 from '@angular/material/progress-spinner';
31
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
30
32
  import * as i2$1 from '@angular/material/card';
31
33
  import { MatCardModule } from '@angular/material/card';
32
34
  import * as i8 from '@angular/material/chips';
@@ -13572,8 +13574,11 @@ class ResourceSurfaceOpenAdapterService {
13572
13574
  },
13573
13575
  surface: {
13574
13576
  id: surface.id,
13577
+ resourceKey: surface.resourceKey,
13575
13578
  kind: surface.kind,
13576
13579
  scope: surface.scope,
13580
+ title: surface.title,
13581
+ description: surface.description ?? null,
13577
13582
  intent: surface.intent ?? null,
13578
13583
  operationId: surface.operationId,
13579
13584
  path: surface.path,
@@ -13582,7 +13587,9 @@ class ResourceSurfaceOpenAdapterService {
13582
13587
  schemaUrl: surface.schemaUrl,
13583
13588
  responseCardinality: surface.responseCardinality ?? null,
13584
13589
  availability: surface.availability,
13590
+ order: surface.order,
13585
13591
  tags: surface.tags,
13592
+ relatedResource: surface.relatedResource ?? null,
13586
13593
  },
13587
13594
  },
13588
13595
  };
@@ -13720,6 +13727,188 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13720
13727
  args: [{ providedIn: 'any' }]
13721
13728
  }] });
13722
13729
 
13730
+ class RelatedResourceSurfaceResolverService {
13731
+ resolve(request) {
13732
+ try {
13733
+ if (!request?.surface) {
13734
+ return { state: 'idle', reason: 'surface-not-provided' };
13735
+ }
13736
+ const surface = request.surface;
13737
+ if (surface.availability?.allowed === false) {
13738
+ return {
13739
+ state: 'permission-limited',
13740
+ reason: surface.availability.reason || 'surface-not-allowed',
13741
+ surface,
13742
+ relatedResource: surface.relatedResource ?? null,
13743
+ };
13744
+ }
13745
+ const relatedResource = surface.relatedResource ?? null;
13746
+ if (!this.isCompleteRelatedResource(relatedResource)) {
13747
+ return {
13748
+ state: 'not-found',
13749
+ reason: 'related-resource-not-published',
13750
+ surface,
13751
+ relatedResource,
13752
+ };
13753
+ }
13754
+ if (!this.hasReadOperation(relatedResource)) {
13755
+ return {
13756
+ state: 'empty',
13757
+ reason: 'related-resource-read-operation-not-published',
13758
+ surface,
13759
+ relatedResource,
13760
+ };
13761
+ }
13762
+ const parentResourceId = this.resolveParentResourceId(request, relatedResource);
13763
+ if (parentResourceId == null || parentResourceId === '') {
13764
+ return {
13765
+ state: 'not-found',
13766
+ reason: 'parent-resource-id-not-resolved',
13767
+ surface,
13768
+ relatedResource,
13769
+ };
13770
+ }
13771
+ const queryContext = this.buildQueryContext(request.queryContext, relatedResource.childParentField, parentResourceId);
13772
+ const payload = this.buildPayload(surface, relatedResource, parentResourceId, queryContext, request);
13773
+ return {
13774
+ state: 'ready',
13775
+ surface,
13776
+ relatedResource,
13777
+ parentResourceId,
13778
+ childResourcePath: relatedResource.childResourcePath,
13779
+ childResourceKey: relatedResource.childResourceKey,
13780
+ queryContext,
13781
+ payload,
13782
+ };
13783
+ }
13784
+ catch (error) {
13785
+ return {
13786
+ state: 'error',
13787
+ reason: error instanceof Error ? error.message : 'related-resource-resolution-failed',
13788
+ surface: request?.surface ?? null,
13789
+ relatedResource: request?.surface?.relatedResource ?? null,
13790
+ };
13791
+ }
13792
+ }
13793
+ state(state, reason) {
13794
+ return { state, reason };
13795
+ }
13796
+ buildPayload(surface, relatedResource, parentResourceId, queryContext, request) {
13797
+ const preset = SURFACE_OPEN_PRESETS.find((candidate) => candidate.id === 'praxis-table');
13798
+ if (!preset) {
13799
+ throw new Error('Missing canonical surface preset "praxis-table".');
13800
+ }
13801
+ const payload = this.clone(preset.payload);
13802
+ payload.presentation = request.presentation ?? payload.presentation;
13803
+ payload.title = request.title || surface.title;
13804
+ payload.subtitle = request.subtitle || surface.description || undefined;
13805
+ payload.icon = request.icon || payload.icon;
13806
+ payload.widget.inputs = {
13807
+ ...(payload.widget.inputs || {}),
13808
+ configPersistenceStrategy: 'volatile',
13809
+ resourcePath: this.normalizeResourcePath(relatedResource.childResourcePath),
13810
+ tableId: request.tableId || this.buildStableTableId(surface, relatedResource, parentResourceId),
13811
+ queryContext,
13812
+ };
13813
+ payload.context = {
13814
+ ...(payload.context || {}),
13815
+ resource: {
13816
+ resourceKey: surface.resourceKey,
13817
+ resourcePath: this.normalizeResourcePath(request.parentResourcePath || ''),
13818
+ resourceId: parentResourceId,
13819
+ },
13820
+ surface,
13821
+ relatedResource,
13822
+ childResource: {
13823
+ resourceKey: relatedResource.childResourceKey,
13824
+ resourcePath: this.normalizeResourcePath(relatedResource.childResourcePath),
13825
+ parentField: relatedResource.childParentField,
13826
+ selectable: relatedResource.selectable,
13827
+ selectionKeyField: relatedResource.selectionKeyField,
13828
+ operations: relatedResource.childOperations,
13829
+ },
13830
+ };
13831
+ return payload;
13832
+ }
13833
+ buildQueryContext(queryContext, childParentField, parentResourceId) {
13834
+ return {
13835
+ ...(queryContext || {}),
13836
+ filters: {
13837
+ ...(queryContext?.filters || {}),
13838
+ [childParentField]: parentResourceId,
13839
+ },
13840
+ meta: {
13841
+ ...(queryContext?.meta || {}),
13842
+ relatedResource: true,
13843
+ parentFilterField: childParentField,
13844
+ },
13845
+ };
13846
+ }
13847
+ resolveParentResourceId(request, relatedResource) {
13848
+ if (request.parentResourceId != null) {
13849
+ return request.parentResourceId;
13850
+ }
13851
+ return this.readPath(request.parentRecord, relatedResource.parentIdPathVariable);
13852
+ }
13853
+ readPath(record, path) {
13854
+ if (!record || !path) {
13855
+ return null;
13856
+ }
13857
+ const value = path.split('.').reduce((current, segment) => {
13858
+ if (!current || typeof current !== 'object' || Array.isArray(current)) {
13859
+ return undefined;
13860
+ }
13861
+ return current[segment];
13862
+ }, record);
13863
+ return typeof value === 'string' || typeof value === 'number' ? value : null;
13864
+ }
13865
+ isCompleteRelatedResource(relatedResource) {
13866
+ return !!relatedResource
13867
+ && !!this.trim(relatedResource.childResourceKey)
13868
+ && !!this.trim(relatedResource.childResourcePath)
13869
+ && !!this.trim(relatedResource.childParentField)
13870
+ && !!this.trim(relatedResource.parentIdPathVariable)
13871
+ && Array.isArray(relatedResource.childOperations);
13872
+ }
13873
+ hasReadOperation(relatedResource) {
13874
+ return relatedResource.childOperations.includes('LIST')
13875
+ || relatedResource.childOperations.includes('FILTER');
13876
+ }
13877
+ buildStableTableId(surface, relatedResource, parentResourceId) {
13878
+ return this.sanitizeStableId(`${relatedResource.childResourceKey}.${surface.id}.${String(parentResourceId)}`);
13879
+ }
13880
+ normalizeResourcePath(resourcePath) {
13881
+ let normalized = this.trim(resourcePath);
13882
+ if (/^https?:\/\//i.test(normalized)) {
13883
+ try {
13884
+ normalized = new URL(normalized).pathname;
13885
+ }
13886
+ catch {
13887
+ return '';
13888
+ }
13889
+ }
13890
+ return normalized
13891
+ .replace(/^\/+/, '')
13892
+ .replace(/^(?:api\/)+/i, '')
13893
+ .replace(/\/+$/, '');
13894
+ }
13895
+ sanitizeStableId(value) {
13896
+ return value.replace(/[^a-zA-Z0-9._-]+/g, '-');
13897
+ }
13898
+ trim(value) {
13899
+ return typeof value === 'string' ? value.trim() : '';
13900
+ }
13901
+ clone(value) {
13902
+ return value == null ? value : JSON.parse(JSON.stringify(value));
13903
+ }
13904
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RelatedResourceSurfaceResolverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
13905
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RelatedResourceSurfaceResolverService, providedIn: 'any' });
13906
+ }
13907
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RelatedResourceSurfaceResolverService, decorators: [{
13908
+ type: Injectable,
13909
+ args: [{ providedIn: 'any' }]
13910
+ }] });
13911
+
13723
13912
  class SurfaceOpenMaterializerService {
13724
13913
  discovery = inject(ResourceDiscoveryService);
13725
13914
  async materialize(payload, context) {
@@ -13964,6 +14153,7 @@ class SurfaceOpenMaterializerService {
13964
14153
  outputs: {
13965
14154
  rowClick: 'emit',
13966
14155
  selectionChange: 'emit',
14156
+ resourceEvent: 'emit',
13967
14157
  widgetEvent: 'emit',
13968
14158
  },
13969
14159
  inputs: {
@@ -14000,6 +14190,7 @@ class SurfaceOpenMaterializerService {
14000
14190
  ...(payload.widget.outputs || {}),
14001
14191
  rowClick: 'emit',
14002
14192
  selectionChange: 'emit',
14193
+ resourceEvent: 'emit',
14003
14194
  widgetEvent: 'emit',
14004
14195
  },
14005
14196
  inputs: {
@@ -36160,6 +36351,7 @@ class PraxisSurfaceHostComponent {
36160
36351
  widgetEvent = new EventEmitter();
36161
36352
  rowClick = new EventEmitter();
36162
36353
  selectionChange = new EventEmitter();
36354
+ resourceEvent = new EventEmitter();
36163
36355
  beforeWidgetLoader;
36164
36356
  mainWidgetLoader;
36165
36357
  afterWidgetLoader;
@@ -36273,19 +36465,103 @@ class PraxisSurfaceHostComponent {
36273
36465
  }
36274
36466
  }
36275
36467
  onSlotWidgetEvent(ownerWidgetKey, event) {
36468
+ const resourceEvent = event.resourceEvent ?? this.toResourceEvent(ownerWidgetKey, event);
36276
36469
  if (event.output === 'rowClick') {
36277
36470
  this.rowClick.emit(event.payload);
36278
36471
  }
36279
36472
  if (event.output === 'selectionChange') {
36280
36473
  this.selectionChange.emit(event.payload);
36281
36474
  }
36475
+ if (resourceEvent) {
36476
+ this.resourceEvent.emit(resourceEvent);
36477
+ }
36282
36478
  this.widgetEvent.emit({
36283
36479
  ...event,
36480
+ resourceEvent: resourceEvent ?? undefined,
36284
36481
  ownerWidgetKey: event.ownerWidgetKey || ownerWidgetKey,
36285
36482
  });
36286
36483
  }
36484
+ toResourceEvent(ownerWidgetKey, event) {
36485
+ const sourceOutput = String(event.output || '').trim();
36486
+ if (!sourceOutput) {
36487
+ return null;
36488
+ }
36489
+ const kind = sourceOutput === 'rowClick'
36490
+ ? 'row-click'
36491
+ : sourceOutput === 'selectionChange'
36492
+ ? 'selection-change'
36493
+ : sourceOutput === 'recordSurfaceOpen'
36494
+ ? 'surface-open'
36495
+ : 'widget-event';
36496
+ const resourceContext = this.readRecord(this.context?.['resource']);
36497
+ const surfaceContext = this.readRecord(this.context?.['surface']);
36498
+ return {
36499
+ kind,
36500
+ sourceComponentId: event.sourceComponentId,
36501
+ sourceOutput,
36502
+ phase: kind === 'surface-open' ? 'request' : 'notification',
36503
+ resourcePath: this.stringOrNull(resourceContext?.['resourcePath']),
36504
+ resourceKey: this.stringOrNull(resourceContext?.['resourceKey']),
36505
+ resourceId: this.resourceIdOrNull(resourceContext?.['resourceId']),
36506
+ surface: this.toResourceSurface(surfaceContext, resourceContext),
36507
+ payload: event.payload,
36508
+ context: {
36509
+ ...(this.context || {}),
36510
+ ownerWidgetKey: event.ownerWidgetKey || ownerWidgetKey,
36511
+ sourceChildWidgetKey: event.sourceChildWidgetKey,
36512
+ },
36513
+ };
36514
+ }
36515
+ readRecord(value) {
36516
+ return value && typeof value === 'object' && !Array.isArray(value)
36517
+ ? value
36518
+ : null;
36519
+ }
36520
+ stringOrNull(value) {
36521
+ const text = typeof value === 'string' ? value.trim() : '';
36522
+ return text || null;
36523
+ }
36524
+ resourceIdOrNull(value) {
36525
+ return typeof value === 'string' || typeof value === 'number' ? value : null;
36526
+ }
36527
+ toResourceSurface(surface, resource) {
36528
+ const availability = this.readRecord(surface?.['availability']);
36529
+ if (!surface || !availability) {
36530
+ return null;
36531
+ }
36532
+ const id = this.stringOrNull(surface['id']);
36533
+ const resourceKey = this.stringOrNull(surface['resourceKey'])
36534
+ || this.stringOrNull(resource?.['resourceKey']);
36535
+ const operationId = this.stringOrNull(surface['operationId']);
36536
+ const path = this.stringOrNull(surface['path']);
36537
+ const method = this.stringOrNull(surface['method']);
36538
+ const schemaId = this.stringOrNull(surface['schemaId']);
36539
+ const schemaUrl = this.stringOrNull(surface['schemaUrl']);
36540
+ if (!id || !resourceKey || !operationId || !path || !method || !schemaId || !schemaUrl) {
36541
+ return null;
36542
+ }
36543
+ return {
36544
+ id,
36545
+ resourceKey,
36546
+ kind: surface['kind'],
36547
+ scope: surface['scope'],
36548
+ title: String(surface['title'] || id),
36549
+ description: surface['description'],
36550
+ intent: surface['intent'],
36551
+ operationId,
36552
+ path,
36553
+ method,
36554
+ schemaId,
36555
+ schemaUrl,
36556
+ responseCardinality: surface['responseCardinality'],
36557
+ availability: availability,
36558
+ order: Number(surface['order'] || 0),
36559
+ tags: Array.isArray(surface['tags']) ? surface['tags'] : [],
36560
+ relatedResource: surface['relatedResource'],
36561
+ };
36562
+ }
36287
36563
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisSurfaceHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
36288
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisSurfaceHostComponent, isStandalone: true, selector: "praxis-surface-host", inputs: { title: "title", subtitle: "subtitle", icon: "icon", beforeWidget: "beforeWidget", widget: "widget", afterWidget: "afterWidget", context: "context", strictValidation: "strictValidation", renderTitleInsideBody: "renderTitleInsideBody" }, outputs: { widgetEvent: "widgetEvent", rowClick: "rowClick", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "beforeWidgetLoader", first: true, predicate: ["beforeWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "mainWidgetLoader", first: true, predicate: ["mainWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "afterWidgetLoader", first: true, predicate: ["afterWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }], usesOnChanges: true, ngImport: i0, template: `
36564
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisSurfaceHostComponent, isStandalone: true, selector: "praxis-surface-host", inputs: { title: "title", subtitle: "subtitle", icon: "icon", beforeWidget: "beforeWidget", widget: "widget", afterWidget: "afterWidget", context: "context", strictValidation: "strictValidation", renderTitleInsideBody: "renderTitleInsideBody" }, outputs: { widgetEvent: "widgetEvent", rowClick: "rowClick", selectionChange: "selectionChange", resourceEvent: "resourceEvent" }, viewQueries: [{ propertyName: "beforeWidgetLoader", first: true, predicate: ["beforeWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "mainWidgetLoader", first: true, predicate: ["mainWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }, { propertyName: "afterWidgetLoader", first: true, predicate: ["afterWidgetLoader"], descendants: true, read: DynamicWidgetLoaderDirective }], usesOnChanges: true, ngImport: i0, template: `
36289
36565
  <div class="pdx-surface-host">
36290
36566
  @if (subtitle || (title && renderTitleInsideBody)) {
36291
36567
  <header class="pdx-surface-host__header">
@@ -36434,6 +36710,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
36434
36710
  type: Output
36435
36711
  }], selectionChange: [{
36436
36712
  type: Output
36713
+ }], resourceEvent: [{
36714
+ type: Output
36437
36715
  }], beforeWidgetLoader: [{
36438
36716
  type: ViewChild,
36439
36717
  args: ['beforeWidgetLoader', { read: DynamicWidgetLoaderDirective }]
@@ -36445,6 +36723,431 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
36445
36723
  args: ['afterWidgetLoader', { read: DynamicWidgetLoaderDirective }]
36446
36724
  }] } });
36447
36725
 
36726
+ const RELATED_RESOURCE_OUTLET_I18N_NAMESPACE = 'relatedResourceOutlet';
36727
+ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
36728
+ namespaces: {
36729
+ [RELATED_RESOURCE_OUTLET_I18N_NAMESPACE]: {
36730
+ 'pt-BR': {
36731
+ 'state.idle.title': 'Recurso relacionado não selecionado',
36732
+ 'state.idle.description': 'Selecione uma surface relacionada para carregar os dados.',
36733
+ 'state.resolving.title': 'Resolvendo recurso relacionado',
36734
+ 'state.resolving.description': 'Validando metadados e permissões da relação.',
36735
+ 'state.loading.title': 'Carregando recurso relacionado',
36736
+ 'state.loading.description': 'Aguarde enquanto a coleção relacionada é carregada.',
36737
+ 'state.empty.title': 'Nenhuma operação de leitura publicada',
36738
+ 'state.empty.description': 'A relação existe, mas não há operação de lista ou filtro disponível.',
36739
+ 'state.permission-limited.title': 'Acesso limitado',
36740
+ 'state.permission-limited.description': 'O contexto atual não permite abrir este recurso relacionado.',
36741
+ 'state.not-found.title': 'Relação indisponível',
36742
+ 'state.not-found.description': 'Não foi possível resolver a relação ou o identificador do registro pai.',
36743
+ 'state.error.title': 'Falha ao preparar recurso relacionado',
36744
+ 'state.error.description': 'Ocorreu um erro ao preparar a superfície relacionada.',
36745
+ 'action.open': 'Abrir relacionado',
36746
+ 'status.ready': 'Recurso relacionado pronto',
36747
+ },
36748
+ 'en-US': {
36749
+ 'state.idle.title': 'Related resource not selected',
36750
+ 'state.idle.description': 'Select a related surface to load its data.',
36751
+ 'state.resolving.title': 'Resolving related resource',
36752
+ 'state.resolving.description': 'Validating relation metadata and permissions.',
36753
+ 'state.loading.title': 'Loading related resource',
36754
+ 'state.loading.description': 'Wait while the related collection is loaded.',
36755
+ 'state.empty.title': 'No read operation published',
36756
+ 'state.empty.description': 'The relation exists, but no list or filter operation is available.',
36757
+ 'state.permission-limited.title': 'Limited access',
36758
+ 'state.permission-limited.description': 'The current context cannot open this related resource.',
36759
+ 'state.not-found.title': 'Relation unavailable',
36760
+ 'state.not-found.description': 'The relation or parent record identifier could not be resolved.',
36761
+ 'state.error.title': 'Failed to prepare related resource',
36762
+ 'state.error.description': 'An error occurred while preparing the related surface.',
36763
+ 'action.open': 'Open related',
36764
+ 'status.ready': 'Related resource ready',
36765
+ },
36766
+ },
36767
+ },
36768
+ };
36769
+
36770
+ class PraxisRelatedResourceOutletComponent {
36771
+ resolver = inject(RelatedResourceSurfaceResolverService);
36772
+ i18n = inject(PraxisI18nService);
36773
+ injector = inject(Injector);
36774
+ discoverySubscription;
36775
+ discoveryRequestKey = '';
36776
+ surface = input(null, ...(ngDevMode ? [{ debugName: "surface" }] : /* istanbul ignore next */ []));
36777
+ surfaceId = input(null, ...(ngDevMode ? [{ debugName: "surfaceId" }] : /* istanbul ignore next */ []));
36778
+ surfaceCatalog = input(null, ...(ngDevMode ? [{ debugName: "surfaceCatalog" }] : /* istanbul ignore next */ []));
36779
+ discoverySource = input(null, ...(ngDevMode ? [{ debugName: "discoverySource" }] : /* istanbul ignore next */ []));
36780
+ parentLinks = input(null, ...(ngDevMode ? [{ debugName: "parentLinks" }] : /* istanbul ignore next */ []));
36781
+ apiEndpointKey = input(null, ...(ngDevMode ? [{ debugName: "apiEndpointKey" }] : /* istanbul ignore next */ []));
36782
+ apiUrlEntry = input(null, ...(ngDevMode ? [{ debugName: "apiUrlEntry" }] : /* istanbul ignore next */ []));
36783
+ parentRecord = input(null, ...(ngDevMode ? [{ debugName: "parentRecord" }] : /* istanbul ignore next */ []));
36784
+ parentResourceId = input(null, ...(ngDevMode ? [{ debugName: "parentResourceId" }] : /* istanbul ignore next */ []));
36785
+ parentResourcePath = input(null, ...(ngDevMode ? [{ debugName: "parentResourcePath" }] : /* istanbul ignore next */ []));
36786
+ presentation = input('drawer', ...(ngDevMode ? [{ debugName: "presentation" }] : /* istanbul ignore next */ []));
36787
+ title = input(null, ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
36788
+ subtitle = input(null, ...(ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []));
36789
+ icon = input(null, ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
36790
+ tableId = input(null, ...(ngDevMode ? [{ debugName: "tableId" }] : /* istanbul ignore next */ []));
36791
+ queryContext = input(null, ...(ngDevMode ? [{ debugName: "queryContext" }] : /* istanbul ignore next */ []));
36792
+ mode = input('inline', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
36793
+ state = input(null, ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
36794
+ stateReason = input(null, ...(ngDevMode ? [{ debugName: "stateReason" }] : /* istanbul ignore next */ []));
36795
+ compact = input(false, ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
36796
+ strictValidation = input(false, ...(ngDevMode ? [{ debugName: "strictValidation" }] : /* istanbul ignore next */ []));
36797
+ ownerWidgetKey = input('related-resource.outlet', ...(ngDevMode ? [{ debugName: "ownerWidgetKey" }] : /* istanbul ignore next */ []));
36798
+ surfaceOpen = output();
36799
+ widgetEvent = output();
36800
+ resourceEvent = output();
36801
+ discoveredSurface = signal(null, ...(ngDevMode ? [{ debugName: "discoveredSurface" }] : /* istanbul ignore next */ []));
36802
+ discoveryState = signal(null, ...(ngDevMode ? [{ debugName: "discoveryState" }] : /* istanbul ignore next */ []));
36803
+ discoveryStateReason = signal(null, ...(ngDevMode ? [{ debugName: "discoveryStateReason" }] : /* istanbul ignore next */ []));
36804
+ resolution = computed(() => {
36805
+ const state = this.state();
36806
+ if (state && state !== 'ready') {
36807
+ return this.resolver.state(state, this.stateReason() || undefined);
36808
+ }
36809
+ const discoveryState = this.discoveryState();
36810
+ if (discoveryState && discoveryState !== 'ready') {
36811
+ return this.resolver.state(discoveryState, this.discoveryStateReason() || undefined);
36812
+ }
36813
+ return this.resolver.resolve({
36814
+ surface: this.surface() || this.discoveredSurface(),
36815
+ parentRecord: this.parentRecord(),
36816
+ parentResourceId: this.parentResourceId(),
36817
+ parentResourcePath: this.parentResourcePath(),
36818
+ presentation: this.presentation(),
36819
+ title: this.title(),
36820
+ subtitle: this.subtitle(),
36821
+ icon: this.icon(),
36822
+ tableId: this.tableId(),
36823
+ queryContext: this.queryContext(),
36824
+ });
36825
+ }, ...(ngDevMode ? [{ debugName: "resolution" }] : /* istanbul ignore next */ []));
36826
+ isBusy = computed(() => {
36827
+ const state = this.resolution().state;
36828
+ return state === 'resolving' || state === 'loading';
36829
+ }, ...(ngDevMode ? [{ debugName: "isBusy" }] : /* istanbul ignore next */ []));
36830
+ constructor() {
36831
+ effect((onCleanup) => {
36832
+ const surface = this.surface();
36833
+ const surfaceId = this.surfaceId();
36834
+ const catalog = this.surfaceCatalog();
36835
+ const discoverySource = this.discoverySource() || this.parentLinks();
36836
+ const parentResourcePath = this.parentResourcePath();
36837
+ const parentResourceId = this.parentResourceId();
36838
+ const apiEndpointKey = this.apiEndpointKey();
36839
+ const apiUrlEntry = this.apiUrlEntry();
36840
+ this.discoverySubscription?.unsubscribe();
36841
+ this.discoverySubscription = undefined;
36842
+ if (surface || !this.trim(surfaceId)) {
36843
+ this.resetDiscoveryState();
36844
+ return;
36845
+ }
36846
+ if (catalog) {
36847
+ this.applyCatalogSurface(surfaceId, catalog);
36848
+ return;
36849
+ }
36850
+ const href = this.resolveFallbackSurfaceCatalogHref(parentResourcePath, parentResourceId);
36851
+ if (!discoverySource && !href) {
36852
+ this.discoveredSurface.set(null);
36853
+ this.discoveryState.set('not-found');
36854
+ this.discoveryStateReason.set('surface-discovery-source-not-provided');
36855
+ return;
36856
+ }
36857
+ const options = this.discoveryOptions(apiEndpointKey, apiUrlEntry);
36858
+ const requestKey = this.buildDiscoveryRequestKey(surfaceId, discoverySource, href, options);
36859
+ this.discoveryRequestKey = requestKey;
36860
+ this.discoveredSurface.set(null);
36861
+ this.discoveryState.set('resolving');
36862
+ this.discoveryStateReason.set(null);
36863
+ const discovery = this.injector.get(ResourceDiscoveryService);
36864
+ const catalog$ = discoverySource
36865
+ ? discovery.getSurfaces(discoverySource, options)
36866
+ : discovery.fetchJson(href, options);
36867
+ this.discoverySubscription = catalog$.subscribe({
36868
+ next: (response) => {
36869
+ if (this.discoveryRequestKey !== requestKey) {
36870
+ return;
36871
+ }
36872
+ this.applyCatalogSurface(surfaceId, response);
36873
+ },
36874
+ error: (error) => {
36875
+ if (this.discoveryRequestKey !== requestKey) {
36876
+ return;
36877
+ }
36878
+ this.discoveredSurface.set(null);
36879
+ this.discoveryState.set(this.isPermissionError(error) ? 'permission-limited' : 'error');
36880
+ this.discoveryStateReason.set(this.isPermissionError(error)
36881
+ ? 'surface-discovery-permission-limited'
36882
+ : 'surface-discovery-failed');
36883
+ },
36884
+ });
36885
+ onCleanup(() => {
36886
+ this.discoverySubscription?.unsubscribe();
36887
+ this.discoverySubscription = undefined;
36888
+ });
36889
+ });
36890
+ }
36891
+ openRelated() {
36892
+ const payload = this.resolution().payload;
36893
+ if (payload) {
36894
+ this.surfaceOpen.emit(payload);
36895
+ }
36896
+ }
36897
+ onWidgetEvent(event) {
36898
+ const resourceEvent = event.resourceEvent ?? this.extractResourceEvent(event);
36899
+ if (resourceEvent) {
36900
+ this.resourceEvent.emit(resourceEvent);
36901
+ this.widgetEvent.emit({ ...event, resourceEvent });
36902
+ return;
36903
+ }
36904
+ this.widgetEvent.emit(event);
36905
+ }
36906
+ stateIcon() {
36907
+ switch (this.resolution().state) {
36908
+ case 'ready':
36909
+ return 'hub';
36910
+ case 'permission-limited':
36911
+ return 'lock';
36912
+ case 'not-found':
36913
+ return 'link_off';
36914
+ case 'empty':
36915
+ return 'playlist_remove';
36916
+ case 'error':
36917
+ return 'error';
36918
+ default:
36919
+ return 'account_tree';
36920
+ }
36921
+ }
36922
+ stateTitle() {
36923
+ const state = this.resolution().state;
36924
+ return this.t(`state.${state}.title`, this.defaultTitle(state));
36925
+ }
36926
+ stateDescription() {
36927
+ const state = this.resolution().state;
36928
+ return this.t(`state.${state}.description`, this.defaultDescription(state));
36929
+ }
36930
+ t(key, fallback) {
36931
+ return this.i18n.t(key, undefined, fallback, RELATED_RESOURCE_OUTLET_I18N_NAMESPACE);
36932
+ }
36933
+ defaultTitle(state) {
36934
+ return state === 'ready'
36935
+ ? this.t('status.ready', 'Related resource ready')
36936
+ : 'Related resource';
36937
+ }
36938
+ defaultDescription(state) {
36939
+ return this.resolution().reason || state;
36940
+ }
36941
+ applyCatalogSurface(surfaceId, catalog) {
36942
+ const normalizedId = this.trim(surfaceId);
36943
+ const surface = (catalog?.surfaces || []).find((candidate) => this.trim(candidate.id) === normalizedId) || null;
36944
+ this.discoveredSurface.set(surface);
36945
+ this.discoveryState.set(surface ? null : 'not-found');
36946
+ this.discoveryStateReason.set(surface ? null : 'surface-id-not-found');
36947
+ }
36948
+ resetDiscoveryState() {
36949
+ this.discoveredSurface.set(null);
36950
+ this.discoveryState.set(null);
36951
+ this.discoveryStateReason.set(null);
36952
+ this.discoveryRequestKey = '';
36953
+ }
36954
+ discoveryOptions(endpointKey, apiUrlEntry) {
36955
+ if (!endpointKey && !apiUrlEntry) {
36956
+ return undefined;
36957
+ }
36958
+ return {
36959
+ endpointKey: endpointKey || undefined,
36960
+ apiUrlEntry: apiUrlEntry || null,
36961
+ };
36962
+ }
36963
+ resolveFallbackSurfaceCatalogHref(parentResourcePath, parentResourceId) {
36964
+ const path = this.normalizeResourcePath(parentResourcePath || '');
36965
+ if (!path || parentResourceId == null || parentResourceId === '') {
36966
+ return null;
36967
+ }
36968
+ return `/api/${path}/${encodeURIComponent(String(parentResourceId))}/surfaces`;
36969
+ }
36970
+ normalizeResourcePath(resourcePath) {
36971
+ let normalized = this.trim(resourcePath);
36972
+ if (/^https?:\/\//i.test(normalized)) {
36973
+ try {
36974
+ normalized = new URL(normalized).pathname;
36975
+ }
36976
+ catch {
36977
+ return '';
36978
+ }
36979
+ }
36980
+ return normalized
36981
+ .replace(/^\/+/, '')
36982
+ .replace(/^(?:api\/)+/i, '')
36983
+ .replace(/\/+$/, '');
36984
+ }
36985
+ buildDiscoveryRequestKey(surfaceId, source, href, options) {
36986
+ return JSON.stringify({
36987
+ surfaceId: this.trim(surfaceId),
36988
+ source,
36989
+ href,
36990
+ endpointKey: options?.endpointKey || null,
36991
+ apiUrlEntry: options?.apiUrlEntry || null,
36992
+ });
36993
+ }
36994
+ isPermissionError(error) {
36995
+ const status = typeof error === 'object' && error
36996
+ ? error.status
36997
+ : null;
36998
+ return status === 401 || status === 403;
36999
+ }
37000
+ extractResourceEvent(event) {
37001
+ if (event.output !== 'resourceEvent' || !event.payload || typeof event.payload !== 'object') {
37002
+ return null;
37003
+ }
37004
+ const candidate = event.payload;
37005
+ return typeof candidate.kind === 'string'
37006
+ && typeof candidate.sourceComponentId === 'string'
37007
+ && 'payload' in candidate
37008
+ ? candidate
37009
+ : null;
37010
+ }
37011
+ trim(value) {
37012
+ return typeof value === 'string' ? value.trim() : '';
37013
+ }
37014
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRelatedResourceOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
37015
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisRelatedResourceOutletComponent, isStandalone: true, selector: "praxis-related-resource-outlet", inputs: { surface: { classPropertyName: "surface", publicName: "surface", isSignal: true, isRequired: false, transformFunction: null }, surfaceId: { classPropertyName: "surfaceId", publicName: "surfaceId", isSignal: true, isRequired: false, transformFunction: null }, surfaceCatalog: { classPropertyName: "surfaceCatalog", publicName: "surfaceCatalog", isSignal: true, isRequired: false, transformFunction: null }, discoverySource: { classPropertyName: "discoverySource", publicName: "discoverySource", isSignal: true, isRequired: false, transformFunction: null }, parentLinks: { classPropertyName: "parentLinks", publicName: "parentLinks", isSignal: true, isRequired: false, transformFunction: null }, apiEndpointKey: { classPropertyName: "apiEndpointKey", publicName: "apiEndpointKey", isSignal: true, isRequired: false, transformFunction: null }, apiUrlEntry: { classPropertyName: "apiUrlEntry", publicName: "apiUrlEntry", isSignal: true, isRequired: false, transformFunction: null }, parentRecord: { classPropertyName: "parentRecord", publicName: "parentRecord", isSignal: true, isRequired: false, transformFunction: null }, parentResourceId: { classPropertyName: "parentResourceId", publicName: "parentResourceId", isSignal: true, isRequired: false, transformFunction: null }, parentResourcePath: { classPropertyName: "parentResourcePath", publicName: "parentResourcePath", isSignal: true, isRequired: false, transformFunction: null }, presentation: { classPropertyName: "presentation", publicName: "presentation", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, tableId: { classPropertyName: "tableId", publicName: "tableId", isSignal: true, isRequired: false, transformFunction: null }, queryContext: { classPropertyName: "queryContext", publicName: "queryContext", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, stateReason: { classPropertyName: "stateReason", publicName: "stateReason", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, strictValidation: { classPropertyName: "strictValidation", publicName: "strictValidation", isSignal: true, isRequired: false, transformFunction: null }, ownerWidgetKey: { classPropertyName: "ownerWidgetKey", publicName: "ownerWidgetKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { surfaceOpen: "surfaceOpen", widgetEvent: "widgetEvent", resourceEvent: "resourceEvent" }, host: { attributes: { "data-praxis-related-resource-outlet": "core" }, properties: { "attr.data-state": "resolution().state" } }, providers: [providePraxisI18nConfig(RELATED_RESOURCE_OUTLET_I18N_CONFIG)], ngImport: i0, template: `
37016
+ <section class="pdx-related-outlet" [class.pdx-related-outlet--compact]="compact()">
37017
+ @if (resolution().state === 'ready' && mode() === 'inline' && resolution().payload?.widget) {
37018
+ <ng-container
37019
+ [dynamicWidgetLoader]="resolution().payload!.widget"
37020
+ [ownerWidgetKey]="ownerWidgetKey()"
37021
+ [context]="resolution().payload!.context || null"
37022
+ [strictValidation]="strictValidation()"
37023
+ [autoWireOutputs]="true"
37024
+ (widgetEvent)="onWidgetEvent($event)"
37025
+ ></ng-container>
37026
+ } @else {
37027
+ <div
37028
+ class="pdx-related-outlet__state"
37029
+ [class.pdx-related-outlet__state--ready]="resolution().state === 'ready'"
37030
+ [class.pdx-related-outlet__state--busy]="isBusy()"
37031
+ role="status"
37032
+ aria-live="polite"
37033
+ >
37034
+ <div class="pdx-related-outlet__icon" aria-hidden="true">
37035
+ @if (isBusy()) {
37036
+ <mat-progress-spinner mode="indeterminate" diameter="22"></mat-progress-spinner>
37037
+ } @else {
37038
+ <mat-icon [fontIcon]="stateIcon()"></mat-icon>
37039
+ }
37040
+ </div>
37041
+ <div class="pdx-related-outlet__copy">
37042
+ <h3>{{ stateTitle() }}</h3>
37043
+ <p>{{ stateDescription() }}</p>
37044
+ </div>
37045
+ @if (resolution().state === 'ready' && mode() === 'open-action') {
37046
+ <button mat-flat-button type="button" color="primary" (click)="openRelated()">
37047
+ <mat-icon fontIcon="open_in_new" aria-hidden="true"></mat-icon>
37048
+ {{ t('action.open', 'Open related') }}
37049
+ </button>
37050
+ }
37051
+ </div>
37052
+ }
37053
+ </section>
37054
+ `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-related-outlet{display:block;min-width:0;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__state{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--pdx-related-outlet-gap, 12px);min-height:var(--pdx-related-outlet-min-height, 64px);padding:var(--pdx-related-outlet-padding, 12px);border:1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, .16));border-radius:var(--pdx-related-outlet-radius, 8px);background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface, transparent))}.pdx-related-outlet--compact .pdx-related-outlet__state{min-height:var(--pdx-related-outlet-compact-min-height, 48px);padding:var(--pdx-related-outlet-compact-padding, 8px 10px)}.pdx-related-outlet__state--ready{border-color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__icon{display:inline-grid;place-items:center;width:32px;height:32px;color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__state--busy .pdx-related-outlet__icon{color:var(--md-sys-color-secondary, currentColor)}.pdx-related-outlet__copy{display:grid;gap:2px;min-width:0}.pdx-related-outlet__copy h3,.pdx-related-outlet__copy p{margin:0}.pdx-related-outlet__copy h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.25rem system-ui);color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__copy p{font:var(--md-sys-typescale-body-small, 400 .82rem/1.15rem system-ui);color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:600px){.pdx-related-outlet__state{grid-template-columns:auto minmax(0,1fr)}.pdx-related-outlet__state button{grid-column:1 / -1;justify-self:start}}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3$2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
37055
+ }
37056
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRelatedResourceOutletComponent, decorators: [{
37057
+ type: Component,
37058
+ args: [{ selector: 'praxis-related-resource-outlet', standalone: true, host: {
37059
+ 'data-praxis-related-resource-outlet': 'core',
37060
+ '[attr.data-state]': 'resolution().state',
37061
+ }, imports: [
37062
+ DynamicWidgetLoaderDirective,
37063
+ MatButtonModule,
37064
+ MatIconModule,
37065
+ MatProgressSpinnerModule,
37066
+ ], providers: [providePraxisI18nConfig(RELATED_RESOURCE_OUTLET_I18N_CONFIG)], template: `
37067
+ <section class="pdx-related-outlet" [class.pdx-related-outlet--compact]="compact()">
37068
+ @if (resolution().state === 'ready' && mode() === 'inline' && resolution().payload?.widget) {
37069
+ <ng-container
37070
+ [dynamicWidgetLoader]="resolution().payload!.widget"
37071
+ [ownerWidgetKey]="ownerWidgetKey()"
37072
+ [context]="resolution().payload!.context || null"
37073
+ [strictValidation]="strictValidation()"
37074
+ [autoWireOutputs]="true"
37075
+ (widgetEvent)="onWidgetEvent($event)"
37076
+ ></ng-container>
37077
+ } @else {
37078
+ <div
37079
+ class="pdx-related-outlet__state"
37080
+ [class.pdx-related-outlet__state--ready]="resolution().state === 'ready'"
37081
+ [class.pdx-related-outlet__state--busy]="isBusy()"
37082
+ role="status"
37083
+ aria-live="polite"
37084
+ >
37085
+ <div class="pdx-related-outlet__icon" aria-hidden="true">
37086
+ @if (isBusy()) {
37087
+ <mat-progress-spinner mode="indeterminate" diameter="22"></mat-progress-spinner>
37088
+ } @else {
37089
+ <mat-icon [fontIcon]="stateIcon()"></mat-icon>
37090
+ }
37091
+ </div>
37092
+ <div class="pdx-related-outlet__copy">
37093
+ <h3>{{ stateTitle() }}</h3>
37094
+ <p>{{ stateDescription() }}</p>
37095
+ </div>
37096
+ @if (resolution().state === 'ready' && mode() === 'open-action') {
37097
+ <button mat-flat-button type="button" color="primary" (click)="openRelated()">
37098
+ <mat-icon fontIcon="open_in_new" aria-hidden="true"></mat-icon>
37099
+ {{ t('action.open', 'Open related') }}
37100
+ </button>
37101
+ }
37102
+ </div>
37103
+ }
37104
+ </section>
37105
+ `, styles: [":host{display:block;min-width:0}.pdx-related-outlet{display:block;min-width:0;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__state{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--pdx-related-outlet-gap, 12px);min-height:var(--pdx-related-outlet-min-height, 64px);padding:var(--pdx-related-outlet-padding, 12px);border:1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, .16));border-radius:var(--pdx-related-outlet-radius, 8px);background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface, transparent))}.pdx-related-outlet--compact .pdx-related-outlet__state{min-height:var(--pdx-related-outlet-compact-min-height, 48px);padding:var(--pdx-related-outlet-compact-padding, 8px 10px)}.pdx-related-outlet__state--ready{border-color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__icon{display:inline-grid;place-items:center;width:32px;height:32px;color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__state--busy .pdx-related-outlet__icon{color:var(--md-sys-color-secondary, currentColor)}.pdx-related-outlet__copy{display:grid;gap:2px;min-width:0}.pdx-related-outlet__copy h3,.pdx-related-outlet__copy p{margin:0}.pdx-related-outlet__copy h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.25rem system-ui);color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__copy p{font:var(--md-sys-typescale-body-small, 400 .82rem/1.15rem system-ui);color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:600px){.pdx-related-outlet__state{grid-template-columns:auto minmax(0,1fr)}.pdx-related-outlet__state button{grid-column:1 / -1;justify-self:start}}\n"] }]
37106
+ }], ctorParameters: () => [], propDecorators: { surface: [{ type: i0.Input, args: [{ isSignal: true, alias: "surface", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: false }] }], surfaceCatalog: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceCatalog", required: false }] }], discoverySource: [{ type: i0.Input, args: [{ isSignal: true, alias: "discoverySource", required: false }] }], parentLinks: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentLinks", required: false }] }], apiEndpointKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiEndpointKey", required: false }] }], apiUrlEntry: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiUrlEntry", required: false }] }], parentRecord: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentRecord", required: false }] }], parentResourceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentResourceId", required: false }] }], parentResourcePath: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentResourcePath", required: false }] }], presentation: [{ type: i0.Input, args: [{ isSignal: true, alias: "presentation", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], tableId: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableId", required: false }] }], queryContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "queryContext", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], stateReason: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateReason", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], strictValidation: [{ type: i0.Input, args: [{ isSignal: true, alias: "strictValidation", required: false }] }], ownerWidgetKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "ownerWidgetKey", required: false }] }], surfaceOpen: [{ type: i0.Output, args: ["surfaceOpen"] }], widgetEvent: [{ type: i0.Output, args: ["widgetEvent"] }], resourceEvent: [{ type: i0.Output, args: ["resourceEvent"] }] } });
37107
+
37108
+ const PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA = {
37109
+ id: 'praxis-related-resource-outlet',
37110
+ selector: 'praxis-related-resource-outlet',
37111
+ component: PraxisRelatedResourceOutletComponent,
37112
+ friendlyName: 'Related Resource Outlet',
37113
+ description: 'Runtime genérico para materializar surface.relatedResource como tabela filha governada por metadata.',
37114
+ icon: 'hub',
37115
+ inputs: [
37116
+ { name: 'surfaceId', type: 'string | null', description: 'Identidade declarativa da surface quando o outlet deve descobri-la no catálogo do recurso.' },
37117
+ { name: 'surfaceCatalog', type: 'ResourceSurfaceCatalogResponse | null', description: 'Catálogo de surfaces já carregado pelo host; evita nova consulta quando disponível.' },
37118
+ { name: 'discoverySource', type: 'ResourceLinkSource | null', description: 'Resposta HATEOAS ou mapa de links usado para seguir rel surfaces quando surface não foi fornecida.' },
37119
+ { name: 'parentLinks', type: 'RestApiLinks | RestApiResponse<unknown> | null', description: 'Atalho para links do registro pai; tem o mesmo papel de discoverySource para rel surfaces.' },
37120
+ { name: 'apiEndpointKey', type: 'ApiEndpoint | null', description: 'Endpoint Praxis usado pelo ResourceDiscoveryService ao resolver links ou fallback do catálogo.' },
37121
+ { name: 'apiUrlEntry', type: 'ApiUrlEntry | null', description: 'Entrada de API já resolvida para hosts destacados ou integrações remotas.' },
37122
+ { name: 'surface', type: 'ResourceSurfaceCatalogItem | null', description: 'Surface de catálogo que pode publicar relatedResource.' },
37123
+ { name: 'parentRecord', type: 'Record<string, unknown> | null', description: 'Registro pai usado para resolver parentIdPathVariable.' },
37124
+ { name: 'parentResourceId', type: 'string | number | null', description: 'Identificador explícito do registro pai quando não vem do record.' },
37125
+ { name: 'parentResourcePath', type: 'string | null', description: 'ResourcePath do recurso pai para contexto da surface.' },
37126
+ { name: 'queryContext', type: 'RelatedResourceQueryContext | null', description: 'QueryContext base mesclado com o filtro canônico da relação filha.' },
37127
+ { name: 'mode', type: "'inline' | 'open-action'", description: 'Renderiza a tabela filha inline ou emite payload para abertura host-mediated.', default: 'inline' },
37128
+ { name: 'state', type: 'RelatedResourceResolutionState | null', description: 'Override de estado para hosts/outlets que estejam carregando discovery remoto.' },
37129
+ { name: 'compact', type: 'boolean', description: 'Reduz densidade visual dos estados não materializados.', default: false },
37130
+ { name: 'strictValidation', type: 'boolean', description: 'Validação estrita do widget materializado pelo DynamicWidgetLoader.', default: false },
37131
+ ],
37132
+ outputs: [
37133
+ { name: 'surfaceOpen', type: 'SurfaceOpenPayload', description: 'Emitido em modo open-action com o payload pronto de surface.open.' },
37134
+ { name: 'widgetEvent', type: 'WidgetEventEnvelope', description: 'Reemite eventos do widget filho materializado.' },
37135
+ { name: 'resourceEvent', type: 'PraxisResourceEvent', description: 'Promove eventos canonicos emitidos pelo widget filho materializado.' },
37136
+ ],
37137
+ tags: ['resource', 'surface', 'related-resource', 'runtime', 'metadata-driven'],
37138
+ lib: '@praxisui/core',
37139
+ };
37140
+ function providePraxisRelatedResourceOutletMetadata() {
37141
+ return {
37142
+ provide: ENVIRONMENT_INITIALIZER,
37143
+ multi: true,
37144
+ useFactory: (registry) => () => {
37145
+ registry.register(PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA);
37146
+ },
37147
+ deps: [ComponentMetadataRegistry],
37148
+ };
37149
+ }
37150
+
36448
37151
  class EmptyStateCardComponent {
36449
37152
  icon = 'tab';
36450
37153
  title = 'Sem configuração disponível';
@@ -37903,4 +38606,4 @@ function provideHookWhitelist(allowed) {
37903
38606
  * Generated bundle index. Do not edit.
37904
38607
  */
37905
38608
 
37906
- export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };
38609
+ export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, CompositionRuntimeFacade, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeResourceAvailabilityReasonCode, normalizeStart, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolveResourceAvailabilityReasonKey, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToJson, slugify, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };