@pega/sdk 0.0.1 → 0.0.3

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 (223) hide show
  1. package/dist/index.js +2 -19
  2. package/package.json +4 -1
  3. package/templates/react-sdk-reference/.claude/instructions/component-map.md +38 -0
  4. package/templates/react-sdk-reference/.claude/instructions/dse-component.md +75 -0
  5. package/templates/react-sdk-reference/.claude/instructions/field-component.md +71 -0
  6. package/templates/react-sdk-reference/.claude/instructions/template-component.md +92 -0
  7. package/templates/react-sdk-reference/.claude/instructions/widget-component.md +87 -0
  8. package/templates/react-sdk-reference/.claude/prompts/add-component.md +144 -0
  9. package/templates/react-sdk-reference/.claude/prompts/component-manifest.json +111 -0
  10. package/templates/react-sdk-reference/.claude/prompts/generate-all-components.md +149 -0
  11. package/templates/react-sdk-reference/.claude/prompts/generate-dse-components.md +126 -0
  12. package/templates/react-sdk-reference/.claude/prompts/generate-field-components.md +139 -0
  13. package/templates/react-sdk-reference/.claude/prompts/generate-template-components.md +151 -0
  14. package/templates/react-sdk-reference/.claude/prompts/generate-widget-components.md +124 -0
  15. package/templates/react-sdk-reference/.claude/prompts/identify-components.md +105 -0
  16. package/templates/react-sdk-reference/.claude/prompts/replace-design-system.md +519 -0
  17. package/templates/react-sdk-reference/.claude/skills/component-contracts.md +140 -0
  18. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/AlertBanner.md +135 -0
  19. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/Banner.md +149 -0
  20. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/CaseSummaryFields.md +154 -0
  21. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/DetailsFields.md +144 -0
  22. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldGroup.md +131 -0
  23. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldGroupList.md +111 -0
  24. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldValueList.md +115 -0
  25. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/Operator.md +149 -0
  26. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/Pulse.md +83 -0
  27. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/RichTextEditor.md +206 -0
  28. package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/WssQuickCreate.md +135 -0
  29. package/templates/react-sdk-reference/.claude/skills/design-system-extension.md +289 -0
  30. package/templates/react-sdk-reference/.claude/skills/field-components.md +294 -0
  31. package/templates/react-sdk-reference/.claude/skills/field-skills/AutoComplete.md +112 -0
  32. package/templates/react-sdk-reference/.claude/skills/field-skills/CancelAlert.md +203 -0
  33. package/templates/react-sdk-reference/.claude/skills/field-skills/Checkbox.md +158 -0
  34. package/templates/react-sdk-reference/.claude/skills/field-skills/Currency.md +106 -0
  35. package/templates/react-sdk-reference/.claude/skills/field-skills/Date.md +99 -0
  36. package/templates/react-sdk-reference/.claude/skills/field-skills/DateTime.md +103 -0
  37. package/templates/react-sdk-reference/.claude/skills/field-skills/Decimal.md +98 -0
  38. package/templates/react-sdk-reference/.claude/skills/field-skills/Dropdown.md +114 -0
  39. package/templates/react-sdk-reference/.claude/skills/field-skills/Email.md +107 -0
  40. package/templates/react-sdk-reference/.claude/skills/field-skills/Group.md +90 -0
  41. package/templates/react-sdk-reference/.claude/skills/field-skills/Integer.md +87 -0
  42. package/templates/react-sdk-reference/.claude/skills/field-skills/Location.md +136 -0
  43. package/templates/react-sdk-reference/.claude/skills/field-skills/Multiselect.md +164 -0
  44. package/templates/react-sdk-reference/.claude/skills/field-skills/ObjectReference.md +164 -0
  45. package/templates/react-sdk-reference/.claude/skills/field-skills/Percentage.md +92 -0
  46. package/templates/react-sdk-reference/.claude/skills/field-skills/Phone.md +110 -0
  47. package/templates/react-sdk-reference/.claude/skills/field-skills/RadioButtons.md +146 -0
  48. package/templates/react-sdk-reference/.claude/skills/field-skills/RichText.md +138 -0
  49. package/templates/react-sdk-reference/.claude/skills/field-skills/ScalarList.md +124 -0
  50. package/templates/react-sdk-reference/.claude/skills/field-skills/SelectableCard.md +216 -0
  51. package/templates/react-sdk-reference/.claude/skills/field-skills/SemanticLink.md +148 -0
  52. package/templates/react-sdk-reference/.claude/skills/field-skills/TextArea.md +96 -0
  53. package/templates/react-sdk-reference/.claude/skills/field-skills/TextContent.md +101 -0
  54. package/templates/react-sdk-reference/.claude/skills/field-skills/TextInput.md +104 -0
  55. package/templates/react-sdk-reference/.claude/skills/field-skills/Time.md +88 -0
  56. package/templates/react-sdk-reference/.claude/skills/field-skills/URL.md +85 -0
  57. package/templates/react-sdk-reference/.claude/skills/field-skills/UserReference.md +180 -0
  58. package/templates/react-sdk-reference/.claude/skills/run-and-verify.md +68 -0
  59. package/templates/react-sdk-reference/.claude/skills/template-components.md +322 -0
  60. package/templates/react-sdk-reference/.claude/skills/template-skills/AdvancedSearch.md +144 -0
  61. package/templates/react-sdk-reference/.claude/skills/template-skills/AppShell.md +122 -0
  62. package/templates/react-sdk-reference/.claude/skills/template-skills/BannerPage.md +83 -0
  63. package/templates/react-sdk-reference/.claude/skills/template-skills/CaseSummary.md +100 -0
  64. package/templates/react-sdk-reference/.claude/skills/template-skills/CaseView.md +131 -0
  65. package/templates/react-sdk-reference/.claude/skills/template-skills/CaseViewActionsMenu.md +126 -0
  66. package/templates/react-sdk-reference/.claude/skills/template-skills/Confirmation.md +107 -0
  67. package/templates/react-sdk-reference/.claude/skills/template-skills/DataReference.md +120 -0
  68. package/templates/react-sdk-reference/.claude/skills/template-skills/DefaultForm.md +102 -0
  69. package/templates/react-sdk-reference/.claude/skills/template-skills/DefaultPage.md +110 -0
  70. package/templates/react-sdk-reference/.claude/skills/template-skills/Details.md +88 -0
  71. package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsSubTabs.md +95 -0
  72. package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsThreeColumn.md +78 -0
  73. package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsTwoColumn.md +78 -0
  74. package/templates/react-sdk-reference/.claude/skills/template-skills/DynamicTabs.md +101 -0
  75. package/templates/react-sdk-reference/.claude/skills/template-skills/FieldGroupTemplate.md +109 -0
  76. package/templates/react-sdk-reference/.claude/skills/template-skills/HierarchicalForm.md +113 -0
  77. package/templates/react-sdk-reference/.claude/skills/template-skills/InlineDashboard.md +104 -0
  78. package/templates/react-sdk-reference/.claude/skills/template-skills/InlineDashboardPage.md +85 -0
  79. package/templates/react-sdk-reference/.claude/skills/template-skills/ListPage.md +68 -0
  80. package/templates/react-sdk-reference/.claude/skills/template-skills/ListView.md +139 -0
  81. package/templates/react-sdk-reference/.claude/skills/template-skills/MultiReferenceReadOnly.md +80 -0
  82. package/templates/react-sdk-reference/.claude/skills/template-skills/NarrowWide.md +141 -0
  83. package/templates/react-sdk-reference/.claude/skills/template-skills/OneColumn.md +109 -0
  84. package/templates/react-sdk-reference/.claude/skills/template-skills/PromotedFilters.md +124 -0
  85. package/templates/react-sdk-reference/.claude/skills/template-skills/SelfServiceCaseView.md +135 -0
  86. package/templates/react-sdk-reference/.claude/skills/template-skills/SimpleTable.md +127 -0
  87. package/templates/react-sdk-reference/.claude/skills/template-skills/SingleReferenceReadOnly.md +103 -0
  88. package/templates/react-sdk-reference/.claude/skills/template-skills/SubTabs.md +79 -0
  89. package/templates/react-sdk-reference/.claude/skills/template-skills/TwoColumn.md +131 -0
  90. package/templates/react-sdk-reference/.claude/skills/template-skills/WideNarrow.md +150 -0
  91. package/templates/react-sdk-reference/.claude/skills/template-skills/WssNavBar.md +135 -0
  92. package/templates/react-sdk-reference/.claude/skills/widget-components.md +271 -0
  93. package/templates/react-sdk-reference/.claude/skills/widget-skills/AppAnnouncement.md +82 -0
  94. package/templates/react-sdk-reference/.claude/skills/widget-skills/Attachment.md +146 -0
  95. package/templates/react-sdk-reference/.claude/skills/widget-skills/CaseHistory.md +107 -0
  96. package/templates/react-sdk-reference/.claude/skills/widget-skills/FileUtility.md +200 -0
  97. package/templates/react-sdk-reference/.claude/skills/widget-skills/Followers.md +99 -0
  98. package/templates/react-sdk-reference/.claude/skills/widget-skills/QuickCreate.md +114 -0
  99. package/templates/react-sdk-reference/.claude/skills/widget-skills/SummaryItem.md +167 -0
  100. package/templates/react-sdk-reference/.claude/skills/widget-skills/ToDo.md +190 -0
  101. package/templates/react-sdk-reference/.cursor/rules/component-map.mdrules +41 -0
  102. package/templates/react-sdk-reference/.cursor/rules/dse-component.mdrules +78 -0
  103. package/templates/react-sdk-reference/.cursor/rules/field-component.mdrules +74 -0
  104. package/templates/react-sdk-reference/.cursor/rules/pega-sdk.mdrules +247 -0
  105. package/templates/react-sdk-reference/.cursor/rules/prompts/add-component.mdrules +149 -0
  106. package/templates/react-sdk-reference/.cursor/rules/prompts/component-manifest.json +111 -0
  107. package/templates/react-sdk-reference/.cursor/rules/prompts/generate-all-components.mdrules +154 -0
  108. package/templates/react-sdk-reference/.cursor/rules/prompts/generate-dse-components.mdrules +131 -0
  109. package/templates/react-sdk-reference/.cursor/rules/prompts/generate-field-components.mdrules +144 -0
  110. package/templates/react-sdk-reference/.cursor/rules/prompts/generate-template-components.mdrules +156 -0
  111. package/templates/react-sdk-reference/.cursor/rules/prompts/generate-widget-components.mdrules +129 -0
  112. package/templates/react-sdk-reference/.cursor/rules/prompts/identify-components.mdrules +110 -0
  113. package/templates/react-sdk-reference/.cursor/rules/prompts/replace-design-system.mdrules +524 -0
  114. package/templates/react-sdk-reference/.cursor/rules/skills/component-contracts.mdrules +145 -0
  115. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/AlertBanner.mdrules +140 -0
  116. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Banner.mdrules +154 -0
  117. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/CaseSummaryFields.mdrules +159 -0
  118. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/DetailsFields.mdrules +149 -0
  119. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldGroup.mdrules +136 -0
  120. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldGroupList.mdrules +116 -0
  121. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldValueList.mdrules +120 -0
  122. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Operator.mdrules +154 -0
  123. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Pulse.mdrules +88 -0
  124. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/RichTextEditor.mdrules +211 -0
  125. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/WssQuickCreate.mdrules +140 -0
  126. package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension.mdrules +294 -0
  127. package/templates/react-sdk-reference/.cursor/rules/skills/field-components.mdrules +299 -0
  128. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/AutoComplete.mdrules +117 -0
  129. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/CancelAlert.mdrules +208 -0
  130. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Checkbox.mdrules +163 -0
  131. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Currency.mdrules +111 -0
  132. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Date.mdrules +104 -0
  133. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/DateTime.mdrules +108 -0
  134. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Decimal.mdrules +103 -0
  135. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Dropdown.mdrules +119 -0
  136. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Email.mdrules +112 -0
  137. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Group.mdrules +95 -0
  138. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Integer.mdrules +92 -0
  139. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Location.mdrules +141 -0
  140. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Multiselect.mdrules +169 -0
  141. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/ObjectReference.mdrules +169 -0
  142. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Percentage.mdrules +97 -0
  143. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Phone.mdrules +115 -0
  144. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/RadioButtons.mdrules +151 -0
  145. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/RichText.mdrules +143 -0
  146. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/ScalarList.mdrules +129 -0
  147. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/SelectableCard.mdrules +221 -0
  148. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/SemanticLink.mdrules +153 -0
  149. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextArea.mdrules +101 -0
  150. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextContent.mdrules +106 -0
  151. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextInput.mdrules +109 -0
  152. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Time.mdrules +93 -0
  153. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/URL.mdrules +90 -0
  154. package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/UserReference.mdrules +185 -0
  155. package/templates/react-sdk-reference/.cursor/rules/skills/run-and-verify.mdrules +73 -0
  156. package/templates/react-sdk-reference/.cursor/rules/skills/template-components.mdrules +327 -0
  157. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/AdvancedSearch.mdrules +149 -0
  158. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/AppShell.mdrules +127 -0
  159. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/BannerPage.mdrules +88 -0
  160. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseSummary.mdrules +105 -0
  161. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseView.mdrules +136 -0
  162. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseViewActionsMenu.mdrules +131 -0
  163. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/Confirmation.mdrules +112 -0
  164. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DataReference.mdrules +125 -0
  165. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DefaultForm.mdrules +107 -0
  166. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DefaultPage.mdrules +115 -0
  167. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/Details.mdrules +93 -0
  168. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsSubTabs.mdrules +100 -0
  169. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsThreeColumn.mdrules +83 -0
  170. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsTwoColumn.mdrules +83 -0
  171. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DynamicTabs.mdrules +106 -0
  172. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/FieldGroupTemplate.mdrules +114 -0
  173. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/HierarchicalForm.mdrules +118 -0
  174. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/InlineDashboard.mdrules +109 -0
  175. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/InlineDashboardPage.mdrules +90 -0
  176. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/ListPage.mdrules +73 -0
  177. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/ListView.mdrules +144 -0
  178. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/MultiReferenceReadOnly.mdrules +85 -0
  179. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/NarrowWide.mdrules +146 -0
  180. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/OneColumn.mdrules +114 -0
  181. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/PromotedFilters.mdrules +129 -0
  182. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SelfServiceCaseView.mdrules +140 -0
  183. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SimpleTable.mdrules +132 -0
  184. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SingleReferenceReadOnly.mdrules +108 -0
  185. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SubTabs.mdrules +84 -0
  186. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/TwoColumn.mdrules +136 -0
  187. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/WideNarrow.mdrules +155 -0
  188. package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/WssNavBar.mdrules +140 -0
  189. package/templates/react-sdk-reference/.cursor/rules/skills/widget-components.mdrules +276 -0
  190. package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/AppAnnouncement.mdrules +87 -0
  191. package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/Attachment.mdrules +151 -0
  192. package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/CaseHistory.mdrules +112 -0
  193. package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/FileUtility.mdrules +205 -0
  194. package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/Followers.mdrules +104 -0
  195. package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/QuickCreate.mdrules +119 -0
  196. package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/SummaryItem.mdrules +172 -0
  197. package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/ToDo.mdrules +195 -0
  198. package/templates/react-sdk-reference/.cursor/rules/template-component.mdrules +95 -0
  199. package/templates/react-sdk-reference/.cursor/rules/widget-component.mdrules +90 -0
  200. package/templates/react-sdk-reference/.github/copilot-instructions.md +58 -0
  201. package/templates/react-sdk-reference/.github/prompts/add-component.prompt.md +144 -16
  202. package/templates/react-sdk-reference/.github/prompts/generate-all-components.prompt.md +154 -0
  203. package/templates/react-sdk-reference/.github/prompts/generate-dse-components.prompt.md +131 -0
  204. package/templates/react-sdk-reference/.github/prompts/generate-field-components.prompt.md +144 -0
  205. package/templates/react-sdk-reference/.github/prompts/generate-template-components.prompt.md +156 -0
  206. package/templates/react-sdk-reference/.github/prompts/generate-widget-components.prompt.md +129 -0
  207. package/templates/react-sdk-reference/.github/skills/design-system-extension.md +58 -18
  208. package/templates/react-sdk-reference/.github/skills/field-components.md +55 -23
  209. package/templates/react-sdk-reference/.github/skills/template-components.md +48 -11
  210. package/templates/react-sdk-reference/.github/skills/widget-components.md +49 -12
  211. package/templates/react-sdk-reference/AGENTS.md +217 -29
  212. package/templates/react-sdk-reference/package.json +3 -2
  213. package/templates/react-sdk-reference/pega-auth-0.2.42.tgz +0 -0
  214. package/templates/react-sdk-reference/pega-constellationjs-0.26.3-local.tgz +0 -0
  215. package/templates/react-sdk-reference/pega-sdk-react-0.1.0.tgz +0 -0
  216. package/templates/react-sdk-reference/pega-sdk-types-0.1.0.tgz +0 -0
  217. package/templates/react-sdk-reference/sdk-config.json +1 -1
  218. package/templates/react-sdk-reference/vite.config.ts +1 -1
  219. package/templates/react-sdk-reference/.github/prompts/replace-all-fields.prompt.md +0 -48
  220. package/templates/react-sdk-reference/.github/prompts/replace-component.prompt.md +0 -81
  221. package/templates/react-sdk-reference/.github/prompts/replace-field.prompt.md +0 -41
  222. package/templates/react-sdk-reference/.github/prompts/swap-design-system.prompt.md +0 -49
  223. package/templates/react-sdk-reference/.github/skills/swap-design-system.md +0 -105
