@praxisui/list 9.0.10 → 9.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -107,7 +107,7 @@ In remote mode, search, sort and export share a collection toolbar above the ite
107
107
  - Selection supports `none`, `single` and `multiple`, with return modes `value`, `item` or `id`.
108
108
  - Item actions can emit local events or delegate to `GlobalActionService`; collection export uses the shared `@praxisui/core` contract for `csv`, `json`, `excel`, `pdf` and `print`.
109
109
  - In `cards` and `tiles`, item activation and secondary item actions are separate keyboard targets. Hosts should preserve this composite interaction model instead of nesting action buttons inside the item activation surface.
110
- - A governed `actions[].recordOpen` resolves the identity declared by the backend against the current-principal resource and contextual surface catalogs before executing `surface.open`; it never derives the target from the displayed label or from `item.id`.
110
+ - A governed `actions[].recordOpen` resolves the identity declared by the backend against the current-principal resource and contextual surface catalogs before executing `surface.open`; it never derives the target from the displayed label or from `item.id`. This path requires the host's canonical `API_URL` configuration, resolved only when the action runs; local lists do not acquire a backend dependency merely by rendering the component.
111
111
 
112
112
  ## Known Runtime Boundaries
113
113
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-08-21T13:43:24.944Z",
3
+ "generatedAt": "2026-08-21T14:58:36.316Z",
4
4
  "packageName": "@praxisui/list",
5
- "packageVersion": "9.0.10",
5
+ "packageVersion": "9.0.11",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -7,7 +7,7 @@ import * as i3 from '@angular/material/list';
7
7
  import { MatListModule } from '@angular/material/list';
8
8
  import * as i4 from '@angular/material/icon';
9
9
  import { MatIconModule } from '@angular/material/icon';
10
- import { resolveValuePresentation, LoggerService, GenericCrudService, toTitleCase, PraxisIconDirective, providePraxisI18n, PraxisI18nService, PraxisIconButtonComponent, validateGlobalActionRefs, IconPickerService, GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_ACTION_CATALOG, getGlobalActionCatalog, SURFACE_OPEN_I18N_NAMESPACE, getGlobalActionUiSchema, SurfaceOpenActionEditorComponent, PRAXIS_I18N_CONFIG, providePraxisI18nConfig, SURFACE_OPEN_I18N_CONFIG, deepMerge, ASYNC_CONFIG_STORAGE, ComponentKeyService, PraxisJsonLogicService, PraxisCollectionExportService, ResourceRecordOpenService, GlobalActionService, GLOBAL_DIALOG_SERVICE, ResourceRecordOpenError, assertPraxisCollectionExportArtifact, normalizePraxisDataQueryContext, ComponentMetadataRegistry, API_URL, LocalStorageAsyncAdapter, LocalStorageConfigService } from '@praxisui/core';
10
+ import { resolveValuePresentation, LoggerService, GenericCrudService, toTitleCase, PraxisIconDirective, providePraxisI18n, PraxisI18nService, PraxisIconButtonComponent, validateGlobalActionRefs, IconPickerService, GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_ACTION_CATALOG, getGlobalActionCatalog, SURFACE_OPEN_I18N_NAMESPACE, getGlobalActionUiSchema, SurfaceOpenActionEditorComponent, PRAXIS_I18N_CONFIG, providePraxisI18nConfig, SURFACE_OPEN_I18N_CONFIG, deepMerge, ASYNC_CONFIG_STORAGE, ComponentKeyService, PraxisJsonLogicService, PraxisCollectionExportService, GlobalActionService, GLOBAL_DIALOG_SERVICE, ResourceRecordOpenError, ResourceRecordOpenService, assertPraxisCollectionExportArtifact, normalizePraxisDataQueryContext, ComponentMetadataRegistry, API_URL, LocalStorageAsyncAdapter, LocalStorageConfigService } from '@praxisui/core';
11
11
  import * as i5 from '@angular/material/chips';
12
12
  import { MatChipsModule } from '@angular/material/chips';
13
13
  import { MatDividerModule } from '@angular/material/divider';
