@praxisui/rich-content 9.0.0-beta.5 → 9.0.0-beta.6

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.
@@ -48,6 +48,7 @@ const PRAXIS_RICH_CONTENT_EN_US = {
48
48
  'praxis.richContent.editor.nodeType.text': 'Text',
49
49
  'praxis.richContent.editor.nodeType.badge': 'Badge',
50
50
  'praxis.richContent.editor.nodeType.icon': 'Icon',
51
+ 'praxis.richContent.editor.nodeType.avatar': 'Avatar',
51
52
  'praxis.richContent.editor.nodeType.image': 'Image',
52
53
  'praxis.richContent.editor.nodeType.link': 'Link',
53
54
  'praxis.richContent.editor.nodeType.metric': 'Metric',
@@ -87,6 +88,7 @@ const PRAXIS_RICH_CONTENT_EN_US = {
87
88
  'praxis.richContent.editor.field.src': 'Image URL',
88
89
  'praxis.richContent.editor.field.href': 'Link URL',
89
90
  'praxis.richContent.editor.field.target': 'Target',
91
+ 'praxis.richContent.editor.field.rel': 'Rel',
90
92
  'praxis.richContent.editor.field.alt': 'Alternative text',
91
93
  'praxis.richContent.editor.field.testId': 'Test id',
92
94
  'praxis.richContent.editor.field.className': 'CSS class',
@@ -101,6 +103,10 @@ const PRAXIS_RICH_CONTENT_EN_US = {
101
103
  'praxis.richContent.editor.field.gap': 'Gap',
102
104
  'praxis.richContent.editor.field.avatarName': 'Avatar name',
103
105
  'praxis.richContent.editor.field.avatarImage': 'Avatar image',
106
+ 'praxis.richContent.editor.field.nameExpr': 'Name binding',
107
+ 'praxis.richContent.editor.field.imageSrcExpr': 'Image binding',
108
+ 'praxis.richContent.editor.field.initials': 'Initials',
109
+ 'praxis.richContent.editor.field.initialsExpr': 'Initials binding',
104
110
  'praxis.richContent.editor.field.emptyText': 'Empty text',
105
111
  'praxis.richContent.editor.field.errorText': 'Error text',
106
112
  'praxis.richContent.editor.field.meta': 'Meta',
@@ -171,6 +177,10 @@ const PRAXIS_RICH_CONTENT_EN_US = {
171
177
  'praxis.richContent.editor.decisionEvidence': 'Evidence',
172
178
  'praxis.richContent.editor.decisionPrimaryAction': 'Primary action',
173
179
  'praxis.richContent.editor.decisionSecondaryActions': 'Secondary actions',
180
+ 'praxis.richContent.editor.addPrimaryAction': 'Add primary action',
181
+ 'praxis.richContent.editor.addSecondaryAction': 'Add secondary action',
182
+ 'praxis.richContent.editor.addAction': 'Add action',
183
+ 'praxis.richContent.editor.action': 'Action',
174
184
  'praxis.richContent.editor.addEvidence': 'Add evidence',
175
185
  'praxis.richContent.editor.evidence': 'Evidence',
176
186
  'praxis.richContent.editor.defaultEvidenceLabel': 'Evidence',
@@ -287,6 +297,12 @@ const PRAXIS_RICH_CONTENT_EN_US = {
287
297
  'praxis.richContent.editor.placeholder.valueExpr': 'row.total',
288
298
  'praxis.richContent.editor.placeholder.captionExpr': 'row.caption',
289
299
  'praxis.richContent.editor.placeholder.progressExpr': 'row.progress',
300
+ 'praxis.richContent.editor.placeholder.nameExpr': 'row.name',
301
+ 'praxis.richContent.editor.placeholder.imageSrcExpr': 'row.avatarUrl',
302
+ 'praxis.richContent.editor.placeholder.initialsExpr': 'row.initials',
303
+ 'praxis.richContent.editor.placeholder.rel': 'noopener noreferrer',
304
+ 'praxis.richContent.editor.target.self': 'Same tab',
305
+ 'praxis.richContent.editor.target.blank': 'New tab',
290
306
  'praxis.richContent.editor.defaultText': 'Text',
291
307
  'praxis.richContent.editor.defaultBadge': 'Badge',
292
308
  'praxis.richContent.editor.defaultLink': 'Link',
@@ -327,13 +343,18 @@ const PRAXIS_RICH_CONTENT_EN_US = {
327
343
  'praxis.richContent.editor.defaultActionCardAction': 'Run action',
328
344
  'praxis.richContent.editor.defaultCollapsibleCardTitle': 'Advanced details',
329
345
  'praxis.richContent.editor.defaultCollapsibleCardText': 'Collapsible card content',
346
+ 'praxis.richContent.editor.cardActions': 'Card actions',
347
+ 'praxis.richContent.editor.calloutActions': 'Callout actions',
330
348
  'praxis.richContent.editor.ctaGroupActions': 'CTA actions',
349
+ 'praxis.richContent.editor.emptyStateActions': 'Empty state actions',
350
+ 'praxis.richContent.editor.recordSummaryActions': 'Summary actions',
331
351
  'praxis.richContent.editor.tabsItems': 'Tab items',
332
352
  'praxis.richContent.editor.lookupResultActions': 'Lookup actions',
333
353
  'praxis.richContent.editor.lookupCardSecondaryActions': 'Secondary actions',
334
354
  'praxis.richContent.editor.relatedRecordSecondaryActions': 'Secondary actions',
335
355
  'praxis.richContent.editor.actionCardSecondaryActions': 'Secondary actions',
336
356
  'praxis.richContent.editor.collapsibleCardActions': 'Card actions',
357
+ 'praxis.richContent.editor.accordionItemActions': 'Item actions',
337
358
  'praxis.richContent.editor.status.idle': 'Idle',
338
359
  'praxis.richContent.editor.status.resolved': 'Resolved',
339
360
  'praxis.richContent.editor.status.empty': 'Empty',
@@ -422,6 +443,7 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
422
443
  'praxis.richContent.editor.nodeType.text': 'Texto',
423
444
  'praxis.richContent.editor.nodeType.badge': 'Badge',
424
445
  'praxis.richContent.editor.nodeType.icon': 'Ícone',
446
+ 'praxis.richContent.editor.nodeType.avatar': 'Avatar',
425
447
  'praxis.richContent.editor.nodeType.image': 'Imagem',
426
448
  'praxis.richContent.editor.nodeType.link': 'Link',
427
449
  'praxis.richContent.editor.nodeType.metric': 'Métrica',
@@ -440,6 +462,7 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
440
462
  'praxis.richContent.editor.field.src': 'URL da imagem',
441
463
  'praxis.richContent.editor.field.href': 'URL do link',
442
464
  'praxis.richContent.editor.field.target': 'Destino',
465
+ 'praxis.richContent.editor.field.rel': 'Rel',
443
466
  'praxis.richContent.editor.field.alt': 'Texto alternativo',
444
467
  'praxis.richContent.editor.field.testId': 'Id de teste',
445
468
  'praxis.richContent.editor.field.className': 'Classe CSS',
@@ -454,6 +477,10 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
454
477
  'praxis.richContent.editor.field.gap': 'Espaçamento',
455
478
  'praxis.richContent.editor.field.avatarName': 'Nome do avatar',
456
479
  'praxis.richContent.editor.field.avatarImage': 'Imagem do avatar',
480
+ 'praxis.richContent.editor.field.nameExpr': 'Vínculo do nome',
481
+ 'praxis.richContent.editor.field.imageSrcExpr': 'Vínculo da imagem',
482
+ 'praxis.richContent.editor.field.initials': 'Iniciais',
483
+ 'praxis.richContent.editor.field.initialsExpr': 'Vínculo das iniciais',
457
484
  'praxis.richContent.editor.field.emptyText': 'Texto vazio',
458
485
  'praxis.richContent.editor.field.errorText': 'Texto de erro',
459
486
  'praxis.richContent.editor.field.meta': 'Meta',
@@ -501,6 +528,12 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
501
528
  'praxis.richContent.editor.placeholder.valueExpr': 'row.total',
502
529
  'praxis.richContent.editor.placeholder.captionExpr': 'row.caption',
503
530
  'praxis.richContent.editor.placeholder.progressExpr': 'row.progress',
531
+ 'praxis.richContent.editor.placeholder.nameExpr': 'row.name',
532
+ 'praxis.richContent.editor.placeholder.imageSrcExpr': 'row.avatarUrl',
533
+ 'praxis.richContent.editor.placeholder.initialsExpr': 'row.initials',
534
+ 'praxis.richContent.editor.placeholder.rel': 'noopener noreferrer',
535
+ 'praxis.richContent.editor.target.self': 'Mesma aba',
536
+ 'praxis.richContent.editor.target.blank': 'Nova aba',
504
537
  'praxis.richContent.editor.defaultText': 'Texto',
505
538
  'praxis.richContent.editor.defaultBadge': 'Badge',
506
539
  'praxis.richContent.editor.defaultLink': 'Link',
@@ -572,9 +605,9 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
572
605
  'praxis.richContent.editor.nodeType.collapsibleCard': 'Card colapsável',
573
606
  'praxis.richContent.editor.nodeType.disclosure': 'Disclosure',
574
607
  'praxis.richContent.editor.nodeType.accordion': 'Accordion',
575
- 'praxis.richContent.editor.nodeType.formLauncher': 'Lançador de formulário',
608
+ 'praxis.richContent.editor.nodeType.formLauncher': 'Lançador de formulário',
576
609
  'praxis.richContent.editor.field.message': 'Mensagem',
577
- 'praxis.richContent.editor.field.description': 'Descrição',
610
+ 'praxis.richContent.editor.field.description': 'Descrição',
578
611
  'praxis.richContent.editor.field.status': 'Status',
579
612
  'praxis.richContent.editor.field.titleExpr': 'Vínculo do título',
580
613
  'praxis.richContent.editor.field.subtitleExpr': 'Vínculo do subtítulo',
@@ -617,11 +650,15 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
617
650
  'praxis.richContent.editor.field.actionId': 'Action ID',
618
651
  'praxis.richContent.editor.field.payloadExpr': 'Binding do payload',
619
652
  'praxis.richContent.editor.field.availabilityExpr': 'Binding de disponibilidade',
620
- 'praxis.richContent.editor.field.confirmMessage': 'Mensagem de confirmação',
653
+ 'praxis.richContent.editor.field.confirmMessage': 'Mensagem de confirmação',
621
654
  'praxis.richContent.editor.decisionGovernance': 'Governança da decisão',
622
655
  'praxis.richContent.editor.decisionEvidence': 'Evidências',
623
656
  'praxis.richContent.editor.decisionPrimaryAction': 'Ação primária',
624
657
  'praxis.richContent.editor.decisionSecondaryActions': 'Ações secundárias',
658
+ 'praxis.richContent.editor.addPrimaryAction': 'Adicionar ação primária',
659
+ 'praxis.richContent.editor.addSecondaryAction': 'Adicionar ação secundária',
660
+ 'praxis.richContent.editor.addAction': 'Adicionar ação',
661
+ 'praxis.richContent.editor.action': 'Ação',
625
662
  'praxis.richContent.editor.addEvidence': 'Adicionar evidência',
626
663
  'praxis.richContent.editor.evidence': 'Evidência',
627
664
  'praxis.richContent.editor.defaultEvidenceLabel': 'Evidência',
@@ -653,7 +690,7 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
653
690
  'praxis.richContent.editor.placeholder.evidenceSourceExpr': '${evidence.source}',
654
691
  'praxis.richContent.editor.field.formId': 'Form ID',
655
692
  'praxis.richContent.editor.field.ctaLabel': 'Label do CTA',
656
- 'praxis.richContent.editor.field.ctaIcon': 'Ícone do CTA',
693
+ 'praxis.richContent.editor.field.ctaIcon': 'Ícone do CTA',
657
694
  'praxis.richContent.editor.layout.stacked': 'Empilhado',
658
695
  'praxis.richContent.editor.layout.inlineShort': 'Inline',
659
696
  'praxis.richContent.editor.layout.split': 'Dividido',
@@ -695,25 +732,31 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
695
732
  'praxis.richContent.editor.timeline.textAppearance.label': 'Rótulo',
696
733
  'praxis.richContent.editor.appearance.underline': 'Sublinhado',
697
734
  'praxis.richContent.editor.appearance.pills': 'Pílulas',
698
- 'praxis.richContent.editor.variant.basic': 'Básico',
735
+ 'praxis.richContent.editor.variant.basic': 'Básico',
699
736
  'praxis.richContent.editor.variant.raised': 'Elevado',
700
737
  'praxis.richContent.editor.variant.stroked': 'Contornado',
701
738
  'praxis.richContent.editor.variant.flat': 'Flat',
702
- 'praxis.richContent.editor.color.basic': 'Básica',
703
- 'praxis.richContent.editor.color.primary': 'Primária',
739
+ 'praxis.richContent.editor.color.basic': 'Básica',
740
+ 'praxis.richContent.editor.color.primary': 'Primária',
704
741
  'praxis.richContent.editor.color.accent': 'Accent',
705
742
  'praxis.richContent.editor.color.warn': 'Warn',
706
- 'praxis.richContent.editor.ctaGroupActions': 'Ações do CTA',
743
+ 'praxis.richContent.editor.cardActions': 'Ações do card',
744
+ 'praxis.richContent.editor.calloutActions': 'Ações do callout',
745
+ 'praxis.richContent.editor.ctaGroupActions': 'Ações do CTA',
746
+ 'praxis.richContent.editor.emptyStateActions': 'Ações do estado vazio',
747
+ 'praxis.richContent.editor.recordSummaryActions': 'Ações do resumo',
707
748
  'praxis.richContent.editor.tabsItems': 'Itens de aba',
708
- 'praxis.richContent.editor.lookupResultActions': 'Ações da consulta',
709
- 'praxis.richContent.editor.lookupCardSecondaryActions': 'Ações secundárias',
749
+ 'praxis.richContent.editor.lookupResultActions': 'Ações da consulta',
750
+ 'praxis.richContent.editor.lookupCardSecondaryActions': 'Ações secundárias',
751
+ 'praxis.richContent.editor.relatedRecordSecondaryActions': 'Ações secundárias',
710
752
  'praxis.richContent.editor.actionCardSecondaryActions': 'Ações secundárias',
711
- 'praxis.richContent.editor.collapsibleCardActions': 'Ações do card',
753
+ 'praxis.richContent.editor.collapsibleCardActions': 'Ações do card',
754
+ 'praxis.richContent.editor.accordionItemActions': 'Ações do item',
712
755
  'praxis.richContent.editor.status.idle': 'Aguardando',
713
756
  'praxis.richContent.editor.status.resolved': 'Resolvido',
714
757
  'praxis.richContent.editor.status.empty': 'Vazio',
715
758
  'praxis.richContent.editor.status.error': 'Erro',
716
- 'praxis.richContent.editor.formLauncherSecondaryActions': 'Ações secundárias',
759
+ 'praxis.richContent.editor.formLauncherSecondaryActions': 'Ações secundárias',
717
760
  'praxis.richContent.editor.defaultLookupResultTitle': 'Resultado de consulta',
718
761
  'praxis.richContent.editor.defaultLookupResultField': 'Departamento',
719
762
  'praxis.richContent.editor.defaultLookupResultHint': 'Resolvido a partir do registro selecionado',
@@ -5136,6 +5179,7 @@ const EDITABLE_TOP_LEVEL_NODE_TYPES = [
5136
5179
  'text',
5137
5180
  'badge',
5138
5181
  'icon',
5182
+ 'avatar',
5139
5183
  'image',
5140
5184
  'link',
5141
5185
  'metric',
@@ -5168,6 +5212,7 @@ const EDITABLE_PRESENTER_NODE_TYPES = [
5168
5212
  'text',
5169
5213
  'badge',
5170
5214
  'icon',
5215
+ 'avatar',
5171
5216
  'image',
5172
5217
  'link',
5173
5218
  'metric',
@@ -5184,6 +5229,12 @@ function createDefaultRichContentNode(type, tx, presetRef) {
5184
5229
  return { type: 'badge', label: tx('editor.defaultBadge', 'Badge') };
5185
5230
  case 'icon':
5186
5231
  return { type: 'icon', icon: 'check_circle' };
5232
+ case 'avatar':
5233
+ return {
5234
+ type: 'avatar',
5235
+ name: tx('editor.defaultAvatarName', 'Person'),
5236
+ initials: 'P',
5237
+ };
5187
5238
  case 'image':
5188
5239
  return { type: 'image', src: '/assets/placeholder.png', alt: '' };
5189
5240
  case 'link':
@@ -5539,6 +5590,12 @@ function createDefaultPresenterNode(type, tx) {
5539
5590
  return { type: 'badge', label: tx('editor.defaultBadge', 'Badge') };
5540
5591
  case 'icon':
5541
5592
  return { type: 'icon', icon: 'check_circle' };
5593
+ case 'avatar':
5594
+ return {
5595
+ type: 'avatar',
5596
+ name: tx('editor.defaultAvatarName', 'Person'),
5597
+ initials: 'P',
5598
+ };
5542
5599
  case 'image':
5543
5600
  return { type: 'image', src: '/assets/placeholder.png', alt: '' };
5544
5601
  case 'link':
@@ -7109,6 +7166,50 @@ class PraxisRichContentConfigEditor {
7109
7166
  />
7110
7167
  </label>
7111
7168
  }
7169
+ @case ('avatar') {
7170
+ <label>
7171
+ <span>{{ tx('editor.field.avatarName', 'Avatar name') }}</span>
7172
+ <input
7173
+ [ngModel]="getStringField(node, 'name')"
7174
+ (ngModelChange)="setString('name', $event)"
7175
+ />
7176
+ </label>
7177
+ <label>
7178
+ <span>{{ tx('editor.field.nameExpr', 'Name binding') }}</span>
7179
+ <input
7180
+ [ngModel]="getStringField(node, 'nameExpr')"
7181
+ (ngModelChange)="setString('nameExpr', $event)"
7182
+ />
7183
+ </label>
7184
+ <label>
7185
+ <span>{{ tx('editor.field.avatarImage', 'Avatar image') }}</span>
7186
+ <input
7187
+ [ngModel]="getStringField(node, 'imageSrc')"
7188
+ (ngModelChange)="setString('imageSrc', $event)"
7189
+ />
7190
+ </label>
7191
+ <label>
7192
+ <span>{{ tx('editor.field.imageSrcExpr', 'Image binding') }}</span>
7193
+ <input
7194
+ [ngModel]="getStringField(node, 'imageSrcExpr')"
7195
+ (ngModelChange)="setString('imageSrcExpr', $event)"
7196
+ />
7197
+ </label>
7198
+ <label>
7199
+ <span>{{ tx('editor.field.initials', 'Initials') }}</span>
7200
+ <input
7201
+ [ngModel]="getStringField(node, 'initials')"
7202
+ (ngModelChange)="setString('initials', $event)"
7203
+ />
7204
+ </label>
7205
+ <label>
7206
+ <span>{{ tx('editor.field.initialsExpr', 'Initials binding') }}</span>
7207
+ <input
7208
+ [ngModel]="getStringField(node, 'initialsExpr')"
7209
+ (ngModelChange)="setString('initialsExpr', $event)"
7210
+ />
7211
+ </label>
7212
+ }
7112
7213
  @case ('image') {
7113
7214
  <label>
7114
7215
  <span>{{ tx('editor.field.src', 'Image URL') }}</span>
@@ -7140,6 +7241,23 @@ class PraxisRichContentConfigEditor {
7140
7241
  (ngModelChange)="setString('href', $event)"
7141
7242
  />
7142
7243
  </label>
7244
+ <label>
7245
+ <span>{{ tx('editor.field.target', 'Target') }}</span>
7246
+ <select
7247
+ [ngModel]="getStringField(node, 'target') || '_self'"
7248
+ (ngModelChange)="setString('target', $event)"
7249
+ >
7250
+ <option value="_self">{{ tx('editor.target.self', 'Same tab') }}</option>
7251
+ <option value="_blank">{{ tx('editor.target.blank', 'New tab') }}</option>
7252
+ </select>
7253
+ </label>
7254
+ <label>
7255
+ <span>{{ tx('editor.field.rel', 'Rel') }}</span>
7256
+ <input
7257
+ [ngModel]="getStringField(node, 'rel')"
7258
+ (ngModelChange)="setString('rel', $event)"
7259
+ />
7260
+ </label>
7143
7261
  }
7144
7262
  @case ('metric') {
7145
7263
  <label>
@@ -7595,6 +7713,53 @@ class PraxisRichContentConfigEditor {
7595
7713
  />
7596
7714
  </label>
7597
7715
  }
7716
+ @case ('avatar') {
7717
+ <label>
7718
+ <span>{{ tx('editor.field.avatarName', 'Avatar name') }}</span>
7719
+ <input
7720
+ [ngModel]="getStringField(node, 'name')"
7721
+ (ngModelChange)="setStringField($index, 'name', $event)"
7722
+ />
7723
+ </label>
7724
+ <label>
7725
+ <span>{{ tx('editor.field.nameExpr', 'Name binding') }}</span>
7726
+ <input
7727
+ [ngModel]="getStringField(node, 'nameExpr')"
7728
+ (ngModelChange)="setStringField($index, 'nameExpr', $event)"
7729
+ [placeholder]="tx('editor.placeholder.nameExpr', 'row.name')"
7730
+ />
7731
+ </label>
7732
+ <label>
7733
+ <span>{{ tx('editor.field.avatarImage', 'Avatar image') }}</span>
7734
+ <input
7735
+ [ngModel]="getStringField(node, 'imageSrc')"
7736
+ (ngModelChange)="setStringField($index, 'imageSrc', $event)"
7737
+ />
7738
+ </label>
7739
+ <label>
7740
+ <span>{{ tx('editor.field.imageSrcExpr', 'Image binding') }}</span>
7741
+ <input
7742
+ [ngModel]="getStringField(node, 'imageSrcExpr')"
7743
+ (ngModelChange)="setStringField($index, 'imageSrcExpr', $event)"
7744
+ [placeholder]="tx('editor.placeholder.imageSrcExpr', 'row.avatarUrl')"
7745
+ />
7746
+ </label>
7747
+ <label>
7748
+ <span>{{ tx('editor.field.initials', 'Initials') }}</span>
7749
+ <input
7750
+ [ngModel]="getStringField(node, 'initials')"
7751
+ (ngModelChange)="setStringField($index, 'initials', $event)"
7752
+ />
7753
+ </label>
7754
+ <label>
7755
+ <span>{{ tx('editor.field.initialsExpr', 'Initials binding') }}</span>
7756
+ <input
7757
+ [ngModel]="getStringField(node, 'initialsExpr')"
7758
+ (ngModelChange)="setStringField($index, 'initialsExpr', $event)"
7759
+ [placeholder]="tx('editor.placeholder.initialsExpr', 'row.initials')"
7760
+ />
7761
+ </label>
7762
+ }
7598
7763
  @case ('image') {
7599
7764
  <label>
7600
7765
  <span>{{ tx('editor.field.src', 'Image URL') }}</span>
@@ -7611,6 +7776,48 @@ class PraxisRichContentConfigEditor {
7611
7776
  />
7612
7777
  </label>
7613
7778
  }
7779
+ @case ('link') {
7780
+ <label>
7781
+ <span>{{ tx('editor.field.label', 'Label') }}</span>
7782
+ <input
7783
+ [ngModel]="getStringField(node, 'label')"
7784
+ (ngModelChange)="setStringField($index, 'label', $event)"
7785
+ />
7786
+ </label>
7787
+ <label>
7788
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
7789
+ <input
7790
+ [ngModel]="getStringField(node, 'labelExpr')"
7791
+ (ngModelChange)="setStringField($index, 'labelExpr', $event)"
7792
+ [placeholder]="tx('editor.placeholder.labelExpr', 'row.linkLabel')"
7793
+ />
7794
+ </label>
7795
+ <label class="prx-rich-editor__wide-field">
7796
+ <span>{{ tx('editor.field.href', 'Link URL') }}</span>
7797
+ <input
7798
+ [ngModel]="getStringField(node, 'href')"
7799
+ (ngModelChange)="setStringField($index, 'href', $event)"
7800
+ />
7801
+ </label>
7802
+ <label>
7803
+ <span>{{ tx('editor.field.target', 'Target') }}</span>
7804
+ <select
7805
+ [ngModel]="getStringField(node, 'target') || '_self'"
7806
+ (ngModelChange)="setStringField($index, 'target', $event)"
7807
+ >
7808
+ <option value="_self">{{ tx('editor.target.self', 'Same tab') }}</option>
7809
+ <option value="_blank">{{ tx('editor.target.blank', 'New tab') }}</option>
7810
+ </select>
7811
+ </label>
7812
+ <label>
7813
+ <span>{{ tx('editor.field.rel', 'Rel') }}</span>
7814
+ <input
7815
+ [ngModel]="getStringField(node, 'rel')"
7816
+ (ngModelChange)="setStringField($index, 'rel', $event)"
7817
+ [placeholder]="tx('editor.placeholder.rel', 'noopener noreferrer')"
7818
+ />
7819
+ </label>
7820
+ }
7614
7821
  @case ('metric') {
7615
7822
  <label>
7616
7823
  <span>{{ tx('editor.field.label', 'Label') }}</span>
@@ -9035,24 +9242,24 @@ class PraxisRichContentConfigEditor {
9035
9242
  <header class="prx-rich-editor__nested-header">
9036
9243
  <h5>{{ tx('editor.decisionEvidence', 'Evidence') }}</h5>
9037
9244
  <div class="prx-rich-editor__quick-actions">
9038
- <button type="button" (click)="addDecisionPackageEvidence($index)">
9245
+ <button type="button" (click)="addDecisionPackageEvidence(nodeIndex)">
9039
9246
  {{ tx('editor.addEvidence', 'Add evidence') }}
9040
9247
  </button>
9041
9248
  </div>
9042
9249
  </header>
9043
- @for (evidence of getDecisionPackageEvidence($index); track evidence.id ?? $index; let evidenceIndex = $index) {
9250
+ @for (evidence of getDecisionPackageEvidence(nodeIndex); track evidence.id ?? $index; let evidenceIndex = $index) {
9044
9251
  <div class="prx-rich-editor__nested-node">
9045
9252
  <div class="prx-rich-editor__nested-actions">
9046
9253
  <strong>{{ tx('editor.evidence', 'Evidence') }} {{ evidenceIndex + 1 }}</strong>
9047
- @if (isRemovalPending('nodes.' + $index + '.evidence', evidenceIndex)) {
9048
- <button type="button" (click)="removeDecisionPackageEvidence($index, evidenceIndex)">
9254
+ @if (isRemovalPending('nodes.' + nodeIndex + '.evidence', evidenceIndex)) {
9255
+ <button type="button" (click)="removeDecisionPackageEvidence(nodeIndex, evidenceIndex)">
9049
9256
  {{ tx('editor.confirmRemove', 'Confirm remove') }}
9050
9257
  </button>
9051
9258
  <button type="button" (click)="cancelRemoval()">
9052
9259
  {{ tx('editor.cancelRemove', 'Cancel') }}
9053
9260
  </button>
9054
9261
  } @else {
9055
- <button type="button" (click)="requestNestedRemoval('nodes.' + $index + '.evidence', evidenceIndex)">
9262
+ <button type="button" (click)="requestNestedRemoval('nodes.' + nodeIndex + '.evidence', evidenceIndex)">
9056
9263
  {{ tx('editor.removeBlock', 'Remove') }}
9057
9264
  </button>
9058
9265
  }
@@ -9061,37 +9268,37 @@ class PraxisRichContentConfigEditor {
9061
9268
  <label>
9062
9269
  <span>{{ tx('editor.field.itemId', 'Item ID') }}</span>
9063
9270
  <input
9064
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'id')"
9065
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'id', $event)"
9271
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'id')"
9272
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'id', $event)"
9066
9273
  />
9067
9274
  </label>
9068
9275
  <label>
9069
9276
  <span>{{ tx('editor.field.label', 'Label') }}</span>
9070
9277
  <input
9071
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'label')"
9072
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'label', $event)"
9278
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'label')"
9279
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'label', $event)"
9073
9280
  />
9074
9281
  </label>
9075
9282
  <label>
9076
9283
  <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
9077
9284
  <input
9078
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'labelExpr')"
9079
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'labelExpr', $event)"
9285
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'labelExpr')"
9286
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'labelExpr', $event)"
9080
9287
  [placeholder]="tx('editor.placeholder.evidenceLabelExpr', '\${evidence.label}')"
9081
9288
  />
9082
9289
  </label>
9083
9290
  <label>
9084
9291
  <span>{{ tx('editor.field.source', 'Source') }}</span>
9085
9292
  <input
9086
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'source')"
9087
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'source', $event)"
9293
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'source')"
9294
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'source', $event)"
9088
9295
  />
9089
9296
  </label>
9090
9297
  <label>
9091
9298
  <span>{{ tx('editor.field.sourceExpr', 'Source binding') }}</span>
9092
9299
  <input
9093
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'sourceExpr')"
9094
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'sourceExpr', $event)"
9300
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'sourceExpr')"
9301
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'sourceExpr', $event)"
9095
9302
  [placeholder]="tx('editor.placeholder.evidenceSourceExpr', '\${evidence.source}')"
