@praxisui/crud 9.0.4-rc.30 → 9.0.4-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-08-05T01:36:08.693Z",
3
+ "generatedAt": "2026-08-05T09:56:10.324Z",
4
4
  "packageName": "@praxisui/crud",
5
- "packageVersion": "9.0.4-rc.30",
5
+ "packageVersion": "9.0.4-rc.32",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 2,
@@ -6,7 +6,7 @@ import { Router, ActivatedRoute, RouterLink } from '@angular/router';
6
6
  import { MatSnackBar } from '@angular/material/snack-bar';
7
7
  import { firstValueFrom, BehaviorSubject, Subscription } from 'rxjs';
8
8
  import * as i2$1 from '@praxisui/core';
9
- import { ASYNC_CONFIG_STORAGE, GlobalConfigService, CrudOperationResolutionService, fillUndefined, SETTINGS_PANEL_DATA, PraxisI18nService, PraxisIconDirective, providePraxisI18nConfig, createDefaultTableConfig, EnterpriseRuntimeContextService, GLOBAL_SURFACE_SERVICE, SurfaceOutletRegistryService, ComponentKeyService, ResourceDiscoveryService, ResourceActionOpenAdapterService, ResourceSurfaceOpenAdapterService, normalizeSurfaceOperationContext, translateUnavailableWorkflowMessage, EmptyStateCardComponent, RESOURCE_DISCOVERY_I18N_CONFIG, SURFACE_DRAWER_REF, SURFACE_DRAWER_CONTENT_DATA, PraxisIconButtonComponent, PraxisResourceIdentityComponent, GenericCrudService, ComponentMetadataRegistry } from '@praxisui/core';
9
+ import { ASYNC_CONFIG_STORAGE, GlobalConfigService, CrudOperationResolutionService, LoggerService, SurfaceNavigationError, fillUndefined, SETTINGS_PANEL_DATA, PraxisI18nService, PraxisIconDirective, providePraxisI18nConfig, createDefaultTableConfig, EnterpriseRuntimeContextService, GLOBAL_SURFACE_SERVICE, SurfaceOutletRegistryService, ComponentKeyService, ResourceDiscoveryService, ResourceActionOpenAdapterService, ResourceSurfaceOpenAdapterService, normalizeSurfaceOperationContext, translateUnavailableWorkflowMessage, isSurfaceNavigationError, translateSurfaceNavigationRejected, EmptyStateCardComponent, RESOURCE_DISCOVERY_I18N_CONFIG, SURFACE_DRAWER_REF, SURFACE_DRAWER_CONTENT_DATA, PraxisIconButtonComponent, PraxisResourceIdentityComponent, GenericCrudService, ComponentMetadataRegistry } from '@praxisui/core';
10
10
  import { SettingsPanelService } from '@praxisui/settings-panel';
11
11
  import { PraxisTableInlineAuthoringEditorComponent, PraxisTable } from '@praxisui/table';
12
12
  import { ConfirmDialogComponent } from '@praxisui/dynamic-fields';
@@ -103,6 +103,7 @@ class CrudLauncherService {
103
103
  storage = inject(ASYNC_CONFIG_STORAGE);
104
104
  global = inject(GlobalConfigService);
105
105
  operationResolver = inject(CrudOperationResolutionService);
106
+ logger = inject(LoggerService, { optional: true });
106
107
  dialogHostPromise;
107
108
  nextSurfaceFrameId = 0;
108
109
  drawerAdapter = (() => {
@@ -168,7 +169,23 @@ class CrudLauncherService {
168
169
  },
169
170
  });
170
171
  if (!frameRef) {
171
- throw new Error(`Active surface session rejected nested CRUD frame "${frameId}".`);
172
+ const error = new SurfaceNavigationError('SURFACE_SESSION_NAVIGATION_REJECTED', 'push', frameId);
173
+ this.logger?.warn('Surface session rejected nested CRUD frame.', {
174
+ context: {
175
+ lib: '@praxisui/crud',
176
+ component: 'CrudLauncherService',
177
+ actionId: `crud.${String(actionForLaunch.action || 'unknown')}`,
178
+ },
179
+ data: {
180
+ code: error.code,
181
+ operation: error.operation,
182
+ frameId: error.frameId,
183
+ formId: actionForLaunch.formId,
184
+ openMode: mode,
185
+ },
186
+ throttleKey: `${error.code}:crud:${frameId}`,
187
+ });
188
+ throw error;
172
189
  }
173
190
  this.bindSurfaceFrameLifecycle(frameRef, drawerCallbacks);
174
191
  return { mode };
@@ -4020,6 +4037,7 @@ class PraxisCrudComponent {
4020
4037
  }
4021
4038
  catch (err) {
4022
4039
  this.error.emit(err);
4040
+ this.notifySurfaceNavigationFailure(err);
4023
4041
  }
4024
4042
  finally {
4025
4043
  this.openingActionLabel.set(null);
@@ -4521,18 +4539,23 @@ class PraxisCrudComponent {
4521
4539
  const handledInline = await this.surfaceOutlets.tryActivate(payload, surfaceContext);
4522
4540
  openPromise = handledInline ? Promise.resolve(undefined) : Promise.resolve(this.surfaceService.open(payload, surfaceContext));
4523
4541
  }
4524
- catch {
4542
+ catch (error) {
4543
+ if (this.notifySurfaceNavigationFailure(error)) {
4544
+ this.error.emit(error);
4545
+ return true;
4546
+ }
4525
4547
  return false;
4526
4548
  }
4527
- this.afterOpen.emit({
4528
- mode: this.mapSurfacePresentationToCrudMode(payload?.presentation),
4529
- action,
4530
- });
4531
4549
  try {
4532
4550
  this.bindDiscoveredSurfaceLifecycle(await openPromise);
4551
+ this.afterOpen.emit({
4552
+ mode: this.mapSurfacePresentationToCrudMode(payload?.presentation),
4553
+ action,
4554
+ });
4533
4555
  }
4534
4556
  catch (err) {
4535
4557
  this.error.emit(err);
4558
+ this.notifySurfaceNavigationFailure(err);
4536
4559
  }
4537
4560
  return true;
4538
4561
  }
@@ -4580,7 +4603,11 @@ class PraxisCrudComponent {
4580
4603
  group: catalog?.group ?? null,
4581
4604
  });
4582
4605
  }
