@praxisui/table 10.0.0-rc.25 → 10.0.0-rc.27

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
@@ -168,6 +168,21 @@ continuity after a page reload or destruction of the owning table. The backend r
168
168
  the authority for every mutation and protected read.
169
169
 
170
170
 
171
+ BASIC selected-item, proposal, preview, execution and result GETs use the existing
172
+ `behavior.loading.requestTimeoutMs` policy, captured for each read (default 30000 ms).
173
+ Explicit 0 disables that deadline only when the host has another governed policy;
174
+ view teardown still cancels the transport. This is the Table loading policy, not a
175
+ new bulk timeout or the server unit deadline. Expiry releases local busy state and
176
+ permits an explicit protected retry with the same proposal/execution and cursor;
177
+ it neither declares a terminal execution nor proves that a mutation failed.
178
+
179
+ The table-owned pending work contains only already dispatched evaluation/confirmation
180
+ POSTs. Destroying a workflow cancels GET subscriptions and ignores stale callbacks;
181
+ remount reads the same retained intent under fresh authorization, without waiting on
182
+ an abandoned GET or repeating a POST. An uncertain pending POST remains in custody
183
+ and is awaited, with its original key. Context denial still hides all protected
184
+ projections, and recovery requires the complete fresh authorized read sequence.
185
+
171
186
  This first visual cut does not offer DOMAIN_COMMAND, PER_ITEM_UPDATE, QUERY,
172
187
  ASYNC, ATOMIC or durable jobs. The existing `bulk-partial` demo above uses its
173
188
  older collection action contract and does not certify this new candidate flow.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-15T15:10:58.041Z",
3
+ "generatedAt": "2026-10-15T22:42:56.841Z",
4
4
  "packageName": "@praxisui/table",
5
- "packageVersion": "10.0.0-rc.25",
5
+ "packageVersion": "10.0.0-rc.27",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 3,
@@ -8037,6 +8037,23 @@
8037
8037
  "public": true,
8038
8038
  "group": "data"
8039
8039
  }
8040
+ },
8041
+ {
8042
+ "id": "queryContextChange",
8043
+ "label": "Query Context Change",
8044
+ "direction": "output",
8045
+ "semanticKind": "query-context",
8046
+ "schema": {
8047
+ "id": "PraxisDataQueryContext",
8048
+ "kind": "ts-type",
8049
+ "ref": "PraxisDataQueryContext"
8050
+ },
8051
+ "cardinality": "stream",
8052
+ "description": "Contexto de consulta atualizado apos reconciliacao ou limpeza de filtros editaveis na regiao unica de filtros da tabela.",
8053
+ "exposure": {
8054
+ "public": true,
8055
+ "group": "data"
8056
+ }
8040
8057
  }
8041
8058
  ],
8042
8059
  "runtimeProfiles": [
@@ -450,12 +450,44 @@ class TableDetailTreeDraft {
450
450
  }
451
451
  add(node, nested = false) {
452
452
  const selected = this.selected()?.node;
453
- const childKey = selected?.type === 'card' || selected?.type === 'tab' ? 'content' : 'items';
453
+ const isCardLike = selected?.type === 'card' || (!selected?.type && Array.isArray(selected?.content));
454
+ const childKey = selected?.type === 'cardGrid'
455
+ ? 'cards'
456
+ : (isCardLike || selected?.type === 'tab')
457
+ ? 'content'
458
+ : 'items';
454
459
  const parent = nested && selected ? selected : this.schema;
455
460
  const key = nested && selected ? childKey : 'items';
456
461
  if (!nested && this.schema.layout === 'tabs' && node.type !== 'tab') {
457
462
  node = { type: 'tab', title: node.title || node.label || node.type, content: [node] };
458
463
  }
464
+ else if (nested && selected?.type === 'cardGrid') {
465
+ if (node.type === 'cardGrid' && Array.isArray(node.cards) && node.cards.length > 0) {
466
+ node = structuredClone(node.cards[0]);
467
+ }
468
+ else if (node.type === 'card') {
469
+ node = {
470
+ ...(node.id ? { id: node.id } : {}),
471
+ title: node.title ?? '',
472
+ ...(node.subtitle !== undefined ? { subtitle: node.subtitle } : {}),
473
+ content: Array.isArray(node.content) && node.content.length
474
+ ? node.content
475
+ : [{ type: 'text', text: node.title || 'Detalhe' }],
476
+ };
477
+ }
478
+ else if (!Array.isArray(node.content)) {
479
+ node = {
480
+ title: node.title || node.label || '',
481
+ content: [node],
482
+ };
483
+ }
484
+ }
485
+ else if (nested && (isCardLike || selected?.type === 'compose') && node.type === 'cardGrid' && Array.isArray(node.cards)) {
486
+ const firstCardContent = node.cards[0]?.content;
487
+ if (Array.isArray(firstCardContent) && firstCardContent.length > 0) {
488
+ node = structuredClone(firstCardContent[0]);
489
+ }
490
+ }
459
491
  if (!Array.isArray(parent[key]))
460
492
  parent[key] = [];
461
493
  parent[key].push(node);