9096
9303
  />
9097
9304
  </label>
@@ -9104,27 +9311,27 @@ class PraxisRichContentConfigEditor {
9104
9311
  <header class="prx-rich-editor__nested-header">
9105
9312
  <h5>{{ tx('editor.decisionPrimaryAction', 'Primary action') }}</h5>
9106
9313
  <div class="prx-rich-editor__quick-actions">
9107
- @if (getDecisionPackagePrimaryAction($index)) {
9108
- <button type="button" (click)="removeDecisionPackagePrimaryAction($index)">
9314
+ @if (getDecisionPackagePrimaryAction(nodeIndex)) {
9315
+ <button type="button" (click)="removeDecisionPackagePrimaryAction(nodeIndex)">
9109
9316
  {{ tx('editor.removeBlock', 'Remove') }}
9110
9317
  </button>
9111
9318
  } @else {
9112
- <button type="button" (click)="addDecisionPackagePrimaryActionPreset($index, 'primary')">
9319
+ <button type="button" (click)="addDecisionPackagePrimaryActionPreset(nodeIndex, 'primary')">
9113
9320
  {{ tx('editor.addPrimaryAction', 'Add primary action') }}
9114
9321
  </button>
9115
- <button type="button" (click)="addDecisionPackagePrimaryAction($index)">
9322
+ <button type="button" (click)="addDecisionPackagePrimaryAction(nodeIndex)">
9116
9323
  {{ tx('editor.addAction', 'Add action') }}
9117
9324
  </button>
9118
9325
  }
9119
9326
  </div>
9120
9327
  </header>
9121
- @if (getDecisionPackagePrimaryAction($index); as primaryAction) {
9328
+ @if (getDecisionPackagePrimaryAction(nodeIndex); as primaryAction) {
9122
9329
  <div class="prx-rich-editor__node-grid">
9123
9330
  <ng-container
9124
9331
  *ngTemplateOutlet="actionFields; context: {
9125
9332
  action: primaryAction,
9126
- path: '$.nodes[' + $index + '].primaryAction',
9127
- setField: setDecisionPackagePrimaryActionField.bind(this, $index)
9333
+ path: '$.nodes[' + nodeIndex + '].primaryAction',
9334
+ setField: setDecisionPackagePrimaryActionField.bind(this, nodeIndex)
9128
9335
  }"
9129
9336
  ></ng-container>
9130
9337
  </div>
@@ -10041,6 +10248,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10041
10248
  />
10042
10249
  </label>
10043
10250
  }
10251
+ @case ('avatar') {
10252
+ <label>
10253
+ <span>{{ tx('editor.field.avatarName', 'Avatar name') }}</span>
10254
+ <input
10255
+ [ngModel]="getStringField(node, 'name')"
10256
+ (ngModelChange)="setString('name', $event)"
10257
+ />
10258
+ </label>
10259
+ <label>
10260
+ <span>{{ tx('editor.field.nameExpr', 'Name binding') }}</span>
10261
+ <input
10262
+ [ngModel]="getStringField(node, 'nameExpr')"
10263
+ (ngModelChange)="setString('nameExpr', $event)"
10264
+ />
10265
+ </label>
10266
+ <label>
10267
+ <span>{{ tx('editor.field.avatarImage', 'Avatar image') }}</span>
10268
+ <input
10269
+ [ngModel]="getStringField(node, 'imageSrc')"
10270
+ (ngModelChange)="setString('imageSrc', $event)"
10271
+ />
10272
+ </label>
10273
+ <label>
10274
+ <span>{{ tx('editor.field.imageSrcExpr', 'Image binding') }}</span>
10275
+ <input
10276
+ [ngModel]="getStringField(node, 'imageSrcExpr')"
10277
+ (ngModelChange)="setString('imageSrcExpr', $event)"
10278
+ />
10279
+ </label>
10280
+ <label>
10281
+ <span>{{ tx('editor.field.initials', 'Initials') }}</span>
10282
+ <input
10283
+ [ngModel]="getStringField(node, 'initials')"
10284
+ (ngModelChange)="setString('initials', $event)"
10285
+ />
10286
+ </label>
10287
+ <label>
10288
+ <span>{{ tx('editor.field.initialsExpr', 'Initials binding') }}</span>
10289
+ <input
10290
+ [ngModel]="getStringField(node, 'initialsExpr')"
10291
+ (ngModelChange)="setString('initialsExpr', $event)"
10292
+ />
10293
+ </label>
10294
+ }
10044
10295
  @case ('image') {
10045
10296
  <label>
10046
10297
  <span>{{ tx('editor.field.src', 'Image URL') }}</span>
@@ -10072,6 +10323,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10072
10323
  (ngModelChange)="setString('href', $event)"
10073
10324
  />
10074
10325
  </label>
10326
+ <label>
10327
+ <span>{{ tx('editor.field.target', 'Target') }}</span>
10328
+ <select
10329
+ [ngModel]="getStringField(node, 'target') || '_self'"
10330
+ (ngModelChange)="setString('target', $event)"
10331
+ >
10332
+ <option value="_self">{{ tx('editor.target.self', 'Same tab') }}</option>
10333
+ <option value="_blank">{{ tx('editor.target.blank', 'New tab') }}</option>
10334
+ </select>
10335
+ </label>
10336
+ <label>
10337
+ <span>{{ tx('editor.field.rel', 'Rel') }}</span>
10338
+ <input
10339
+ [ngModel]="getStringField(node, 'rel')"
10340
+ (ngModelChange)="setString('rel', $event)"
10341
+ />
10342
+ </label>
10075
10343
  }
10076
10344
  @case ('metric') {
10077
10345
  <label>
@@ -10527,6 +10795,53 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10527
10795
  />
10528
10796
  </label>
10529
10797
  }
10798
+ @case ('avatar') {
10799
+ <label>
10800
+ <span>{{ tx('editor.field.avatarName', 'Avatar name') }}</span>
10801
+ <input
10802
+ [ngModel]="getStringField(node, 'name')"
10803
+ (ngModelChange)="setStringField($index, 'name', $event)"
10804
+ />
10805
+ </label>
10806
+ <label>
10807
+ <span>{{ tx('editor.field.nameExpr', 'Name binding') }}</span>
10808
+ <input
10809
+ [ngModel]="getStringField(node, 'nameExpr')"
10810
+ (ngModelChange)="setStringField($index, 'nameExpr', $event)"
10811
+ [placeholder]="tx('editor.placeholder.nameExpr', 'row.name')"
10812
+ />
10813
+ </label>
10814
+ <label>
10815
+ <span>{{ tx('editor.field.avatarImage', 'Avatar image') }}</span>
10816
+ <input
10817
+ [ngModel]="getStringField(node, 'imageSrc')"
10818
+ (ngModelChange)="setStringField($index, 'imageSrc', $event)"
10819
+ />
10820
+ </label>
10821
+ <label>
10822
+ <span>{{ tx('editor.field.imageSrcExpr', 'Image binding') }}</span>
10823
+ <input
10824
+ [ngModel]="getStringField(node, 'imageSrcExpr')"
10825
+ (ngModelChange)="setStringField($index, 'imageSrcExpr', $event)"
10826
+ [placeholder]="tx('editor.placeholder.imageSrcExpr', 'row.avatarUrl')"
10827
+ />
10828
+ </label>
10829
+ <label>
10830
+ <span>{{ tx('editor.field.initials', 'Initials') }}</span>
10831
+ <input
10832
+ [ngModel]="getStringField(node, 'initials')"
10833
+ (ngModelChange)="setStringField($index, 'initials', $event)"
10834
+ />
10835
+ </label>
10836
+ <label>
10837
+ <span>{{ tx('editor.field.initialsExpr', 'Initials binding') }}</span>
10838
+ <input
10839
+ [ngModel]="getStringField(node, 'initialsExpr')"
10840
+ (ngModelChange)="setStringField($index, 'initialsExpr', $event)"
10841
+ [placeholder]="tx('editor.placeholder.initialsExpr', 'row.initials')"
10842
+ />
10843
+ </label>
10844
+ }
10530
10845
  @case ('image') {
10531
10846
  <label>
10532
10847
  <span>{{ tx('editor.field.src', 'Image URL') }}</span>
@@ -10543,6 +10858,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10543
10858
  />
10544
10859
  </label>
10545
10860
  }
10861
+ @case ('link') {
10862
+ <label>
10863
+ <span>{{ tx('editor.field.label', 'Label') }}</span>
10864
+ <input
10865
+ [ngModel]="getStringField(node, 'label')"
10866
+ (ngModelChange)="setStringField($index, 'label', $event)"
10867
+ />
10868
+ </label>
10869
+ <label>
10870
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
10871
+ <input
10872
+ [ngModel]="getStringField(node, 'labelExpr')"
10873
+ (ngModelChange)="setStringField($index, 'labelExpr', $event)"
10874
+ [placeholder]="tx('editor.placeholder.labelExpr', 'row.linkLabel')"
10875
+ />
10876
+ </label>
10877
+ <label class="prx-rich-editor__wide-field">
10878
+ <span>{{ tx('editor.field.href', 'Link URL') }}</span>
10879
+ <input
10880
+ [ngModel]="getStringField(node, 'href')"
10881
+ (ngModelChange)="setStringField($index, 'href', $event)"
10882
+ />
10883
+ </label>
10884
+ <label>
10885
+ <span>{{ tx('editor.field.target', 'Target') }}</span>
10886
+ <select
10887
+ [ngModel]="getStringField(node, 'target') || '_self'"
10888
+ (ngModelChange)="setStringField($index, 'target', $event)"
10889
+ >
10890
+ <option value="_self">{{ tx('editor.target.self', 'Same tab') }}</option>
10891
+ <option value="_blank">{{ tx('editor.target.blank', 'New tab') }}</option>
10892
+ </select>
10893
+ </label>
10894
+ <label>
10895
+ <span>{{ tx('editor.field.rel', 'Rel') }}</span>
10896
+ <input
10897
+ [ngModel]="getStringField(node, 'rel')"
10898
+ (ngModelChange)="setStringField($index, 'rel', $event)"
10899
+ [placeholder]="tx('editor.placeholder.rel', 'noopener noreferrer')"
10900
+ />
10901
+ </label>
10902
+ }
10546
10903
  @case ('metric') {
10547
10904
  <label>
10548
10905
  <span>{{ tx('editor.field.label', 'Label') }}</span>
@@ -11967,24 +12324,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11967
12324
  <header class="prx-rich-editor__nested-header">
11968
12325
  <h5>{{ tx('editor.decisionEvidence', 'Evidence') }}</h5>
11969
12326
  <div class="prx-rich-editor__quick-actions">
11970
- <button type="button" (click)="addDecisionPackageEvidence($index)">
12327
+ <button type="button" (click)="addDecisionPackageEvidence(nodeIndex)">
11971
12328
  {{ tx('editor.addEvidence', 'Add evidence') }}
11972
12329
  </button>
11973
12330
  </div>
11974
12331
  </header>
11975
- @for (evidence of getDecisionPackageEvidence($index); track evidence.id ?? $index; let evidenceIndex = $index) {
12332
+ @for (evidence of getDecisionPackageEvidence(nodeIndex); track evidence.id ?? $index; let evidenceIndex = $index) {
11976
12333
  <div class="prx-rich-editor__nested-node">
11977
12334
  <div class="prx-rich-editor__nested-actions">
11978
12335
  <strong>{{ tx('editor.evidence', 'Evidence') }} {{ evidenceIndex + 1 }}</strong>
11979
- @if (isRemovalPending('nodes.' + $index + '.evidence', evidenceIndex)) {
11980
- <button type="button" (click)="removeDecisionPackageEvidence($index, evidenceIndex)">
12336
+ @if (isRemovalPending('nodes.' + nodeIndex + '.evidence', evidenceIndex)) {
12337
+ <button type="button" (click)="removeDecisionPackageEvidence(nodeIndex, evidenceIndex)">
11981
12338
  {{ tx('editor.confirmRemove', 'Confirm remove') }}
11982
12339
  </button>
11983
12340
  <button type="button" (click)="cancelRemoval()">
11984
12341
  {{ tx('editor.cancelRemove', 'Cancel') }}
11985
12342
  </button>
11986
12343
  } @else {
11987
- <button type="button" (click)="requestNestedRemoval('nodes.' + $index + '.evidence', evidenceIndex)">
12344
+ <button type="button" (click)="requestNestedRemoval('nodes.' + nodeIndex + '.evidence', evidenceIndex)">
11988
12345
  {{ tx('editor.removeBlock', 'Remove') }}
11989
12346
  </button>
11990
12347
  }
@@ -11993,37 +12350,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11993
12350
  <label>
11994
12351
  <span>{{ tx('editor.field.itemId', 'Item ID') }}</span>
11995
12352
  <input
11996
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'id')"
11997
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'id', $event)"
12353
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'id')"
12354
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'id', $event)"
11998
12355
  />
11999
12356
  </label>
12000
12357
  <label>
12001
12358
  <span>{{ tx('editor.field.label', 'Label') }}</span>
12002
12359
  <input
12003
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'label')"
12004
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'label', $event)"
12360
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'label')"
12361
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'label', $event)"
12005
12362
  />
