@pega/sdk 0.0.14 → 0.0.15

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.
Files changed (130) hide show
  1. package/README.md +46 -6
  2. package/dist/index.js +50 -24
  3. package/package.json +42 -3
  4. package/templates/angular-sdk-reference/angular.json +1 -2
  5. package/templates/angular-sdk-reference/extra-webpack.config.cjs +23 -0
  6. package/templates/angular-sdk-reference/index.html +12 -0
  7. package/templates/angular-sdk-reference/package.json +0 -1
  8. package/templates/angular-sdk-reference/src/app/app.component.ts +15 -232
  9. package/templates/angular-sdk-reference/src/app/pconnect-renderer.component.ts +153 -0
  10. package/templates/angular-sdk-reference/src/components/fields/auto-complete/auto-complete.component.ts +58 -21
  11. package/templates/angular-sdk-reference/src/components/fields/checkbox/checkbox.component.ts +8 -3
  12. package/templates/angular-sdk-reference/src/components/fields/currency/currency.component.ts +22 -7
  13. package/templates/angular-sdk-reference/src/components/fields/date-input/date-input.component.ts +19 -6
  14. package/templates/angular-sdk-reference/src/components/fields/dropdown/dropdown.component.ts +24 -7
  15. package/templates/angular-sdk-reference/src/components/fields/email/email.component.ts +19 -6
  16. package/templates/angular-sdk-reference/src/components/fields/integer/integer.component.ts +19 -6
  17. package/templates/angular-sdk-reference/src/components/fields/phone/phone.component.ts +19 -6
  18. package/templates/angular-sdk-reference/src/components/fields/radio-buttons/radio-buttons.component.ts +16 -5
  19. package/templates/angular-sdk-reference/src/components/fields/text-area/text-area.component.ts +19 -6
  20. package/templates/angular-sdk-reference/src/components/fields/text-input/text-input.component.ts +19 -6
  21. package/templates/angular-sdk-reference/src/components/fields/url-input/url-input.component.ts +26 -7
  22. package/templates/angular-sdk-reference/src/components/helpers/sdk-helpers.ts +93 -0
  23. package/templates/angular-sdk-reference/src/components/infra/case-summary/case-summary.component.ts +8 -9
  24. package/templates/angular-sdk-reference/src/components/infra/case-view/case-view.component.ts +24 -12
  25. package/templates/angular-sdk-reference/src/components/infra/root-container/root-container.component.ts +21 -15
  26. package/templates/angular-sdk-reference/src/components/infra/stages/stages.component.ts +21 -10
  27. package/templates/angular-sdk-reference/src/components/infra/view/view.component.ts +14 -9
  28. package/templates/angular-sdk-reference/src/components/templates/default-form/default-form.component.ts +12 -8
  29. package/templates/angular-sdk-reference/tsconfig.app.json +13 -0
  30. package/templates/angular-sdk-reference/tsconfig.json +2 -5
  31. package/templates/react-sdk-reference/.ai-common/agents/embedded-flow-expert.md +65 -31
  32. package/templates/react-sdk-reference/.ai-common/agents/implementation-expert.md +74 -38
  33. package/templates/react-sdk-reference/.ai-common/global/ai-agent-instructions-embedded.md +33 -1
  34. package/templates/react-sdk-reference/.ai-common/global/ai-agent-instructions.md +57 -22
  35. package/templates/react-sdk-reference/.ai-common/instructions/embedded-component.md +25 -10
  36. package/templates/react-sdk-reference/.ai-common/prompts/add-component.md +40 -19
  37. package/templates/react-sdk-reference/.ai-common/prompts/component-manifest.json +55 -1
  38. package/templates/react-sdk-reference/.ai-common/prompts/embedded-component-manifest.md +26 -4
  39. package/templates/react-sdk-reference/.ai-common/prompts/generate-all-components.md +82 -33
  40. package/templates/react-sdk-reference/.ai-common/prompts/generate-dse-components.md +46 -26
  41. package/templates/react-sdk-reference/.ai-common/prompts/generate-embedded-components.md +28 -15
  42. package/templates/react-sdk-reference/.ai-common/prompts/generate-field-components.md +24 -6
  43. package/templates/react-sdk-reference/.ai-common/prompts/generate-infra-components.md +24 -6
  44. package/templates/react-sdk-reference/.ai-common/prompts/generate-template-components.md +24 -6
  45. package/templates/react-sdk-reference/.ai-common/prompts/generate-widget-components.md +24 -6
  46. package/templates/react-sdk-reference/.ai-common/prompts/identify-components.md +2 -0
  47. package/templates/react-sdk-reference/.ai-common/prompts/replace-design-system.md +44 -17
  48. package/templates/react-sdk-reference/.ai-common/skills/connect-pega-server.md +14 -1
  49. package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/AssignmentHeader.md +79 -0
  50. package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/Toast.md +96 -0
  51. package/templates/react-sdk-reference/.ai-common/skills/design-system-extension.md +56 -35
  52. package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/analyze-customer-repo.md +29 -3
  53. package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/run-and-verify-integration.md +97 -37
  54. package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/wire-integration.md +91 -60
  55. package/templates/react-sdk-reference/.ai-common/skills/field-components.md +13 -1
  56. package/templates/react-sdk-reference/.ai-common/skills/infra-components.md +13 -1
  57. package/templates/react-sdk-reference/.ai-common/skills/portal-flow/run-and-verify-portal.md +290 -0
  58. package/templates/react-sdk-reference/.ai-common/skills/template-components.md +13 -1
  59. package/templates/react-sdk-reference/.ai-common/skills/widget-components.md +13 -1
  60. package/templates/react-sdk-reference/assets/icons/trash.svg +3 -0
  61. package/templates/react-sdk-reference/index.html +0 -1
  62. package/templates/react-sdk-reference/package.json +2 -2
  63. package/templates/react-sdk-reference/package.minimal.json +2 -2
  64. package/templates/react-sdk-reference/sdk-config.json +3 -3
  65. package/templates/react-sdk-reference/src/FallbackComponent.tsx +1 -1
  66. package/templates/react-sdk-reference/src/MashupApp.tsx +33 -78
  67. package/templates/react-sdk-reference/src/PortalApp.tsx +23 -100
  68. package/templates/react-sdk-reference/src/components/component-map.ts +15 -1
  69. package/templates/react-sdk-reference/src/components/designSystemExtension/AssignmentHeader/AssignmentHeader.tsx +15 -0
  70. package/templates/react-sdk-reference/src/components/designSystemExtension/AssignmentHeader/index.tsx +1 -0
  71. package/templates/react-sdk-reference/src/components/designSystemExtension/FieldGroup/FieldGroup.tsx +1 -1
  72. package/templates/react-sdk-reference/src/components/designSystemExtension/FieldGroupList/FieldGroupList.tsx +1 -1
  73. package/templates/react-sdk-reference/src/components/designSystemExtension/FieldValueList/FieldValueList.tsx +16 -4
  74. package/templates/react-sdk-reference/src/components/designSystemExtension/ModalDialog/ModalDialog.tsx +26 -0
  75. package/templates/react-sdk-reference/src/components/designSystemExtension/ModalDialog/index.tsx +1 -0
  76. package/templates/react-sdk-reference/src/components/designSystemExtension/Toast/Toast.tsx +35 -0
  77. package/templates/react-sdk-reference/src/components/designSystemExtension/Toast/index.tsx +1 -0
  78. package/templates/react-sdk-reference/src/components/field/AutoComplete/AutoComplete.tsx +362 -24
  79. package/templates/react-sdk-reference/src/components/field/CancelAlert/CancelAlert.tsx +1 -1
  80. package/templates/react-sdk-reference/src/components/field/Checkbox/Checkbox.tsx +3 -1
  81. package/templates/react-sdk-reference/src/components/field/Currency/Currency.tsx +6 -3
  82. package/templates/react-sdk-reference/src/components/field/Date/Date.tsx +2 -1
  83. package/templates/react-sdk-reference/src/components/field/DateTime/DateTime.tsx +2 -1
  84. package/templates/react-sdk-reference/src/components/field/Decimal/Decimal.tsx +4 -3
  85. package/templates/react-sdk-reference/src/components/field/Dropdown/Dropdown.tsx +2 -0
  86. package/templates/react-sdk-reference/src/components/field/Email/Email.tsx +2 -1
  87. package/templates/react-sdk-reference/src/components/field/EmbeddedDataMulti/EmbeddedDataMulti.tsx +121 -0
  88. package/templates/react-sdk-reference/src/components/field/EmbeddedDataMulti/config-ext.json +7 -0
  89. package/templates/react-sdk-reference/src/components/field/EmbeddedDataMulti/index.tsx +1 -0
  90. package/templates/react-sdk-reference/src/components/field/Integer/Integer.tsx +2 -1
  91. package/templates/react-sdk-reference/src/components/field/Location/Location.tsx +1 -1
  92. package/templates/react-sdk-reference/src/components/field/Multiselect/Multiselect.tsx +40 -20
  93. package/templates/react-sdk-reference/src/components/field/ObjectReference/ObjectReference.tsx +554 -49
  94. package/templates/react-sdk-reference/src/components/field/ObjectReference/utils.ts +111 -20
  95. package/templates/react-sdk-reference/src/components/field/Percentage/Percentage.tsx +4 -3
  96. package/templates/react-sdk-reference/src/components/field/Phone/Phone.tsx +2 -1
  97. package/templates/react-sdk-reference/src/components/field/SelectableCard/SelectableCard.tsx +2 -1
  98. package/templates/react-sdk-reference/src/components/field/TextArea/TextArea.tsx +2 -1
  99. package/templates/react-sdk-reference/src/components/field/TextInput/TextInput.tsx +2 -1
  100. package/templates/react-sdk-reference/src/components/field/Time/Time.tsx +2 -1
  101. package/templates/react-sdk-reference/src/components/field/URL/URL.tsx +2 -1
  102. package/templates/react-sdk-reference/src/components/field/UserReference/UserReference.tsx +1 -1
  103. package/templates/react-sdk-reference/src/components/helpers/field-utils.ts +44 -0
  104. package/templates/react-sdk-reference/src/components/helpers/simpleTableHelpers.ts +19 -7
  105. package/templates/react-sdk-reference/src/components/infra/ModalViewContainer/DataViewActionButtons/DataViewActionButtons.tsx +97 -0
  106. package/templates/react-sdk-reference/src/components/infra/ModalViewContainer/DataViewActionButtons/index.tsx +1 -0
  107. package/templates/react-sdk-reference/src/components/infra/ModalViewContainer/ListViewActionButtons/ListViewActionButtons.tsx +53 -0
  108. package/templates/react-sdk-reference/src/components/infra/ModalViewContainer/ListViewActionButtons/index.tsx +1 -0
  109. package/templates/react-sdk-reference/src/components/template/AdvancedSearch/SearchGroups/SearchGroups.tsx +2 -2
  110. package/templates/react-sdk-reference/src/components/template/CaseSummary/CaseSummary.tsx +3 -1
  111. package/templates/react-sdk-reference/src/components/template/DataReference/SearchForm.tsx +4 -4
  112. package/templates/react-sdk-reference/src/components/template/HierarchicalForm/HierarchicalForm.tsx +2 -2
  113. package/templates/react-sdk-reference/src/components/template/InlineDashboard/InlineDashboard.tsx +1 -1
  114. package/templates/react-sdk-reference/src/components/template/ListView/ListView.tsx +7 -3
  115. package/templates/react-sdk-reference/src/components/template/SimpleTable/SimpleTableManual/SimpleTableManual.tsx +173 -99
  116. package/templates/react-sdk-reference/src/components/template/SimpleTable/SimpleTableSelect/SimpleTableSelect.tsx +63 -56
  117. package/templates/react-sdk-reference/src/components/widget/ToDo/ToDo.tsx +1 -1
  118. package/templates/react-sdk-reference/vite.config.ts +26 -4
  119. package/templates/angular-sdk-reference/pega-constellationjs-0.26.3-local.tgz +0 -0
  120. package/templates/angular-sdk-reference/src/helpers/event-utils.ts +0 -18
  121. package/templates/angular-sdk-reference/src/helpers/utils.ts +0 -38
  122. package/templates/angular-sdk-reference/src/helpers/versionHelpers.ts +0 -14
  123. package/templates/react-sdk-reference/.ai-common/instructions/dse-component.md +0 -47
  124. package/templates/react-sdk-reference/.ai-common/instructions/field-component.md +0 -50
  125. package/templates/react-sdk-reference/.ai-common/instructions/infra-component.md +0 -76
  126. package/templates/react-sdk-reference/.ai-common/instructions/template-component.md +0 -43
  127. package/templates/react-sdk-reference/.ai-common/instructions/widget-component.md +0 -45
  128. package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/authenticate.md +0 -311
  129. package/templates/react-sdk-reference/pega-constellationjs-0.26.3-local.tgz +0 -0
  130. package/templates/react-sdk-reference/pega-sdk-react-0.1.0.tgz +0 -0
