@praxisui/list 9.0.37 → 9.0.38

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/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@praxisui/list",
3
- "version": "9.0.37",
3
+ "version": "9.0.38",
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.37",
9
+ "@praxisui/dynamic-fields": "^9.0.38",
10
10
  "rxjs": ">=7 <9",
11
11
  "@angular/forms": "^21.0.0",
12
12
  "@angular/router": "^21.0.0",
13
- "@praxisui/ai": "^9.0.37",
14
- "@praxisui/core": "^9.0.37",
15
- "@praxisui/rich-content": "^9.0.37",
16
- "@praxisui/settings-panel": "^9.0.37"
13
+ "@praxisui/ai": "^9.0.38",
14
+ "@praxisui/core": "^9.0.38",
15
+ "@praxisui/rich-content": "^9.0.38",
16
+ "@praxisui/settings-panel": "^9.0.38"
17
17
  },
18
18
  "dependencies": {
19
19
  "tslib": "^2.3.0",
@@ -166,23 +166,23 @@ Este arquivo foi adaptado para o padrao canonico atual sem remover conteudo tecn
166
166
 
167
167
  ### Input bindings
168
168
 
169
- | Binding/Path | Type | Required | Source | Runtime normalization | Notes |
170
- | --------------------- | -------------------------------- | ------------- | --------------- | ----------------------------------------------------------- | -------------------------------------------------------------------------- |
171
- | `config` | `PraxisListConfig` | Yes (logical) | component-input | convertido para `ListAuthoringDocument` antes do apply plan | Config projetada de runtime; a autoria canônica é `ListAuthoringDocument`. |
172
- | `configPersistenceStrategy` | `'local-first' \| 'input-first' \| 'volatile'` | No | component-input | `volatile` elimina a chave de storage | Use `volatile` em previews efêmeros que não podem ler nem gravar configuração. |
173
- | `listId` | `string` | Yes | component-input | component key builder | Necessário para escopo de persistência. |
174
- | `componentInstanceId` | `string \| undefined` | No | component-input | component key scoping | Evita colisão entre instâncias da mesma lista. |
175
- | `form` | `FormGroup \| null \| undefined` | No | component-input | selection adapter | Integra seleção com controle externo quando configurado. |
176
- | `enableCustomization` | `boolean` | No | component-input | boolean coercion | Input canônico para habilitar editor/configuração visual em runtime. |
169
+ | Binding/Path | Type | Required | Source | Runtime normalization | Notes |
170
+ | --------------------------- | ---------------------------------------------- | ------------- | --------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------ |
171
+ | `config` | `PraxisListConfig` | Yes (logical) | component-input | convertido para `ListAuthoringDocument` antes do apply plan | Config projetada de runtime; a autoria canônica é `ListAuthoringDocument`. |
172
+ | `configPersistenceStrategy` | `'local-first' \| 'input-first' \| 'volatile'` | No | component-input | `volatile` elimina a chave de storage | Use `volatile` em previews efêmeros que não podem ler nem gravar configuração. |
173
+ | `listId` | `string` | Yes | component-input | component key builder | Necessário para escopo de persistência. |
174
+ | `componentInstanceId` | `string \| undefined` | No | component-input | component key scoping | Evita colisão entre instâncias da mesma lista. |
175
+ | `form` | `FormGroup \| null \| undefined` | No | component-input | selection adapter | Integra seleção com controle externo quando configurado. |
176
+ | `enableCustomization` | `boolean` | No | component-input | boolean coercion | Input canônico para habilitar editor/configuração visual em runtime. |
177
177
 
178
178
  ### Output events
179
179
 
180
- | Event | Payload | Trigger | Stability | Notes |
181
- | ----------------- | -------------------- | ----------------------------------------------------------------------------------- | --------- | ----------------------------------------------------------- |
182
- | `itemClick` | `ListItemEvent` | clique (mouse/teclado) em item | Partial | Preservado da documentação anterior. |
183
- | `actionClick` | `ListActionEvent` | acao local de item, global com `emitLocal=true` ou acao de `rich-content` hospedado | Partial | `rich-content` inclui `payload?` e `source='rich-content'`. |
184
- | `selectionChange` | `ListSelectionEvent` | alteracao de selecao em `mat-selection-list` | Partial | Preservado da documentação anterior. |
185
- | `exportAction` | `any` | resultado ou erro de exportacao de colecao | Active | Usa `PraxisCollectionExportService`. |
180
+ | Event | Payload | Trigger | Stability | Notes |
181
+ | ----------------- | -------------------- | ----------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------ |
182
+ | `itemClick` | `ListItemEvent` | clique (mouse/teclado) em item | Partial | Preservado da documentação anterior. |
183
+ | `actionClick` | `ListActionEvent` | acao local de item, global com `emitLocal=true` ou acao de `rich-content` hospedado | Partial | `rich-content` inclui `payload?` e `source='rich-content'`. |
184
+ | `selectionChange` | `ListSelectionEvent` | alteração pelo controle explícito de seleção da linha | Partial | Preserva binding e payload; a superfície usa checkbox/radio. |
185
+ | `exportAction` | `any` | resultado ou erro de exportacao de colecao | Active | Usa `PraxisCollectionExportService`. |
186
186
 
187
187
  ### External side channels
188
188
 
@@ -425,7 +425,7 @@ Antes de liberar para producao:
425
425
  | ----------------- | -------------------- | --------------------------------------------------- |
426
426
  | `itemClick` | `ListItemEvent` | clique (mouse/teclado) em item |
427
427
  | `actionClick` | `ListActionEvent` | acao local de item (ou global com `emitLocal=true`) |
428
- | `selectionChange` | `ListSelectionEvent` | alteracao de selecao em `mat-selection-list` |
428
+ | `selectionChange` | `ListSelectionEvent` | alteração pelo checkbox/radio explícito da linha |
429
429
  | `exportAction` | `any` | exportacao concluida, delegada ou com erro |
430
430
 
431
431
  #### Data mode and flow
@@ -573,6 +573,12 @@ Notas de seguranca:
573
573
  | `selection.compareBy` | Active | gera `ids` e trackBy custom |
574
574
  | `selection.return` | Active | `value/item/id` no payload `selectionChange.value` |
575
575
 
576
+ Na variante `list`, a materialização acessível usa um `mat-list` neutro. Cada
577
+ linha expõe checkbox (`multiple`) ou radio (`single`), ação principal, ações
578
+ secundárias e expansão como alvos de teclado irmãos. Isso elimina controles
579
+ interativos aninhados sem alterar `PraxisListConfig`, o `FormControl`, o formato
580
+ de `ListSelectionEvent` ou a precedência de `selection.compareBy`.
581
+
576
582
  #### Export API
577
583
 
578
584
  | Caminho | Status | Observacao |
@@ -677,7 +683,7 @@ Tipo declarado sem renderer dedicado:
677
683
  Notas de UX/WCAG:
678
684
 
679
685
  - `aria-expanded` e `aria-controls` ficam no owner real do trigger (`row` ou `icon`);
680
- - com `selection.mode !== 'none'`, a selecao continua dona da linha e a expansao passa a ser acionada apenas pelo icone;
686
+ - com `selection.mode !== 'none'`, a seleção é acionada pelo checkbox/radio explícito e a expansão permanece em um botão irmão, acionado apenas pelo ícone;
681
687
  - `expansion.sections[].itemsExpr` pode resolver arrays/objetos JSON com placeholders; o runtime materializa a estrutura em vez de exibir JSON cru;
682
688
  - para detalhes editoriais avancados, use `type='rich-content'` com `document`/`documentExpr`; a lista hospeda o contrato canonico `RichContentDocument` em vez de criar DSL visual paralela;
683
689
  - ações dentro de seções `rich-content` são mediadas por `hostCapabilities` da própria lista, reemitidas em `actionClick` com `payload?` e `source='rich-content'`, e `confirmMessage` usa o mesmo `GLOBAL_DIALOG_SERVICE` das ações nativas;
@@ -876,11 +882,11 @@ AI:
876
882
  | `expansion.sections[].documentExpr` | Active | expr que resolve `RichContentDocument` |
877
883
  | `expansion.sections[].emptyLabel` | Active | empty state da secao |
878
884
  | `expansion.rendering.shell` | Active | attached/detached/modal |
879
- | `expansion.rendering.columns` | Active | 1/2/3 colunas |
880
- | `expansion.rendering.gap` | Active | gap entre secoes |
881
- | `expansion.rendering.padding` | Active | padding do shell |
882
- | `expansion.rendering.class` | Active | classe do shell |
883
- | `expansion.rendering.style` | Active | estilo adicional |
885
+ | `expansion.rendering.columns` | Active | 1/2/3 colunas |
886
+ | `expansion.rendering.gap` | Active | gap entre secoes |
887
+ | `expansion.rendering.padding` | Active | padding do shell |
888
+ | `expansion.rendering.class` | Active | classe do shell |
889
+ | `expansion.rendering.style` | Active | estilo adicional |
884
890
  | `actions` | Partial | bloco de acoes |
885
891
  | `actions[].id` | Active | id |
886
892
  | `actions[].icon` | Active | icon |
@@ -2,7 +2,6 @@ import * as rxjs from 'rxjs';
2
2
  import { BehaviorSubject, Observable } from 'rxjs';
3
3
  import * as i0 from '@angular/core';
4
4
  import { OnInit, OnChanges, AfterViewInit, OnDestroy, EventEmitter, SimpleChanges, ChangeDetectorRef, DoCheck, Provider } from '@angular/core';
5
- import { MatSelectionListChange } from '@angular/material/list';
6
5
  import { MatPaginatorSelectConfig, PageEvent } from '@angular/material/paginator';
7
6
  import { FormGroup, FormControl } from '@angular/forms';
8
7
  import * as _praxisui_core from '@praxisui/core';
@@ -508,6 +507,7 @@ declare class PraxisList implements OnInit, OnChanges, AfterViewInit, OnDestroy
508
507
  private search$;
509
508
  get layoutLines(): number;
510
509
  boundControl: FormControl<unknown | unknown[] | null>;
510
+ private selectionControlSubscription?;
511
511
  readonly skinScopeId: string;
512
512
  skinClasses: string;
513
513
  inlineCss: string;
@@ -576,6 +576,7 @@ declare class PraxisList implements OnInit, OnChanges, AfterViewInit, OnDestroy
576
576
  isTilesVariant(): boolean;
577
577
  isSelectionEnabled(): boolean;
578
578
  private setupSelectionBinding;
579
+ private watchSelectionControl;
579
580
  leading: (item: any) => Record<string, any> | null;
580
581
  primary: (item: any) => Record<string, any> | null;
581
582
  secondary: (item: any) => Record<string, any> | null;
@@ -681,24 +682,30 @@ declare class PraxisList implements OnInit, OnChanges, AfterViewInit, OnDestroy
681
682
  }[];