@@ -0,0 +1,149 @@
1
+ ---
2
+ description: DSE component skill: DetailsFields
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # Skill: DetailsFields
7
+
8
+ Read-only field display component that receives an array of PConnect-aware field objects and renders each as a label/value pair. Delegates value rendering to `PConnectComponent` in DISPLAY_ONLY mode.
9
+
10
+ > **Prerequisite skill:** [`design-system-extension.md`](../design-system-extension.md) — covers architecture, props interface, styling patterns, and registration patterns common to ALL DSE components.
11
+
12
+ ---
13
+
14
+ ## Component Purpose
15
+
16
+ Renders a vertical list of read-only field name/value pairs for a details/summary panel. Each field is a PConnect-aware object. The component extracts type, label, and view config from each field's PConnect, forces the view into `readOnly + DISPLAY_ONLY` mode, and delegates rendering to `PConnectComponent`.
17
+
18
+ Supports three item layouts:
19
+ - **Reference type:** Renders the value directly (no label/value grid wrapper).
20
+ - **React element value:** Renders value in a single full-width cell (no label).
21
+ - **Label + value pair:** Renders label in a 6-col cell and value in a 6-col cell.
22
+
23
+ ## Pega Metadata
24
+
25
+ - **Pega Name:** `DetailsFields`
26
+ - **Registration key:** `DetailsFields` (in `component-map.ts`)
27
+ - **Does NOT use `getPConnect` on the component itself** — iterates `fields[]` each of which has `.getPConnect()`
28
+
29
+ ## Props
30
+
31
+ | Prop | Type | Required | Description |
32
+ |------|------|----------|-------------|
33
+ | `fields` | `any[]` | Yes | Array of PConnect-aware field objects. Each must have `.getPConnect()` method |
34
+
35
+ ## Behavioral Contract
36
+
37
+ ### 1. Field Iteration and PConnect Setup
38
+
39
+ For each field in `fields`:
40
+ 1. Call `field.getPConnect()` to get `thePConn`.
41
+ 2. Get `theCompType = thePConn.getComponentName().toLowerCase()`.
42
+ 3. Get `label = thePConn.getConfigProps().label`.
43
+ 4. Call `configObj = thePConn.getReferencedView()` — get the referenced view config object.
44
+ 5. Set `configObj.config.readOnly = true` and `configObj.config.displayMode = 'DISPLAY_ONLY'` — forces display-only rendering.
45
+ 6. For `reference` type: override label with `thePConn.getInheritedProps().label`.
46
+ 7. Render the value using `createElement(PConnectComponent, thePConn.getReferencedViewPConnect())`.
47
+ 8. Push `{ type: theCompType, label, value: <React.Fragment key={index}>{renderedValue}</React.Fragment> }` into the field components array.
48
+
49
+ ### 2. Item Layout (per field component)
50
+
51
+ Choose the layout based on the field:
52
+
53
+ | Condition | Layout |
54
+ |-----------|--------|
55
+ | `type === 'reference'` | Render `field.value` directly with no wrapper |
56
+ | `isValidElement(field.value)` | Single 12-col cell containing `field.value` (no label) |
57
+ | Default (string/primitive value) | 6-col label cell + 6-col value cell |
58
+
59
+ ### 3. Label/Value Grid Row
60
+
61
+ - **Row wrapper:** `<Grid container spacing={1} style={{ padding: '4px 0px' }}>`
62
+ - **Label cell:** `<Grid size={{ xs: 6 }}>` containing `<Typography variant='body2' component='span' className='fieldLabel'>{field.label}</Typography>`
63
+ - **Value cell:** `<Grid size={{ xs: 6 }}>` containing `<Typography variant='body2' component='span' className='fieldValue'>{formattedValue}</Typography>`
64
+
65
+ ### 4. Value Formatting
66
+
67
+ - For `date` type: call `format(value, 'date')` before display.
68
+ - For all others: use value as-is.
69
+ - If formatted value is `undefined` or `''`, display `'---'` instead.
70
+
71
+ ### 5. React element detection
72
+
73
+ Use `isValidElement(field.value)` — if true, render full-width (12 cols) without label.
74
+
75
+ ## Visual Specifications
76
+
77
+ Derived from `DetailsFields.tsx` makeStyles:
78
+
79
+ ### Label
80
+
81
+ | Property | Value |
82
+ |----------|-------|
83
+ | Display | block |
84
+ | Font weight | 400 |
85
+ | Color | `theme.palette.text.secondary` |
86
+ | Typography | `body2` (≈ 0.875rem / 14px) |
87
+
88
+ ### Value
89
+
90
+ | Property | Value |
91
+ |----------|-------|
92
+ | Font weight | 400 |
93
+ | Color | `theme.palette.text.primary` |
94
+ | Typography | `body2` (≈ 0.875rem / 14px) |
95
+
96
+ ### Row Padding
97
+
98
+ | Property | Value |
99
+ |----------|-------|
100
+ | Row style | `padding: 4px 0px` |
101
+
102
+ **CSS-only implementation notes:**
103
+ - Each row: `display: grid; grid-template-columns: 1fr 1fr; padding: 4px 0; gap: 8px`.
104
+ - Label: `font-size: 0.875rem; font-weight: 400; color: var(--text-secondary); display: block`.
105
+ - Value: `font-size: 0.875rem; font-weight: 400; color: var(--text-primary)`.
106
+ - For a React element value (full-width): render in a single column spanning full width.
107
+ - For a reference type: render the component directly with no wrapping grid.
108
+
109
+ ## Edge Cases & Special Logic
110
+
111
+ - `fields` defaults to `[]` — guard against null/undefined.
112
+ - Reference fields bypass the label/value layout entirely — their rendered output fills the full row.
113
+ - React element values (e.g., from child components) are detected with `isValidElement` and rendered full-width without a label cell.
114
+ - The `configObj` mutation (`readOnly = true`, `displayMode = 'DISPLAY_ONLY'`) happens on the object returned by `getReferencedView()` — this is intentional side-effectful configuration.
115
+ - `format(value, 'date')` is only called for `date` type — all other types pass through raw.
116
+
117
+ ## Dependencies
118
+
119
+ - `createElement`, `isValidElement` from `react`
120
+ - `PConnectComponent` from `@pega/sdk-react` — used to render each field in DISPLAY_ONLY mode
121
+ - `format` from `../../helpers/formatters` — for date formatting
122
+ - Each `field` in `fields[]` must support `.getPConnect()` returning a PConnect object with:
123
+ - `.getComponentName()` → string
124
+ - `.getConfigProps()` → `{ label: string }`
125
+ - `.getReferencedView()` → mutable config object
126
+ - `.getReferencedViewPConnect()` → props object for `PConnectComponent`
127
+ - `.getInheritedProps()` → `{ label?: string }` (for reference type)
128
+
129
+ ## Design System Mapping
130
+
131
+ **UI control type:** Vertical list of read-only label/value field pairs with PConnect delegation.
132
+
133
+ Listed design systems are examples only.
134
+
135
+ | Design System | Recommended Component |
136
+ |---|---|
137
+ | Default (CSS only) | CSS grid 2-column rows per field pair |
138
+ | MUI | `<Grid container spacing={1}>` per row with `<Typography>` label and value |
139
+ | Ant Design | `<Descriptions layout='horizontal' column={1}>` with PConnect-rendered values |
140
+ | Chakra UI | `<Grid templateColumns='1fr 1fr'>` rows with `<Text>` label/value |
141
+ | Shadcn/ui | `<div class='grid grid-cols-2'>` rows |
142
+
143
+ When implementing in a specific design system, map the following:
144
+ - Label → secondary muted text, `body2` size
145
+ - Value → primary text, `body2` size
146
+ - Row padding → `4px 0` vertical spacing between pairs
147
+ - Full-width value (React element) → single column spanning full width
148
+ - Reference type → render the child component without any label wrapper
149
+ - Empty value → display `'---'`
@@ -0,0 +1,136 @@
1
+ ---
2
+ description: DSE component skill: FieldGroup
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # Skill: FieldGroup
7
+
8
+ Collapsible or static container that groups related fields under an optional section header and instructions text.
9
+
10
+ > **Prerequisite skill:** [`design-system-extension.md`](../design-system-extension.md) — covers architecture, props interface, styling patterns, and registration patterns common to ALL DSE components.
11
+
12
+ ---
13
+
14
+ ## Component Purpose
15
+
16
+ Renders a labeled section that wraps one or more field components. Supports optional:
17
+ - **Section name** — rendered as a bold header above the fields.
18
+ - **Collapsible behavior** — the name header becomes a toggle that shows/hides the fields.
19
+ - **Instructions text** — rendered as HTML below the header and above the fields.
20
+
21
+ Children are rendered inside a full-width inner container.
22
+
23
+ ## Pega Metadata
24
+
25
+ - **Pega Name:** `FieldGroup`
26
+ - **Registration key:** `FieldGroup` (in `component-map.ts`)
27
+ - **Does NOT use `getPConnect`** — receives children via `PropsWithChildren`
28
+
29
+ ## Props
30
+
31
+ | Prop | Type | Required | Description |
32
+ |------|------|----------|-------------|
33
+ | `children` | `ReactNode` | No | Field components to render inside the group |
34
+ | `name` | `string` | No | Section heading displayed above the fields |
35
+ | `collapsible` | `boolean` | No | If `true`, the header acts as a collapse/expand toggle. Default `false` |
36
+ | `instructions` | `string` | No | HTML string of instruction text shown between header and fields |
37
+
38
+ ## Behavioral Contract
39
+
40
+ 1. **State:** Maintain a `collapsed` boolean in local state, initialized to `false` (expanded).
41
+ 2. **Name rendering:**
42
+ - If `name` is not provided, render no header.
43
+ - If `name` is provided and `collapsible` is `false`, render `<b>{name}</b>`.
44
+ - If `name` is provided and `collapsible` is `true`, wrap in a clickable `<span>` with:
45
+ - `id='field-group-header'`
46
+ - A directional arrow icon: **right arrow** when `collapsed === true`, **down arrow** when `collapsed === false`.
47
+ - The bold name text beside the arrow.
48
+ - Clicking the span toggles `collapsed`.
49
+ 3. **Instructions:** If `instructions` is provided AND is not the string `'none'`, render it with `dangerouslySetInnerHTML={{ __html: instructions }}`.
50
+ 4. **Children:** Render children inside a full-width div. If `collapsed` is `true`, do NOT render children (or instructions).
51
+ 5. **Header cursor:** When `collapsible` is `true`, the header span uses `cursor: pointer`. When `collapsible` is `false`, cursor is `auto`.
52
+ 6. **Layout:** All content is wrapped in a `Grid container` with `spacing={4}` and `justifyContent='space-between'`. The name row and children are inside a single inner `Grid` at full width.
53
+
54
+ ## Visual Specifications
55
+
56
+ Derived from `FieldGroup.tsx` makeStyles:
57
+
58
+ ### Outer Container
59
+
60
+ | Property | Value |
61
+ |----------|-------|
62
+ | Spacing | 4 units (≈ 32px in MUI default) |
63
+
64
+ ### Component Root Margins
65
+
66
+ | Property | Value |
67
+ |----------|-------|
68
+ | Margin right | `theme.spacing(1)` (≈ 8px) |
69
+ | Margin left | `theme.spacing(1)` |
70
+ | Margin top | `theme.spacing(1)` |
71
+ | Margin bottom | `theme.spacing(1)` |
72
+
73
+ ### Field Margin (name row)
74
+
75
+ | Property | Value |
76
+ |----------|-------|
77
+ | Padding top | `theme.spacing(1)` |
78
+ | Padding bottom | `theme.spacing(1)` |
79
+ | Margin top | `theme.spacing(1)` |
80
+
81
+ ### Header Row (collapsible)
82
+
83
+ | Property | Value |
84
+ |----------|-------|
85
+ | Display | flex |
86
+ | Align items | center |
87
+ | Gap | 5px |
88
+ | Cursor | `pointer` (collapsible) or `auto` (non-collapsible) |
89
+
90
+ ### Instructions
91
+
92
+ | Property | Value |
93
+ |----------|-------|
94
+ | Padding | `5px 0` |
95
+
96
+ **CSS-only implementation notes:**
97
+ - Outer wrapper: `margin: 8px`.
98
+ - Name row: `padding: 8px 0; margin-top: 8px`.
99
+ - Collapsible header: `display: flex; align-items: center; gap: 5px; cursor: pointer; user-select: none`.
100
+ - Non-collapsible name: plain `<b>` with no wrapper.
101
+ - Instructions: `padding: 5px 0`.
102
+ - Arrow icons: use Unicode or inline SVG — collapsed → `▶` / `›`, expanded → `▼` / `⌄`.
103
+ - Children wrapper: `width: 100%`.
104
+ - When collapsed, use `display: none` or conditional rendering to hide children.
105
+
106
+ ## Edge Cases & Special Logic
107
+
108
+ - If `collapsible` is `false` (default), the `collapsed` state is never changed — clicking the name does nothing.
109
+ - `instructions` equal to the string `'none'` must NOT be rendered (skip entirely).
110
+ - `instructions` is rendered as raw HTML — ensure the content is trusted (server-side).
111
+ - If `name` is absent, render no header row, but still render instructions (if any) and children.
112
+
113
+ ## Dependencies
114
+
115
+ - No Pega SDK imports required (no `getPConnect`)
116
+ - Arrow icons: `KeyboardArrowRightIcon` / `KeyboardArrowDownIcon` from `@mui/icons-material` (MUI only) — use equivalent icons or Unicode characters in non-MUI implementations
117
+
118
+ ## Design System Mapping
119
+
120
+ **UI control type:** Collapsible section container with label, instructions, and children.
121
+
122
+ Listed design systems are examples only.
123
+
124
+ | Design System | Recommended Component |
125
+ |---|---|
126
+ | Default (CSS only) | `<div>` with toggled `display: none` on children, `<b>` header |
127
+ | MUI | Grid container with `KeyboardArrowRight/Down` icons for collapse toggle |
128
+ | Ant Design | `<Collapse>` or `<Card>` with collapsible panels |
129
+ | Chakra UI | `<Accordion>` or manual `<Box>` with toggle state |
130
+ | Shadcn/ui | `<Collapsible>` + `<CollapsibleTrigger>` + `<CollapsibleContent>` |
131
+
132
+ When implementing in a specific design system, map the following:
133
+ - `collapsed` toggle → design system's collapse/expand state or controlled component
134
+ - Arrow direction → visual indicator of expand/collapse state (chevron or arrow icon)
135
+ - `instructions` HTML → design system's `dangerouslySetInnerHTML` or rich content slot
136
+ - Full-width children → ensure children container spans the full group width
@@ -0,0 +1,116 @@
1
+ ---
2
+ description: DSE component skill: FieldGroupList
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # Skill: FieldGroupList
7
+
8
+ Repeating list of named field groups, each with its own children. Supports per-item delete and a global "+Add" link at the bottom.
9
+
10
+ > **Prerequisite skill:** [`design-system-extension.md`](../design-system-extension.md) — covers architecture, props interface, styling patterns, and registration patterns common to ALL DSE components.
11
+
12
+ ---
13
+
14
+ ## Component Purpose
15
+
16
+ Renders a vertical list of field group items. Each item has a bold name header, optional delete button (top-right), and rendered children (the group's fields). An optional "+Add" link appears at the bottom when adding is allowed. A horizontal divider separates items when `onAdd` is provided.
17
+
18
+ ## Pega Metadata
19
+
20
+ - **Pega Name:** `FieldGroupList`
21
+ - **Registration key:** `FieldGroupList` (in `component-map.ts`)
22
+ - **Does NOT use `getPConnect`** — receives all data as direct props
23
+
24
+ ## Props
25
+
26
+ | Prop | Type | Required | Description |
27
+ |------|------|----------|-------------|
28
+ | `items` | `Array<{ name: string; id: string; children: ReactNode }>` | Yes | List of field group items to render |
29
+ | `onDelete` | `(id: string) => void` | No | Called with the item's `id` when the delete button is clicked. If not provided, no delete button is shown |
30
+ | `onAdd` | `() => void` | No | Called when the "+Add" link is clicked. If not provided, no add link or dividers are shown |
31
+
32
+ ## Behavioral Contract
33
+
34
+ 1. Render a `Grid container` with `spacing={4}` and `justifyContent='space-between'` as the outer wrapper.
35
+ 2. Inside, render a full-width inner Grid with `spacing={1}`.
36
+ 3. For **each item** in `props.items`:
37
+ - Render a full-width `Grid` keyed by `item.name`.
38
+ - Render `<b>{item.name}</b>` as the item header.
39
+ - If `onDelete` is provided, render a delete button:
40
+ - Floated right.
41
+ - `type='button'`, `id={'delete-row-' + item.id}`, `aria-label='Delete Row'`.
42
+ - Button class: `psdk-utility-button`.
43
+ - On click: call `onDelete(item.id)`.
44
+ - Button contains an `<img>` with the trash icon loaded via `Utils.getImageSrc('trash', Utils.getSDKStaticConentUrl())`.
45
+ - Image class: `psdk-utility-card-action-svg-icon`.
46
+ - Render `{item.children}`.
47
+ - Render `<br />`.
48
+ - If `onAdd` is provided: render `<Divider />`, then `<br />`.
49
+ 4. After all items, if `onAdd` is provided, render a `<Link>` (or `<a>`) with text `'+Add'`, `cursor: pointer`, and `onClick={onAdd}`.
50
+
51
+ ## Visual Specifications
52
+
53
+ Derived from `FieldGroupList.tsx`:
54
+
55
+ ### Outer Layout
56
+
57
+ | Property | Value |
58
+ |----------|-------|
59
+ | Grid container spacing | 4 (≈ 32px) |
60
+
61
+ ### Delete Button
62
+
63
+ | Property | Value |
64
+ |----------|-------|
65
+ | Float | right |
66
+ | Style class | `psdk-utility-button` |
67
+ | Icon source | `Utils.getImageSrc('trash', Utils.getSDKStaticConentUrl())` |
68
+
69
+ ### "+Add" Link
70
+
71
+ | Property | Value |
72
+ |----------|-------|
73
+ | Cursor | pointer |
74
+ | Underline | hover |
75
+ | Text | `'+Add'` |
76
+
77
+ **CSS-only implementation notes:**
78
+ - Outer wrapper: `display: flex; flex-direction: column; gap: 32px`.
79
+ - Item wrapper: `display: flex; flex-direction: column; gap: 8px; width: 100%`.
80
+ - Item header row: `display: flex; justify-content: space-between; align-items: center`.
81
+ - Delete button: `float: right` (or use flexbox `justify-content: space-between` on the header row instead).
82
+ - Delete icon: `width: 20px; height: 20px` SVG image of a trash/delete icon.
83
+ - Divider: `border-top: 1px solid var(--divider-color); margin: 8px 0`.
84
+ - "+Add" link: `cursor: pointer; text-decoration: underline; color: var(--app-primary-color)`.
85
+
86
+ ## Edge Cases & Special Logic
87
+
88
+ - If `items` is empty, render only the "+Add" link (if `onAdd` is provided).
89
+ - If neither `onDelete` nor `onAdd` is provided, the list is read-only (no interactive elements).
90
+ - The trash icon is loaded dynamically via `Utils.getImageSrc` — if this utility is unavailable, fall back to a standard `🗑` character or an SVG trash icon.
91
+ - The delete button must use `type='button'` to prevent form submission.
92
+
93
+ ## Dependencies
94
+
95
+ - `Utils` from `../../helpers/utils` — for `getImageSrc` and `getSDKStaticConentUrl` (used only for the trash icon)
96
+ - No Pega SDK `getPConnect` imports required
97
+
98
+ ## Design System Mapping
99
+
100
+ **UI control type:** Repeating list of named groups with optional delete and add actions.
101
+
102
+ Listed design systems are examples only.
103
+
104
+ | Design System | Recommended Component |
105
+ |---|---|
106
+ | Default (CSS only) | Flex column layout with `<hr>` divider and `<button>` delete |
107
+ | MUI | `<Grid container>` items with `<Divider>` and `<Link>` for "+Add" |
108
+ | Ant Design | `<List>` items with `<Divider>` and `<Button type='link'>` for "+Add" |
109
+ | Chakra UI | `<VStack>` with `<Divider>` and `<Button variant='link'>` |
110
+ | Shadcn/ui | `<div>` flex column with `<Separator>` and a link button |
111
+
112
+ When implementing in a specific design system, map the following:
113
+ - Delete button → icon button or `danger` variant button placed at the item top-right
114
+ - Divider between items → `<Divider>` / `<hr>` (only when `onAdd` is present)
115
+ - "+Add" link → a text link / `Button variant='link'` that calls `onAdd`
116
+ - Trash icon → design system's delete icon or an SVG
@@ -0,0 +1,120 @@
1
+ ---
2
+ description: DSE component skill: FieldValueList
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # Skill: FieldValueList
7
+
8
+ Single field-value pair display component. Renders a label and value in either an inline (side-by-side) or stacked layout. Also used as a display mode renderer by field components (e.g., `TextInput`, `Dropdown`, etc.).
9
+
10
+ > **Prerequisite skill:** [`design-system-extension.md`](../design-system-extension.md) — covers architecture, props interface, styling patterns, and registration patterns common to ALL DSE components.
11
+
12
+ ---
13
+
14
+ ## Component Purpose
15
+
16
+ Renders a single name/value pair in a compact read-only layout. Supports two layout variants:
17
+ - **Inline:** Label and value are side by side (label 4/12 cols, value 8/12 cols).
18
+ - **Stacked:** Label is on top, value is larger below (both 12/12 cols).
19
+
20
+ When no name is provided, only the value is rendered at full width. Used directly as a display widget and delegated to by field components for their `DISPLAY_ONLY` and `STACKED_LARGE_VAL` display modes.
21
+
22
+ ## Pega Metadata
23
+
24
+ - **Pega Name:** `FieldValueList`
25
+ - **Registration key:** `FieldValueList` (in `component-map.ts`)
26
+ - **Does NOT use `getPConnect`** — receives all data as direct props
27
+
28
+ ## Props
29
+
30
+ | Prop | Type | Required | Description |
31
+ |------|------|----------|-------------|
32
+ | `name` | `string` | No | Field label. If omitted, only the value is rendered |
33
+ | `value` | `any` | Yes | Field value to display |
34
+ | `variant` | `string` | No | Layout: `'inline'` (default) or `'stacked'` |
35
+ | `isHtml` | `boolean` | No | If `true`, render value as raw HTML (default `false`) |
36
+
37
+ ## Behavioral Contract
38
+
39
+ 1. **Empty value fallback:** If `value` is `undefined` or an empty string (`''`), display `'---'` instead.
40
+ 2. **No-name case:** If `name` is not provided, render only the value at full width (12 columns) regardless of `variant`.
41
+ 3. **Inline variant** (default — `variant !== 'stacked'`):
42
+ - Label column: 4 of 12 columns.
43
+ - Value column: 8 of 12 columns (or 12 if no name).
44
+ - Label: secondary text color, `body2` typography, `fontWeight: 400`.
45
+ - Value: primary text color, `body2` typography.
46
+ 4. **Stacked variant** (`variant === 'stacked'`):
47
+ - Label column: 12 of 12, `paddingBottom: 0` (label sits tight above value).
48
+ - Value column: 12 of 12, `paddingTop: 0` (value sits tight below label).
49
+ - Label: secondary text color, `body2` typography, `fontWeight: 400`.
50
+ - Value: primary text color, **`h6` typography** (larger / more prominent than inline).
51
+ 5. **HTML rendering:** If `isHtml` is `true`, wrap value in a `<div dangerouslySetInnerHTML={{ __html: formattedValue }}>`. The formatted value (with `'---'` fallback) is passed to `__html`.
52
+ 6. **Layout wrapper:** Render everything inside a container row with space-between justification and consistent spacing.
53
+
54
+ ## Visual Specifications
55
+
56
+ Derived from `FieldValueList.tsx` makeStyles:
57
+
58
+ ### Label
59
+
60
+ | Property | Value |
61
+ |----------|-------|
62
+ | Font weight | 400 |
63
+ | Color | `theme.palette.text.secondary` (muted/secondary text) |
64
+ | Typography | `body2` (≈ 0.875rem / 14px) |
65
+
66
+ ### Value
67
+
68
+ | Property | Value |
69
+ |----------|-------|
70
+ | Color | `theme.palette.text.primary` (default text) |
71
+ | Typography (inline) | `body2` (≈ 0.875rem / 14px) |
72
+ | Typography (stacked) | `h6` (≈ 1.25rem / 20px, weight 500) |
73
+
74
+ ### Padding Adjustments (stacked only)
75
+
76
+ | Property | Value |
77
+ |----------|-------|
78
+ | Label bottom padding | `0 !important` |
79
+ | Value top padding | `0 !important` |
80
+
81
+ **CSS-only implementation notes:**
82
+ - Root row: `display: flex; justify-content: space-between; align-items: baseline; gap: 1rem`.
83
+ - **Inline label:** `flex: 0 0 33%; font-weight: 400; font-size: 0.875rem; color: var(--text-secondary)`.
84
+ - **Inline value:** `flex: 1; font-size: 0.875rem; color: var(--text-primary)`.
85
+ - **Stacked:** `display: flex; flex-direction: column; gap: 0`.
86
+ - **Stacked label:** `font-weight: 400; font-size: 0.875rem; color: var(--text-secondary); margin-bottom: 0`.
87
+ - **Stacked value:** `font-size: 1.25rem; font-weight: 500; color: var(--text-primary); margin-top: 0`.
88
+
89
+ ## Edge Cases & Special Logic
90
+
91
+ - `value` can be any type (string, number, boolean, React element). Render it as-is unless it's empty/undefined.
92
+ - When `isHtml` is `true`, set the raw HTML from the formatted value — do NOT sanitize (the caller is responsible). Ensure value is a string before passing to `dangerouslySetInnerHTML`.
93
+ - When `variant` is `'stacked'` and `name` is absent, render value at 12 cols with `h6` typography.
94
+ - When `variant` is `'inline'` and `name` is absent, render value at 12 cols with `body2` typography.
95
+
96
+ ## Dependencies
97
+
98
+ - No Pega SDK imports required (no `getPConnect`)
99
+ - No helper utilities required
100
+
101
+ ## Design System Mapping
102
+
103
+ **UI control type:** Read-only field label/value display pair.
104
+
105
+ Listed design systems are examples only.
106
+
107
+ | Design System | Recommended Component |
108
+ |---|---|
109
+ | Default (CSS only) | `<div class='field-value-inline'>` or `<div class='field-value-stacked'>` with CSS |
110
+ | MUI | `<Grid container>` with `<Typography>` for label and value |
111
+ | Ant Design | `<Descriptions>` item, or `<Typography.Text type='secondary'>` + `<Typography.Text>` |
112
+ | Chakra UI | `<Stack direction='row'>` (inline) or `<Stack spacing={0}>` (stacked) |
113
+ | Shadcn/ui | Custom label/value pair with Tailwind flex utilities |
114
+
115
+ When implementing in a specific design system, map the following:
116
+ - Label → secondary/muted text style
117
+ - Value inline → same size as label
118
+ - Value stacked → larger typography (h6 equivalent)
119
+ - Empty value → always display `'---'` (never show blank)
120
+ - `isHtml={true}` → design system's `dangerouslySetInnerHTML` or `innerHTML` equivalent
@@ -0,0 +1,154 @@
1
+ ---
2
+ description: DSE component skill: Operator
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # Skill: Operator
7
+
8
+ Read-only display of a Pega case operator (creator or updater). Shows the operator's name and relative timestamp. On click, fetches full operator details from Pega and displays them in a popover.
9
+
10
+ > **Prerequisite skill:** [`design-system-extension.md`](../design-system-extension.md) — covers architecture, props interface, styling patterns, and registration patterns common to ALL DSE components.
11
+
12
+ ---
13
+
14
+ ## Component Purpose
15
+
16
+ Renders a clickable read-only field displaying a case operator's name and the relative time of their action (created/updated). Clicking the field triggers an async fetch of the operator's profile details (position, organization, reports-to, telephone, email) and shows them in a popover panel.
17
+
18
+ ## Pega Metadata
19
+
20
+ - **Pega Name:** `Operator`
21
+ - **Registration key:** `Operator` (in `component-map.ts`)
22
+ - **Extends `PConnProps`** — but does NOT call `getPConnect()`. Props are all passed directly.
23
+
24
+ ## Props
25
+
26
+ The component interface extends `PConnProps` but all rendering data is passed as explicit props:
27
+
28
+ | Prop | Type | Required | Description |
29
+ |------|------|----------|-------------|
30
+ | `label` | `string` | Yes | The field label used to identify which operator to display. Must be `'create operator'` or `'update operator'` (case-insensitive). |
31
+ | `displayLabel` | `any` | No | Alternative label (used if `label` doesn't match). Also compared case-insensitively. |
32
+ | `createDateTime` | `string` | Yes | ISO datetime string of when the case was created |
33
+ | `createLabel` | `string` | Yes | Display label for the create operator field |
34
+ | `createOperator` | `{ userName: string; userId: string }` | Yes | Creator's name and ID |
35
+ | `updateDateTime` | `string` | Yes | ISO datetime string of last update |
36
+ | `updateLabel` | `string` | Yes | Display label for the update operator field |
37
+ | `updateOperator` | `{ userName: string; userId: string }` | Yes | Updater's name and ID |
38
+
39
+ ## Behavioral Contract
40
+
41
+ ### 1. Operator Selection
42
+
43
+ Determine which operator to display based on `label.toLowerCase()` or `displayLabel?.toLowerCase()`:
44
+ - If either is `'create operator'`:
45
+ - `caseOpLabel = createLabel`
46
+ - `caseOpName = createOperator.userName`
47
+ - `caseOpId = createOperator.userId`
48
+ - `caseTime = createDateTime`
49
+ - If either is `'update operator'`:
50
+ - `caseOpLabel = updateLabel`
51
+ - `caseOpName = updateOperator.userName`
52
+ - `caseOpId = updateOperator.userId`
53
+ - `caseTime = updateDateTime`
54
+ - Otherwise: `caseOpLabel = '---'`, `caseOpName = '---'`, `caseOpId = ''`, `caseTime = ''`.
55
+
56
+ ### 2. Main Display
57
+
58
+ Render a read-only TextField (standard variant, no underline, pointer cursor) with:
59
+ - `defaultValue={caseOpName}`
60
+ - `label={caseOpLabel}`
61
+ - `onClick={showOperatorDetails}`
62
+ - `readOnly: true`, `disableUnderline: true`, `cursor: 'pointer'`
63
+
64
+ Below the TextField, render the relative time: `Utils.generateDateTime(caseTime, 'DateTime-Since')`.
65
+
66
+ ### 3. Popover on Click (`showOperatorDetails`)
67
+
68
+ When the TextField is clicked:
69
+ 1. Call `PCore.getUserApi().getOperatorDetails(caseOpId)` — returns a Promise.
70
+ 2. Use `PCore.getLocaleUtils().getLocaleValue(key, 'Operator')` to localize field labels.
71
+ 3. On resolution, build a fields array with these entries (using `'---'` as fallback for missing values):
72
+ - Position (`pyPosition`)
73
+ - Organization (`pyOrganization`)
74
+ - Reports to (`pyReportToUserName`)
75
+ - Telephone (`pyTelephone`) — rendered as `<a href={'tel:' + value}>{value}</a>`
76
+ - Email address (`pyEmailAddress`) — rendered as `<a href={'mailto:' + value}>{value}</a>`
77
+ 4. If `res.data.pyOperatorInfo.pyUserName` is empty, use all `'---'` fallbacks.
78
+ 5. Set `popoverFields` state with the resolved fields.
79
+ 6. Set `popoverAnchorEl` to the clicked element to open the popover.
80
+
81
+ ### 4. Popover Layout
82
+
83
+ The popover renders when `popoverAnchorEl` is set:
84
+ - Anchor origin: `{ vertical: 'bottom', horizontal: 'center' }`
85
+ - Transform origin: `{ vertical: 'top', horizontal: 'center' }`
86
+ - Max width: `45ch`
87
+ - Content: A `Grid container` with:
88
+ - `Typography h6` showing `caseOpName` at full width.
89
+ - One row per field: 6-col `Typography caption` (label) + 6-col `Typography subtitle2` (value).
90
+
91
+ Closing the popover sets `popoverAnchorEl` to `null`.
92
+
93
+ ## Visual Specifications
94
+
95
+ Derived from `Operator.tsx` makeStyles:
96
+
97
+ ### Root Container
98
+
99
+ | Property | Value |
100
+ |----------|-------|
101
+ | Padding | `theme.spacing(1)` (≈ 8px) |
102
+ | Margin | `theme.spacing(1)` |
103
+
104
+ ### Popover Container
105
+
106
+ | Property | Value |
107
+ |----------|-------|
108
+ | Padding | `theme.spacing(1)` |
109
+ | Margin | `theme.spacing(1)` |
110
+ | Max width | 45ch |
111
+
112
+ **CSS-only implementation notes:**
113
+ - Main display: read-only text field with label above, value below, pointer cursor on the value element.
114
+ - Time display: secondary muted text below the operator name (e.g., `font-size: 0.75rem; color: var(--text-secondary)`).
115
+ - Popover: `position: absolute; background: var(--bg-paper); border: 1px solid var(--divider); border-radius: 4px; padding: 8px; max-width: 45ch; box-shadow: 0 4px 12px rgba(0,0,0,0.15)`.
116
+ - Operator name in popover: `font-size: 1.25rem; font-weight: 500; margin-bottom: 8px`.
117
+ - Detail rows: `display: grid; grid-template-columns: 1fr 1fr; gap: 4px; align-items: baseline`.
118
+ - Detail label: `font-size: 0.75rem; color: var(--text-secondary)`.
119
+ - Detail value: `font-size: 0.875rem; font-weight: 500`.
120
+ - Close popover on outside click (use `onClose` / blur handler).
121
+
122
+ ## Edge Cases & Special Logic
123
+
124
+ - If `caseOpId` is empty (label not recognized), do NOT call `getOperatorDetails` — the fetch would fail.
125
+ - If the API response has no `pyOperatorInfo.pyUserName`, fall back to all `'---'` for field values (still open the popover).
126
+ - `Utils.generateDateTime(caseTime, 'DateTime-Since')` handles empty `caseTime` gracefully.
127
+ - State: `popoverFields` starts as empty array `[]`. Check `popoverFields.length === 0` and return `undefined` from `getPopoverGrid()` to render nothing before data loads.
128
+
129
+ ## Dependencies
130
+
131
+ - `Utils` from `../../helpers/utils` — `Utils.generateDateTime` for relative time display
132
+ - `PCore.getUserApi().getOperatorDetails(userId)` — global Pega runtime API for operator details
133
+ - `PCore.getLocaleUtils().getLocaleValue(key, 'Operator')` — for localized field labels in the popover
134
+
135
+ ## Design System Mapping
136
+
137
+ **UI control type:** Clickable read-only field with async popover detail panel.
138
+
139
+ Listed design systems are examples only.
140
+
141
+ | Design System | Recommended Component |
142
+ |---|---|
143
+ | Default (CSS only) | `<div>` with click handler, custom CSS popover/tooltip panel |
144
+ | MUI | Read-only `<TextField>` + `<Popover>` with `<Grid>` detail rows |
145
+ | Ant Design | `<Input readOnly>` + `<Popover>` with `<Descriptions>` |
146
+ | Chakra UI | `<Input isReadOnly>` + `<Popover>` with custom content |
147
+ | Shadcn/ui | `<Input readOnly>` + `<Popover>` + `<PopoverContent>` |
148
+
149
+ When implementing in a specific design system, map the following:
150
+ - `onClick` on read-only input → trigger async fetch + open popover
151
+ - `PCore.getUserApi().getOperatorDetails()` → call this before showing the popover
152
+ - Popover anchor → position relative to the clicked element
153
+ - `Utils.generateDateTime(caseTime, 'DateTime-Since')` → relative time display (e.g., "2 hours ago")
154
+ - Telephone/email in popover → clickable `<a href='tel:...'>` and `<a href='mailto:...'>` links