12006
12363
  </label>
12007
12364
  <label>
12008
12365
  <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
12009
12366
  <input
12010
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'labelExpr')"
12011
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'labelExpr', $event)"
12367
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'labelExpr')"
12368
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'labelExpr', $event)"
12012
12369
  [placeholder]="tx('editor.placeholder.evidenceLabelExpr', '\${evidence.label}')"
12013
12370
  />
12014
12371
  </label>
12015
12372
  <label>
12016
12373
  <span>{{ tx('editor.field.source', 'Source') }}</span>
12017
12374
  <input
12018
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'source')"
12019
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'source', $event)"
12375
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'source')"
12376
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'source', $event)"
12020
12377
  />
12021
12378
  </label>
12022
12379
  <label>
12023
12380
  <span>{{ tx('editor.field.sourceExpr', 'Source binding') }}</span>
12024
12381
  <input
12025
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'sourceExpr')"
12026
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'sourceExpr', $event)"
12382
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'sourceExpr')"
12383
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'sourceExpr', $event)"
12027
12384
  [placeholder]="tx('editor.placeholder.evidenceSourceExpr', '\${evidence.source}')"
12028
12385
  />
12029
12386
  </label>
@@ -12036,27 +12393,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12036
12393
  <header class="prx-rich-editor__nested-header">