4583
- catch {
4606
+ catch (error) {
4607
+ if (this.notifySurfaceNavigationFailure(error)) {
4608
+ this.error.emit(error);
4609
+ return true;
4610
+ }
4584
4611
  return false;
4585
4612
  }
4586
4613
  let openPromise;
@@ -4604,16 +4631,31 @@ class PraxisCrudComponent {
4604
4631
  },
4605
4632
  }));
4606
4633
  }
4607
- catch {
4634
+ catch (error) {
4635
+ if (this.notifySurfaceNavigationFailure(error)) {
4636
+ this.error.emit(error);
4637
+ return true;
4638
+ }
4608
4639
  return false;
4609
4640
  }
4610
- this.afterOpen.emit({
4611
- mode: this.mapSurfacePresentationToCrudMode(payload?.presentation),
4612
- action,
4613
- });
4614
- void openPromise
4615
- .then((result) => this.handleDiscoveredSurfaceResult(result))
4616
- .catch((err) => this.error.emit(err));
4641
+ try {
4642
+ this.handleDiscoveredSurfaceResult(await openPromise);
4643
+ this.afterOpen.emit({
4644
+ mode: this.mapSurfacePresentationToCrudMode(payload?.presentation),
4645
+ action,
4646
+ });
4647
+ }
4648
+ catch (err) {
4649
+ this.error.emit(err);
4650
+ this.notifySurfaceNavigationFailure(err);
4651
+ }
4652
+ return true;
4653
+ }
4654
+ notifySurfaceNavigationFailure(error) {
4655
+ if (!isSurfaceNavigationError(error)) {
4656
+ return false;
4657
+ }
4658
+ this.snack.open(translateSurfaceNavigationRejected(this.i18n), undefined, { duration: 4500 });
4617
4659
  return true;
4618
4660
  }
4619
4661
  async resolveDiscoveredActionCatalog(row) {
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@praxisui/crud",
3
- "version": "9.0.4-rc.30",
3
+ "version": "9.0.4-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": "^9.0.4-rc.30",
9
- "@praxisui/table": "^9.0.4-rc.30",
10
- "@praxisui/core": "^9.0.4-rc.30",
11
- "@praxisui/dynamic-fields": "^9.0.4-rc.30",
12
- "@praxisui/settings-panel": "^9.0.4-rc.30",
8
+ "@praxisui/dynamic-form": "^9.0.4-rc.32",
9
+ "@praxisui/table": "^9.0.4-rc.32",
10
+ "@praxisui/core": "^9.0.4-rc.32",
11
+ "@praxisui/dynamic-fields": "^9.0.4-rc.32",
12
+ "@praxisui/settings-panel": "^9.0.4-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": "^9.0.4-rc.30",
17
+ "@praxisui/ai": "^9.0.4-rc.32",
18
18
  "rxjs": "~7.8.0"
19
19
  },
20
20
  "dependencies": {
@@ -290,6 +290,7 @@ declare class PraxisCrudComponent implements OnChanges {
290
290
  private tryOpenDiscoveredCrudSurface;
291
291
  private resolveDiscoveredSurfaceCatalog;
292
292
  private tryOpenDiscoveredWorkflowAction;
293
+ private notifySurfaceNavigationFailure;
293
294
  private resolveDiscoveredActionCatalog;
294
295
  private selectDiscoveredWorkflowAction;
295
296
  private resolveProvidedWorkflowAction;
@@ -360,6 +361,7 @@ declare class CrudLauncherService {
360
361
  private readonly storage;
361
362
  private readonly global;
362
363
  private readonly operationResolver;
364
+ private readonly logger;
363
365
  private dialogHostPromise?;
364
366
  private nextSurfaceFrameId;
365
367
  private readonly drawerAdapter;