@praxisui/table 9.0.62 → 9.0.63

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
@@ -102,6 +102,8 @@ Use `resourcePath` when the host wants the table to enter backend schema/data mo
102
102
 
103
103
  `resourcePath` is enough only when the host already provides the Praxis API/CRUD wiring expected by the table runtime. In remote mode, the table derives columns from the backend schema contract and data from the backend resource/filter contract.
104
104
 
105
+ Each standalone `praxis-filter` owns an isolated `GenericCrudService` instance. This is required when a composed page renders filters, tables, and related CRUD surfaces for different resources at the same time: one widget must never replace another widget's active schema/resource context.
106
+
105
107
  For schema-governed tables that need only a few editorial differences, keep
106
108
  `columns: []` and declare a schema projection. The runtime derives every visible
107
109
  column from `/schemas/filtered` and reapplies the overrides by canonical field
@@ -176,12 +178,35 @@ and emit schema/metadata diagnostics, but they do not emit `configChange` or a
176
178
  persistable `tableInputPatch`. Those authoring outputs are reserved for explicit
177
179
  user operations such as applying table settings or Quick Connect.
178
180
 
181
+ Item actions discovered from HATEOAS are also runtime projections owned by the
182
+ backend. When the overflow menu is opened before contextual discovery finishes,
183
+ the menu shows its loading state and replaces that state with the governed
184
+ actions in the same user interaction as soon as discovery settles. Hosts must
185
+ not copy workflow actions into local table configuration or require users to
186
+ close and reopen the menu to observe a capability that has already resolved.
187
+
179
188
  Row, selection and action events can include the read-only `resourceIdentity`
180
189
  materialized from the response schema. A valid explicit identity is preferred;
181
190
  otherwise a valid `idField` can produce a diagnostic key-only fallback. This
182
191
  context is for list/detail continuity and must not be copied into command
183
192
  controls or persistence payloads.
184
193
 
194
+ When row selection is enabled with `mode: "row"` or `mode: "both"`, selectable
195
+ rows use a single roving keyboard stop. `ArrowUp`, `ArrowDown`, `Home`, and `End`
196
+ move focus without changing the selection; `Enter` and `Space` activate the
197
+ focused row through the same `selectionChange` contract used by pointer input.
198
+ Navigation is resolved against the table data model rather than the rows currently
199
+ mounted in the DOM. In virtualized tables, `Home` and `End` therefore reach the
200
+ first and last logical records and scroll the viewport before restoring focus.
201
+ After refresh or filtering, focus follows the same stable row identity when that
202
+ record still exists and otherwise falls back to the first available record. Set a
203
+ stable `idField` for corporate datasets; index identity is only a last-resort local
204
+ fallback and cannot preserve focus across reordering.
205
+ The table receives its accessible name from `accessibility.ariaLabels.table`,
206
+ then the table title, and finally the localized runtime fallback. Selection
207
+ changes are announced in an isolated polite live region unless
208
+ `accessibility.announcements.userActions` is explicitly `false`.
209
+
185
210
  ## Column resizing and auto-fit
186
211
 
187
212
  Column resizing is governed by `behavior.resizing`. When `enabled` is `true`,
@@ -403,10 +428,22 @@ Main authoring areas include:
403
428
 
404
429
  The package exports separate governed contracts for the two authoring documents: `PRAXIS_TABLE_AUTHORING_MANIFEST` owns `TableConfig`, including embedded filtering under `behavior.filtering`, while `PRAXIS_FILTER_AUTHORING_MANIFEST` owns the standalone `FilterConfig`. The standalone manifest never persists the controlled `value` DTO and does not expose Table query-builder operations or the nominal `submit` alias. `TABLE_AI_CAPABILITIES` / `TABLE_COMPONENT_AI_CAPABILITIES` remain the component capability discovery surface for the Table aggregate.
405
430
 
431
+ Canonical table refinements preserve business meaning across preview, persistence, reopen and runtime rendering:
432
+
433
+ - The global table title belongs to `toolbar.title` with the toolbar visible. It is distinct from a column header and must not be stored as an ad hoc root `title` or public widget input.
434
+ - `column.format.set` materializes both the requested format and its compatible visual column type. For example, `BRL|symbol|2` produces a currency column while preserving the schema's numeric data shape and every unrelated column property.
435
+ - `column.order.set` is a discrete visual move; order `0` means the first position. Its compiler emits a complete, collision-free order for all sibling columns so reopen and stable-sort runtimes cannot turn the edit into a visual no-op.
436
+ - `column.sticky.set` only pins a column during horizontal scrolling. It never means move-to-start and never substitutes for `column.order.set`.
437
+
438
+ Certification of these refinements must inspect the rendered table DOM—not only the authored JSON—including the toolbar title, visible header sequence, hidden-column absence and formatted cell content.
439
+
406
440
  ## Analytics And Rich Content
407
441
 
408
442
  The table can materialize analytic table projections produced by the canonical `x-ui.analytics` decision in `@praxisui/core`. Services such as `AnalyticsTableContractService` help hosts resolve analytic table contracts and data without reimplementing that projection.
409
443
 
444
+ `AnalyticsTableStatsApiService.execute()` returns an `Observable<AnalyticsTableRow[]>`. The subscription owns the HTTP transport: unsubscribing aborts an in-flight stats request. `PraxisTable` applies the same `behavior.loading.requestTimeoutMs`, `behavior.loading.allowCancel`, retry, supersession and destruction lifecycle to REST resources and `analyticsProjection`, while preserving the last stable rows on cancellation or failure. Consumers that need a one-shot promise may use `firstValueFrom(...)` at their own orchestration boundary.
445
+ When both `resourcePath` and `analyticsProjection` are present, the canonical `DataMode` precedence remains remote: the table cancels any analytical transport and does not mix rows from the stats endpoint with the resource collection.
446
+
410
447
  Detail rows can host governed rich content surfaces. Rich content semantics belong to the shared rich content/core contracts; the table provides the row-detail shell and host-mediated dispatch.
411
448
  When the actions column header combines an icon and a label, the table materializes that rich content with inline, non-wrapping layout. Column width may still be governed by the table contract, but the icon is not allowed to force the label onto a second line.
412
449
  When no bottom paginator or footer toolbar follows the data surface, the table closes its lower corners. When a bottom surface is present, the table keeps square lower corners so the stack remains visually continuous.