682
683
  onItemClick(item: any, index: number, section?: string): void;
683
684
  onRowActivate(item: any, index: number, section?: string): void;
684
- onRowSpaceActivate(event: Event, clickable: boolean, item: any, index: number, section?: string): void;
685
685
  onExpandToggle(event: Event, item: any, index: number): void;
686
686
  onActionKeydown(ev: Event): void;
687
687
  configEditorLabel(): string;
688
688
  expandToggleAriaLabel(item: any, index: number): string;
689
689
  expansionRegionAriaLabel(item: any): string;
690
690
  emptyStateLabel(): string;
691
+ selectionListAriaLabel(): string | null;
692
+ selectionControlName(): string;
693
+ selectionControlAriaLabel(item: any): string;
694
+ isItemSelected(item: any): boolean;
695
+ setItemSelected(item: any, selected: boolean): void;
696
+ private selectionItemsEqual;
691
697
  isResourceConnectionMissing(): boolean;
692
698
  onActionClick(ev: MouseEvent, actionId: string, item: any, index: number): Promise<void>;
693
699
  private executeRecordOpenAction;
694
700
  private resolveRecordOpenService;
701
+ private resolveActionFocusOrigin;
695
702
  private reportRecordOpenFailure;
696
703
  private resolveActionPayload;
