@praxisui/list 9.0.57 → 9.0.59
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 +3 -0
- package/ai/component-registry.json +181 -2
- package/fesm2022/praxisui-list.mjs +11 -1
- package/package.json +6 -6
- package/src/lib/praxis-list.json-api.md +9 -2
package/README.md
CHANGED
|
@@ -86,6 +86,8 @@ Data mode resolution is deterministic:
|
|
|
86
86
|
|
|
87
87
|
In remote mode, search, sort and export share a collection toolbar above the items; pagination remains attached to the collection footer. A configured `resourcePath` does not activate remote controls when local `data` is also present. The runtime uses `/filter` through `GenericCrudService.filter(query, pageable)`. Synchronous changes projected from one `queryContext` are coalesced into a single request. If that endpoint fails with an empty query, the compatibility path may fall back to `getAll()`. With active criteria, the list fails closed, preserves the filter context and exposes a read-only, retryable error stream instead of displaying unfiltered records.
|
|
88
88
|
|
|
89
|
+
For HATEOAS records, the canonical `_links.self.href` is the preferred render identity. This keeps distinct resource representations stable even when a domain field such as an employee id repeats across periods or projections. `selection.compareBy` remains the explicit equality and payload identity for selection; it does not override the canonical render identity when a self link is available.
|
|
90
|
+
|
|
89
91
|
## Main Inputs And Outputs
|
|
90
92
|
|
|
91
93
|
- `config: PraxisListConfig`: list/card/tile configuration.
|
|
@@ -105,6 +107,7 @@ In remote mode, search, sort and export share a collection toolbar above the ite
|
|
|
105
107
|
- In `layout.rowLayout`, canonical semantic slots keep the configured desktop grid and reflow into ordered, non-overlapping rows at narrow viewports; extended operational slots stack without requiring host CSS.
|
|
106
108
|
- Template expressions use `${item.field}`. Currency/date/number templates can use config i18n defaults.
|
|
107
109
|
- Selection supports `none`, `single` and `multiple`, with return modes `value`, `item` or `id`.
|
|
110
|
+
- `selection.compareBy` controls selection equality and emitted ids. Remote HATEOAS rows are rendered by `_links.self.href` when available, independently of that selection choice.
|
|
108
111
|
- 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
112
|
- 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
113
|
- 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`.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-09-
|
|
3
|
+
"generatedAt": "2026-09-03T20:25:30.797Z",
|
|
4
4
|
"packageName": "@praxisui/list",
|
|
5
|
-
"packageVersion": "9.0.
|
|
5
|
+
"packageVersion": "9.0.59",
|
|
6
6
|
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
7
|
"sourceRegistryVersion": "1.0.0",
|
|
8
8
|
"componentCount": 1,
|
|
@@ -274,6 +274,185 @@
|
|
|
274
274
|
}
|
|
275
275
|
}
|
|
276
276
|
],
|
|
277
|
+
"runtimeProfiles": [
|
|
278
|
+
{
|
|
279
|
+
"id": "public-local-volatile",
|
|
280
|
+
"audience": "public-untrusted",
|
|
281
|
+
"description": "Lista efêmera com dados inline e sem efeitos externos.",
|
|
282
|
+
"constraints": [
|
|
283
|
+
{
|
|
284
|
+
"path": "config.dataSource.data",
|
|
285
|
+
"operator": "array"
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
"path": "config.dataSource.resourcePath",
|
|
289
|
+
"operator": "absent-or-empty"
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"path": "configPersistenceStrategy",
|
|
293
|
+
"operator": "equals",
|
|
294
|
+
"value": "volatile"
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
"path": "enableCustomization",
|
|
298
|
+
"operator": "not-true"
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"path": "config.actions",
|
|
302
|
+
"operator": "empty-array-or-absent"
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"path": "config.expansion",
|
|
306
|
+
"operator": "absent-or-empty"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"path": "config.export.enabled",
|
|
310
|
+
"operator": "not-true"
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"path": "config.templating.leading.type",
|
|
314
|
+
"operator": "none-of",
|
|
315
|
+
"values": [
|
|
316
|
+
"image",
|
|
317
|
+
"html",
|
|
318
|
+
"component",
|
|
319
|
+
"slot"
|
|
320
|
+
]
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"path": "config.templating.primary.type",
|
|
324
|
+
"operator": "none-of",
|
|
325
|
+
"values": [
|
|
326
|
+
"image",
|
|
327
|
+
"html",
|
|
328
|
+
"component",
|
|
329
|
+
"slot"
|
|
330
|
+
]
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
"path": "config.templating.secondary.type",
|
|
334
|
+
"operator": "none-of",
|
|
335
|
+
"values": [
|
|
336
|
+
"image",
|
|
337
|
+
"html",
|
|
338
|
+
"component",
|
|
339
|
+
"slot"
|
|
340
|
+
]
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"path": "config.templating.trailing.type",
|
|
344
|
+
"operator": "none-of",
|
|
345
|
+
"values": [
|
|
346
|
+
"image",
|
|
347
|
+
"html",
|
|
348
|
+
"component",
|
|
349
|
+
"slot"
|
|
350
|
+
]
|
|
351
|
+
}
|
|
352
|
+
],
|
|
353
|
+
"effects": []
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"id": "public-resource-read",
|
|
357
|
+
"audience": "public-untrusted",
|
|
358
|
+
"description": "Leitura de recurso público, condicionada a capabilities do backend.",
|
|
359
|
+
"constraints": [
|
|
360
|
+
{
|
|
361
|
+
"path": "config.dataSource.data",
|
|
362
|
+
"operator": "absent-or-empty"
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"path": "config.dataSource.resourcePath",
|
|
366
|
+
"operator": "present"
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
"path": "configPersistenceStrategy",
|
|
370
|
+
"operator": "equals",
|
|
371
|
+
"value": "volatile"
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
"path": "enableCustomization",
|
|
375
|
+
"operator": "not-true"
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
"path": "config.actions",
|
|
379
|
+
"operator": "empty-array-or-absent"
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
"path": "config.expansion",
|
|
383
|
+
"operator": "absent-or-empty"
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
"path": "config.export.enabled",
|
|
387
|
+
"operator": "not-true"
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
"path": "config.templating.leading.type",
|
|
391
|
+
"operator": "none-of",
|
|
392
|
+
"values": [
|
|
393
|
+
"image",
|
|
394
|
+
"html",
|
|
395
|
+
"component",
|
|
396
|
+
"slot"
|
|
397
|
+
]
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"path": "config.templating.primary.type",
|
|
401
|
+
"operator": "none-of",
|
|
402
|
+
"values": [
|
|
403
|
+
"image",
|
|
404
|
+
"html",
|
|
405
|
+
"component",
|
|
406
|
+
"slot"
|
|
407
|
+
]
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
"path": "config.templating.secondary.type",
|
|
411
|
+
"operator": "none-of",
|
|
412
|
+
"values": [
|
|
413
|
+
"image",
|
|
414
|
+
"html",
|
|
415
|
+
"component",
|
|
416
|
+
"slot"
|
|
417
|
+
]
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
"path": "config.templating.trailing.type",
|
|
421
|
+
"operator": "none-of",
|
|
422
|
+
"values": [
|
|
423
|
+
"image",
|
|
424
|
+
"html",
|
|
425
|
+
"component",
|
|
426
|
+
"slot"
|
|
427
|
+
]
|
|
428
|
+
}
|
|
429
|
+
],
|
|
430
|
+
"effects": [
|
|
431
|
+
{
|
|
432
|
+
"kind": "resource-read",
|
|
433
|
+
"resourcePath": "config.dataSource.resourcePath",
|
|
434
|
+
"operations": [
|
|
435
|
+
{
|
|
436
|
+
"operationId": "filter",
|
|
437
|
+
"method": "POST",
|
|
438
|
+
"pathSuffix": "filter",
|
|
439
|
+
"role": "primary",
|
|
440
|
+
"queryContext": {
|
|
441
|
+
"portId": "queryContext",
|
|
442
|
+
"requestFieldPath": "$"
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
"operationId": "all",
|
|
447
|
+
"method": "GET",
|
|
448
|
+
"pathSuffix": "all",
|
|
449
|
+
"role": "fallback"
|
|
450
|
+
}
|
|
451
|
+
]
|
|
452
|
+
}
|
|
453
|
+
]
|
|
454
|
+
}
|
|
455
|
+
],
|
|
277
456
|
"configEditor": {
|
|
278
457
|
"component": "[ref:PraxisListWidgetConfigEditor]",
|
|
279
458
|
"title": "Configure list"
|
|
@@ -15482,6 +15482,10 @@ class PraxisList {
|
|
|
15482
15482
|
itemRenderKey(item) {
|
|
15483
15483
|
if (!item || typeof item !== 'object')
|
|
15484
15484
|
return null;
|
|
15485
|
+
const selfHref = item?._links?.self?.href;
|
|
15486
|
+
if (this.isStablePrimitiveKey(selfHref)) {
|
|
15487
|
+
return selfHref;
|
|
15488
|
+
}
|
|
15485
15489
|
const primary = this.itemStableKey(item, false);
|
|
15486
15490
|
const discriminators = [
|
|
15487
15491
|
'resourceKey',
|
|
@@ -16081,7 +16085,13 @@ const PRAXIS_LIST_COMPONENT_METADATA = {
|
|
|
16081
16085
|
kind: 'resource-read',
|
|
16082
16086
|
resourcePath: 'config.dataSource.resourcePath',
|
|
16083
16087
|
operations: [
|
|
16084
|
-
{
|
|
16088
|
+
{
|
|
16089
|
+
operationId: 'filter',
|
|
16090
|
+
method: 'POST',
|
|
16091
|
+
pathSuffix: 'filter',
|
|
16092
|
+
role: 'primary',
|
|
16093
|
+
queryContext: { portId: 'queryContext', requestFieldPath: '$' },
|
|
16094
|
+
},
|
|
16085
16095
|
{ operationId: 'all', method: 'GET', pathSuffix: 'all', role: 'fallback' },
|
|
16086
16096
|
],
|
|
16087
16097
|
},
|
package/package.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/list",
|
|
3
|
-
"version": "9.0.
|
|
3
|
+
"version": "9.0.59",
|
|
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.
|
|
9
|
+
"@praxisui/dynamic-fields": "^9.0.59",
|
|
10
10
|
"rxjs": ">=7 <9",
|
|
11
11
|
"@angular/forms": "^21.0.0",
|
|
12
12
|
"@angular/router": "^21.0.0",
|
|
13
|
-
"@praxisui/ai": "^9.0.
|
|
14
|
-
"@praxisui/core": "^9.0.
|
|
15
|
-
"@praxisui/rich-content": "^9.0.
|
|
16
|
-
"@praxisui/settings-panel": "^9.0.
|
|
13
|
+
"@praxisui/ai": "^9.0.59",
|
|
14
|
+
"@praxisui/core": "^9.0.59",
|
|
15
|
+
"@praxisui/rich-content": "^9.0.59",
|
|
16
|
+
"@praxisui/settings-panel": "^9.0.59"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"tslib": "^2.3.0",
|
|
@@ -570,9 +570,16 @@ Notas de seguranca:
|
|
|
570
570
|
| `selection.mode` | Active | `none/single/multiple` |
|
|
571
571
|
| `selection.formControlName` | Active | binding em form externo |
|
|
572
572
|
| `selection.formControlPath` | Active | binding em path do form externo |
|
|
573
|
-
| `selection.compareBy` | Active |
|
|
573
|
+
| `selection.compareBy` | Active | igualdade de seleção e geração de `ids` |
|
|
574
574
|
| `selection.return` | Active | `value/item/id` no payload `selectionChange.value` |
|
|
575
575
|
|
|
576
|
+
A identidade de renderização é independente da identidade escolhida para a
|
|
577
|
+
seleção. Registros HATEOAS usam prioritariamente `_links.self.href`, evitando
|
|
578
|
+
colisões quando o mesmo identificador de domínio aparece em competências ou
|
|
579
|
+
projeções diferentes. Na ausência de self link, a lista aplica sua cadeia de
|
|
580
|
+
identidade estável baseada nos identificadores e discriminadores presentes no
|
|
581
|
+
registro; `selection.compareBy` continua restrito ao contrato de seleção.
|
|
582
|
+
|
|
576
583
|
Na variante `list`, a materialização acessível usa um `mat-list` neutro. Cada
|
|
577
584
|
linha expõe checkbox (`multiple`) ou radio (`single`), ação principal, ações
|
|
578
585
|
secundárias e expansão como alvos de teclado irmãos. Isso elimina controles
|
|
@@ -829,7 +836,7 @@ AI:
|
|
|
829
836
|
| `selection.mode` | Active | none/single/multiple |
|
|
830
837
|
| `selection.formControlName` | Active | binding form |
|
|
831
838
|
| `selection.formControlPath` | Active | binding form |
|
|
832
|
-
| `selection.compareBy` | Active | ids
|
|
839
|
+
| `selection.compareBy` | Active | igualdade de seleção e ids |
|
|
833
840
|
| `selection.return` | Active | value/item/id |
|
|
834
841
|
| `interaction` | Partial | bloco de expansao inline V1 |
|
|
835
842
|
| `interaction.expandable` | Active | toggle da expansao |
|