@praxisui/crud 9.0.4-rc.25 → 9.0.4-rc.26

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
@@ -43,6 +43,7 @@ import { PraxisCrudComponent, CrudMetadata } from '@praxisui/crud';
43
43
  <praxis-crud
44
44
  crudId="employees-crud"
45
45
  [metadata]="metadata"
46
+ tableConfigPersistenceStrategy="input-first"
46
47
  [context]="context"
47
48
  [enableCustomization]="true"
48
49
  (afterSave)="reloadSummary()"
@@ -92,6 +93,7 @@ export class EmployeesCrudComponent {
92
93
  - `metadata`: `CrudMetadata | string`
93
94
  - `crudId`: stable instance id
94
95
  - `componentInstanceId`: optional host-level instance id
96
+ - `tableConfigPersistenceStrategy`: controls persistence precedence for the internal table. Keep `local-first` for user-owned workspaces, use `input-first` for an authoritative governed contract, and use `volatile` for previews that must neither read nor write stored preferences.
95
97
  - `context`: host/runtime context passed into table and form flows
96
98
  - `enableCustomization`: enables the package authoring surface
97
99
  - `authoringCapability`: optionally requires the exact capability from `EnterpriseRuntimeContext.capabilities` before authoring controls, the CRUD editor, and its internal table authoring are available. This is a UX gate; governed persistence must enforce the same policy server-side.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-08-04T21:23:28.566Z",
3
+ "generatedAt": "2026-08-04T22:30:51.687Z",
4
4
  "packageName": "@praxisui/crud",
5
- "packageVersion": "9.0.4-rc.25",
5
+ "packageVersion": "9.0.4-rc.26",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 2,
@@ -29,6 +29,13 @@
29
29
  "required": false,
30
30
  "description": "Identificador opcional para múltiplas instâncias na mesma rota."
31
31
  },
32
+ {
33
+ "name": "tableConfigPersistenceStrategy",
34
+ "type": "'local-first' | 'input-first' | 'volatile'",
35
+ "required": false,
36
+ "description": "Política da tabela interna. Use input-first para contratos governados autoritativos e volatile para previews que não devem ler nem gravar preferências locais.",
37
+ "default": "local-first"
38
+ },
32
39
  {
33
40
  "name": "context",
34
41
  "type": "Record<string, unknown>",
@@ -5015,6 +5022,11 @@
5015
5022
  "type": "string",
5016
5023
  "description": "Optional stable host instance id for multiple CRUD widgets on the same route."
5017
5024
  },
