@pega/custom-dx-components 26.1.11 → 26.1.12-alpha.0.2

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 (323) hide show
  1. package/README.md +6 -2
  2. package/package.json +48 -64
  3. package/src/ai/README.md +44 -0
  4. package/src/ai/catalog/README.md +133 -0
  5. package/src/ai/catalog/best-practices/README.md +24 -0
  6. package/src/ai/catalog/best-practices/accessibility-for-async-components.md +53 -0
  7. package/src/ai/catalog/best-practices/error-handling-and-resiliency.md +116 -0
  8. package/src/ai/catalog/best-practices/genai-assistant-integration-patterns.md +49 -0
  9. package/src/ai/catalog/best-practices/performance-and-efficiency.md +109 -0
  10. package/src/ai/catalog/best-practices/security-considerations.md +93 -0
  11. package/src/ai/catalog/best-practices/testing-pconnect-components.md +245 -0
  12. package/src/ai/catalog/best-practices/troubleshooting-common-pitfalls.md +132 -0
  13. package/src/ai/catalog/pconnect-assignment-lifecycle/SKILL.md +44 -0
  14. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/README.md +39 -0
  15. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/approval-workflow-decision.md +47 -0
  16. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/attachment-upload.md +45 -0
  17. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/bulk-action-submit.md +50 -0
  18. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/confirm-before-destructive-action.md +43 -0
  19. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/create-and-stage-new-case.md +45 -0
  20. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/graceful-submit-failure.md +39 -0
  21. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/modal-assignment-submit.md +58 -0
  22. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/multi-step-wizard.md +44 -0
  23. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/resolve-or-ignore-duplicate.md +47 -0
  24. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/safe-case-deletion.md +36 -0
  25. package/src/ai/catalog/pconnect-case-collaboration/SKILL.md +42 -0
  26. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/README.md +36 -0
  27. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/look-up-user-details.md +43 -0
  28. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/manage-case-attachments.md +51 -0
  29. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/manage-case-participants.md +52 -0
  30. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/participant-and-follower.md +40 -0
  31. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/post-and-manage-feed.md +50 -0
  32. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/relate-cases.md +35 -0
  33. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/tag-case-and-find-related.md +44 -0
  34. package/src/ai/catalog/pconnect-data-subscriptions/SKILL.md +42 -0
  35. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/README.md +35 -0
  36. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/data-page-subscription-cleanup.md +41 -0
  37. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/publish-and-subscribe-events.md +40 -0
  38. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/pubsub-cleanup.md +38 -0
  39. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/query-paginated-list-data.md +44 -0
  40. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/realtime-case-subscription.md +46 -0
  41. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/refresh-and-update-data.md +41 -0
  42. package/src/ai/catalog/pconnect-forms-and-fields/SKILL.md +44 -0
  43. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/README.md +36 -0
  44. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/autosave-tracking.md +45 -0
  45. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/cascading-dependent-fields.md +51 -0
  46. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/collect-form-changes-for-manual-save.md +45 -0
  47. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/custom-field-validators.md +44 -0
  48. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/discard-changes-and-reset-form.md +41 -0
  49. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/full-form-validation.md +38 -0
  50. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/persist-widget-ui-state.md +41 -0
  51. package/src/ai/catalog/pconnect-lists-and-views/SKILL.md +44 -0
  52. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/README.md +35 -0
  53. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/activate-and-switch-container-items.md +52 -0
  54. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/container-item-lifecycle.md +61 -0
  55. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/insert-delete-list-rows.md +40 -0
  56. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/reorder-list-rows.md +39 -0
  57. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/repeating-row-edit.md +39 -0
  58. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/view-personalization.md +60 -0
  59. package/src/ai/catalog/pconnect-navigation-locale-genai/SKILL.md +45 -0
  60. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/README.md +35 -0
  61. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/agent-conversation-for-tasks.md +54 -0
  62. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/bookmarkable-filter-state.md +40 -0
  63. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/deep-link-semantic-url.md +39 -0
  64. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/genai-assistant-conversation.md +43 -0
  65. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/locale-switch-and-relocalize.md +38 -0
  66. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/persist-operator-preferences.md +40 -0
  67. package/src/ai/catalog/references/architecture-overview.md +52 -0
  68. package/src/ai/catalog/references/pconnect-actions-api.md +948 -0
  69. package/src/ai/catalog/references/pconnect-case-info-data-info-localization.md +618 -0
  70. package/src/ai/catalog/references/pconnect-case-validation-utilities.md +238 -0
  71. package/src/ai/catalog/references/pconnect-container-manager.md +215 -0
  72. package/src/ai/catalog/references/pconnect-list-actions.md +250 -0
  73. package/src/ai/catalog/references/pconnect-misc-suggestions-creation.md +231 -0
  74. package/src/ai/catalog/references/pconnect-reference-context-component.md +471 -0
  75. package/src/ai/catalog/references/pconnect-state-config.md +316 -0
  76. package/src/ai/catalog/references/pconnect-validation-api.md +45 -0
  77. package/src/ai/catalog/references/pcore-analytics-genai-details.md +50 -0
  78. package/src/ai/catalog/references/pcore-bootstrap-init-details.md +121 -0
  79. package/src/ai/catalog/references/pcore-bootstrap-registry-routing.md +253 -0
  80. package/src/ai/catalog/references/pcore-case-collaboration-details.md +191 -0
  81. package/src/ai/catalog/references/pcore-case-collaboration-genai.md +264 -0
  82. package/src/ai/catalog/references/pcore-environment-info-details.md +96 -0
  83. package/src/ai/catalog/references/pcore-environment-locale-namespace.md +175 -0
  84. package/src/ai/catalog/references/pcore-messaging-details.md +99 -0
  85. package/src/ai/catalog/references/pcore-misc-details.md +207 -0
  86. package/src/ai/catalog/references/pcore-misc-utilities.md +325 -0
  87. package/src/ai/catalog/references/pcore-rest-data-details.md +164 -0
  88. package/src/ai/catalog/references/pcore-rest-data-messaging.md +308 -0
  89. package/src/ai/catalog/references/pcore-store-context-details.md +40 -0
  90. package/src/ai/catalog/references/pcore-store-context-state.md +130 -0
  91. package/src/ai/index.js +154 -0
  92. package/src/ai/project/.claude/skills/boolean/SKILL.md +43 -0
  93. package/src/ai/project/.claude/skills/case/SKILL.md +58 -0
  94. package/src/ai/project/.claude/skills/create-dx-component/SKILL.md +98 -0
  95. package/src/ai/project/.claude/skills/create-dx-component/assets/PConnProps.d.ts +24 -0
  96. package/src/ai/project/.claude/skills/create-dx-component/assets/create-nonce.ts +5 -0
  97. package/src/ai/project/.claude/skills/create-dx-component/assets/event-utils.ts +18 -0
  98. package/src/ai/project/.claude/skills/create-dx-component/assets/styles.ts +7 -0
  99. package/src/ai/project/.claude/skills/create-dx-component/cookbooks/README.md +28 -0
  100. package/src/ai/project/.claude/skills/create-dx-component/cookbooks/build-a-data-widget.md +281 -0
  101. package/src/ai/project/.claude/skills/create-dx-component/cookbooks/field-with-limits-and-validation.md +156 -0
  102. package/src/ai/project/.claude/skills/create-dx-component/cookbooks/status-badge-field.md +97 -0
  103. package/src/ai/project/.claude/skills/create-dx-component/references/accessibility.md +71 -0
  104. package/src/ai/project/.claude/skills/create-dx-component/references/choosing-type-and-subtype.md +79 -0
  105. package/src/ai/project/.claude/skills/create-dx-component/references/cli-workflow.md +125 -0
  106. package/src/ai/project/.claude/skills/create-dx-component/references/component-patterns.md +241 -0
  107. package/src/ai/project/.claude/skills/create-dx-component/references/config-schema.md +296 -0
  108. package/src/ai/project/.claude/skills/create-dx-component/references/cosmos-components.md +137 -0
  109. package/src/ai/project/.claude/skills/create-dx-component/references/field-behavior.md +155 -0
  110. package/src/ai/project/.claude/skills/create-dx-component/references/field-essentials.md +90 -0
  111. package/src/ai/project/.claude/skills/create-dx-component/references/field-subtypes-extra.md +68 -0
  112. package/src/ai/project/.claude/skills/create-dx-component/references/localization.md +30 -0
  113. package/src/ai/project/.claude/skills/create-dx-component/references/pcore-pconnect-apis.md +77 -0
  114. package/src/ai/project/.claude/skills/create-dx-component/references/presentation-essentials.md +57 -0
  115. package/src/ai/project/.claude/skills/create-dx-component/references/props-contract.md +182 -0
  116. package/src/ai/project/.claude/skills/create-dx-component/references/state-matrix.md +102 -0
  117. package/src/ai/project/.claude/skills/create-dx-component/references/storybook-pattern.md +262 -0
  118. package/src/ai/project/.claude/skills/create-dx-component/references/styles-pattern.md +54 -0
  119. package/src/ai/project/.claude/skills/create-dx-component/references/template-essentials.md +87 -0
  120. package/src/ai/project/.claude/skills/create-dx-component/references/template-patterns.md +131 -0
  121. package/src/ai/project/.claude/skills/create-dx-component/references/test-pattern.md +215 -0
  122. package/src/ai/project/.claude/skills/create-dx-component/references/ui-gallery-reuse.md +93 -0
  123. package/src/ai/project/.claude/skills/create-dx-component/references/widget-essentials.md +84 -0
  124. package/src/ai/project/.claude/skills/create-dx-component/references/widget-patterns.md +164 -0
  125. package/src/ai/project/.claude/skills/currency/SKILL.md +46 -0
  126. package/src/ai/project/.claude/skills/date/SKILL.md +46 -0
  127. package/src/ai/project/.claude/skills/decimal/SKILL.md +49 -0
  128. package/src/ai/project/.claude/skills/details/SKILL.md +60 -0
  129. package/src/ai/project/.claude/skills/email/SKILL.md +42 -0
  130. package/src/ai/project/.claude/skills/field/SKILL.md +68 -0
  131. package/src/ai/project/.claude/skills/form/SKILL.md +51 -0
  132. package/src/ai/project/.claude/skills/generate-component-set/SKILL.md +80 -0
  133. package/src/ai/project/.claude/skills/generate-component-set/component-manifest.json +161 -0
  134. package/src/ai/project/.claude/skills/identify-components/SKILL.md +76 -0
  135. package/src/ai/project/.claude/skills/integer/SKILL.md +45 -0
  136. package/src/ai/project/.claude/skills/page/SKILL.md +60 -0
  137. package/src/ai/project/.claude/skills/page-widget/SKILL.md +55 -0
  138. package/src/ai/project/.claude/skills/percentage/SKILL.md +52 -0
  139. package/src/ai/project/.claude/skills/phone/SKILL.md +44 -0
  140. package/src/ai/project/.claude/skills/picklist/SKILL.md +50 -0
  141. package/src/ai/project/.claude/skills/plan-dx-component/SKILL.md +51 -0
  142. package/src/ai/project/.claude/skills/plan-dx-component/references/design-system-mapping.md +108 -0
  143. package/src/ai/project/.claude/skills/plan-dx-component/references/intake.md +146 -0
  144. package/src/ai/project/.claude/skills/plan-dx-component/references/plan-template.md +76 -0
  145. package/src/ai/project/.claude/skills/plan-dx-component/references/requirements-template.md +88 -0
  146. package/src/ai/project/.claude/skills/presentation/SKILL.md +61 -0
  147. package/src/ai/project/.claude/skills/publish-library/SKILL.md +106 -0
  148. package/src/ai/project/.claude/skills/radiobuttons/SKILL.md +51 -0
  149. package/src/ai/project/.claude/skills/review-component/SKILL.md +49 -0
  150. package/src/ai/project/.claude/skills/review-component/references/checklist.md +77 -0
  151. package/src/ai/project/.claude/skills/template/SKILL.md +60 -0
  152. package/src/ai/project/.claude/skills/text/SKILL.md +45 -0
  153. package/src/ai/project/.claude/skills/update-dx-component/SKILL.md +56 -0
  154. package/src/ai/project/.claude/skills/update-dx-component/references/maintenance.md +43 -0
  155. package/src/ai/project/.claude/skills/url/SKILL.md +46 -0
  156. package/src/ai/project/.claude/skills/validate-component/SKILL.md +78 -0
  157. package/src/ai/project/.claude/skills/validate-component/references/runtime-troubleshooting.md +56 -0
  158. package/src/ai/project/.claude/skills/validate-component/scripts/check-component.mjs +327 -0
  159. package/src/ai/project/.claude/skills/widget/SKILL.md +59 -0
  160. package/src/ai/project/.gemini/settings.json +5 -0
  161. package/src/ai/project/AGENTS.md +74 -0
  162. package/src/ai/readme-section.md +91 -0
  163. package/src/cli.js +48 -7
  164. package/src/constants.js +54 -53
  165. package/src/internal-tests.js +27 -0
  166. package/src/tasks/ai-toggle/index.js +46 -0
  167. package/src/tasks/authenticate/helper.js +38 -38
  168. package/src/tasks/authenticate/index.js +17 -15
  169. package/src/tasks/build-all/helper.js +4 -4
  170. package/src/tasks/build-all/index.js +7 -7
  171. package/src/tasks/build-comp/helper.js +17 -17
  172. package/src/tasks/build-comp/index.js +10 -10
  173. package/src/tasks/build-jest-assets/index.js +7 -9
  174. package/src/tasks/build-lib/helper.js +8 -8
  175. package/src/tasks/build-lib/index.js +8 -8
  176. package/src/tasks/bundle/builder/index.js +9 -12
  177. package/src/tasks/bundle/builder/modules.js +8 -9
  178. package/src/tasks/bundle/builder/paths.js +2 -19
  179. package/src/tasks/bundle/builder/webpack.config.js +60 -77
  180. package/src/tasks/bundle/index.js +8 -8
  181. package/src/tasks/create/index.js +35 -35
  182. package/src/tasks/create/templates/Constellation/Field/Boolean/index.tsx.mustache +1 -36
  183. package/src/tasks/create/templates/Constellation/Field/Date/date.ts.mustache +2 -2
  184. package/src/tasks/create/templates/Constellation/Field/Date/index.tsx.mustache +2 -27
  185. package/src/tasks/create/templates/Constellation/Field/DateTime/date-utils.ts.mustache +2 -2
  186. package/src/tasks/create/templates/Constellation/Field/DateTime/date.ts.mustache +2 -2
  187. package/src/tasks/create/templates/Constellation/Field/DateTime/index.tsx.mustache +2 -35
  188. package/src/tasks/create/templates/Constellation/Field/Decimal/index.tsx.mustache +3 -36
  189. package/src/tasks/create/templates/Constellation/Field/Decimal-Currency/index.tsx.mustache +4 -39
  190. package/src/tasks/create/templates/Constellation/Field/Decimal-Percentage/index.tsx.mustache +4 -53
  191. package/src/tasks/create/templates/Constellation/Field/Icon-Button-URL/index.tsx.mustache +5 -5
  192. package/src/tasks/create/templates/Constellation/Field/Integer/index.tsx.mustache +3 -36
  193. package/src/tasks/create/templates/Constellation/Field/Picklist/index.tsx.mustache +7 -42
  194. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/component-constants.ts +1 -1
  195. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/date.ts.mustache +0 -2
  196. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/embed-utils.ts.mustache +1 -1
  197. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/index.tsx.mustache +11 -11
  198. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/repeat-utils.ts.mustache +3 -13
  199. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/textformat-utils.tsx.mustache +2 -3
  200. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/utils.ts.mustache +28 -28
  201. package/src/tasks/create/templates/Constellation/Field/Picklist-RadioButtons/index.tsx.mustache +2 -2
  202. package/src/tasks/create/templates/Constellation/Field/Picklist-RadioButtons/textformat-utils.tsx.mustache +2 -3
  203. package/src/tasks/create/templates/Constellation/Field/Text/index.tsx.mustache +4 -33
  204. package/src/tasks/create/templates/Constellation/Field/Text-Email/index.tsx.mustache +3 -33
  205. package/src/tasks/create/templates/Constellation/Field/Text-Input/index.tsx.mustache +3 -31
  206. package/src/tasks/create/templates/Constellation/Field/Text-Paragraph/index.tsx.mustache +3 -31
  207. package/src/tasks/create/templates/Constellation/Field/Text-Phone/index.tsx.mustache +3 -35
  208. package/src/tasks/create/templates/Constellation/Field/Text-URL/index.tsx.mustache +3 -33
  209. package/src/tasks/create/templates/Constellation/Field/Text-URL/text-url.tsx.mustache +2 -3
  210. package/src/tasks/create/templates/Constellation/Field/TimeofDay/index.tsx.mustache +2 -35
  211. package/src/tasks/create/templates/Constellation/Field/TimeofDay/time-of-day.ts.mustache +2 -2
  212. package/src/tasks/create/templates/Constellation/Template/DETAILS/Avatar.tsx.mustache +19 -15
  213. package/src/tasks/create/templates/Constellation/Template/DETAILS/Operator.tsx.mustache +6 -6
  214. package/src/tasks/create/templates/Constellation/Template/DETAILS/demo.stories.tsx.mustache +1 -1
  215. package/src/tasks/create/templates/Constellation/Template/DETAILS/index.tsx.mustache +4 -8
  216. package/src/tasks/create/templates/Constellation/Template/DETAILS/mock.ts.mustache +9 -9
  217. package/src/tasks/create/templates/Constellation/Template/DETAILS/utils.js.mustache +4 -8
  218. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/Avatar.tsx.mustache +19 -15
  219. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/Operator.tsx.mustache +6 -6
  220. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/demo.stories.tsx.mustache +1 -1
  221. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/index.tsx.mustache +1 -1
  222. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/mock.ts.mustache +9 -9
  223. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/utils.ts.mustache +4 -8
  224. package/src/tasks/create/templates/Constellation/Template/FORM/demo.stories.tsx.mustache +8 -8
  225. package/src/tasks/create/templates/Constellation/Template/FORM-region/demo.stories.tsx.mustache +8 -8
  226. package/src/tasks/create/templates/Constellation/Template/PAGE/utils.ts.mustache +4 -9
  227. package/src/tasks/create/templates/Constellation/Widget/CASE/demo.test.tsx.mustache +3 -3
  228. package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/Avatar.tsx.mustache +19 -14
  229. package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/Operator.tsx.mustache +6 -6
  230. package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/index.tsx.mustache +1 -1
  231. package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/mock.ts.mustache +1 -1
  232. package/src/tasks/create/templates/Launchpad/Field/Icon-Button-URL/index.tsx.mustache +5 -5
  233. package/src/tasks/create/templates/Launchpad/Field/Text-Phone/index.tsx.mustache +3 -35
  234. package/src/tasks/create/templates/Launchpad/Field/__components.md +1 -1
  235. package/src/tasks/create/templates/Launchpad/Template/FORM/demo.stories.tsx.mustache +8 -8
  236. package/src/tasks/create/templates/Launchpad/Template/FORM-region/demo.stories.tsx.mustache +8 -8
  237. package/src/tasks/create/templates/Launchpad/Widget/CASE/demo.test.tsx.mustache +3 -3
  238. package/src/tasks/create/templates/Launchpad/Widget/PAGE-CASE/index.tsx.mustache +1 -1
  239. package/src/tasks/create/templates/Launchpad/Widget/PAGE-CASE/mock.ts.mustache +1 -1
  240. package/src/tasks/create-all/index.js +42 -41
  241. package/src/tasks/create-lib/helper.js +13 -13
  242. package/src/tasks/create-lib/index.js +5 -5
  243. package/src/tasks/create-version/helper.js +10 -10
  244. package/src/tasks/create-version/index.js +3 -4
  245. package/src/tasks/delete/helper.js +20 -19
  246. package/src/tasks/delete/index.js +2 -2
  247. package/src/tasks/delete-all/helper.js +26 -25
  248. package/src/tasks/delete-all/index.js +2 -2
  249. package/src/tasks/delete-lib/helper.js +6 -6
  250. package/src/tasks/delete-lib/index.js +6 -6
  251. package/src/tasks/delete-pub/helper.js +18 -18
  252. package/src/tasks/delete-pub/index.js +8 -8
  253. package/src/tasks/delete-version/index.js +2 -2
  254. package/src/tasks/dev-server/index.js +1 -1
  255. package/src/tasks/export-archive/helper.js +21 -21
  256. package/src/tasks/export-archive/index.js +27 -40
  257. package/src/tasks/export-rc/helper.js +34 -34
  258. package/src/tasks/export-rc/index.js +21 -31
  259. package/src/tasks/import-archive/helper.js +39 -39
  260. package/src/tasks/import-archive/index.js +69 -89
  261. package/src/tasks/import-comp/helper.js +8 -8
  262. package/src/tasks/import-comp/index.js +30 -42
  263. package/src/tasks/index.js +5 -0
  264. package/src/tasks/init/Node.gitignore +149 -0
  265. package/src/tasks/init/helper.js +15 -8
  266. package/src/tasks/init/index.js +115 -35
  267. package/src/tasks/init/template/.prettierrc.json +4 -1
  268. package/src/tasks/init/template/.storybook/main.ts +1 -4
  269. package/src/tasks/init/template/.storybook/manager.ts +1 -1
  270. package/src/tasks/init/template/.storybook/preview.tsx +2 -2
  271. package/src/tasks/init/template/.storybook/theme.js +1 -1
  272. package/src/tasks/init/template/.vscode/extensions.json +0 -1
  273. package/src/tasks/init/template/README.md +2 -2
  274. package/src/tasks/init/template/eslint.config.mjs +13 -155
  275. package/src/tasks/init/template/jest.config.cjs +2 -0
  276. package/src/tasks/init/template/package-lock.json +26864 -0
  277. package/src/tasks/init/template/package.json.mustache +19 -74
  278. package/src/tasks/init/template/setupTests.ts +10 -4
  279. package/src/tasks/init/template/tsconfig.json +14 -6
  280. package/src/tasks/internal-test/index.js +21 -0
  281. package/src/tasks/internal-test-full/index.js +15 -0
  282. package/src/tasks/internal-test-functional/index.js +15 -0
  283. package/src/tasks/internal-test-unit/index.js +13 -0
  284. package/src/tasks/linter/index.js +2 -2
  285. package/src/tasks/list/helper.js +41 -40
  286. package/src/tasks/list/index.js +3 -3
  287. package/src/tasks/list-lib/helper.js +5 -5
  288. package/src/tasks/list-lib/index.js +8 -8
  289. package/src/tasks/list-pub/helper.js +23 -16
  290. package/src/tasks/list-pub/index.js +24 -21
  291. package/src/tasks/move/helper.js +8 -8
  292. package/src/tasks/move/index.js +19 -23
  293. package/src/tasks/promote-webpack/index.js +4 -4
  294. package/src/tasks/promote-webpack/webpack.config.js +62 -93
  295. package/src/tasks/publish/helper.js +21 -21
  296. package/src/tasks/publish/index.js +16 -16
  297. package/src/tasks/publish-all/helper.js +20 -20
  298. package/src/tasks/publish-all/index.js +11 -12
  299. package/src/tasks/publish-archive/helper.js +9 -9
  300. package/src/tasks/publish-archive/index.js +12 -14
  301. package/src/tasks/publish-lib/helper.js +3 -3
  302. package/src/tasks/publish-lib/index.js +28 -34
  303. package/src/tasks/quarantine/index.js +8 -8
  304. package/src/tasks/rename/index.js +26 -30
  305. package/src/tasks/rename-lib/index.js +21 -25
  306. package/src/tasks/restore/index.js +8 -8
  307. package/src/tasks/restore-config/index.js +3 -5
  308. package/src/tasks/set-perm/index.js +8 -8
  309. package/src/tasks/show-help/index.js +17 -9
  310. package/src/tasks/show-status/index.js +2 -2
  311. package/src/tasks/store/index.js +8 -8
  312. package/src/tasks/switch-lib/helper.js +7 -7
  313. package/src/tasks/switch-lib/index.js +7 -7
  314. package/src/tasks/switch-version/helper.js +6 -6
  315. package/src/tasks/switch-version/index.js +7 -7
  316. package/src/tasks/update/index.js +1 -1
  317. package/src/tasks/upgrade/index.js +7 -7
  318. package/src/tasks/validator/index.js +49 -203
  319. package/src/util.js +169 -186
  320. package/src/rules/no-pcore-pconnect-in-presentation.js +0 -103
  321. package/src/tasks/init/template/.stylelintrc.json +0 -4
  322. package/src/tasks/init/template/babel.config.cjs +0 -22
  323. package/src/tasks/init/template/cspell.json +0 -14
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: pconnect-lists-and-views
3
+ description: 'Reference catalog and cookbook for PCore/PConnect APIs governing lists, containers, and view state — ListActions, ContainerManager, ContainerUtils, and PersonalizationUtils — with recipes for editing a repeating row with validation, personalizing and restoring a saved list view, managing non-assignment container item lifecycle, inserting/deleting list rows, reordering list rows, and switching between container items with an unsaved-changes guard. Use when you need the exact signature for these APIs, or the correct order to call them to edit list rows or manage container items.'
4
+ user-invocable: true
5
+ argument-hint: 'Use when editing a repeating row/table, saving or restoring a personalized list view, or adding/closing items in a non-assignment container — for the exact ListActions/ContainerManager/ContainerUtils/PersonalizationUtils signature, or the correct call order.'
6
+ metadata:
7
+ verified-against: 'latest 26.x'
8
+ ---
9
+
10
+ # Lists, Containers & Views — PCore/PConnect Skill
11
+
12
+ This skill covers the PCore/PConnect APIs and recipes for **lists, containers, and view state**: repeating row edits, saved list view personalization, and non-assignment container item lifecycle. It is one of the PCore/PConnect API skills — see the [skills index](../README.md) for the full method catalog, architecture primer, and the other five skills.
13
+
14
+ ## When to Use This Skill
15
+
16
+ Load this skill when:
17
+
18
+ - You need the exact parameters, return type, or purpose of a `ListActions`, `ContainerManager`, `ContainerUtils`, or `PersonalizationUtils` method.
19
+ - You're validating and updating a field within a repeating row/table (not a top-level form).
20
+ - You're letting users save/restore a personalized sort, filter, or column configuration for a list.
21
+ - You're adding a non-assignment view to a multi-item container (for example, a side panel) without losing items already open.
22
+
23
+ If your task is about submitting an assignment inside a modal container, see [pconnect-assignment-lifecycle](../pconnect-assignment-lifecycle/SKILL.md) instead — that skill covers the single-assignment modal submit flow.
24
+
25
+ New to PCore/PConnect? Start with [Architecture at a Glance](../references/architecture-overview.md).
26
+
27
+ ## Key Reference Files
28
+
29
+ | File | Class(es) | Obtained via |
30
+ | ------------------------------------------------------------------------------------------------------ | --------------------------------------- | --------------------------------- |
31
+ | [../references/pconnect-list-actions.md](../references/pconnect-list-actions.md) | `ListActions` | `pConn.getListActions()` |
32
+ | [../references/pconnect-container-manager.md](../references/pconnect-container-manager.md) | `ContainerManager` | `pConn.getContainerManager()` |
33
+ | [../references/pcore-case-collaboration-details.md](../references/pcore-case-collaboration-details.md) | `ContainerUtils` | `PCore.getContainerUtils()` |
34
+ | [../references/pcore-case-collaboration-genai.md](../references/pcore-case-collaboration-genai.md) | `PersonalizationUtils` (accessor-level) | `PCore.getPersonalizationUtils()` |
35
+
36
+ See the [full reference index](../README.md) for every other PCore/PConnect method not directly related to this skill's topic.
37
+
38
+ ## Cookbooks
39
+
40
+ Multi-method, ordering/cleanup recipes for this skill's topic live in [cookbooks/README.md](./cookbooks/README.md): editing a repeating row with validation, saved list view personalization, non-assignment container item lifecycle, inserting/deleting list rows, reordering list rows, and switching between container items with an unsaved-changes guard.
41
+
42
+ Use the reference files above for a single method's signature. Use the cookbook index when you need the **order** multiple methods should be called in to complete a task.
43
+
44
+ For testing components that call these APIs, security considerations, performance (batching row operations, virtualizing long lists), or troubleshooting a personalization/container issue that isn't behaving as documented, see [Cross-Cutting Best Practices](../best-practices/README.md).
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: Lists, Containers & Views Cookbook — Recipe Index
3
+ description: Multi-method recipes for repeating row edits, list view personalization, and container item lifecycle, indexed by symptom/keyword and primary method for AI/RAG retrieval.
4
+ ---
5
+
6
+ # Cookbook: Lists, Containers & Views
7
+
8
+ > Part of the [Lists, Containers & Views skill](../SKILL.md).
9
+
10
+ Every file in [`../../references/`](../../references/) documents one method at a time. Each file in this folder shows how to **chain multiple documented methods together** to complete one common real-world task. Every recipe only uses methods already cataloged in `references/` — follow the links in each recipe for full signatures. Nothing here invents a new API; every call is a direct composition of already-documented methods.
11
+
12
+ Each recipe is a single, self-contained file with:
13
+
14
+ - YAML frontmatter (`keywords`, `primary_methods`, `related`) for structured/metadata search.
15
+ - A **Problem** statement — what you're trying to accomplish, in plain language.
16
+ - A **Solution** — the minimal correct code, linking to the individual reference files for each method used.
17
+ - A **Discussion** — the ordering/cleanup/gotcha pitfall that makes this worth documenting as a recipe instead of assembling from scratch.
18
+ - **Related recipes** — links to recipes that share a pattern (lifecycle, cleanup, error handling, etc.), including recipes in sibling skills.
19
+
20
+ ## Recipe Index
21
+
22
+ Search by symptom or keyword before assembling a sequence of calls from scratch — there is a good chance the ordering/cleanup pitfalls have already been worked out below.
23
+
24
+ | Recipe | Keywords | Primary methods |
25
+ | ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------- | ------------------------------------ |
26
+ | [Repeating row edit](./repeating-row-edit.md) | table row, grid, embedded list, inline edit, field-level validation | `ListActions`, `ValidationApi` |
27
+ | [Saved list view personalization](./view-personalization.md) | saved view, personalization, sort filter preference, remember columns | `PersonalizationUtils` |
28
+ | [Container item lifecycle](./container-item-lifecycle.md) | utility container, side panel, non-assignment view, multiple container, dirty check | `ContainerManager`, `ContainerUtils` |
29
+ | [Insert and delete list rows](./insert-delete-list-rows.md) | add row, remove row, insert row, delete row, dynamic list, embedded list | `ListActions` |
30
+ | [Reorder list rows](./reorder-list-rows.md) | reorder, drag and drop, move row, priority list, sequence | `ListActions` |
31
+ | [Switch container items with an unsaved-changes guard](./activate-and-switch-container-items.md) | tabs, switch tab, side panel, active item, unsaved changes guard | `ContainerManager`, `ContainerUtils` |
32
+
33
+ Use the individual reference files in [`../../references/`](../../references/) to look up a single method's exact signature. Use a recipe here when you need to know the **order** multiple methods should be called in to complete a task.
34
+
35
+ As more cookbooks are added, add one file per recipe (not more content to an existing recipe file) and a row here — see any existing recipe file for the expected frontmatter/structure.
@@ -0,0 +1,52 @@
1
+ ---
2
+ title: Switch between container items with an unsaved-changes guard
3
+ keywords: [tabs, switch tab, side panel, active item, unsaved changes guard, dirty check]
4
+ primary_methods:
5
+ [
6
+ ContainerManager.activateContainerItem,
7
+ ContainerManager.hasContainerItems,
8
+ ContainerUtils.isContainerDirty,
9
+ ContainerUtils.getActiveContainerItemName
10
+ ]
11
+ related: [container-item-lifecycle]
12
+ ---
13
+
14
+ # Recipe: Switch between container items with an unsaved-changes guard
15
+
16
+ > Part of the [Lists, Containers & Views cookbook](./README.md) — [skill overview](../SKILL.md).
17
+
18
+ ## Problem
19
+
20
+ A container hosts several items at once (for example, tabs or a multi-document side panel), and switching the active item should warn the user first if the currently active item has unsaved changes.
21
+
22
+ ## Solution
23
+
24
+ Uses [`ContainerManager`](../../references/pconnect-container-manager.md) and `ContainerUtils` (via `PCore.getContainerUtils()`, see [pcore-case-collaboration-details.md](../../references/pcore-case-collaboration-details.md)).
25
+
26
+ ```typescript
27
+ async function onSwitchTab(targetContainerItemID, targetName) {
28
+ const containerManager = pConn.getContainerManager();
29
+ const containerUtils = PCore.getContainerUtils();
30
+
31
+ if (!containerManager.hasContainerItems()) return;
32
+
33
+ const activeItemName = containerUtils.getActiveContainerItemName(targetName);
34
+ if (activeItemName && containerUtils.isContainerDirty(activeItemName)) {
35
+ const confirmed = await confirmSwitchAwayFromUnsavedTab();
36
+ if (!confirmed) return;
37
+ }
38
+
39
+ await containerManager.activateContainerItem({ containerItemID: targetContainerItemID });
40
+ }
41
+ ```
42
+
43
+ ## Discussion
44
+
45
+ **MUST** check `hasContainerItems` before calling `getActiveContainerItemName`/`isContainerDirty` on a container that may not have any items yet — calling them on an empty container is a common source of an unhelpful "no active item" branch being reached silently instead of being guarded against explicitly.
46
+
47
+ **SHOULD** reuse the same confirmation pattern as [Show a custom confirmation dialog before a destructive action](../../pconnect-assignment-lifecycle/cookbooks/confirm-before-destructive-action.md) rather than a one-off `window.confirm`, so switching away from unsaved work is visually consistent with other destructive/interrupting confirmations in the app.
48
+
49
+ ## Related recipes
50
+
51
+ - [Add a non-assignment view to a multi-item container without losing existing items](./container-item-lifecycle.md)
52
+ - [Show a custom confirmation dialog before a destructive action](../../pconnect-assignment-lifecycle/cookbooks/confirm-before-destructive-action.md)
@@ -0,0 +1,61 @@
1
+ ---
2
+ title: Add a non-assignment view to a multi-item container without losing existing items
3
+ keywords:
4
+ [
5
+ utility container,
6
+ side panel,
7
+ non-assignment view,
8
+ multiple container,
9
+ addContainerItem,
10
+ dirty check,
11
+ closeContainerItem
12
+ ]
13
+ primary_methods:
14
+ [
15
+ ContainerManager.initializeContainers,
16
+ ContainerManager.addContainerItem,
17
+ ContainerUtils.isContainerInitialized,
18
+ ContainerUtils.closeContainerItem
19
+ ]
20
+ related: [modal-assignment-submit, full-form-validation]
21
+ ---
22
+
23
+ # Recipe: Add a non-assignment view to a multi-item container without losing existing items
24
+
25
+ > Part of the [Lists, Containers & Views cookbook](./README.md) — [skill overview](../SKILL.md).
26
+
27
+ ## Problem
28
+
29
+ A custom shell wants a "multiple" container (for example, a side panel that can hold several open items at once, like a document comparison view) that can add arbitrary views — not just assignments — without wiping out items a user already has open, and that checks for unsaved changes before closing one.
30
+
31
+ ## Solution
32
+
33
+ Uses [`ContainerManager`](../../references/pconnect-container-manager.md) and `ContainerUtils` (via `PCore.getContainerUtils()`, see [pcore-case-collaboration-details.md](../../references/pcore-case-collaboration-details.md)).
34
+
35
+ ```typescript
36
+ const containerManager = pConn.getContainerManager();
37
+ const containerUtils = PCore.getContainerUtils();
38
+
39
+ if (!containerUtils.isContainerInitialized(context, containerName)) {
40
+ await containerManager.initializeContainers({ type: 'multiple', name: containerName });
41
+ }
42
+
43
+ await containerManager.addContainerItem({ context, semanticURL: '' });
44
+
45
+ // Later, when the user closes one item:
46
+ async function onCloseItem(containerItemID: string) {
47
+ if (containerUtils.isContainerDirty(containerItemID) && !(await confirmDiscard())) return;
48
+ await containerUtils.closeContainerItem(containerItemID, { skipDirtyCheck: true });
49
+ }
50
+ ```
51
+
52
+ ## Discussion
53
+
54
+ **NEVER** call `initializeContainers` unconditionally before every `addContainerItem` — for a `multiple` container, re-initializing resets the items a user already has open. **ALWAYS** guard it with `isContainerInitialized` first.
55
+
56
+ `closeContainerItem` (on `ContainerUtils`) and `removeContainerItem` (on `ContainerManager`) are not interchangeable: `closeContainerItem` performs the dirty check itself unless you pass `skipDirtyCheck`, which is why this recipe checks `isContainerDirty` up front and then explicitly skips the built-in check to avoid asking the user twice.
57
+
58
+ ## Related recipes
59
+
60
+ - [Open an assignment in a modal, edit, validate, submit, and close](../../pconnect-assignment-lifecycle/cookbooks/modal-assignment-submit.md)
61
+ - [Full-form validation before submit](../../pconnect-forms-and-fields/cookbooks/full-form-validation.md)
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: Insert and delete rows in an embedded list
3
+ keywords: [add row, remove row, insert row, delete row, dynamic list, embedded list]
4
+ primary_methods: [ListActions.insert, ListActions.deleteEntry]
5
+ related: [repeating-row-edit, reorder-list-rows]
6
+ ---
7
+
8
+ # Recipe: Insert and delete rows in an embedded list
9
+
10
+ > Part of the [Lists, Containers & Views cookbook](./README.md) — [skill overview](../SKILL.md).
11
+
12
+ ## Problem
13
+
14
+ An embedded/repeating list needs an "Add row" and "Remove row" affordance — inserting a new row at a specific position, or deleting an existing one — distinct from editing a field within an existing row.
15
+
16
+ ## Solution
17
+
18
+ Uses [`ListActions`](../../references/pconnect-list-actions.md).
19
+
20
+ ```typescript
21
+ function onAddRowClick(newRowDefaults) {
22
+ // Inserts at index 0 so the newest row appears first; use the list's current length to append instead.
23
+ pConn.getListActions().insert(newRowDefaults, 0);
24
+ }
25
+
26
+ function onRemoveRowClick(rowIndex) {
27
+ pConn.getListActions().deleteEntry(rowIndex);
28
+ }
29
+ ```
30
+
31
+ ## Discussion
32
+
33
+ **MUST** pass a complete-enough `payload` to `insert` so the new row renders without missing required fields — unlike `update`/`updateProperty`, there's no existing row data to fall back on for fields the payload omits.
34
+
35
+ **SHOULD** re-validate any fields whose validity depends on row count or ordering (for example, "at least one row required") after a `deleteEntry` call — deleting a row can flip a form from valid to invalid without any field-level `validate()` call being triggered on its own.
36
+
37
+ ## Related recipes
38
+
39
+ - [Edit a repeating row with validation, then save](./repeating-row-edit.md)
40
+ - [Reorder rows in a list](./reorder-list-rows.md)
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: Reorder rows in a list
3
+ keywords: [reorder, drag and drop, move row, priority list, sequence]
4
+ primary_methods: [ListActions.reorder]
5
+ related: [insert-delete-list-rows]
6
+ ---
7
+
8
+ # Recipe: Reorder rows in a list
9
+
10
+ > Part of the [Lists, Containers & Views cookbook](./README.md) — [skill overview](../SKILL.md).
11
+
12
+ ## Problem
13
+
14
+ A list where row order itself is meaningful (a priority queue, a ranked sequence of steps) needs to support moving a row to a new position, whether via drag-and-drop or explicit "move up"/"move down" controls.
15
+
16
+ ## Solution
17
+
18
+ Uses [`ListActions`](../../references/pconnect-list-actions.md).
19
+
20
+ ```typescript
21
+ function onDropRow(fromIndex, toIndex) {
22
+ pConn.getListActions().reorder(fromIndex, toIndex);
23
+ }
24
+
25
+ function onMoveUpClick(index) {
26
+ if (index === 0) return;
27
+ pConn.getListActions().reorder(index, index - 1);
28
+ }
29
+ ```
30
+
31
+ ## Discussion
32
+
33
+ **MUST** compute `fromIndex`/`toIndex` from the list's current in-memory order at the moment of the call, not from a stale index captured earlier in the render — if the list can change between when a drag starts and when it's dropped (for example, another user's real-time update arrives mid-drag), a stale index reorders the wrong row.
34
+
35
+ **SHOULD** treat `reorder` as void/fire-and-forget for the row data itself, but still re-render from the updated list state rather than optimistically re-ordering local component state independently — `reorder` already updates the underlying store, so a separately-maintained local copy can drift out of sync.
36
+
37
+ ## Related recipes
38
+
39
+ - [Insert and delete rows in an embedded list](./insert-delete-list-rows.md)
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: Edit a repeating row with validation, then save
3
+ keywords: [table row, grid, embedded list, inline edit, field-level validation]
4
+ primary_methods: [ValidationApi.validate, ListActions.updateProperty]
5
+ related: [bulk-action-submit, full-form-validation]
6
+ ---
7
+
8
+ # Recipe: Edit a repeating row with validation, then save
9
+
10
+ > Part of the [Lists, Containers & Views cookbook](./README.md) — [skill overview](../SKILL.md).
11
+
12
+ ## Problem
13
+
14
+ A field within a repeating row (table/grid) needs to be validated before the row's underlying data is updated.
15
+
16
+ ## Solution
17
+
18
+ Uses [`ListActions`](../../references/pconnect-list-actions.md) and [`ValidationApi`](../../references/pconnect-validation-api.md).
19
+
20
+ ```typescript
21
+ const result = pConn.getValidationApi().validate(newExperienceValue, '.Experience');
22
+
23
+ if (result.status) {
24
+ pConn.getListActions().updateProperty('.Experience', newExperienceValue);
25
+ } else {
26
+ // result.message contains the validation error to display on the row.
27
+ }
28
+ ```
29
+
30
+ ## Discussion
31
+
32
+ `validate()` (unlike `validateEmail()`) writes the error directly into application state, so the field itself will show `result.message` without extra wiring.
33
+
34
+ The 5.1.0 typedefs type `updateProperty`'s `value` as `GenericObject | undefined` (`Record<string, unknown>`), so a primitive value needs a cast to compile — for example `newExperienceValue as unknown as Record<string, unknown>`.
35
+
36
+ ## Related recipes
37
+
38
+ - [Bulk-submit selected rows from a list](../../pconnect-assignment-lifecycle/cookbooks/bulk-action-submit.md)
39
+ - [Validate an entire form before allowing submit](../../pconnect-forms-and-fields/cookbooks/full-form-validation.md)
@@ -0,0 +1,60 @@
1
+ ---
2
+ title: Let end users save and restore a personalized list view
3
+ keywords: [saved view, personalization, sort filter preference, remember columns, list view]
4
+ primary_methods:
5
+ [
6
+ PCore.getPersonalizationUtils,
7
+ PersonalizationUtils.fetchPersonalizations,
8
+ PersonalizationUtils.createPersonalization,
9
+ PersonalizationUtils.updatePersonalization
10
+ ]
11
+ related: [repeating-row-edit]
12
+ ---
13
+
14
+ # Recipe: Let end users save and restore a personalized list view
15
+
16
+ > Part of the [Lists, Containers & Views cookbook](./README.md) — [skill overview](../SKILL.md).
17
+
18
+ ## Problem
19
+
20
+ A list/table component wants to let users save their current sort/filter/column configuration and reapply it later, without inventing a custom storage mechanism.
21
+
22
+ ## Solution
23
+
24
+ Uses `PCore.getPersonalizationUtils(listID)` (see [pcore-case-collaboration-genai.md](../../references/pcore-case-collaboration-genai.md)).
25
+
26
+ ```typescript
27
+ const personalizationUtils = PCore.getPersonalizationUtils(listComponentID);
28
+
29
+ // Resolves to a PersonalizationStore — { allPersonalizations, defaultPersonalization } — or an AxiosResponse wrapping one.
30
+ // allPersonalizations is either RawPersonalization[] (each with name, personalizationID, personalizationState)
31
+ // or a Personalizations map keyed by personalization key.
32
+ const savedViews = await personalizationUtils.fetchPersonalizations();
33
+
34
+ // Types below are from the typedefs' rules/types.d.ts.
35
+ async function saveCurrentView(
36
+ personalizationID: string,
37
+ name: string,
38
+ personalizationState: PersonalizationState,
39
+ alreadySaved: boolean // decide this from `savedViews`
40
+ ) {
41
+ const info: CreatePersonalizationInfo = { name, personalizationState, markAsDefault: false };
42
+ if (alreadySaved) {
43
+ await personalizationUtils.updatePersonalization(personalizationID, info);
44
+ } else {
45
+ await personalizationUtils.createPersonalization(personalizationID, info);
46
+ }
47
+ }
48
+ ```
49
+
50
+ `createPersonalization` and `updatePersonalization` both take `(personalizationID: string, personalizedState: CreatePersonalizationInfo)`, where `CreatePersonalizationInfo` is `{ name: string; personalizationState: PersonalizationState; markAsDefault: boolean; markAsAppDefault?: boolean }`. The typedefs do not say how a new `personalizationID` is chosen.
51
+
52
+ ## Discussion
53
+
54
+ **MUST** keep `listComponentID` stable and unique per list instance (limited to 32 characters). **NEVER** reuse the same ID for two different list components on the same view — their saved personalizations will silently overwrite each other.
55
+
56
+ A falsy `listComponentID` doesn't throw — `getPersonalizationUtils` returns safe no-op stubs instead, so a "Save view" button can appear to work while doing nothing. **ALWAYS** confirm `listComponentID` resolved to a real value before wiring one up.
57
+
58
+ ## Related recipes
59
+
60
+ - [Repeating row edit](./repeating-row-edit.md)
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: pconnect-navigation-locale-genai
3
+ description: 'Reference catalog and cookbook for PCore/PConnect APIs governing navigation, localization, and GenAI Assistant integration — SemanticUrlUtils, NavigationUtils, PCore.switchLocale, LocalizationService, and GenAIAssistantUtils — with recipes for building a shareable deep link, switching locale and re-resolving labels, starting a GenAI Assistant conversation, persisting operator preferences, keeping filter/sort state bookmarkable in the URL, and starting an Agent conversation for task automation. Use when you need the exact signature for these APIs, or the correct order to call them for deep linking, localization, or GenAI conversations.'
4
+ user-invocable: true
5
+ argument-hint: 'Use when building a shareable deep link/semantic URL, switching the active locale and re-resolving labels, or starting a GenAI Assistant conversation — for the exact SemanticUrlUtils/PCore.switchLocale/GenAIAssistantUtils signature, or the correct call order.'
6
+ metadata:
7
+ verified-against: 'latest 26.x'
8
+ ---
9
+
10
+ # Navigation, Locale & GenAI — PCore/PConnect Skill
11
+
12
+ This skill covers the PCore/PConnect APIs and recipes for **navigation, localization, and GenAI Assistant integration**: shareable deep links, locale switching, and GenAI Assistant conversations. It is one of the PCore/PConnect API skills — see the [skills index](../README.md) for the full method catalog, architecture primer, and the other five skills.
13
+
14
+ ## When to Use This Skill
15
+
16
+ Load this skill when:
17
+
18
+ - You need the exact parameters, return type, or purpose of a `SemanticUrlUtils`, `NavigationUtils` (URL params), `PCore.switchLocale`, `LocalizationService`, or `GenAIAssistantUtils` method.
19
+ - You're building a shareable/bookmarkable URL to a specific case or assignment, or reading an identifier back out of the current URL.
20
+ - You're switching the operator's active locale at runtime and need to refresh already-resolved label text.
21
+ - You're starting or continuing a conversation with a configured GenAI Assistant or Agent.
22
+
23
+ If your task is about persisting a custom widget's own UI state (not the URL) across navigation, see [pconnect-forms-and-fields](../pconnect-forms-and-fields/SKILL.md) instead.
24
+
25
+ New to PCore/PConnect? Start with [Architecture at a Glance](../references/architecture-overview.md).
26
+
27
+ ## Key Reference Files
28
+
29
+ | File | Class(es) | Obtained via |
30
+ | ------------------------------------------------------------------------------------------------------------------------ | --------------------------------- | -------------------------------- |
31
+ | [../references/pcore-messaging-details.md](../references/pcore-messaging-details.md) | `SemanticUrlUtils` | `PCore.getSemanticUrlUtils()` |
32
+ | [../references/pcore-misc-details.md](../references/pcore-misc-details.md) | `NavigationUtils` | `PCore.getNavigationUtils()` |
33
+ | [../references/pcore-environment-locale-namespace.md](../references/pcore-environment-locale-namespace.md) | Locale switching (accessor-level) | `PCore.switchLocale()` |
34
+ | [../references/pconnect-case-info-data-info-localization.md](../references/pconnect-case-info-data-info-localization.md) | `LocalizationService` | `pConn.getLocalizationService()` |
35
+ | [../references/pcore-analytics-genai-details.md](../references/pcore-analytics-genai-details.md) | `GenAIAssistantUtils` | `PCore.getGenAIAssistantUtils()` |
36
+
37
+ See the [full reference index](../README.md) for every other PCore/PConnect method not directly related to this skill's topic.
38
+
39
+ ## Cookbooks
40
+
41
+ Multi-method, ordering/cleanup recipes for this skill's topic live in [cookbooks/README.md](./cookbooks/README.md): building a shareable deep link, switching locale and re-resolving labels, starting a GenAI Assistant conversation, persisting operator preferences, keeping filter/sort state bookmarkable in the URL, and starting an Agent conversation for task automation.
42
+
43
+ Use the reference files above for a single method's signature. Use the cookbook index when you need the **order** multiple methods should be called in to complete a task.
44
+
45
+ For testing components that call these APIs, security considerations (deep links, sanitizing GenAI Assistant responses, prompt injection), performance/resiliency for GenAI calls, dedicated GenAI Assistant conversation-integration patterns, accessible focus management after a locale/navigation change, or troubleshooting a call that isn't behaving as documented, see [Cross-Cutting Best Practices](../best-practices/README.md).
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: Navigation, Locale & GenAI Cookbook — Recipe Index
3
+ description: Multi-method recipes for deep links, locale switching, and GenAI Assistant conversations, indexed by symptom/keyword and primary method for AI/RAG retrieval.
4
+ ---
5
+
6
+ # Cookbook: Navigation, Locale & GenAI
7
+
8
+ > Part of the [Navigation, Locale & GenAI skill](../SKILL.md).
9
+
10
+ Every file in [`../../references/`](../../references/) documents one method at a time. Each file in this folder shows how to **chain multiple documented methods together** to complete one common real-world task. Every recipe only uses methods already cataloged in `references/` — follow the links in each recipe for full signatures. Nothing here invents a new API; every call is a direct composition of already-documented methods.
11
+
12
+ Each recipe is a single, self-contained file with:
13
+
14
+ - YAML frontmatter (`keywords`, `primary_methods`, `related`) for structured/metadata search.
15
+ - A **Problem** statement — what you're trying to accomplish, in plain language.
16
+ - A **Solution** — the minimal correct code, linking to the individual reference files for each method used.
17
+ - A **Discussion** — the ordering/cleanup/gotcha pitfall that makes this worth documenting as a recipe instead of assembling from scratch.
18
+ - **Related recipes** — links to recipes that share a pattern (lifecycle, cleanup, error handling, etc.), including recipes in sibling skills.
19
+
20
+ ## Recipe Index
21
+
22
+ Search by symptom or keyword before assembling a sequence of calls from scratch — there is a good chance the ordering/cleanup pitfalls have already been worked out below.
23
+
24
+ | Recipe | Keywords | Primary methods |
25
+ | ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------- | ------------------------------------------- |
26
+ | [Deep link to a case or assignment](./deep-link-semantic-url.md) | deep link, semantic URL, shareable link, permalink, bookmark, query param | `SemanticUrlUtils`, `NavigationUtils` |
27
+ | [Locale switch and re-localize](./locale-switch-and-relocalize.md) | locale switch, language change, i18n, localization, hot reload | `PCore.switchLocale`, `LocalizationService` |
28
+ | [GenAI Assistant conversation](./genai-assistant-conversation.md) | chatbot, GenAI, coach, conversation, assistant | `GenAIAssistantUtils` |
29
+ | [Store and restore operator preferences](./persist-operator-preferences.md) | user settings, operator preferences, persist settings, remember preference | `NavigationUtils` |
30
+ | [Keep filter/sort state bookmarkable in the URL](./bookmarkable-filter-state.md) | bookmarkable filters, URL state, query parameters, shareable filtered view | `NavigationUtils` |
31
+ | [Start an Agent conversation for task automation](./agent-conversation-for-tasks.md) | agent, task automation, GenAI agent, agent conversation, like agent message | `GenAIAssistantUtils` |
32
+
33
+ Use the individual reference files in [`../../references/`](../../references/) to look up a single method's exact signature. Use a recipe here when you need to know the **order** multiple methods should be called in to complete a task.
34
+
35
+ As more cookbooks are added, add one file per recipe (not more content to an existing recipe file) and a row here — see any existing recipe file for the expected frontmatter/structure.
@@ -0,0 +1,54 @@
1
+ ---
2
+ title: Start an Agent conversation for task automation
3
+ keywords: [agent, task automation, GenAI agent, agent conversation, like agent message]
4
+ primary_methods:
5
+ [
6
+ GenAIAssistantUtils.createConversationForAgent,
7
+ GenAIAssistantUtils.sendMessageForAgent,
8
+ GenAIAssistantUtils.getMessagesForAgent,
9
+ GenAIAssistantUtils.likeAgentMessage
10
+ ]
11
+ related: [genai-assistant-conversation]
12
+ ---
13
+
14
+ # Recipe: Start an Agent conversation for task automation
15
+
16
+ > Part of the [Navigation, Locale & GenAI cookbook](./README.md) — [skill overview](../SKILL.md).
17
+
18
+ ## Problem
19
+
20
+ A component needs to hand off a task to a configured Agent (for example, "resolve this case" automation) rather than a conversational GenAI Assistant — a distinct API surface from [Start and continue a GenAI Assistant conversation](./genai-assistant-conversation.md).
21
+
22
+ ## Solution
23
+
24
+ Uses `GenAIAssistantUtils` (via `PCore.getGenAIAssistantUtils()`, see [pcore-analytics-genai-details.md](../../references/pcore-analytics-genai-details.md)).
25
+
26
+ ```typescript
27
+ const { createConversationForAgent, sendMessageForAgent, getMessagesForAgent, likeAgentMessage } =
28
+ PCore.getGenAIAssistantUtils();
29
+
30
+ // Resolves to a ConversationResponse — the conversation ID is on `data.ID`, not `id`.
31
+ const conversation = await createConversationForAgent(contextID, agentID, context);
32
+ const conversationID = conversation.data.ID;
33
+ await sendMessageForAgent(agentID, conversationID, taskInstruction, context);
34
+
35
+ // Re-fetch to pick up the Agent's response/result once it's ready.
36
+ // getMessagesForAgent resolves to an AxiosResponse (not an array); the payload is on `response.data`.
37
+ const response = await getMessagesForAgent(agentID, conversationID, context);
38
+
39
+ // Feedback uses the Agent-specific like/unlike methods, not the Assistant ones.
40
+ // `messageID` is the ID of the Agent message being rated, read from `response.data`.
41
+ await likeAgentMessage(agentID, conversationID, messageID, context);
42
+ ```
43
+
44
+ The 5.1.0 typedefs type `response.data` as `any`, so they do not specify the shape of the message list (or the field that holds a message ID) — confirm it against your server response.
45
+
46
+ ## Discussion
47
+
48
+ **MUST NOT** mix Assistant methods (`createConversation`, `sendMessage`, `getMessages`, `likeAgentMessage`'s Assistant counterpart) with Agent methods (`createConversationForAgent`, `sendMessageForAgent`, `getMessagesForAgent`, `likeAgentMessage`) for the same conversation — the two conversation types are tracked separately server-side, and mixing them for one conversation ID (`conversation.data.ID`) produces a conversation that neither API can fully read back.
49
+
50
+ **SHOULD** gate rendering of any Agent-conversation affordance on `PCore.getEnvironmentInfo().isGenAIEnabled()`, the same gate used for Assistant conversations — see the [GenAI Assistant integration patterns guide](../../best-practices/genai-assistant-integration-patterns.md).
51
+
52
+ ## Related recipes
53
+
54
+ - [Start and continue a GenAI Assistant conversation](./genai-assistant-conversation.md)
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: Keep filter and sort state bookmarkable in the URL
3
+ keywords: [bookmarkable filters, URL state, query parameters, shareable filtered view, filter persistence]
4
+ primary_methods: [NavigationUtils.getURLParam, NavigationUtils.setURLParam]
5
+ related: [deep-link-semantic-url]
6
+ ---
7
+
8
+ # Recipe: Keep filter and sort state bookmarkable in the URL
9
+
10
+ > Part of the [Navigation, Locale & GenAI cookbook](./README.md) — [skill overview](../SKILL.md).
11
+
12
+ ## Problem
13
+
14
+ A list/grid's filter and sort selections should be reflected in the URL's query parameters, so a user can bookmark or share the exact filtered view with a colleague — distinct from [building a semantic deep link to a case or assignment](./deep-link-semantic-url.md), which targets a specific record rather than a filter state.
15
+
16
+ ## Solution
17
+
18
+ Uses `NavigationUtils` (via `PCore.getNavigationUtils()`, see [pcore-misc-details.md](../../references/pcore-misc-details.md)).
19
+
20
+ ```typescript
21
+ const { getURLParam, setURLParam } = PCore.getNavigationUtils();
22
+
23
+ // On initial render, restore filters from the URL if present.
24
+ const initialStatus = getURLParam('status', true) ?? 'all';
25
+
26
+ function onFilterChange(newStatus) {
27
+ setURLParam('status', newStatus, true);
28
+ applyFilter(newStatus);
29
+ }
30
+ ```
31
+
32
+ ## Discussion
33
+
34
+ **MUST** pass matching `decode`/`encode` flags on the read and write sides — a value written with `encode: true` but read back with `decode: false` (or vice versa) can produce a mismatched or double-encoded value for filter text containing special characters (spaces, `&`, `#`).
35
+
36
+ **SHOULD** keep this pattern limited to shallow, display-only filter/sort state — for identifying a specific record to reopen, use [Build a shareable deep link to a specific case or assignment](./deep-link-semantic-url.md) and its semantic-URL route keys instead, since those are recognized by Constellation's own router on reload and plain query parameters are not.
37
+
38
+ ## Related recipes
39
+
40
+ - [Build a shareable deep link to a specific case or assignment](./deep-link-semantic-url.md)
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: Build a shareable deep link to a specific case or assignment
3
+ keywords: [deep link, semantic URL, shareable link, permalink, bookmark, query param]
4
+ primary_methods: [SemanticUrlUtils.getResolvedSemanticURL, SemanticUrlUtils.getActions, NavigationUtils.getURLParam]
5
+ related: [multi-step-wizard]
6
+ ---
7
+
8
+ # Recipe: Build a shareable deep link to a specific case or assignment
9
+
10
+ > Part of the [Navigation, Locale & GenAI cookbook](./README.md) — [skill overview](../SKILL.md).
11
+
12
+ ## Problem
13
+
14
+ A custom component needs to generate a URL a user can copy, bookmark, or share that reopens the exact case/assignment view, and later read that same identifying parameter back out when the app loads from that URL.
15
+
16
+ ## Solution
17
+
18
+ Uses `SemanticUrlUtils` and `NavigationUtils` (both via `PCore.get*()`, see [pcore-messaging-details.md](../../references/pcore-messaging-details.md) and [pcore-misc-details.md](../../references/pcore-misc-details.md)).
19
+
20
+ ```typescript
21
+ const { getResolvedSemanticURL, getActions } = PCore.getSemanticUrlUtils();
22
+
23
+ const shareableUrl = getResolvedSemanticURL(
24
+ getActions().ACTION_OPENWORKBYHANDLE,
25
+ { caseClassName: pConn.getCaseInfo().getClassName() },
26
+ { workID: pConn.getCaseInfo().getID() }
27
+ );
28
+
29
+ // On load, read the identifier back out of the current URL.
30
+ const workIDFromUrl = PCore.getNavigationUtils().getURLParam('workID', true);
31
+ ```
32
+
33
+ ## Discussion
34
+
35
+ **MUST** source the `routeKey` from `getActions()` rather than hardcoding a string literal. **NEVER** hardcode it — an arbitrary string produces a URL that Constellation's own router won't recognize on reload, so the "deep link" silently fails to reopen the right view when a user later pastes it into a browser. **MUST** use `getActions().ACTION_OPENWORKBYHANDLE` for a case/assignment deep link — `getActions()` does not expose an `OPEN_ASSIGNMENT` key; the supported keys are `ACTION_OPENWORKBYHANDLE`, `ACTION_SHOWDATA`, `ACTION_SHOWVIEW`, `ACTION_GETOBJECT`, `ACTION_SHOWINSIGHT`, and `ACTION_SHOWDASHBOARD`.
36
+
37
+ ## Related recipes
38
+
39
+ - [Multi-step wizard navigation with per-step save and final submit](../../pconnect-assignment-lifecycle/cookbooks/multi-step-wizard.md)