@@ -12642,7 +12642,6 @@ class PraxisList {
12642
12642
  jsonLogic = inject(PraxisJsonLogicService);
12643
12643
  i18n = inject(PraxisI18nService);
12644
12644
  collectionExport = inject(PraxisCollectionExportService);
12645
- recordOpenResolver = inject(ResourceRecordOpenService);
12646
12645
  paginatorIntl = inject(MatPaginatorIntl);
12647
12646
  snackBar = inject(MatSnackBar);
12648
12647
  aiApi = inject(AiBackendApiService);
@@ -13701,7 +13700,11 @@ class PraxisList {
13701
13700
  if (!this.globalActions) {
13702
13701
  throw new Error('GlobalActionService is unavailable for surface.open.');
13703
13702
  }
13704
- const resolution = await firstValueFrom(this.recordOpenResolver.resolve(reference, item));
13703
+ // Discovery belongs to the governed record-open path, not to list
13704
+ // construction. Resolve it only when that intent is executed so local
13705
+ // collections remain usable in hosts that do not configure API_URL.
13706
+ const recordOpenResolver = this.resolveRecordOpenService();
13707
+ const resolution = await firstValueFrom(recordOpenResolver.resolve(reference, item));
13705
13708
  const result = await this.globalActions.executeRef({ actionId: 'surface.open', payload: resolution.payload }, {
13706
13709
  sourceId: this.listId,
13707
13710
  output: 'actionClick',
@@ -13719,6 +13722,9 @@ class PraxisList {
13719
13722
  'The surface.open executor rejected the resolved payload.');
13720
13723
  }
13721
13724
  }
13725
+ resolveRecordOpenService() {
13726
+ return this.injector.get(ResourceRecordOpenService);
13727
+ }
13722
13728
  reportRecordOpenFailure(actionId, reference, error) {
13723
13729
  const failureCode = error instanceof ResourceRecordOpenError
13724
13730
  ? error.code
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@praxisui/list",
3
- "version": "9.0.10",
3
+ "version": "9.0.11",
4
4
  "description": "List components and helpers for Praxis UI.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
8
  "@angular/material": "^21.0.0",
9
- "@praxisui/dynamic-fields": "^9.0.10",
9
+ "@praxisui/dynamic-fields": "^9.0.11",
10
10
  "rxjs": ">=7 <9",
11
11
  "@angular/forms": "^21.0.0",
12
12
  "@angular/router": "^21.0.0",
13
- "@praxisui/ai": "^9.0.10",
14
- "@praxisui/core": "^9.0.10",
15
- "@praxisui/rich-content": "^9.0.10",
16
- "@praxisui/settings-panel": "^9.0.10"
13
+ "@praxisui/ai": "^9.0.11",
14
+ "@praxisui/core": "^9.0.11",
15
+ "@praxisui/rich-content": "^9.0.11",
16
+ "@praxisui/settings-panel": "^9.0.11"
17
17
  },
18
18
  "dependencies": {
19
19
  "tslib": "^2.3.0",
@@ -192,19 +192,21 @@ Este arquivo foi adaptado para o padrao canonico atual sem remover conteudo tecn
192
192
  | `ASYNC_CONFIG_STORAGE` | bidirectional | `loadConfig/saveConfig` | fail-open | Persistência de configuração por `listId`/instância. |
193
193
  | `SettingsPanelService` | bidirectional | `open(...).applied$/saved$` | fail-open | Canal de edição runtime para `PraxisListConfigEditor`. |
194
194
  | `GlobalActionService` | outbound action | `executeRef(globalAction, context)` | fail-soft | Opcional; ausência gera warning e segue fluxo local. |
195
+ | `ResourceRecordOpenService` | outbound query | `resolve(reference, record)` | fail-closed | Resolvido sob demanda apenas para `actions[].recordOpen`. |
195
196
  | `GLOBAL_DIALOG_SERVICE` | bidirectional | confirmação de ação | fail-open | Opcional; sem serviço, ação segue sem modal central. |
196
197
  | `PRAXIS_COLLECTION_EXPORT_PROVIDER` | outbound export | `exportCollection(request)` | fail-fast | Necessário para escopos remotos `filtered/all` e formatos avançados. |
197
198
 
198
199
  ### Host/runtime dependencies
199
200
 
200
- | Dependency | Required | Environment | Purpose | Notes |
201
- | ---------------------- | -------- | -------------------- | -------------------- | ----------------------------------------------------------------- |
202
- | `ListDataService` | Yes | browser/dev/prod/ssr | fluxo de dados | Stream de itens, seção, loading e paginação. |
203
- | `ListSkinService` | Yes | browser/dev/prod | skin runtime | Gera classes/estilos sanitizados por instância. |
204
- | `ASYNC_CONFIG_STORAGE` | Yes | browser/dev/prod | persistência | Salva e restaura config de lista. |
205
- | `SettingsPanelService` | Yes | browser/dev/prod | editor runtime | Abre editor de configuração com preview/apply/save. |
206
- | `GenericCrudService` | Optional | browser/dev/prod | inferência de schema | Usado para inferência de templating quando `resourcePath` existe. |
207
- | `ComponentKeyService` | Yes | browser/dev/prod/ssr | chave de escopo | Determina namespace de persistência e isolamento. |
201
+ | Dependency | Required | Environment | Purpose | Notes |
202
+ | ---------------------- | ----------- | -------------------- | -------------------- | ------------------------------------------------------------------------------------- |
203
+ | `ListDataService` | Yes | browser/dev/prod/ssr | fluxo de dados | Stream de itens, seção, loading e paginação. |
204
+ | `ListSkinService` | Yes | browser/dev/prod | skin runtime | Gera classes/estilos sanitizados por instância. |
205
+ | `ASYNC_CONFIG_STORAGE` | Yes | browser/dev/prod | persistência | Salva e restaura config de lista. |
206
+ | `SettingsPanelService` | Yes | browser/dev/prod | editor runtime | Abre editor de configuração com preview/apply/save. |
207
+ | `GenericCrudService` | Optional | browser/dev/prod | inferência de schema | Usado para inferência de templating quando `resourcePath` existe. |
208
+ | `API_URL` | Conditional | browser/dev/prod | discovery governado | Exigido somente ao executar `actions[].recordOpen`; listas locais renderizam sem ele. |
209
+ | `ComponentKeyService` | Yes | browser/dev/prod/ssr | chave de escopo | Determina namespace de persistência e isolamento. |
208
210
 
209
211
  ## Coverage matrix
210
212
 
@@ -534,7 +534,6 @@ declare class PraxisList implements OnInit, OnChanges, AfterViewInit, OnDestroy
534
534
  private readonly jsonLogic;
535
535
  private readonly i18n;
536
536
  private readonly collectionExport;
537
- private readonly recordOpenResolver;
538
537
  private readonly paginatorIntl;
539
538
  private readonly snackBar;
540
539
  private readonly aiApi;
@@ -691,6 +690,7 @@ declare class PraxisList implements OnInit, OnChanges, AfterViewInit, OnDestroy
691
690
  isResourceConnectionMissing(): boolean;
692
691
  onActionClick(ev: MouseEvent, actionId: string, item: any, index: number): Promise<void>;
693
692
  private executeRecordOpenAction;
693
+ private resolveRecordOpenService;
694
694
  private reportRecordOpenFailure;
695
695
  private resolveActionPayload;
696
696
  private resolveTemplate;