5025
+ {
5026
+ "name": "tableConfigPersistenceStrategy",
5027
+ "type": "'local-first' | 'input-first' | 'volatile'",
5028
+ "description": "Persistence precedence forwarded to the internal Praxis Table. Governed previews should use input-first or volatile explicitly."
5029
+ },
5018
5030
  {
5019
5031
  "name": "context",
5020
5032
  "type": "Record<string, unknown>",
@@ -7206,9 +7218,9 @@
7206
7218
  {
7207
7219
  "chunkIndex": 0,
7208
7220
  "chunkKind": "summary",
7209
- "content": "Component ID: praxis-crud\nSelector: praxis-crud\nFriendly Name: Praxis CRUD\nDescription: Tabela com operações de CRUD via metadados.\nLib/Package: @praxisui/crud\nTags: widget, crud, configurable, hasWizard, stable\nInputs:\n - metadata (CrudMetadata | string)\n - crudId (string)\n - componentInstanceId (string)\n - context (Record<string, unknown>)\n - metadata.queryContext (PraxisDataQueryContext | null)\n - metadata.resource.schemaPath (string | null)\n - metadata.resource.title (string | null)\n - metadata.resource.formTitle (string | null)\n - metadata.filterCriteria (Record<string, unknown> | null)\n - metadata.form (FormConfig)\n - metadata.actions[].form (CrudActionFormContract)\n - enableCustomization (boolean)\n - authoringCapability (string | null)\nOutputs:\n - afterOpen ({ mode: FormOpenMode; action: string })\n - afterClose (void)\n - afterSave ({ id: string | number; data: unknown })\n - afterDelete ({ id: string | number })\n - rowClick ({ row: unknown; index: number })\n - selectionChange (unknown)\n - error (unknown)\n - configureRequested (void)\n - crudAuthoringDocumentApplied (CrudAuthoringWidgetPersistenceEvent)\n - crudAuthoringDocumentSaved (CrudAuthoringWidgetPersistenceEvent)\n",
7221
+ "content": "Component ID: praxis-crud\nSelector: praxis-crud\nFriendly Name: Praxis CRUD\nDescription: Tabela com operações de CRUD via metadados.\nLib/Package: @praxisui/crud\nTags: widget, crud, configurable, hasWizard, stable\nInputs:\n - metadata (CrudMetadata | string)\n - crudId (string)\n - componentInstanceId (string)\n - tableConfigPersistenceStrategy ('local-first' | 'input-first' | 'volatile')\n - context (Record<string, unknown>)\n - metadata.queryContext (PraxisDataQueryContext | null)\n - metadata.resource.schemaPath (string | null)\n - metadata.resource.title (string | null)\n - metadata.resource.formTitle (string | null)\n - metadata.filterCriteria (Record<string, unknown> | null)\n - metadata.form (FormConfig)\n - metadata.actions[].form (CrudActionFormContract)\n - enableCustomization (boolean)\n - authoringCapability (string | null)\nOutputs:\n - afterOpen ({ mode: FormOpenMode; action: string })\n - afterClose (void)\n - afterSave ({ id: string | number; data: unknown })\n - afterDelete ({ id: string | number })\n - rowClick ({ row: unknown; index: number })\n - selectionChange (unknown)\n - error (unknown)\n - configureRequested (void)\n - crudAuthoringDocumentApplied (CrudAuthoringWidgetPersistenceEvent)\n - crudAuthoringDocumentSaved (CrudAuthoringWidgetPersistenceEvent)\n",
7210
7222
  "sourcePointer": "projects/praxis-crud/src/lib/praxis-crud.metadata.ts",
7211
- "contentHash": "bdcc39d2237bf1cea3f5ec621aa5b6fac42f8da6c8467cdbe1682888c722f12d",
7223
+ "contentHash": "a9d744b92ff6f475de4d870e57bc963200a7b68688a8ea5159cc02496a8967be",
7212
7224
  "sourceKind": "component_definition",
7213
7225
  "sourceId": "praxis-crud",
7214
7226
  "corpusVersion": "1.0.0"
@@ -7436,9 +7448,9 @@
7436
7448
  {
7437
7449
  "chunkIndex": 23,
7438
7450
  "chunkKind": "authoring_manifest",
7439
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-crud\",\"ownerPackage\":\"@praxisui/crud\",\"configSchemaId\":\"CrudMetadata\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"metadata\",\"type\":\"CrudMetadata | string\",\"description\":\"Canonical CRUD metadata or serialized metadata document.\"},{\"name\":\"crudId\",\"type\":\"string\",\"description\":\"Stable CRUD instance id used for table/form identity and persistence.\"},{\"name\":\"componentInstanceId\",\"type\":\"string\",\"description\":\"Optional stable host instance id for multiple CRUD widgets on the same route.\"},{\"name\":\"context\",\"type\":\"Record<string, unknown>\",\"description\":\"Opaque host context used for authoring seeds and launcher inputs.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Explicit host opt-in for CRUD authoring surfaces.\"},{\"name\":\"authoringCapability\",\"type\":\"string | null\",\"description\":\"Public runtime capability required before CRUD and delegated table authoring can open.\"},{\"name\":\"afterOpen\",\"type\":\"{ mode: FormOpenMode; action: string }\",\"description\":\"Emitted after a CRUD action opens.\"},{\"name\":\"afterSave\",\"type\":\"{ id: string | number; data: unknown }\",\"description\":\"Emitted after save; CRUD refetches the list.\"},{\"name\":\"afterDelete\",\"type\":\"{ id: string | number }\",\"description\":\"Emitted after delete; CRUD refetches the list.\"}]}",
7451
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-crud\",\"ownerPackage\":\"@praxisui/crud\",\"configSchemaId\":\"CrudMetadata\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"metadata\",\"type\":\"CrudMetadata | string\",\"description\":\"Canonical CRUD metadata or serialized metadata document.\"},{\"name\":\"crudId\",\"type\":\"string\",\"description\":\"Stable CRUD instance id used for table/form identity and persistence.\"},{\"name\":\"componentInstanceId\",\"type\":\"string\",\"description\":\"Optional stable host instance id for multiple CRUD widgets on the same route.\"},{\"name\":\"tableConfigPersistenceStrategy\",\"type\":\"'local-first' | 'input-first' | 'volatile'\",\"description\":\"Persistence precedence forwarded to the internal Praxis Table. Governed previews should use input-first or volatile explicitly.\"},{\"name\":\"context\",\"type\":\"Record<string, unknown>\",\"description\":\"Opaque host context used for authoring seeds and launcher inputs.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Explicit host opt-in for CRUD authoring surfaces.\"},{\"name\":\"authoringCapability\",\"type\":\"string | null\",\"description\":\"Public runtime capability required before CRUD and delegated table authoring can open.\"},{\"name\":\"afterOpen\",\"type\":\"{ mode: FormOpenMode; action: string }\",\"description\":\"Emitted after a CRUD action opens.\"},{\"name\":\"afterSave\",\"type\":\"{ id: string | number; data: unknown }\",\"description\":\"Emitted after save; CRUD refetches the list.\"},{\"name\":\"afterDelete\",\"type\":\"{ id: string | number }\",\"description\":\"Emitted after delete; CRUD refetches the list.\"}]}",
7440
7452
  "sourcePointer": "projects/praxis-crud/src/lib/ai/praxis-crud-authoring-manifest.ts",
7441
- "contentHash": "cce406615018b96872557b8ccfe54f7c64d1bd40f8528ac4d62b094fbc27858b",
7453
+ "contentHash": "068b8503236aa70e0543cc63c791a5c9cb192983b3e369285bb44732b3b646d8",
7442
7454
  "sourceKind": "component_definition",
7443
7455
  "sourceId": "praxis-crud",
7444
7456
  "corpusVersion": "1.0.0"
@@ -3667,6 +3667,8 @@ class PraxisCrudComponent {
3667
3667
  metadata;
3668
3668
  crudId;
3669
3669
  componentInstanceId;
3670
+ /** Controls whether the CRUD's internal table trusts host input or stored user configuration. */
3671
+ tableConfigPersistenceStrategy = 'local-first';
3670
3672
  context;
3671
3673
  enableCustomization = false;
3672
3674
  /** Capability publica exigida para authoring governado do CRUD e da tabela interna. */
@@ -5247,7 +5249,7 @@ class PraxisCrudComponent {
5247
5249
  return Object.entries(params).reduce((current, [name, value]) => current.split(`{${name}}`).join(value), text);
5248
5250
  }
5249
5251
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisCrudComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5250
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisCrudComponent, isStandalone: true, selector: "praxis-crud", inputs: { metadata: "metadata", crudId: "crudId", componentInstanceId: "componentInstanceId", context: "context", enableCustomization: "enableCustomization", authoringCapability: "authoringCapability" }, outputs: { configureRequested: "configureRequested", afterOpen: "afterOpen", afterClose: "afterClose", afterSave: "afterSave", afterDelete: "afterDelete", error: "error", rowClick: "rowClick", selectionChange: "selectionChange", tableRuntimeConfigChange: "tableRuntimeConfigChange", crudAuthoringDocumentApplied: "crudAuthoringDocumentApplied", crudAuthoringDocumentSaved: "crudAuthoringDocumentSaved" }, providers: [
5252
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisCrudComponent, isStandalone: true, selector: "praxis-crud", inputs: { metadata: "metadata", crudId: "crudId", componentInstanceId: "componentInstanceId", tableConfigPersistenceStrategy: "tableConfigPersistenceStrategy", context: "context", enableCustomization: "enableCustomization", authoringCapability: "authoringCapability" }, outputs: { configureRequested: "configureRequested", afterOpen: "afterOpen", afterClose: "afterClose", afterSave: "afterSave", afterDelete: "afterDelete", error: "error", rowClick: "rowClick", selectionChange: "selectionChange", tableRuntimeConfigChange: "tableRuntimeConfigChange", crudAuthoringDocumentApplied: "crudAuthoringDocumentApplied", crudAuthoringDocumentSaved: "crudAuthoringDocumentSaved" }, providers: [
5251
5253
  providePraxisI18nConfig(RESOURCE_DISCOVERY_I18N_CONFIG),
5252
5254
  providePraxisI18nConfig(PRAXIS_CRUD_RUNTIME_I18N_CONFIG),
5253
5255
  ], viewQueries: [{ propertyName: "table", first: true, predicate: PraxisTable, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
@@ -5266,6 +5268,7 @@ class PraxisCrudComponent {
5266
5268
  [queryContext]="tableQueryContext"
5267
5269
  [filterCriteria]="tableFilterCriteria"
5268
5270
  [tableId]="crudId || 'default'"
5271
+ [configPersistenceStrategy]="tableConfigPersistenceStrategy"
5269
5272
  [crudContext]="tableCrudContext"
5270
5273
  [enableCustomization]="enableCustomization"
5271
5274
  [authoringCapability]="authoringCapability"
@@ -5313,6 +5316,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5313
5316
  [queryContext]="tableQueryContext"
5314
5317
  [filterCriteria]="tableFilterCriteria"
5315
5318
  [tableId]="crudId || 'default'"
5319
+ [configPersistenceStrategy]="tableConfigPersistenceStrategy"
5316
5320
  [crudContext]="tableCrudContext"
5317
5321
  [enableCustomization]="enableCustomization"
5318
5322
  [authoringCapability]="authoringCapability"
@@ -5346,6 +5350,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5346
5350
  args: [{ required: true }]
5347
5351
  }], componentInstanceId: [{
5348
5352
  type: Input
5353
+ }], tableConfigPersistenceStrategy: [{
5354
+ type: Input
5349
5355
  }], context: [{
5350
5356
  type: Input
5351
5357
  }], enableCustomization: [{
@@ -6305,6 +6311,12 @@ const PRAXIS_CRUD_COMPONENT_METADATA = {
6305
6311
  type: 'string',
6306
6312
  description: 'Identificador opcional para múltiplas instâncias na mesma rota.',
6307
6313
  },
6314
+ {
6315
+ name: 'tableConfigPersistenceStrategy',
6316
+ type: "'local-first' | 'input-first' | 'volatile'",
6317
+ default: 'local-first',
6318
+ description: 'Política da tabela interna. Use input-first para contratos governados autoritativos e volatile para previews que não devem ler nem gravar preferências locais.',
6319
+ },
6308
6320
  {
6309
6321
  name: 'context',
6310
6322
  type: 'Record<string, unknown>',
@@ -6880,6 +6892,7 @@ const PRAXIS_CRUD_AUTHORING_MANIFEST = {
6880
6892
  { name: 'metadata', type: 'CrudMetadata | string', description: 'Canonical CRUD metadata or serialized metadata document.' },
6881
6893
  { name: 'crudId', type: 'string', description: 'Stable CRUD instance id used for table/form identity and persistence.' },
6882
6894
  { name: 'componentInstanceId', type: 'string', description: 'Optional stable host instance id for multiple CRUD widgets on the same route.' },
6895
+ { name: 'tableConfigPersistenceStrategy', type: "'local-first' | 'input-first' | 'volatile'", description: 'Persistence precedence forwarded to the internal Praxis Table. Governed previews should use input-first or volatile explicitly.' },
6883
6896
  { name: 'context', type: 'Record<string, unknown>', description: 'Opaque host context used for authoring seeds and launcher inputs.' },
6884
6897
  { name: 'enableCustomization', type: 'boolean', description: 'Explicit host opt-in for CRUD authoring surfaces.' },
6885
6898
  { name: 'authoringCapability', type: 'string | null', description: 'Public runtime capability required before CRUD and delegated table authoring can open.' },
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@praxisui/crud",
3
- "version": "9.0.4-rc.25",
3
+ "version": "9.0.4-rc.26",
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.25",
9
- "@praxisui/table": "^9.0.4-rc.25",
10
- "@praxisui/core": "^9.0.4-rc.25",
11
- "@praxisui/dynamic-fields": "^9.0.4-rc.25",
12
- "@praxisui/settings-panel": "^9.0.4-rc.25",
8
+ "@praxisui/dynamic-form": "^9.0.4-rc.26",
9
+ "@praxisui/table": "^9.0.4-rc.26",
10
+ "@praxisui/core": "^9.0.4-rc.26",
11
+ "@praxisui/dynamic-fields": "^9.0.4-rc.26",
12
+ "@praxisui/settings-panel": "^9.0.4-rc.26",
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.25",
17
+ "@praxisui/ai": "^9.0.4-rc.26",
18
18
  "rxjs": "~7.8.0"
19
19
  },
20
20
  "dependencies": {
@@ -3,6 +3,7 @@ import { NgZone, OnChanges, EventEmitter, SimpleChanges, OnInit, Provider, After
3
3
  import * as _praxisui_core from '@praxisui/core';
4
4
  import { RowAction, ToolbarAction, ApiEndpoint, ApiUrlEntry, DynamicFormLayoutPolicy, BackConfig, TableConfig, PraxisDataQueryContext, FormConfig, ResourceActionCatalogItem, ResourceSurfaceCatalogItem, MaterializedResourceIdentity, LoadingState, RestApiLinks, ResourceCapabilitySnapshot, GenericCrudService, AsyncConfigStorage, ComponentDocMeta, AiCapabilityCatalog, AiCapability, AiCapabilityCategory, AiValueKind, ComponentAuthoringManifest, SettingsValueProvider } from '@praxisui/core';
5
5
  export { BackConfig } from '@praxisui/core';
6
+ import { TableConfigPersistenceStrategy } from '@praxisui/table';
6
7
  import { MatDialogConfig, MatDialogRef, MatDialog } from '@angular/material/dialog';
7
8
  export { MAT_DIALOG_DATA as DIALOG_DATA } from '@angular/material/dialog';
8
9
  import { ComponentType } from '@angular/cdk/portal';
@@ -170,6 +171,8 @@ declare class PraxisCrudComponent implements OnChanges {
170
171
  metadata: CrudMetadata | string;
171
172
  crudId: string;
172
173
  componentInstanceId?: string;
174
+ /** Controls whether the CRUD's internal table trusts host input or stored user configuration. */
175
+ tableConfigPersistenceStrategy: TableConfigPersistenceStrategy;
173
176
  context?: Record<string, unknown>;
174
177
  enableCustomization: boolean;
175
178
  /** Capability publica exigida para authoring governado do CRUD e da tabela interna. */
@@ -333,7 +336,7 @@ declare class PraxisCrudComponent implements OnChanges {
333
336
  private txWithParams;
334
337
  private interpolateTranslationParams;
335
338
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisCrudComponent, never>;
336
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisCrudComponent, "praxis-crud", never, { "metadata": { "alias": "metadata"; "required": true; }; "crudId": { "alias": "crudId"; "required": true; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "context": { "alias": "context"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "authoringCapability": { "alias": "authoringCapability"; "required": false; }; }, { "configureRequested": "configureRequested"; "afterOpen": "afterOpen"; "afterClose": "afterClose"; "afterSave": "afterSave"; "afterDelete": "afterDelete"; "error": "error"; "rowClick": "rowClick"; "selectionChange": "selectionChange"; "tableRuntimeConfigChange": "tableRuntimeConfigChange"; "crudAuthoringDocumentApplied": "crudAuthoringDocumentApplied"; "crudAuthoringDocumentSaved": "crudAuthoringDocumentSaved"; }, never, never, true, never>;
339
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisCrudComponent, "praxis-crud", never, { "metadata": { "alias": "metadata"; "required": true; }; "crudId": { "alias": "crudId"; "required": true; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "tableConfigPersistenceStrategy": { "alias": "tableConfigPersistenceStrategy"; "required": false; }; "context": { "alias": "context"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "authoringCapability": { "alias": "authoringCapability"; "required": false; }; }, { "configureRequested": "configureRequested"; "afterOpen": "afterOpen"; "afterClose": "afterClose"; "afterSave": "afterSave"; "afterDelete": "afterDelete"; "error": "error"; "rowClick": "rowClick"; "selectionChange": "selectionChange"; "tableRuntimeConfigChange": "tableRuntimeConfigChange"; "crudAuthoringDocumentApplied": "crudAuthoringDocumentApplied"; "crudAuthoringDocumentSaved": "crudAuthoringDocumentSaved"; }, never, never, true, never>;
337
340
  }
338
341
 
339
342
  type CrudDrawerResultType = 'save' | 'delete' | 'close';
@@ -692,6 +695,7 @@ interface PraxisCrudWidgetEditorInputs {
692
695
  metadata?: CrudMetadata | string | null;
693
696
  crudId?: string;
694
697
  componentInstanceId?: string;
698
+ tableConfigPersistenceStrategy?: TableConfigPersistenceStrategy;
695
699
  context?: Record<string, unknown>;
696
700
  enableCustomization?: boolean;
697
701
  authoringCapability?: string | null;