12037
12394
  <h5>{{ tx('editor.decisionPrimaryAction', 'Primary action') }}</h5>
12038
12395
  <div class="prx-rich-editor__quick-actions">
12039
- @if (getDecisionPackagePrimaryAction($index)) {
12040
- <button type="button" (click)="removeDecisionPackagePrimaryAction($index)">
12396
+ @if (getDecisionPackagePrimaryAction(nodeIndex)) {
12397
+ <button type="button" (click)="removeDecisionPackagePrimaryAction(nodeIndex)">
12041
12398
  {{ tx('editor.removeBlock', 'Remove') }}
12042
12399
  </button>
12043
12400
  } @else {
12044
- <button type="button" (click)="addDecisionPackagePrimaryActionPreset($index, 'primary')">
12401
+ <button type="button" (click)="addDecisionPackagePrimaryActionPreset(nodeIndex, 'primary')">
12045
12402
  {{ tx('editor.addPrimaryAction', 'Add primary action') }}
12046
12403
  </button>
12047
- <button type="button" (click)="addDecisionPackagePrimaryAction($index)">
12404
+ <button type="button" (click)="addDecisionPackagePrimaryAction(nodeIndex)">
12048
12405
  {{ tx('editor.addAction', 'Add action') }}
12049
12406
  </button>
12050
12407
  }
12051
12408
  </div>
12052
12409
  </header>
12053
- @if (getDecisionPackagePrimaryAction($index); as primaryAction) {
12410
+ @if (getDecisionPackagePrimaryAction(nodeIndex); as primaryAction) {
12054
12411
  <div class="prx-rich-editor__node-grid">
12055
12412
  <ng-container
12056
12413
  *ngTemplateOutlet="actionFields; context: {
12057
12414
  action: primaryAction,
12058
- path: '$.nodes[' + $index + '].primaryAction',
12059
- setField: setDecisionPackagePrimaryActionField.bind(this, $index)
12415
+ path: '$.nodes[' + nodeIndex + '].primaryAction',
12416
+ setField: setDecisionPackagePrimaryActionField.bind(this, nodeIndex)
12060
12417
  }"
12061
12418
  ></ng-container>
12062
12419
  </div>
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@praxisui/rich-content",
3
- "version": "9.0.0-beta.5",
3
+ "version": "9.0.0-beta.6",
4
4
  "description": "Rich content rendering and authoring primitives for Praxis UI surfaces, including semantic blocks and page-builder integration.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
- "@praxisui/core": "^9.0.0-beta.5",
8
+ "@praxisui/core": "^9.0.0-beta.6",
9
9
  "@angular/forms": "^21.0.0",
10
10
  "rxjs": "~7.8.0"
11
11
  },
@@ -1,6 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnChanges, OnInit, SimpleChanges, InjectionToken, Provider } from '@angular/core';
3
- import { RichContentDocument, RichPrimitiveNode, RichPresetReferenceNode, JsonLogicDataRecord, RichBlockHostCapabilities, RichBlockNode, RichPresenterNode, RichComposeNode, RichCardNode, RichCardMedia, RichActionButtonNode, RichCalloutNode, RichCtaGroupNode, RichKeyValueListNode, RichKeyValueItem, RichEmptyStateNode, RichPropertySheetNode, RichPropertySheetItem, RichStatGroupNode, RichStatItem, RichTabsNode, RichTabsItem, RichRecordSummaryNode, RichRecordSummaryField, RichLookupResultNode, RichLookupResultField, RichLookupCardNode, RichRelatedRecordNode, RichActionCardNode, RichDecisionPackageNode, RichDecisionPackageEvidence, RichCollapsibleCardNode, RichFormLauncherNode, RichDisclosureNode, RichAccordionNode, RichAccordionItem, RichMediaBlockNode, RichTimelineNode, RichTimelineItem, RichTextNode, RichBadgeNode, RichIconNode, RichImageNode, RichLinkNode, RichMetricNode, RichProgressNode, SettingsValueProvider, CorePresetRef, CorePresetDescriptor, ComponentDocMeta, AiCapabilityCatalog, AiCapability, AiCapabilityCategory, AiValueKind, ComponentAuthoringManifest, PraxisI18nDictionary, PraxisI18nConfig, PraxisI18nService } from '@praxisui/core';
3
+ import { RichContentDocument, RichPrimitiveNode, RichPresetReferenceNode, JsonLogicDataRecord, RichBlockHostCapabilities, RichBlockNode, RichPresenterNode, RichComposeNode, RichCardNode, RichCardMedia, RichActionButtonNode, RichCalloutNode, RichCtaGroupNode, RichKeyValueListNode, RichKeyValueItem, RichEmptyStateNode, RichPropertySheetNode, RichPropertySheetItem, RichStatGroupNode, RichStatItem, RichTabsNode, RichTabsItem, RichRecordSummaryNode, RichRecordSummaryField, RichLookupResultNode, RichLookupResultField, RichLookupCardNode, RichRelatedRecordNode, RichActionCardNode, RichDecisionPackageNode, RichDecisionPackageEvidence, RichCollapsibleCardNode, RichFormLauncherNode, RichDisclosureNode, RichAccordionNode, RichAccordionItem, RichMediaBlockNode, RichTimelineNode, RichTimelineItem, RichTextNode, RichBadgeNode, RichIconNode, RichAvatarNode, RichImageNode, RichLinkNode, RichMetricNode, RichProgressNode, SettingsValueProvider, CorePresetRef, CorePresetDescriptor, ComponentDocMeta, AiCapabilityCatalog, AiCapability, AiCapabilityCategory, AiValueKind, ComponentAuthoringManifest, PraxisI18nDictionary, PraxisI18nConfig, PraxisI18nService } from '@praxisui/core';
4
4
  import * as _praxisui_rich_content from '@praxisui/rich-content';