@@ -9,7 +9,7 @@ import { Component, Input } from '@angular/core';
9
9
  import type { OnInit, OnChanges, SimpleChanges } from '@angular/core';
10
10
  import { CommonModule } from '@angular/common';
11
11
  import { FormsModule } from '@angular/forms';
12
- import { handleEvent } from '../../../helpers/event-utils';
12
+ import { handleEvent } from '../../helpers/sdk-helpers';
13
13
 
14
14
  @Component({
15
15
  selector: 'pega-phone',
@@ -17,8 +17,14 @@ import { handleEvent } from '../../../helpers/event-utils';
17
17
  imports: [CommonModule, FormsModule],
18
18
  template: `
19
19
  <div *ngIf="!readOnly" style="margin-bottom: 1rem;">
20
- <label *ngIf="label" style="display: block; margin-bottom: 0.25rem; font-weight: 500; font-size: 0.875rem;">
21
- {{ label }}<span *ngIf="required" style="color: #dc2626; margin-left: 0.25rem;">*</span>
20
+ <label
21
+ *ngIf="label"
22
+ style="display: block; margin-bottom: 0.25rem; font-weight: 500; font-size: 0.875rem;"
23
+ >
24
+ {{ label
25
+ }}<span *ngIf="required" style="color: #dc2626; margin-left: 0.25rem;"
26
+ >*</span
27
+ >
22
28
  </label>
23
29
  <input
24
30
  type="tel"
@@ -29,9 +35,14 @@ import { handleEvent } from '../../../helpers/event-utils';
29
35
  [required]="required"
30
36
  (blur)="onBlur($event)"
31
37
  style="width: 100%; padding: 0.5rem 0.75rem; border-radius: 0.375rem; font-size: 0.875rem;"
32
- [style.border]="validatemessage ? '1px solid #dc2626' : '1px solid #d1d5db'"
38
+ [style.border]="
39
+ validatemessage ? '1px solid #dc2626' : '1px solid #d1d5db'
40
+ "
33
41
  />
34
- <div *ngIf="validatemessage" style="color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem;">
42
+ <div
43
+ *ngIf="validatemessage"
44
+ style="color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem;"
45
+ >
35
46
  {{ validatemessage }}
36
47
  </div>
37
48
  </div>
@@ -79,7 +90,9 @@ export class PhoneComponent implements OnInit, OnChanges {
79
90
 
80
91
  const pConn = p.getPConnect?.();
81
92
  this.actions = pConn?.getActionsApi?.();
82
- this.propName = ((pConn?.getStateProps?.() as Record<string, unknown>)?.value as string) ?? '';
93
+ this.propName =
94
+ ((pConn?.getStateProps?.() as Record<string, unknown>)
95
+ ?.value as string) ?? '';
83
96
  }
84
97
 
85
98
  onBlur(event: Event): void {
@@ -8,7 +8,7 @@
8
8
  import { Component, Input } from '@angular/core';
9
9
  import type { OnInit, OnChanges, SimpleChanges } from '@angular/core';
10
10
  import { CommonModule } from '@angular/common';
11
- import { handleEvent } from '../../../helpers/event-utils';
11
+ import { handleEvent } from '../../helpers/sdk-helpers';
12
12
 
13
13
  @Component({
14
14
  selector: 'pega-radio-buttons',
@@ -17,8 +17,14 @@ import { handleEvent } from '../../../helpers/event-utils';
17
17
  template: `
18
18
  <div *ngIf="!readOnly" style="margin-bottom: 1rem;">
19
19
  <fieldset style="border: none; padding: 0; margin: 0;">
20
- <legend *ngIf="label" style="display: block; margin-bottom: 0.25rem; font-weight: 500; font-size: 0.875rem;">
21
- {{ label }}<span *ngIf="required" style="color: #dc2626; margin-left: 0.25rem;">*</span>
20
+ <legend
21
+ *ngIf="label"
22
+ style="display: block; margin-bottom: 0.25rem; font-weight: 500; font-size: 0.875rem;"
23
+ >
24
+ {{ label
25
+ }}<span *ngIf="required" style="color: #dc2626; margin-left: 0.25rem;"
26
+ >*</span
27
+ >
22
28
  </legend>
23
29
  <div style="display: flex; flex-direction: column; gap: 0.5rem;">
24
30
  <label
@@ -38,7 +44,10 @@ import { handleEvent } from '../../../helpers/event-utils';
38
44
  </label>
39
45
  </div>
40
46
  </fieldset>
41
- <div *ngIf="validatemessage" style="color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem;">
47
+ <div
48
+ *ngIf="validatemessage"
49
+ style="color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem;"
50
+ >
42
51
  {{ validatemessage }}
43
52
  </div>
44
53
  </div>
@@ -90,7 +99,9 @@ export class RadioButtonsComponent implements OnInit, OnChanges {
90
99
 
91
100
  const pConn = p.getPConnect?.();
92
101
  this.actions = pConn?.getActionsApi?.();
93
- this.propName = ((pConn?.getStateProps?.() as Record<string, unknown>)?.value as string) ?? '';
102
+ this.propName =
103
+ ((pConn?.getStateProps?.() as Record<string, unknown>)
104
+ ?.value as string) ?? '';
94
105
  }
95
106
 
96
107
  onRadioChange(event: Event): void {
@@ -9,7 +9,7 @@ import { Component, Input } from '@angular/core';
9
9
  import type { OnInit, OnChanges, SimpleChanges } from '@angular/core';
10
10
  import { CommonModule } from '@angular/common';
11
11
  import { FormsModule } from '@angular/forms';
12
- import { handleEvent } from '../../../helpers/event-utils';
12
+ import { handleEvent } from '../../helpers/sdk-helpers';
13
13
 
14
14
  @Component({
15
15
  selector: 'pega-text-area',
@@ -17,8 +17,14 @@ import { handleEvent } from '../../../helpers/event-utils';
17
17
  imports: [CommonModule, FormsModule],
18
18
  template: `
19
19
  <div *ngIf="!readOnly" style="margin-bottom: 1rem;">
20
- <label *ngIf="label" style="display: block; margin-bottom: 0.25rem; font-weight: 500; font-size: 0.875rem;">
21
- {{ label }}<span *ngIf="required" style="color: #dc2626; margin-left: 0.25rem;">*</span>
20
+ <label
21
+ *ngIf="label"
22
+ style="display: block; margin-bottom: 0.25rem; font-weight: 500; font-size: 0.875rem;"
23
+ >
24
+ {{ label
25
+ }}<span *ngIf="required" style="color: #dc2626; margin-left: 0.25rem;"
26
+ >*</span
27
+ >
22
28
  </label>
23
29
  <textarea
24
30
  [attr.data-testid]="testId"
@@ -30,10 +36,15 @@ import { handleEvent } from '../../../helpers/event-utils';
30
36
  (blur)="onBlur($event)"
31
37
  rows="3"
32
38
  style="width: 100%; padding: 0.5rem 0.75rem; border-radius: 0.375rem; font-size: 0.875rem; resize: vertical;"
33
- [style.border]="validatemessage ? '1px solid #dc2626' : '1px solid #d1d5db'"
39
+ [style.border]="
40
+ validatemessage ? '1px solid #dc2626' : '1px solid #d1d5db'
41
+ "
34
42
  >
35
43
  </textarea>
36
- <div *ngIf="validatemessage" style="color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem;">
44
+ <div
45
+ *ngIf="validatemessage"
46
+ style="color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem;"
47
+ >
37
48
  {{ validatemessage }}
38
49
  </div>
39
50
  </div>
@@ -81,7 +92,9 @@ export class TextAreaComponent implements OnInit, OnChanges {
81
92
 
82
93
  const pConn = p.getPConnect?.();
83
94
  this.actions = pConn?.getActionsApi?.();
84
- this.propName = ((pConn?.getStateProps?.() as Record<string, unknown>)?.value as string) ?? '';
95
+ this.propName =
96
+ ((pConn?.getStateProps?.() as Record<string, unknown>)
97
+ ?.value as string) ?? '';
85
98
  }
86
99
 
87
100
  onChange(event: Event): void {
@@ -9,7 +9,7 @@ import { Component, Input } from '@angular/core';
9
9
  import type { OnInit, OnChanges, SimpleChanges } from '@angular/core';
10
10
  import { CommonModule } from '@angular/common';
11
11
  import { FormsModule } from '@angular/forms';
12
- import { handleEvent } from '../../../helpers/event-utils';
12
+ import { handleEvent } from '../../helpers/sdk-helpers';
13
13
 
14
14
  @Component({
15
15
  selector: 'pega-text-input',
@@ -17,8 +17,14 @@ import { handleEvent } from '../../../helpers/event-utils';
17
17
  imports: [CommonModule, FormsModule],
18
18
  template: `
19
19
  <div *ngIf="!readOnly" style="margin-bottom: 1rem;">
20
- <label *ngIf="label" style="display: block; margin-bottom: 0.25rem; font-weight: 500; font-size: 0.875rem;">
21
- {{ label }}<span *ngIf="required" style="color: #dc2626; margin-left: 0.25rem;">*</span>
20
+ <label
21
+ *ngIf="label"
22
+ style="display: block; margin-bottom: 0.25rem; font-weight: 500; font-size: 0.875rem;"
23
+ >
24
+ {{ label
25
+ }}<span *ngIf="required" style="color: #dc2626; margin-left: 0.25rem;"
26
+ >*</span
27
+ >
22
28
  </label>
23
29
  <input
24
30
  type="text"
@@ -30,9 +36,14 @@ import { handleEvent } from '../../../helpers/event-utils';
30
36
  (change)="onChange($event)"
31
37
  (blur)="onBlur($event)"
32
38
  style="width: 100%; padding: 0.5rem 0.75rem; border-radius: 0.375rem; font-size: 0.875rem;"
33
- [style.border]="validatemessage ? '1px solid #dc2626' : '1px solid #d1d5db'"
39
+ [style.border]="
40
+ validatemessage ? '1px solid #dc2626' : '1px solid #d1d5db'
41
+ "
34
42
  />
35
- <div *ngIf="validatemessage" style="color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem;">
43
+ <div
44
+ *ngIf="validatemessage"
45
+ style="color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem;"
46
+ >
36
47
  {{ validatemessage }}
37
48
  </div>
38
49
  </div>
@@ -80,7 +91,9 @@ export class TextInputComponent implements OnInit, OnChanges {
80
91
 
81
92
  const pConn = p.getPConnect?.();
82
93
  this.actions = pConn?.getActionsApi?.();
83
- this.propName = ((pConn?.getStateProps?.() as Record<string, unknown>)?.value as string) ?? '';
94
+ this.propName =
95
+ ((pConn?.getStateProps?.() as Record<string, unknown>)
96
+ ?.value as string) ?? '';
84
97
  }
85
98
 
86
99
  onChange(event: Event): void {
@@ -9,7 +9,7 @@ import { Component, Input } from '@angular/core';
9
9
  import type { OnInit, OnChanges, SimpleChanges } from '@angular/core';
10
10
  import { CommonModule } from '@angular/common';
11
11
  import { FormsModule } from '@angular/forms';
12
- import { handleEvent } from '../../../helpers/event-utils';
12
+ import { handleEvent } from '../../helpers/sdk-helpers';
13
13
 
14
14
  @Component({
15
15
  selector: 'pega-url-input',
@@ -17,8 +17,14 @@ import { handleEvent } from '../../../helpers/event-utils';
17
17
  imports: [CommonModule, FormsModule],
18
18
  template: `
19
19
  <div *ngIf="!readOnly" style="margin-bottom: 1rem;">
20
- <label *ngIf="label" style="display: block; margin-bottom: 0.25rem; font-weight: 500; font-size: 0.875rem;">
21
- {{ label }}<span *ngIf="required" style="color: #dc2626; margin-left: 0.25rem;">*</span>
20
+ <label
21
+ *ngIf="label"
22
+ style="display: block; margin-bottom: 0.25rem; font-weight: 500; font-size: 0.875rem;"
23
+ >
24
+ {{ label
25
+ }}<span *ngIf="required" style="color: #dc2626; margin-left: 0.25rem;"
26
+ >*</span
27
+ >
22
28
  </label>
23
29
  <input
24
30
  type="url"
@@ -29,16 +35,27 @@ import { handleEvent } from '../../../helpers/event-utils';
29
35
  [required]="required"
30
36
  (blur)="onBlur($event)"
31
37
  style="width: 100%; padding: 0.5rem 0.75rem; border-radius: 0.375rem; font-size: 0.875rem;"
32
- [style.border]="validatemessage ? '1px solid #dc2626' : '1px solid #d1d5db'"
38
+ [style.border]="
39
+ validatemessage ? '1px solid #dc2626' : '1px solid #d1d5db'
40
+ "
33
41
  />
34
- <div *ngIf="validatemessage" style="color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem;">
42
+ <div
43
+ *ngIf="validatemessage"
44
+ style="color: #dc2626; font-size: 0.75rem; margin-top: 0.25rem;"
45
+ >
35
46
  {{ validatemessage }}
36
47
  </div>
37
48
  </div>
38
49
  <div *ngIf="readOnly" style="margin-bottom: 1rem;">
39
50
  <span style="font-size: 0.75rem; color: #6b7280;">{{ label }}</span>
40
51
  <div style="font-size: 0.875rem;">
41
- <a *ngIf="value" [href]="value" target="_blank" rel="noopener noreferrer">{{ value }}</a>
52
+ <a
53
+ *ngIf="value"
54
+ [href]="value"
55
+ target="_blank"
56
+ rel="noopener noreferrer"
57
+ >{{ value }}</a
58
+ >
42
59
  <span *ngIf="!value">—</span>
43
60
  </div>
44
61
  </div>
@@ -82,7 +99,9 @@ export class URLInputComponent implements OnInit, OnChanges {
82
99
 
83
100
  const pConn = p.getPConnect?.();
84
101
  this.actions = pConn?.getActionsApi?.();
85
- this.propName = ((pConn?.getStateProps?.() as Record<string, unknown>)?.value as string) ?? '';
102
+ this.propName =
103
+ ((pConn?.getStateProps?.() as Record<string, unknown>)
104
+ ?.value as string) ?? '';
86
105
  }
87
106
 
88
107
  onBlur(event: Event): void {
@@ -0,0 +1,93 @@
1
+ export function handleEvent(
2
+ actions: any,
3
+ eventType: string,
4
+ propName: string,
5
+ value: unknown,
6
+ ): void {
7
+ switch (eventType) {
8
+ case 'change':
9
+ actions.updateFieldValue(propName, value);
10
+ break;
11
+ case 'blur':
12
+ actions.triggerFieldChange(propName, value);
13
+ break;
14
+ case 'changeNblur':
15
+ actions.updateFieldValue(propName, value);
16
+ actions.triggerFieldChange(propName, value);
17
+ break;
18
+ }
19
+ }
20
+
21
+ export function getOptionList(
22
+ configProps: Record<string, any>,
23
+ dataObject: Record<string, any>,
24
+ ): any[] {
25
+ const listType = configProps['listType']?.toLowerCase();
26
+
27
+ if (listType === 'associated') {
28
+ const datasource = configProps['datasource'];
29
+ return Array.isArray(datasource) ? datasource : [];
30
+ }
31
+
32
+ if (listType === 'datapage') {
33
+ const datasource = configProps['datasource'];
34
+ if (typeof datasource === 'string' && dataObject[datasource]) {
35
+ return [];
36
+ }
37
+
38
+ const listOutput = configProps['listOutput'];
39
+ const items =
40
+ typeof datasource === 'object' && !Array.isArray(listOutput)
41
+ ? datasource?.source
42
+ : listOutput;
43
+ return Array.isArray(items)
44
+ ? items.map((item: any) => ({
45
+ ...item,
46
+ value: item.text ?? item.value,
47
+ }))
48
+ : [];
49
+ }
50
+
51
+ return [];
52
+ }
53
+
54
+ function isAssignmentView(pConnect: any): boolean {
55
+ const caseInfo = PCore.getConstants().CASE_INFO;
56
+ const assignmentViewId = `${pConnect.getValue(caseInfo.ASSIGNMENTACTION_ID)}!${pConnect.getValue(caseInfo.CASE_INFO_CLASSID)}`;
57
+ const currentViewId = `${pConnect.getCurrentView()}!${pConnect.getCurrentClassID()}`;
58
+ return assignmentViewId === currentViewId;
59
+ }
60
+
61
+ export function getInstructions(
62
+ pConnect: any,
63
+ instructions = 'casestep',
64
+ ): string | undefined {
65
+ const caseInfo = PCore.getConstants().CASE_INFO;
66
+ const caseStepInstructions = caseInfo.INSTRUCTIONS
67
+ ? pConnect.getValue(caseInfo.INSTRUCTIONS)
68
+ : undefined;
69
+
70
+ if (
71
+ instructions === 'casestep' &&
72
+ isAssignmentView(pConnect) &&
73
+ caseStepInstructions?.length
74
+ ) {
75
+ return caseStepInstructions;
76
+ }
77
+
78
+ if (
79
+ instructions === 'none' ||
80
+ instructions?.startsWith('@PARAGRAPH') ||
81
+ instructions === 'casestep'
82
+ ) {
83
+ return undefined;
84
+ }
85
+
86
+ return instructions;
87
+ }
88
+
89
+ export function compareSdkPCoreVersions(): void {
90
+ console.warn(
91
+ `Using Constellation version ${PCore.getPCoreVersion()}. Ensure this is the same version as your Infinity server.`,
92
+ );
93
+ }
@@ -8,6 +8,7 @@
8
8
  import { Component, Input, ChangeDetectorRef, NgZone } from '@angular/core';
9
9
  import type { OnInit, OnDestroy } from '@angular/core';
10
10
  import { CommonModule } from '@angular/common';
11
+ import { PegaBridgeService } from '@pega/sdk-angular';
11
12
  import type { Unsubscribe } from '@pega/sdk-angular';
12
13
 
13
14
  @Component({
@@ -20,7 +21,7 @@ import type { Unsubscribe } from '@pega/sdk-angular';
20
21
  padding: 0.75rem 1rem; background: #f9fafb; border-radius: 0.375rem; margin-bottom: 1rem;"
21
22
  >
22
23
  <span style="font-weight: 600; font-size: 0.875rem;">
23
- {{ header || 'Case' }}
24
+ {{ header }}
24
25
  </span>
25
26
  <span
26
27
  *ngIf="status"
@@ -38,7 +39,7 @@ export class CaseSummaryComponent implements OnInit, OnDestroy {
38
39
  status = '';
39
40
 
40
41
  private pConn: any;
41
- private observable: any;
42
+ private bridge = new PegaBridgeService();
42
43
  private storeUnsub: Unsubscribe | undefined;
43
44
 
44
45
  constructor(
@@ -47,25 +48,23 @@ export class CaseSummaryComponent implements OnInit, OnDestroy {
47
48
  ) {}
48
49
 
49
50
  ngOnInit(): void {
50
- // @ts-ignore
51
- const { PConnectObservable } = PCore.getInitialiser().getSdkCore() as any;
52
-
53
51
  this.pConn = this.props.getPConnect();
54
- this.observable = new PConnectObservable(this.pConn);
55
52
  this.updateSelf();
56
53
 
57
- this.storeUnsub = this.observable.subscribe(() => {
54
+ const subscription = this.bridge.observe(this.pConn).subscribe(() => {
58
55
  this.updateSelf();
59
56
  });
57
+ this.storeUnsub = () => subscription.unsubscribe();
60
58
  }
61
59
 
62
60
  ngOnDestroy(): void {
63
61
  this.storeUnsub?.();
64
- this.observable?.destroy();
65
62
  }
66
63
 
67
64
  private updateSelf(): void {
68
- const configProps = this.pConn.resolveConfigProps(this.pConn.getConfigProps());
65
+ const configProps = this.pConn.resolveConfigProps(
66
+ this.pConn.getConfigProps(),
67
+ );
69
68
  this.header = configProps.header ?? '';
70
69
  this.status = configProps.status ?? '';
71
70
 
@@ -10,6 +10,7 @@
10
10
  import { Component, Input, ChangeDetectorRef, NgZone } from '@angular/core';
11
11
  import type { OnInit, OnDestroy } from '@angular/core';
12
12
  import { CommonModule } from '@angular/common';
13
+ import { PegaBridgeService } from '@pega/sdk-angular';
13
14
  import type { Unsubscribe } from '@pega/sdk-angular';
14
15
  import { PConnectBridgeComponent } from '@pega/sdk-angular';
15
16
 
@@ -19,16 +20,24 @@ import { PConnectBridgeComponent } from '@pega/sdk-angular';
19
20
  imports: [CommonModule, PConnectBridgeComponent],
20
21
  template: `
21
22
  <div>
22
- <div *ngIf="heading" style="font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem;">
23
+ <div
24
+ *ngIf="heading"
25
+ style="font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem;"
26
+ >
23
27
  {{ heading }}
24
28
  </div>
25
- <div *ngIf="id" style="font-size: 0.75rem; color: #6b7280; margin-bottom: 1rem;">
29
+ <div
30
+ *ngIf="id"
31
+ style="font-size: 0.75rem; color: #6b7280; margin-bottom: 1rem;"
32
+ >
26
33
  {{ id }}
27
34
  </div>
28
35
 
29
36
  <!-- Case summary -->
30
37
  <div *ngIf="caseSummaryGetPConnect">
31
- <pconnect-bridge [getPConnect]="caseSummaryGetPConnect"></pconnect-bridge>
38
+ <pconnect-bridge
39
+ [getPConnect]="caseSummaryGetPConnect"
40
+ ></pconnect-bridge>
32
41
  </div>
33
42
 
34
43
  <!-- Children (tabs, stages, etc.) -->
@@ -48,7 +57,7 @@ export class CaseViewComponent implements OnInit, OnDestroy {
48
57
  childGetters: Array<() => typeof PConnect> = [];
49
58
 
50
59
  private pConn: any;
51
- private observable: any;
60
+ private bridge = new PegaBridgeService();
52
61
  private storeUnsub: Unsubscribe | undefined;
53
62
 
54
63
  constructor(
@@ -59,23 +68,22 @@ export class CaseViewComponent implements OnInit, OnDestroy {
59
68
  ngOnInit(): void {
60
69
  this.pConn = this.props.getPConnect();
61
70
 
62
- // @ts-ignore
63
- const { PConnectObservable } = PCore.getInitialiser().getSdkCore() as any;
64
- this.observable = new PConnectObservable(this.pConn);
65
71
  this.updateSelf();
66
72
 
67
- this.storeUnsub = this.observable.subscribe(() => {
73
+ const subscription = this.bridge.observe(this.pConn).subscribe(() => {
68
74
  this.updateSelf();
69
75
  });
76
+ this.storeUnsub = () => subscription.unsubscribe();
70
77
  }
71
78
 
72
79
  ngOnDestroy(): void {
73
80
  this.storeUnsub?.();
74
- this.observable?.destroy();
75
81
  }
76
82
 
77
83
  private updateSelf(): void {
78
- const configProps = this.pConn.resolveConfigProps(this.pConn.getConfigProps());
84
+ const configProps = this.pConn.resolveConfigProps(
85
+ this.pConn.getConfigProps(),
86
+ );
79
87
 
80
88
  this.heading = configProps.header ?? '';
81
89
  this.id = configProps.subheader ?? '';
@@ -88,8 +96,12 @@ export class CaseViewComponent implements OnInit, OnDestroy {
88
96
  const firstPConn = firstChild.getPConnect?.() ?? firstChild;
89
97
  const firstCompName = firstPConn.getComponentName?.() ?? '';
90
98
 
91
- if (firstCompName === 'CaseSummary' || firstCompName === 'CaseSummaryFields') {
92
- this.caseSummaryGetPConnect = firstChild.getPConnect ?? (() => firstChild);
99
+ if (
100
+ firstCompName === 'CaseSummary' ||
101
+ firstCompName === 'CaseSummaryFields'
102
+ ) {
103
+ this.caseSummaryGetPConnect =
104
+ firstChild.getPConnect ?? (() => firstChild);
93
105
  this.childGetters = children.slice(1).map((child: any) => {
94
106
  return child.getPConnect ?? (() => child);
95
107
  });
@@ -14,6 +14,7 @@
14
14
  import { Component, Input, NgZone, ChangeDetectorRef } from '@angular/core';
15
15
  import type { OnInit, OnDestroy } from '@angular/core';
16
16
  import { CommonModule } from '@angular/common';
17
+ import { PegaBridgeService } from '@pega/sdk-angular';
17
18
  import type { Unsubscribe } from '@pega/sdk-angular';
18
19
  import { PConnectBridgeComponent } from '@pega/sdk-angular';
19
20
 
@@ -26,18 +27,21 @@ const options = { context: 'app' };
26
27
  template: `
27
28
  <div *ngIf="bShowRoot">
28
29
  <!-- ViewContainer mode (mashup / noPortal) -->
29
- <div *ngIf="viewContainerPConn">
30
- <pconnect-bridge [getPConnect]="viewContainerGetter!"></pconnect-bridge>
30
+ <div *ngIf="viewContainerPConn && viewContainerGetter">
31
+ <pconnect-bridge [getPConnect]="viewContainerGetter"></pconnect-bridge>
31
32
  </div>
32
33
 
33
34
  <!-- Portal/View mode — render resolved pConn -->
34
- <div *ngIf="!viewContainerPConn && resolvedPConn">
35
- <pconnect-bridge [getPConnect]="resolvedPConnGetter!"></pconnect-bridge>
35
+ <div *ngIf="!viewContainerPConn && resolvedPConn && resolvedPConnGetter">
36
+ <pconnect-bridge [getPConnect]="resolvedPConnGetter"></pconnect-bridge>
36
37
  </div>
37
38
 
38
39
  <!-- Fallback: render children -->
39
40
  <div *ngIf="!viewContainerPConn && !resolvedPConn && children.length > 0">
40
- <pconnect-bridge *ngFor="let child of children" [getPConnect]="child.getPConnect"></pconnect-bridge>
41
+ <pconnect-bridge
42
+ *ngFor="let child of children"
43
+ [getPConnect]="child.getPConnect"
44
+ ></pconnect-bridge>
41
45
  </div>
42
46
  </div>
43
47
  `,
@@ -54,7 +58,7 @@ export class RootContainerComponent implements OnInit, OnDestroy {
54
58
  children: Array<{ getPConnect: () => typeof PConnect }> = [];
55
59
 
56
60
  private pConn: any;
57
- private observable: any;
61
+ private bridge = new PegaBridgeService();
58
62
  private storeUnsub: Unsubscribe | undefined;
59
63
 
60
64
  constructor(
@@ -67,34 +71,36 @@ export class RootContainerComponent implements OnInit, OnDestroy {
67
71
 
68
72
  // Add root container items to Redux
69
73
  const { containers } = PCore.getStore().getState();
70
- const items = Object.keys(containers).filter((item) => item.includes('root'));
71
- (PCore.getContainerUtils() as any).getContainerAPI().addContainerItems(items);
74
+ const items = Object.keys(containers).filter((item) =>
75
+ item.includes('root'),
76
+ );
77
+ (PCore.getContainerUtils() as any)
78
+ .getContainerAPI()
79
+ .addContainerItems(items);
72
80
 
73
81
  // Clear out hasViewContainer so ViewContainer can initialize
74
82
  sessionStorage.setItem('hasViewContainer', 'false');
75
83
 
76
84
  // Create observable for store-driven updates
77
- // @ts-ignore
78
- const { PConnectObservable } = PCore.getInitialiser().getSdkCore() as any;
79
- this.observable = new PConnectObservable(this.pConn);
80
-
81
85
  // Initial update
82
86
  this.updateSelf();
83
87
 
84
88
  // Subscribe to store changes
85
- this.storeUnsub = this.observable.subscribe(() => {
89
+ const subscription = this.bridge.observe(this.pConn).subscribe(() => {
86
90
  this.updateSelf();
87
91
  });
92
+ this.storeUnsub = () => subscription.unsubscribe();
88
93
  }
89
94
 
90
95
  ngOnDestroy(): void {
91
96
  this.storeUnsub?.();
92
- this.observable?.destroy();
93
97
  }
94
98
 
95
99
  private updateSelf(): void {
96
100
  // Get fresh props from Redux (not the initial props)
97
- const myProps = this.pConn.resolveConfigProps(this.pConn.getConfigProps()) as any;
101
+ const myProps = this.pConn.resolveConfigProps(
102
+ this.pConn.getConfigProps(),
103
+ ) as any;
98
104
 
99
105
  // Also get populated additional props (routingInfo comes from here)
100
106
  const additionalProps = this.pConn.getComponentProps?.() ?? {};