697
704
  private resolveTemplate;
698
705
  private isDeferredTemplateExpressionKey;
699
706
  private resolveStringTemplate;
700
707
  private lookup;
701
- onSelectionChange(_change: MatSelectionListChange): void;
708
+ onSelectionChange(): void;
702
709
  listExportFormats(): PraxisExportFormat[];
703
710
  exportIcon(format: PraxisExportFormat): string;
704
711
  onExportAction(format: PraxisExportFormat): Promise<void>;
@@ -2149,6 +2156,8 @@ declare const PRAXIS_LIST_EN_US: {
2149
2156
  readonly emptyState: "No items available";
2150
2157
  readonly emptyStateConnectResource: "Connect this list to a resource to load items.";
2151
2158
  readonly recordOpenUnavailable: "Unable to open details for this item.";
2159
+ readonly 'selection.ariaLabel': "Selectable list";
2160
+ readonly 'selection.selectItem': "Select item";
2152
2161
  readonly 'toolbar.label': "List controls";
2153
2162
  readonly 'toolbar.search': "Search";
2154
2163
  readonly 'toolbar.sort': "Sort by";
@@ -2208,7 +2217,7 @@ declare const PRAXIS_LIST_EN_US: {
2208
2217
  readonly 'Use custom color': "Use custom color";
2209
2218
  readonly Default: "Default";
2210
2219
  readonly "Show when (e.g.: ${item.status} == 'done')": "Show when (e.g.: ${item.status} == 'done')";
2211
- readonly "Supported syntax: \"${item.field} == 'value'\". Advanced expressions are not evaluated.": "Supported syntax: \"${item.field} == 'value'\". Advanced expressions are not evaluated.";
2220
+ readonly 'Supported syntax: "${item.field} == \'value\'". Advanced expressions are not evaluated.': "Supported syntax: \"${item.field} == 'value'\". Advanced expressions are not evaluated.";
2212
2221
  readonly Action: "Action";
2213
2222
  readonly Preview: "Preview";
2214
2223
  readonly Remove: "Remove";
@@ -2526,6 +2535,8 @@ declare const PRAXIS_LIST_PT_BR: {
2526
2535
  readonly emptyState: "Nenhum item disponível";
2527
2536
  readonly emptyStateConnectResource: "Conecte a lista a um recurso para carregar os itens.";
2528
2537
  readonly recordOpenUnavailable: "Não foi possível abrir os detalhes deste item.";
2538
+ readonly 'selection.ariaLabel': "Lista selecionável";
2539
+ readonly 'selection.selectItem': "Selecionar item";
2529
2540
  readonly 'toolbar.label': "Controles da lista";
2530
2541
  readonly 'toolbar.search': "Buscar";
2531
2542
  readonly 'toolbar.sort': "Ordenar por";
@@ -2585,7 +2596,7 @@ declare const PRAXIS_LIST_PT_BR: {
2585
2596
  readonly 'Use custom color': "Usar cor personalizada";
2586
2597
  readonly Default: "Padrão";
2587
2598
  readonly "Show when (e.g.: ${item.status} == 'done')": "Exibir quando (ex.: ${item.status} == 'concluído')";
2588
- readonly "Supported syntax: \"${item.field} == 'value'\". Advanced expressions are not evaluated.": "Sintaxe suportada: \"${item.field} == 'valor'\". Expressões avançadas não são avaliadas.";
2599
+ readonly 'Supported syntax: "${item.field} == \'value\'". Advanced expressions are not evaluated.': "Sintaxe suportada: \"${item.field} == 'valor'\". Expressões avançadas não são avaliadas.";
2589
2600
  readonly Action: "Ação";
2590
2601
  readonly Preview: "Pré-visualização";
2591
2602
  readonly Remove: "Remover";