5
5
  import { BehaviorSubject } from 'rxjs';
6
6
 
@@ -270,7 +270,7 @@ interface RichContentValidationResult {
270
270
  declare function validateRichContentDocument(value: unknown): RichContentValidationResult;
271
271
  declare function isValidRichContentDocument(value: unknown): value is RichContentDocument;
272
272
 
273
- type EditableTopLevelNode = RichTextNode | RichBadgeNode | RichIconNode | RichImageNode | RichLinkNode | RichMetricNode | RichProgressNode | RichActionButtonNode | RichComposeNode | RichCardNode | RichCalloutNode | RichCtaGroupNode | RichKeyValueListNode | RichPropertySheetNode | RichStatGroupNode | RichTabsNode | RichEmptyStateNode | RichRecordSummaryNode | RichLookupResultNode | RichLookupCardNode | RichRelatedRecordNode | RichActionCardNode | RichDecisionPackageNode | RichFormLauncherNode | RichCollapsibleCardNode | RichDisclosureNode | RichAccordionNode | RichMediaBlockNode | RichTimelineNode | RichPresetReferenceNode;
273
+ type EditableTopLevelNode = RichTextNode | RichBadgeNode | RichIconNode | RichAvatarNode | RichImageNode | RichLinkNode | RichMetricNode | RichProgressNode | RichActionButtonNode | RichComposeNode | RichCardNode | RichCalloutNode | RichCtaGroupNode | RichKeyValueListNode | RichPropertySheetNode | RichStatGroupNode | RichTabsNode | RichEmptyStateNode | RichRecordSummaryNode | RichLookupResultNode | RichLookupCardNode | RichRelatedRecordNode | RichActionCardNode | RichDecisionPackageNode | RichFormLauncherNode | RichCollapsibleCardNode | RichDisclosureNode | RichAccordionNode | RichMediaBlockNode | RichTimelineNode | RichPresetReferenceNode;
274
274
  type EditableTopLevelNodeType = EditableTopLevelNode['type'];
275
275
  type EditablePresenterNode = RichPresenterNode;
276
276
  type EditablePresenterNodeType = EditablePresenterNode['type'];
@@ -298,7 +298,7 @@ declare class PraxisRichContentConfigEditor implements SettingsValueProvider, On
298
298
  readonly isDirty$: BehaviorSubject<boolean>;
299
299
  readonly isValid$: BehaviorSubject<boolean>;
300
300
  readonly isBusy$: BehaviorSubject<boolean>;
301
- readonly editableNodeTypes: ("text" | "icon" | "image" | "link" | "badge" | "metric" | "progress" | "actionButton" | "compose" | "card" | "callout" | "ctaGroup" | "keyValueList" | "propertySheet" | "statGroup" | "tabs" | "emptyState" | "recordSummary" | "lookupResult" | "lookupCard" | "relatedRecord" | "actionCard" | "decisionPackage" | "formLauncher" | "collapsibleCard" | "disclosure" | "accordion" | "mediaBlock" | "timeline" | "preset")[];
301
+ readonly editableNodeTypes: ("text" | "icon" | "image" | "link" | "badge" | "avatar" | "metric" | "progress" | "actionButton" | "compose" | "card" | "callout" | "ctaGroup" | "keyValueList" | "propertySheet" | "statGroup" | "tabs" | "emptyState" | "recordSummary" | "lookupResult" | "lookupCard" | "relatedRecord" | "actionCard" | "decisionPackage" | "formLauncher" | "collapsibleCard" | "disclosure" | "accordion" | "mediaBlock" | "timeline" | "preset")[];
302
302
  readonly presenterNodeTypes: ("text" | "icon" | "image" | "link" | "badge" | "avatar" | "metric" | "progress" | "actionButton")[];
303
303
  readonly cardContentNodeTypes: EditableCardContentNodeType[];
304
304
  readonly presetOptions: _praxisui_rich_content.RichBlockPresetDefinition[];