@salesforce/templates 66.5.4 → 66.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/lib/templates/project/.forceignore +3 -1
  2. package/lib/templates/project/reactb2e/AGENT.md +12 -2
  3. package/lib/templates/project/reactb2e/CHANGELOG.md +401 -0
  4. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/.forceignore +15 -0
  5. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/codegen.yml +1 -0
  6. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/eslint.config.js +44 -27
  7. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/index.html +0 -1
  8. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/package.json +7 -11
  9. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/api/accountSearchService.ts +46 -0
  10. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/api/query/distinctAccountIndustries.graphql +19 -0
  11. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/api/query/distinctAccountTypes.graphql +19 -0
  12. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/api/query/getAccountDetail.graphql +121 -0
  13. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/api/query/searchAccounts.graphql +51 -0
  14. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/pages/AccountObjectDetailPage.tsx +357 -0
  15. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/pages/AccountSearch.tsx +275 -0
  16. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/pages/Home.tsx +34 -0
  17. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/api/objectSearchService.ts +84 -0
  18. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ActiveFilters.tsx +89 -0
  19. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/FilterPanel.tsx +127 -0
  20. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ObjectBreadcrumb.tsx +66 -0
  21. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/PaginationControls.tsx +151 -0
  22. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SearchBar.tsx +41 -0
  23. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SortControl.tsx +143 -0
  24. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/BooleanFilter.tsx +94 -0
  25. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateFilter.tsx +165 -0
  26. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateRangeFilter.tsx +78 -0
  27. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/MultiSelectFilter.tsx +106 -0
  28. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/NumericRangeFilter.tsx +102 -0
  29. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SearchFilter.tsx +40 -0
  30. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SelectFilter.tsx +97 -0
  31. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/TextFilter.tsx +77 -0
  32. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useAsyncData.ts +53 -0
  33. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useCachedAsyncData.ts +183 -0
  34. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useObjectSearchParams.ts +225 -0
  35. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/debounce.ts +22 -0
  36. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/fieldUtils.ts +29 -0
  37. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/filterUtils.ts +372 -0
  38. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/sortUtils.ts +38 -0
  39. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/api/graphql-operations-types.ts +11260 -0
  40. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/app.tsx +4 -1
  41. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/appLayout.tsx +1 -1
  42. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/components/AgentforceConversationClient.tsx +33 -5
  43. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/components/alerts/status-alert.tsx +1 -1
  44. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/components/ui/badge.tsx +48 -0
  45. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/components/ui/breadcrumb.tsx +109 -0
  46. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/components/ui/calendar.tsx +232 -0
  47. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/components/ui/checkbox.tsx +32 -0
  48. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/components/ui/collapsible.tsx +33 -0
  49. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/components/ui/datePicker.tsx +127 -0
  50. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/components/ui/popover.tsx +89 -0
  51. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/components/ui/sonner.tsx +20 -0
  52. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/index.ts +3 -117
  53. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/pages/Home.tsx +10 -11
  54. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/pages/TestAccPage.tsx +1 -1
  55. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/routes.tsx +8 -20
  56. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/types/conversation.ts +14 -4
  57. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/tsconfig.json +7 -1
  58. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/vite.config.ts +17 -13
  59. package/lib/templates/project/reactb2e/_r_/skills/{webapp-react-data-visualization → building-data-visualization}/SKILL.md +3 -3
  60. package/lib/templates/project/reactb2e/_r_/skills/building-data-visualization/implementation/bar-line-chart.md +316 -0
  61. package/lib/templates/project/{reactb2x/_r_/skills/webapp-react-data-visualization → reactb2e/_r_/skills/building-data-visualization}/implementation/donut-chart.md +1 -1
  62. package/lib/templates/project/{reactb2x/_r_/skills/webapp-react → reactb2e/_r_/skills/building-react-components}/SKILL.md +21 -5
  63. package/lib/templates/project/reactb2e/_r_/skills/{webapp-csp-trusted-sites → configuring-csp-trusted-sites}/SKILL.md +1 -1
  64. package/lib/templates/project/{reactb2x/_r_/webapp-webapplication.md → reactb2e/_r_/skills/configuring-webapp-metadata/SKILL.md} +2 -3
  65. package/lib/templates/project/reactb2e/_r_/{webapp.md → skills/creating-webapp/SKILL.md} +46 -4
  66. package/lib/templates/project/reactb2e/_r_/skills/deploying-to-salesforce/SKILL.md +226 -0
  67. package/lib/templates/project/reactb2e/_r_/skills/{feature-react-file-upload-file-upload → implementing-file-upload}/SKILL.md +1 -1
  68. package/lib/templates/project/{reactb2x/_r_/skills/webapp-features → reactb2e/_r_/skills/installing-webapp-features}/SKILL.md +3 -3
  69. package/lib/templates/project/reactb2e/_r_/skills/managing-agentforce-conversation-client/SKILL.md +186 -0
  70. package/lib/templates/project/reactb2e/_r_/skills/managing-agentforce-conversation-client/references/constraints.md +134 -0
  71. package/lib/templates/project/reactb2e/_r_/skills/managing-agentforce-conversation-client/references/examples.md +132 -0
  72. package/lib/templates/project/reactb2e/_r_/skills/managing-agentforce-conversation-client/references/style-tokens.md +101 -0
  73. package/lib/templates/project/reactb2e/_r_/skills/managing-agentforce-conversation-client/references/troubleshooting.md +57 -0
  74. package/lib/templates/project/reactb2e/_r_/skills/using-salesforce-data/SKILL.md +363 -0
  75. package/lib/templates/project/reactb2e/_r_/skills/using-salesforce-data/graphql-search.sh +139 -0
  76. package/lib/templates/project/reactb2e/_r_/webapp-data.md +353 -0
  77. package/lib/templates/project/reactb2e/_r_/webapp-ui.md +16 -0
  78. package/lib/templates/project/reactb2e/eslint.config.js +7 -0
  79. package/lib/templates/project/reactb2e/package-lock.json +9995 -0
  80. package/lib/templates/project/reactb2e/package.json +12 -11
  81. package/lib/templates/project/reactb2e/scripts/setup-cli.mjs +61 -31
  82. package/lib/templates/project/reactb2e/scripts/sf-project-setup.mjs +66 -0
  83. package/lib/templates/project/reactb2x/AGENT.md +12 -2
  84. package/lib/templates/project/reactb2x/CHANGELOG.md +401 -0
  85. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/.forceignore +15 -0
  86. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/codegen.yml +1 -0
  87. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/eslint.config.js +44 -27
  88. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/index.html +0 -1
  89. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/package.json +8 -11
  90. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/api/accountSearchService.ts +46 -0
  91. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/api/query/distinctAccountIndustries.graphql +19 -0
  92. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/api/query/distinctAccountTypes.graphql +19 -0
  93. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/api/query/getAccountDetail.graphql +121 -0
  94. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/api/query/searchAccounts.graphql +51 -0
  95. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/pages/AccountObjectDetailPage.tsx +357 -0
  96. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/pages/AccountSearch.tsx +275 -0
  97. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/__examples__/pages/Home.tsx +34 -0
  98. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/api/objectSearchService.ts +84 -0
  99. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ActiveFilters.tsx +89 -0
  100. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/FilterPanel.tsx +127 -0
  101. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ObjectBreadcrumb.tsx +66 -0
  102. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/PaginationControls.tsx +151 -0
  103. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SearchBar.tsx +41 -0
  104. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SortControl.tsx +143 -0
  105. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/BooleanFilter.tsx +94 -0
  106. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateFilter.tsx +165 -0
  107. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateRangeFilter.tsx +78 -0
  108. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/MultiSelectFilter.tsx +106 -0
  109. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/NumericRangeFilter.tsx +102 -0
  110. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SearchFilter.tsx +40 -0
  111. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SelectFilter.tsx +97 -0
  112. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/TextFilter.tsx +77 -0
  113. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useAsyncData.ts +53 -0
  114. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useCachedAsyncData.ts +183 -0
  115. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useObjectSearchParams.ts +225 -0
  116. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/debounce.ts +22 -0
  117. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/fieldUtils.ts +29 -0
  118. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/filterUtils.ts +372 -0
  119. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/sortUtils.ts +38 -0
  120. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/authentication/api/userProfileApi.ts +13 -13
  121. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/authentication/layouts/privateRouteLayout.tsx +10 -2
  122. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/ChangePassword.tsx +2 -2
  123. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/ForgotPassword.tsx +2 -2
  124. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/Login.tsx +2 -2
  125. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/Profile.tsx +26 -4
  126. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/Register.tsx +2 -2
  127. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/ResetPassword.tsx +2 -2
  128. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/authentication/sessionTimeout/SessionTimeoutValidator.tsx +8 -16
  129. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/authentication/sessionTimeout/sessionTimeService.ts +30 -42
  130. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/api/graphql-operations-types.ts +11260 -0
  131. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/app.tsx +3 -1
  132. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/components/alerts/status-alert.tsx +1 -1
  133. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/components/ui/badge.tsx +48 -0
  134. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/components/ui/breadcrumb.tsx +109 -0
  135. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/components/ui/calendar.tsx +232 -0
  136. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/components/ui/checkbox.tsx +32 -0
  137. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/components/ui/collapsible.tsx +33 -0
  138. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/components/ui/datePicker.tsx +127 -0
  139. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/components/ui/popover.tsx +89 -0
  140. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/components/ui/sonner.tsx +20 -0
  141. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/pages/Home.tsx +10 -11
  142. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/routes.tsx +9 -21
  143. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/tsconfig.json +7 -1
  144. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/vite.config.ts +17 -13
  145. package/lib/templates/project/reactb2x/_p_/_m_/networks/appreacttemplateb2x.network +1 -1
  146. package/lib/templates/project/reactb2x/_r_/skills/{webapp-react-data-visualization → building-data-visualization}/SKILL.md +3 -3
  147. package/lib/templates/project/reactb2x/_r_/skills/building-data-visualization/implementation/bar-line-chart.md +316 -0
  148. package/lib/templates/project/{reactb2e/_r_/skills/webapp-react-data-visualization → reactb2x/_r_/skills/building-data-visualization}/implementation/donut-chart.md +1 -1
  149. package/lib/templates/project/{reactb2e/_r_/skills/webapp-react → reactb2x/_r_/skills/building-react-components}/SKILL.md +21 -5
  150. package/lib/templates/project/reactb2x/_r_/skills/{webapp-csp-trusted-sites → configuring-csp-trusted-sites}/SKILL.md +1 -1
  151. package/lib/templates/project/{reactb2e/_r_/webapp-webapplication.md → reactb2x/_r_/skills/configuring-webapp-metadata/SKILL.md} +2 -3
  152. package/lib/templates/project/reactb2x/_r_/{webapp.md → skills/creating-webapp/SKILL.md} +46 -4
  153. package/lib/templates/project/reactb2x/_r_/skills/deploying-to-salesforce/SKILL.md +226 -0
  154. package/lib/templates/project/reactb2x/_r_/skills/{feature-react-file-upload-file-upload → implementing-file-upload}/SKILL.md +1 -1
  155. package/lib/templates/project/{reactb2e/_r_/skills/webapp-features → reactb2x/_r_/skills/installing-webapp-features}/SKILL.md +3 -3
  156. package/lib/templates/project/reactb2x/_r_/skills/managing-agentforce-conversation-client/SKILL.md +186 -0
  157. package/lib/templates/project/reactb2x/_r_/skills/managing-agentforce-conversation-client/references/constraints.md +134 -0
  158. package/lib/templates/project/reactb2x/_r_/skills/managing-agentforce-conversation-client/references/examples.md +132 -0
  159. package/lib/templates/project/reactb2x/_r_/skills/managing-agentforce-conversation-client/references/style-tokens.md +101 -0
  160. package/lib/templates/project/reactb2x/_r_/skills/managing-agentforce-conversation-client/references/troubleshooting.md +57 -0
  161. package/lib/templates/project/reactb2x/_r_/skills/using-salesforce-data/SKILL.md +363 -0
  162. package/lib/templates/project/reactb2x/_r_/skills/using-salesforce-data/graphql-search.sh +139 -0
  163. package/lib/templates/project/reactb2x/_r_/webapp-data.md +353 -0
  164. package/lib/templates/project/reactb2x/_r_/webapp-ui.md +16 -0
  165. package/lib/templates/project/reactb2x/eslint.config.js +7 -0
  166. package/lib/templates/project/reactb2x/package-lock.json +9995 -0
  167. package/lib/templates/project/reactb2x/package.json +12 -11
  168. package/lib/templates/project/reactb2x/scripts/setup-cli.mjs +61 -31
  169. package/lib/templates/project/reactb2x/scripts/sf-project-setup.mjs +66 -0
  170. package/lib/templates/webapplication/reactbasic/.forceignore +15 -0
  171. package/lib/templates/webapplication/reactbasic/codegen.yml +1 -0
  172. package/lib/templates/webapplication/reactbasic/eslint.config.js +44 -27
  173. package/lib/templates/webapplication/reactbasic/index.html +0 -1
  174. package/lib/templates/webapplication/reactbasic/package.json +6 -3
  175. package/lib/templates/webapplication/reactbasic/src/app.tsx +4 -1
  176. package/lib/templates/webapplication/reactbasic/src/components/alerts/status-alert.tsx +1 -1
  177. package/lib/templates/webapplication/reactbasic/src/components/ui/badge.tsx +48 -0
  178. package/lib/templates/webapplication/reactbasic/src/components/ui/breadcrumb.tsx +109 -0
  179. package/lib/templates/webapplication/reactbasic/src/components/ui/calendar.tsx +232 -0
  180. package/lib/templates/webapplication/reactbasic/src/components/ui/checkbox.tsx +32 -0
  181. package/lib/templates/webapplication/reactbasic/src/components/ui/collapsible.tsx +33 -0
  182. package/lib/templates/webapplication/reactbasic/src/components/ui/datePicker.tsx +127 -0
  183. package/lib/templates/webapplication/reactbasic/src/components/ui/popover.tsx +89 -0
  184. package/lib/templates/webapplication/reactbasic/src/components/ui/sonner.tsx +20 -0
  185. package/lib/templates/webapplication/reactbasic/tsconfig.json +7 -1
  186. package/lib/templates/webapplication/reactbasic/vite.config.ts +17 -13
  187. package/lib/utils/template-placeholders.js +7 -0
  188. package/lib/utils/template-placeholders.js.map +1 -1
  189. package/lib/utils/webappTemplateUtils.d.ts +3 -1
  190. package/lib/utils/webappTemplateUtils.js +4 -1
  191. package/lib/utils/webappTemplateUtils.js.map +1 -1
  192. package/package.json +6 -6
  193. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/DetailFields.tsx +0 -55
  194. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/DetailForm.tsx +0 -146
  195. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/DetailHeader.tsx +0 -34
  196. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/DetailLayoutSections.tsx +0 -80
  197. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/Section.tsx +0 -108
  198. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/SectionRow.tsx +0 -20
  199. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/UiApiDetailForm.tsx +0 -140
  200. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FieldValueDisplay.tsx +0 -73
  201. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FormattedAddress.tsx +0 -29
  202. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FormattedEmail.tsx +0 -17
  203. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FormattedPhone.tsx +0 -24
  204. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FormattedText.tsx +0 -11
  205. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FormattedUrl.tsx +0 -29
  206. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/filters/FilterField.tsx +0 -54
  207. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/filters/FilterInput.tsx +0 -55
  208. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/filters/FilterSelect.tsx +0 -72
  209. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/filters/FiltersPanel.tsx +0 -380
  210. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/forms/filters-form.tsx +0 -114
  211. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/forms/submit-button.tsx +0 -47
  212. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/GlobalSearchInput.tsx +0 -114
  213. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/ResultCardFields.tsx +0 -71
  214. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/SearchHeader.tsx +0 -31
  215. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/SearchPagination.tsx +0 -144
  216. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/SearchResultCard.tsx +0 -136
  217. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/SearchResultsPanel.tsx +0 -197
  218. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/shared/LoadingFallback.tsx +0 -61
  219. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/api/objectDetailService.ts +0 -102
  220. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/api/objectInfoGraphQLService.ts +0 -137
  221. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/api/objectInfoService.ts +0 -95
  222. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/api/recordListGraphQLService.ts +0 -364
  223. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/constants.ts +0 -39
  224. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/filters/FilterInput.tsx +0 -55
  225. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/filters/FilterSelect.tsx +0 -72
  226. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/hooks/form.tsx +0 -209
  227. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/hooks/useObjectInfoBatch.ts +0 -65
  228. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/hooks/useObjectSearchData.ts +0 -174
  229. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/hooks/useRecordDetailLayout.ts +0 -137
  230. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/hooks/useRecordListGraphQL.ts +0 -135
  231. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/pages/DetailPage.tsx +0 -109
  232. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/pages/GlobalSearch.tsx +0 -229
  233. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/filters/filters.ts +0 -121
  234. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/filters/picklist.ts +0 -6
  235. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/objectInfo/objectInfo.ts +0 -49
  236. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/recordDetail/recordDetail.ts +0 -61
  237. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/schema.d.ts +0 -200
  238. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/search/searchResults.ts +0 -229
  239. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/apiUtils.ts +0 -59
  240. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/cacheUtils.ts +0 -76
  241. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/debounce.ts +0 -89
  242. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/fieldUtils.ts +0 -354
  243. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/fieldValueExtractor.ts +0 -67
  244. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/filterUtils.ts +0 -32
  245. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/formDataTransformUtils.ts +0 -260
  246. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/formUtils.ts +0 -142
  247. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/graphQLNodeFieldUtils.ts +0 -186
  248. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/graphQLObjectInfoAdapter.ts +0 -77
  249. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/graphQLRecordAdapter.ts +0 -90
  250. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/layoutTransformUtils.ts +0 -236
  251. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/linkUtils.ts +0 -14
  252. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/paginationUtils.ts +0 -49
  253. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/recordUtils.ts +0 -159
  254. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/sanitizationUtils.ts +0 -49
  255. package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/tsconfig.tsbuildinfo +0 -1
  256. package/lib/templates/project/reactb2e/_r_/features/feature-graphql-graphql-data-access-rule.md +0 -470
  257. package/lib/templates/project/reactb2e/_r_/features/feature-react-agentforce-conversation-client-embedded-agent-rule.md +0 -18
  258. package/lib/templates/project/reactb2e/_r_/features/feature-react-chart-analytics-charts-rule.md +0 -27
  259. package/lib/templates/project/reactb2e/_r_/skills/_k_/SKILL.md +0 -148
  260. package/lib/templates/project/reactb2e/_r_/skills/_k_/docs/embed-examples.md +0 -192
  261. package/lib/templates/project/reactb2e/_r_/skills/_k_/docs/troubleshooting.md +0 -51
  262. package/lib/templates/project/reactb2e/_r_/skills/feature-graphql-graphql-data-access/SKILL.md +0 -155
  263. package/lib/templates/project/reactb2e/_r_/skills/feature-graphql-graphql-data-access/docs/explore-schema.md +0 -256
  264. package/lib/templates/project/reactb2e/_r_/skills/feature-graphql-graphql-data-access/docs/generate-mutation-query.md +0 -228
  265. package/lib/templates/project/reactb2e/_r_/skills/feature-graphql-graphql-data-access/docs/generate-read-query.md +0 -202
  266. package/lib/templates/project/reactb2e/_r_/skills/feature-graphql-graphql-data-access/docs/shared-schema.graphqls +0 -1150
  267. package/lib/templates/project/reactb2e/_r_/skills/feature-micro-frontend-micro-frontend/SKILL.md +0 -137
  268. package/lib/templates/project/reactb2e/_r_/skills/feature-react-chart-analytics-charts/SKILL.md +0 -41
  269. package/lib/templates/project/reactb2e/_r_/skills/feature-react-chart-analytics-charts/docs/schema-mapping.md +0 -4
  270. package/lib/templates/project/reactb2e/_r_/skills/webapp-react-interactive-map/SKILL.md +0 -92
  271. package/lib/templates/project/reactb2e/_r_/skills/webapp-react-interactive-map/implementation/geocoding.md +0 -245
  272. package/lib/templates/project/reactb2e/_r_/skills/webapp-react-interactive-map/implementation/leaflet-map.md +0 -279
  273. package/lib/templates/project/reactb2e/_r_/skills/webapp-react-weather-widget/SKILL.md +0 -65
  274. package/lib/templates/project/reactb2e/_r_/skills/webapp-react-weather-widget/implementation/weather-hook.md +0 -258
  275. package/lib/templates/project/reactb2e/_r_/skills/webapp-react-weather-widget/implementation/weather-ui.md +0 -216
  276. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/SKILL.md +0 -271
  277. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/charts.csv +0 -26
  278. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/colors.csv +0 -97
  279. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/icons.csv +0 -101
  280. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/landing.csv +0 -31
  281. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/products.csv +0 -97
  282. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/react-performance.csv +0 -45
  283. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/stacks/html-tailwind.csv +0 -56
  284. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/stacks/react.csv +0 -54
  285. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/stacks/shadcn.csv +0 -61
  286. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/styles.csv +0 -68
  287. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/typography.csv +0 -58
  288. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/ui-reasoning.csv +0 -101
  289. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/ux-guidelines.csv +0 -100
  290. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/data/web-interface.csv +0 -31
  291. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/scripts/core.js +0 -255
  292. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/scripts/design_system.js +0 -861
  293. package/lib/templates/project/reactb2e/_r_/skills/webapp-ui-ux/scripts/search.js +0 -98
  294. package/lib/templates/project/reactb2e/_r_/skills/webapp-unsplash-images/SKILL.md +0 -71
  295. package/lib/templates/project/reactb2e/_r_/skills/webapp-unsplash-images/implementation/usage.md +0 -159
  296. package/lib/templates/project/reactb2e/_r_/webapp-cli-commands.md +0 -88
  297. package/lib/templates/project/reactb2e/_r_/webapp-react-code-quality.md +0 -136
  298. package/lib/templates/project/reactb2e/_r_/webapp-react-typescript.md +0 -205
  299. package/lib/templates/project/reactb2e/_r_/webapp-react.md +0 -202
  300. package/lib/templates/project/reactb2e/_r_/webapp-skills-first.md +0 -26
  301. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/DetailFields.tsx +0 -55
  302. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/DetailForm.tsx +0 -146
  303. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/DetailHeader.tsx +0 -34
  304. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/DetailLayoutSections.tsx +0 -80
  305. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/Section.tsx +0 -108
  306. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/SectionRow.tsx +0 -20
  307. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/UiApiDetailForm.tsx +0 -140
  308. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FieldValueDisplay.tsx +0 -73
  309. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FormattedAddress.tsx +0 -29
  310. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FormattedEmail.tsx +0 -17
  311. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FormattedPhone.tsx +0 -24
  312. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FormattedText.tsx +0 -11
  313. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/_det_/_fmt_/FormattedUrl.tsx +0 -29
  314. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/filters/FilterField.tsx +0 -54
  315. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/filters/FilterInput.tsx +0 -55
  316. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/filters/FilterSelect.tsx +0 -72
  317. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/filters/FiltersPanel.tsx +0 -380
  318. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/forms/filters-form.tsx +0 -114
  319. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/forms/submit-button.tsx +0 -47
  320. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/GlobalSearchInput.tsx +0 -114
  321. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/ResultCardFields.tsx +0 -71
  322. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/SearchHeader.tsx +0 -31
  323. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/SearchPagination.tsx +0 -144
  324. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/SearchResultCard.tsx +0 -136
  325. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/search/SearchResultsPanel.tsx +0 -197
  326. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/_c_/shared/LoadingFallback.tsx +0 -61
  327. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/api/objectDetailService.ts +0 -102
  328. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/api/objectInfoGraphQLService.ts +0 -137
  329. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/api/objectInfoService.ts +0 -95
  330. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/api/recordListGraphQLService.ts +0 -364
  331. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/constants.ts +0 -39
  332. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/filters/FilterInput.tsx +0 -55
  333. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/filters/FilterSelect.tsx +0 -72
  334. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/hooks/form.tsx +0 -209
  335. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/hooks/useObjectInfoBatch.ts +0 -65
  336. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/hooks/useObjectSearchData.ts +0 -174
  337. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/hooks/useRecordDetailLayout.ts +0 -137
  338. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/hooks/useRecordListGraphQL.ts +0 -135
  339. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/pages/DetailPage.tsx +0 -109
  340. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/pages/GlobalSearch.tsx +0 -229
  341. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/filters/filters.ts +0 -121
  342. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/filters/picklist.ts +0 -6
  343. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/objectInfo/objectInfo.ts +0 -49
  344. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/recordDetail/recordDetail.ts +0 -61
  345. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/schema.d.ts +0 -200
  346. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/types/search/searchResults.ts +0 -229
  347. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/apiUtils.ts +0 -59
  348. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/cacheUtils.ts +0 -76
  349. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/debounce.ts +0 -89
  350. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/fieldUtils.ts +0 -354
  351. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/fieldValueExtractor.ts +0 -67
  352. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/filterUtils.ts +0 -32
  353. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/formDataTransformUtils.ts +0 -260
  354. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/formUtils.ts +0 -142
  355. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/graphQLNodeFieldUtils.ts +0 -186
  356. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/graphQLObjectInfoAdapter.ts +0 -77
  357. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/graphQLRecordAdapter.ts +0 -90
  358. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/layoutTransformUtils.ts +0 -236
  359. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/linkUtils.ts +0 -14
  360. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/paginationUtils.ts +0 -49
  361. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/recordUtils.ts +0 -159
  362. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/_f_/_gs_/utils/sanitizationUtils.ts +0 -49
  363. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/src/index.ts +0 -120
  364. package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/tsconfig.tsbuildinfo +0 -1
  365. package/lib/templates/project/reactb2x/_r_/features/feature-graphql-graphql-data-access-rule.md +0 -470
  366. package/lib/templates/project/reactb2x/_r_/features/feature-react-agentforce-conversation-client-embedded-agent-rule.md +0 -18
  367. package/lib/templates/project/reactb2x/_r_/features/feature-react-chart-analytics-charts-rule.md +0 -27
  368. package/lib/templates/project/reactb2x/_r_/skills/_k_/SKILL.md +0 -148
  369. package/lib/templates/project/reactb2x/_r_/skills/_k_/docs/embed-examples.md +0 -192
  370. package/lib/templates/project/reactb2x/_r_/skills/_k_/docs/troubleshooting.md +0 -51
  371. package/lib/templates/project/reactb2x/_r_/skills/feature-graphql-graphql-data-access/SKILL.md +0 -155
  372. package/lib/templates/project/reactb2x/_r_/skills/feature-graphql-graphql-data-access/docs/explore-schema.md +0 -256
  373. package/lib/templates/project/reactb2x/_r_/skills/feature-graphql-graphql-data-access/docs/generate-mutation-query.md +0 -228
  374. package/lib/templates/project/reactb2x/_r_/skills/feature-graphql-graphql-data-access/docs/generate-read-query.md +0 -202
  375. package/lib/templates/project/reactb2x/_r_/skills/feature-graphql-graphql-data-access/docs/shared-schema.graphqls +0 -1150
  376. package/lib/templates/project/reactb2x/_r_/skills/feature-micro-frontend-micro-frontend/SKILL.md +0 -137
  377. package/lib/templates/project/reactb2x/_r_/skills/feature-react-chart-analytics-charts/SKILL.md +0 -41
  378. package/lib/templates/project/reactb2x/_r_/skills/feature-react-chart-analytics-charts/docs/schema-mapping.md +0 -4
  379. package/lib/templates/project/reactb2x/_r_/skills/webapp-react-interactive-map/SKILL.md +0 -92
  380. package/lib/templates/project/reactb2x/_r_/skills/webapp-react-interactive-map/implementation/geocoding.md +0 -245
  381. package/lib/templates/project/reactb2x/_r_/skills/webapp-react-interactive-map/implementation/leaflet-map.md +0 -279
  382. package/lib/templates/project/reactb2x/_r_/skills/webapp-react-weather-widget/SKILL.md +0 -65
  383. package/lib/templates/project/reactb2x/_r_/skills/webapp-react-weather-widget/implementation/weather-hook.md +0 -258
  384. package/lib/templates/project/reactb2x/_r_/skills/webapp-react-weather-widget/implementation/weather-ui.md +0 -216
  385. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/SKILL.md +0 -271
  386. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/charts.csv +0 -26
  387. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/colors.csv +0 -97
  388. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/icons.csv +0 -101
  389. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/landing.csv +0 -31
  390. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/products.csv +0 -97
  391. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/react-performance.csv +0 -45
  392. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/stacks/html-tailwind.csv +0 -56
  393. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/stacks/react.csv +0 -54
  394. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/stacks/shadcn.csv +0 -61
  395. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/styles.csv +0 -68
  396. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/typography.csv +0 -58
  397. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/ui-reasoning.csv +0 -101
  398. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/ux-guidelines.csv +0 -100
  399. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/data/web-interface.csv +0 -31
  400. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/scripts/core.js +0 -255
  401. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/scripts/design_system.js +0 -861
  402. package/lib/templates/project/reactb2x/_r_/skills/webapp-ui-ux/scripts/search.js +0 -98
  403. package/lib/templates/project/reactb2x/_r_/skills/webapp-unsplash-images/SKILL.md +0 -71
  404. package/lib/templates/project/reactb2x/_r_/skills/webapp-unsplash-images/implementation/usage.md +0 -159
  405. package/lib/templates/project/reactb2x/_r_/webapp-cli-commands.md +0 -88
  406. package/lib/templates/project/reactb2x/_r_/webapp-react-code-quality.md +0 -136
  407. package/lib/templates/project/reactb2x/_r_/webapp-react-typescript.md +0 -205
  408. package/lib/templates/project/reactb2x/_r_/webapp-react.md +0 -202
  409. package/lib/templates/project/reactb2x/_r_/webapp-skills-first.md +0 -26
  410. /package/lib/templates/project/reactb2e/_p_/_m_/_w_/_a_/{src/components.json → components.json} +0 -0
  411. /package/lib/templates/project/reactb2e/_r_/skills/{webapp-react-data-visualization → building-data-visualization}/implementation/dashboard-layout.md +0 -0
  412. /package/lib/templates/project/reactb2e/_r_/skills/{webapp-react-data-visualization → building-data-visualization}/implementation/stat-card.md +0 -0
  413. /package/lib/templates/project/reactb2e/_r_/skills/{webapp-react → building-react-components}/implementation/component.md +0 -0
  414. /package/lib/templates/project/reactb2e/_r_/skills/{webapp-react → building-react-components}/implementation/header-footer.md +0 -0
  415. /package/lib/templates/project/reactb2e/_r_/skills/{webapp-react → building-react-components}/implementation/page.md +0 -0
  416. /package/lib/templates/project/reactb2e/_r_/skills/{webapp-csp-trusted-sites → configuring-csp-trusted-sites}/implementation/metadata-format.md +0 -0
  417. /package/lib/templates/project/reactb2x/_p_/_m_/_w_/_a_/{src/components.json → components.json} +0 -0
  418. /package/lib/templates/project/reactb2x/_r_/skills/{webapp-react-data-visualization → building-data-visualization}/implementation/dashboard-layout.md +0 -0
  419. /package/lib/templates/project/reactb2x/_r_/skills/{webapp-react-data-visualization → building-data-visualization}/implementation/stat-card.md +0 -0
  420. /package/lib/templates/project/reactb2x/_r_/skills/{webapp-react → building-react-components}/implementation/component.md +0 -0
  421. /package/lib/templates/project/reactb2x/_r_/skills/{webapp-react → building-react-components}/implementation/header-footer.md +0 -0
  422. /package/lib/templates/project/reactb2x/_r_/skills/{webapp-react → building-react-components}/implementation/page.md +0 -0
  423. /package/lib/templates/project/reactb2x/_r_/skills/{webapp-csp-trusted-sites → configuring-csp-trusted-sites}/implementation/metadata-format.md +0 -0
  424. /package/lib/templates/webapplication/reactbasic/{src/components.json → components.json} +0 -0
@@ -1,260 +0,0 @@
1
- /**
2
- * Transforms UI API record + object info into detail form shape: Reference fields get
3
- * relationshipField, compound fields get constituents, metadata gets editable flag.
4
- * Aligns with LWC detailForm _calculateFormData and uiApiDataTransformHelper.
5
- */
6
-
7
- import type { FieldValue } from "../types/search/searchResults";
8
-
9
- /** Field metadata from object info API (subset used by form transform). */
10
- export interface ObjectInfoFieldMetadata {
11
- compound?: boolean;
12
- compoundFieldName?: string;
13
- compoundComponentName?: string;
14
- dataType?: string;
15
- relationshipName?: string;
16
- updateable?: boolean;
17
- calculated?: boolean;
18
- polymorphicForeignKey?: boolean;
19
- apiName?: string;
20
- label?: string;
21
- [name: string]: unknown;
22
- }
23
-
24
- /** Minimal UI API object info (metadata) for form data transform. */
25
- export interface ObjectInfoMetadata {
26
- apiName?: string;
27
- fields?: Record<string, ObjectInfoFieldMetadata>;
28
- [name: string]: unknown;
29
- }
30
-
31
- /** Transformed field value: base FieldValue + relationshipField (Reference) and constituents (compound). */
32
- export interface TransformedFieldValue extends FieldValue {
33
- relationshipField?: FieldValue;
34
- constituents?: Record<string, TransformedFieldValue & { metadata?: ObjectInfoFieldMetadata }>;
35
- }
36
-
37
- export type TransformedDataFields = Record<string, TransformedFieldValue>;
38
-
39
- /** Form values keyed by record context id (e.g. record.id). */
40
- export type FormValues = Record<string, TransformedDataFields>;
41
-
42
- /** Form metadata keyed by metadata context (e.g. object apiName). */
43
- export type FormMetadata = Record<string, ObjectInfoMetadata>;
44
-
45
- /** Contexts: recordId -> objectApiName. */
46
- export type FormContexts = Record<string, string>;
47
-
48
- /** Result of calculateFormData (single record). */
49
- export interface FormData {
50
- formValues: FormValues;
51
- formMetadata: FormMetadata;
52
- formContexts: FormContexts;
53
- }
54
-
55
- /** Fields never editable per UI API (platform convention). */
56
- const NON_EDITABLE_FIELDS = ["OwnerId", "RecordTypeId"];
57
-
58
- /** Created By / Last Modified By: synthetic compound from Id + Date (modstampMetadataTransform). */
59
- const SYSTEM_FIELDS = [
60
- {
61
- fieldName: "CreatedBy",
62
- idFieldName: "CreatedById",
63
- dateFieldName: "CreatedDate",
64
- apiName: "CreatedBy",
65
- compound: true,
66
- dataType: "String",
67
- label: "Created By",
68
- },
69
- {
70
- fieldName: "LastModifiedBy",
71
- idFieldName: "LastModifiedById",
72
- dateFieldName: "LastModifiedDate",
73
- apiName: "LastModifiedBy",
74
- compound: true,
75
- dataType: "String",
76
- label: "Last Modified By",
77
- },
78
- ];
79
-
80
- function modstampMetadataTransform(metadata: ObjectInfoMetadata): ObjectInfoMetadata {
81
- const fields = { ...metadata.fields };
82
- if (!fields) return metadata;
83
-
84
- SYSTEM_FIELDS.forEach((systemField) => {
85
- const field = systemField.fieldName;
86
- const idField = systemField.idFieldName;
87
- const dateField = systemField.dateFieldName;
88
- if (idField in fields && dateField in fields && metadata.fields) {
89
- fields[field] = { ...metadata.fields[idField], ...systemField };
90
- fields[idField] = {
91
- ...(metadata.fields[idField] ?? {}),
92
- compoundComponentName: "Id",
93
- compoundFieldName: field,
94
- };
95
- fields[dateField] = {
96
- ...(metadata.fields[dateField] ?? {}),
97
- compoundComponentName: "Date",
98
- compoundFieldName: field,
99
- };
100
- }
101
- });
102
- return { ...metadata, fields };
103
- }
104
-
105
- export function metaDataTransform(metadata: ObjectInfoMetadata): ObjectInfoMetadata {
106
- const newMetadata = modstampMetadataTransform(metadata);
107
- const fields: Record<string, ObjectInfoFieldMetadata> = {};
108
- const metaFields = newMetadata.fields ?? {};
109
- Object.keys(metaFields).forEach((fieldName) => {
110
- const fieldRep = metaFields[fieldName];
111
- const isCalculated = Boolean(fieldRep.calculated);
112
- const isUpdateable = Boolean(fieldRep.updateable);
113
- const isPolymorphicLookup = Boolean(fieldRep.polymorphicForeignKey);
114
- fields[fieldName] = {
115
- ...fieldRep,
116
- editable:
117
- !isCalculated &&
118
- isUpdateable &&
119
- !isPolymorphicLookup &&
120
- !NON_EDITABLE_FIELDS.includes(fieldName),
121
- } as ObjectInfoFieldMetadata;
122
- });
123
- return { ...newMetadata, fields };
124
- }
125
-
126
- export function getConstituentMap(
127
- dataFields: Record<string, FieldValue>,
128
- fieldMetadata: Record<string, ObjectInfoFieldMetadata>,
129
- ): Record<string, Record<string, TransformedFieldValue & { metadata?: ObjectInfoFieldMetadata }>> {
130
- const constituentMap: Record<
131
- string,
132
- Record<string, TransformedFieldValue & { metadata?: ObjectInfoFieldMetadata }>
133
- > = {};
134
- Object.keys(fieldMetadata).forEach((fieldApiName) => {
135
- const { compoundFieldName } = fieldMetadata[fieldApiName];
136
- if (compoundFieldName && dataFields[fieldApiName]) {
137
- const constituentFields =
138
- constituentMap[compoundFieldName] ??
139
- ({} as Record<string, TransformedFieldValue & { metadata?: ObjectInfoFieldMetadata }>);
140
- const raw = dataFields[fieldApiName] as TransformedFieldValue;
141
- constituentFields[fieldApiName] = {
142
- ...raw,
143
- metadata: fieldMetadata[fieldApiName],
144
- };
145
- constituentMap[compoundFieldName] = constituentFields;
146
-
147
- const compoundMeta = fieldMetadata[compoundFieldName];
148
- if (
149
- compoundMeta?.dataType === "Address" &&
150
- (fieldApiName.endsWith("StateCode") || fieldApiName.endsWith("CountryCode"))
151
- ) {
152
- const nonPicklistName = fieldApiName.replace("Code", "");
153
- if (fieldMetadata[nonPicklistName] && dataFields[nonPicklistName]) {
154
- constituentFields[nonPicklistName] = {
155
- ...(dataFields[nonPicklistName] as TransformedFieldValue),
156
- metadata: fieldMetadata[nonPicklistName],
157
- };
158
- }
159
- }
160
- }
161
- });
162
- if (constituentMap.Name) {
163
- const constituentApiNames = Object.keys(constituentMap.Name);
164
- if (constituentApiNames.length === 1 && constituentApiNames[0] === "Name") {
165
- delete constituentMap.Name;
166
- }
167
- }
168
- return constituentMap;
169
- }
170
-
171
- export function objectInfoFieldsTransform(
172
- dataFields: Record<string, FieldValue>,
173
- metadata: ObjectInfoMetadata,
174
- ): TransformedDataFields {
175
- const fieldMetadata = metadata.fields ?? {};
176
- const transformedDataFields: TransformedDataFields = { ...dataFields };
177
-
178
- Object.keys(fieldMetadata).forEach((field) => {
179
- const meta = fieldMetadata[field];
180
- if (meta.dataType === "Reference" && meta.relationshipName != null) {
181
- const existing = dataFields[field];
182
- const relField = dataFields[meta.relationshipName];
183
- transformedDataFields[field] = {
184
- ...(existing ?? {}),
185
- relationshipField: {
186
- ...(relField ?? {}),
187
- value: null,
188
- },
189
- };
190
- }
191
- });
192
-
193
- Object.keys(fieldMetadata).forEach((field) => {
194
- const meta = fieldMetadata[field];
195
- const { compound, dataType } = meta;
196
- const existing = dataFields[field];
197
- if (dataType === "Reference") return;
198
- if (compound) {
199
- transformedDataFields[field] = { ...(existing ?? {}) };
200
- } else if (existing) {
201
- transformedDataFields[field] = existing as TransformedFieldValue;
202
- }
203
- });
204
-
205
- const constituentMap = getConstituentMap(transformedDataFields, fieldMetadata);
206
- Object.keys(constituentMap).forEach((field) => {
207
- if (transformedDataFields[field]) {
208
- transformedDataFields[field] = {
209
- ...transformedDataFields[field],
210
- constituents: constituentMap[field],
211
- };
212
- }
213
- });
214
- return transformedDataFields;
215
- }
216
-
217
- export function multiRecordMetadataTransform(
218
- metadata: Record<string, ObjectInfoMetadata>,
219
- ): FormMetadata {
220
- const result: FormMetadata = {};
221
- Object.keys(metadata).forEach((metadataContext) => {
222
- result[metadataContext] = metaDataTransform(metadata[metadataContext]);
223
- });
224
- return result;
225
- }
226
-
227
- export function multiRecordValuesTransform(
228
- values: Record<string, Record<string, FieldValue>>,
229
- metadata: FormMetadata,
230
- contexts: FormContexts,
231
- ): FormValues {
232
- const result: FormValues = {};
233
- Object.keys(values).forEach((recordContext) => {
234
- const metadataContext = contexts[recordContext];
235
- if (metadataContext && metadata[metadataContext]) {
236
- result[recordContext] = objectInfoFieldsTransform(
237
- values[recordContext],
238
- metadata[metadataContext],
239
- );
240
- }
241
- });
242
- return result;
243
- }
244
-
245
- export function calculateFormData(
246
- record: { id: string; apiName: string; fields: Record<string, FieldValue> },
247
- metadata: ObjectInfoMetadata | null | undefined,
248
- ): FormData {
249
- const formValues: FormValues = {};
250
- const formMetadata: FormMetadata = {};
251
- const formContexts: FormContexts = { [record.id]: record.apiName };
252
-
253
- if (!metadata?.fields) {
254
- return { formValues, formMetadata, formContexts };
255
- }
256
-
257
- formMetadata[record.apiName] = metaDataTransform(metadata);
258
- formValues[record.id] = objectInfoFieldsTransform(record.fields, formMetadata[record.apiName]);
259
- return { formValues, formMetadata, formContexts };
260
- }
@@ -1,142 +0,0 @@
1
- /**
2
- * Form Utilities
3
- *
4
- * Utility functions for form validation and error handling.
5
- * These utilities are framework-agnostic and can be used with any form library.
6
- */
7
-
8
- /**
9
- * Form error structure from TanStack Form
10
- * Errors can be objects with a message property or strings
11
- */
12
- export interface FormError {
13
- message: string;
14
- [key: string]: unknown;
15
- }
16
-
17
- /**
18
- * Type guard to check if an error has a message property
19
- * @param error - The error to check
20
- * @returns true if the error has a message property
21
- */
22
- export function isFormError(error: unknown): error is FormError {
23
- return (
24
- typeof error === "object" &&
25
- error !== null &&
26
- "message" in error &&
27
- typeof (error as FormError).message === "string"
28
- );
29
- }
30
-
31
- /**
32
- * Extracts unique errors by message, filtering out duplicates
33
- * Handles both Error objects and string errors
34
- * Converts FormError objects to Error instances for compatibility with UI components
35
- *
36
- * @param errors - Array of error objects or strings from form libraries
37
- * @returns Array of unique Error objects (compatible with FieldError component)
38
- *
39
- * @example
40
- * ```tsx
41
- * const uniqueErrors = getUniqueErrors(formErrors);
42
- * ```
43
- */
44
- export function getUniqueErrors(errors: unknown[]): Error[] {
45
- const errorMap = new Map<string, Error>();
46
-
47
- for (const error of errors) {
48
- if (isFormError(error)) {
49
- // Use message as key to deduplicate
50
- if (!errorMap.has(error.message)) {
51
- // Convert FormError to Error for compatibility
52
- const errorObj = new Error(error.message);
53
- // Preserve additional properties if needed
54
- Object.assign(errorObj, error);
55
- errorMap.set(error.message, errorObj);
56
- }
57
- } else if (typeof error === "string") {
58
- // Handle string errors
59
- if (!errorMap.has(error)) {
60
- errorMap.set(error, new Error(error));
61
- }
62
- } else if (error instanceof Error) {
63
- // Handle Error objects directly
64
- if (!errorMap.has(error.message)) {
65
- errorMap.set(error.message, error);
66
- }
67
- }
68
- }
69
-
70
- return Array.from(errorMap.values());
71
- }
72
-
73
- /**
74
- * Validates that min value is less than or equal to max value for range filters
75
- * This utility can be used in form validation logic
76
- *
77
- * @param minValue - Minimum value (string or number)
78
- * @param maxValue - Maximum value (string or number)
79
- * @returns Error message if validation fails, null if valid
80
- *
81
- * @remarks
82
- * - If both values are empty, validation passes
83
- * - Only validates if both values can be parsed as numbers
84
- * - Returns null if values cannot be parsed (lets other validators handle it)
85
- *
86
- * @example
87
- * ```tsx
88
- * // In form validation
89
- * const minError = validateRangeValues(minFieldValue, maxFieldValue);
90
- * if (minError) {
91
- * setFieldError('minField', minError);
92
- * }
93
- * ```
94
- */
95
- export function validateRangeValues(
96
- minValue: string | number | null | undefined,
97
- maxValue: string | number | null | undefined,
98
- ): string | null {
99
- // If both are empty, validation passes
100
- if (!minValue && !maxValue) {
101
- return null;
102
- }
103
-
104
- // Parse values to numbers if possible
105
- const parseValue = (val: string | number | null | undefined): number | null => {
106
- if (!val) {
107
- return null;
108
- }
109
- if (typeof val === "number") {
110
- return val;
111
- }
112
- const parsed = parseInt(val, 10);
113
- return isNaN(parsed) ? null : parsed;
114
- };
115
-
116
- const minNum = parseValue(minValue);
117
- const maxNum = parseValue(maxValue);
118
-
119
- // If one is not a number, skip numeric validation (let other validators handle it)
120
- if (minNum === null || maxNum === null) {
121
- return null;
122
- }
123
-
124
- // Validate min <= max
125
- if (minNum > maxNum) {
126
- return "Minimum value must be less than or equal to maximum value";
127
- }
128
-
129
- return null;
130
- }
131
-
132
- export function getFormValueByPath(record: Record<string, unknown>, fieldPath: string): string {
133
- if (!fieldPath) return "";
134
- const parts = fieldPath.split(".");
135
- let current: Record<string, unknown> = record;
136
- for (const part of parts) {
137
- if (current == null || typeof current !== "object") return "";
138
- current = (current as Record<string, unknown>)[part] as unknown as Record<string, unknown>;
139
- }
140
- if (current === undefined || current === null) return "";
141
- return "" + current;
142
- }
@@ -1,186 +0,0 @@
1
- /**
2
- * GraphQL record node → display values for detail view.
3
- *
4
- * getGraphQLNodeValue: primitive by field path. getDisplayValueForDetailFieldFromNode: single field,
5
- * uses metadata to show relationship name instead of Id. getDisplayValueForLayoutItemFromNode:
6
- * single or compound (address, modstamp). getGraphQLRecordDisplayName: record title from nameFields.
7
- *
8
- * @module utils/graphQLNodeFieldUtils
9
- */
10
-
11
- import type { FieldValue } from "../types/search/searchResults";
12
- import type { GraphQLRecordNode } from "../api/recordListGraphQLService";
13
- import type { ObjectInfoMetadata } from "./formDataTransformUtils";
14
- import { getDisplayValueForLayoutItem, type LayoutItemDisplayResult } from "./fieldUtils";
15
-
16
- /** Metadata from getObjectInfoBatch (object metadata) used to resolve reference fields by relationshipName. */
17
- export type ObjectMetadataForDisplay = ObjectInfoMetadata | null | undefined;
18
-
19
- /**
20
- * Gets a primitive value from a GraphQL node by field path.
21
- * - "Id" -> node.Id (scalar)
22
- * - "Name" -> node.Name?.value
23
- * - "Owner.Alias" -> node.Owner?.Alias?.value
24
- */
25
- export function getGraphQLNodeValue(
26
- node: GraphQLRecordNode | null | undefined,
27
- fieldPath: string,
28
- ): string | number | boolean | null {
29
- if (!node || !fieldPath) return null;
30
- const parts = fieldPath.split(".");
31
- let current: unknown = node;
32
- for (let i = 0; i < parts.length; i++) {
33
- if (current == null || typeof current !== "object") return null;
34
- current = (current as Record<string, unknown>)[parts[i]];
35
- }
36
- if (current == null) return null;
37
- if (typeof current === "object" && current !== null && "value" in current) {
38
- const v = (current as { value: unknown }).value;
39
- if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") {
40
- return v;
41
- }
42
- if (v === null) return null;
43
- return v as string;
44
- }
45
- if (typeof current === "string" || typeof current === "number" || typeof current === "boolean") {
46
- return current as string | number | boolean;
47
- }
48
- // Relationship/lookup objects: try DisplayValue (scalar or object), Name.value, then Id
49
- if (typeof current === "object" && current !== null) {
50
- const obj = current as Record<string, unknown>;
51
- const displayVal = obj.DisplayValue ?? obj.displayValue;
52
- if (displayVal != null) {
53
- if (
54
- typeof displayVal === "string" ||
55
- typeof displayVal === "number" ||
56
- typeof displayVal === "boolean"
57
- ) {
58
- return displayVal;
59
- }
60
- if (typeof displayVal === "object" && "value" in displayVal) {
61
- const v = (displayVal as { value: unknown }).value;
62
- if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") return v;
63
- if (v === null) return null;
64
- return v as string;
65
- }
66
- }
67
- const nameObj = obj.Name ?? obj.name;
68
- if (nameObj != null && typeof nameObj === "object" && "value" in nameObj) {
69
- const v = (nameObj as { value: unknown }).value;
70
- if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") return v;
71
- if (v === null) return null;
72
- return v as string;
73
- }
74
- const idVal = obj.Id ?? obj.id;
75
- if (
76
- idVal != null &&
77
- (typeof idVal === "string" || typeof idVal === "number" || typeof idVal === "boolean")
78
- ) {
79
- return idVal;
80
- }
81
- }
82
- return null;
83
- }
84
-
85
- /** Builds a minimal Record<string, FieldValue> from node for the given api names (for reuse with fieldUtils formatters). */
86
- function nodeToConstituentFields(
87
- node: GraphQLRecordNode,
88
- componentApiNames: string[],
89
- metadata?: ObjectMetadataForDisplay,
90
- ): Record<string, FieldValue> {
91
- const fields: Record<string, FieldValue> = {};
92
- for (const apiName of componentApiNames) {
93
- const v = getDisplayValueForDetailFieldFromNode(node, apiName, metadata);
94
- const displayValue = v as string | null;
95
- fields[apiName] = { displayValue, value: v };
96
- }
97
- return fields;
98
- }
99
-
100
- /**
101
- * Resolves display value for a layout item from a GraphQL node (single or multiple components).
102
- * Reuses address/modstamp formatting from fieldUtils by building minimal constituent fields from the node.
103
- * Pass metadata from getObjectInfoBatch so reference fields show the relationship's name instead of Id.
104
- */
105
- export function getDisplayValueForLayoutItemFromNode(
106
- node: GraphQLRecordNode | null | undefined,
107
- componentApiNames: string[],
108
- metadata?: ObjectMetadataForDisplay,
109
- ): LayoutItemDisplayResult {
110
- if (!node || componentApiNames.length === 0) {
111
- return { value: null };
112
- }
113
- if (componentApiNames.length === 1) {
114
- const apiName = componentApiNames[0];
115
- const value = getDisplayValueForDetailFieldFromNode(node, apiName, metadata);
116
- const dataType = metadata?.fields?.[apiName]?.dataType;
117
- return { value, dataType };
118
- }
119
- const constituents = nodeToConstituentFields(node, componentApiNames, metadata);
120
- const result = getDisplayValueForLayoutItem(constituents, componentApiNames);
121
- return { value: result.value, dataType: result.dataType };
122
- }
123
-
124
- /**
125
- * Resolves display value for a single detail field from a GraphQL node.
126
- * When metadata from getObjectInfoBatch is provided and the field is a Reference (dataType === "Reference")
127
- * with a relationshipName, shows the related record's display value (e.g. Owner.Name) instead of the Id.
128
- */
129
- /** Treat dataType as Reference regardless of casing (e.g. REFERENCE from GraphQL). */
130
- function isReferenceDataType(dataType: string | undefined): boolean {
131
- return dataType != null && dataType.toLowerCase() === "reference";
132
- }
133
-
134
- export function getDisplayValueForDetailFieldFromNode(
135
- node: GraphQLRecordNode | null | undefined,
136
- apiName: string,
137
- metadata?: ObjectMetadataForDisplay,
138
- ): string | number | boolean | null {
139
- if (!node || !apiName) return null;
140
- const fieldMeta = metadata?.fields?.[apiName];
141
- if (
142
- fieldMeta &&
143
- isReferenceDataType(fieldMeta.dataType) &&
144
- fieldMeta.relationshipName != null &&
145
- fieldMeta.relationshipName !== ""
146
- ) {
147
- const displayValue = getGraphQLNodeValue(node, fieldMeta.relationshipName);
148
- if (displayValue !== null && displayValue !== undefined && displayValue !== "") {
149
- return displayValue;
150
- }
151
- }
152
- return getGraphQLNodeValue(node, apiName);
153
- }
154
-
155
- /** Fallback field names for record display name when nameFields are not available. */
156
- const DISPLAY_FIELD_CANDIDATES = [
157
- "Name",
158
- "CaseNumber",
159
- "Subject",
160
- "Title",
161
- "DeveloperName",
162
- "ContractNumber",
163
- ] as const;
164
-
165
- /** Minimal metadata for record display name. */
166
- export type GraphQLRecordDisplayNameMetadata = { nameFields?: string[] } | null;
167
-
168
- /**
169
- * Resolves a display name for a record from a GraphQL node.
170
- * Tries metadata.nameFields first, then DISPLAY_FIELD_CANDIDATES, then node.Id.
171
- */
172
- export function getGraphQLRecordDisplayName(
173
- node: GraphQLRecordNode | null | undefined,
174
- metadata?: GraphQLRecordDisplayNameMetadata,
175
- ): string {
176
- if (!node) return "";
177
- const id = (node.Id as string) ?? "";
178
- const candidates = [...(metadata?.nameFields ?? []), ...DISPLAY_FIELD_CANDIDATES];
179
- for (const fieldPath of candidates) {
180
- const v = getGraphQLNodeValue(node, fieldPath);
181
- if (v !== null && v !== undefined && v !== "") {
182
- return v as string;
183
- }
184
- }
185
- return id;
186
- }
@@ -1,77 +0,0 @@
1
- /**
2
- * GraphQL objectInfos → REST-compatible object info and picklist.
3
- *
4
- * graphQLObjectInfoToObjectInfoResult / graphQLObjectInfosToBatchResponse: used by objectInfoService
5
- * after getObjectInfosGraphQL. extractPicklistValuesFromGraphQLObjectInfo: used for getPicklistValues.
6
- * Normalizes casing and adds synthetic compound fields (e.g. BillingAddress) for layout/dataType.
7
- *
8
- * @module utils/graphQLObjectInfoAdapter
9
- */
10
-
11
- import type {
12
- ObjectInfoBatchResponse,
13
- GetObjectInfosQueryObjectInfos,
14
- GetPicklistValuesQueryObjectInfo,
15
- GetPicklistValuesQueryField,
16
- GetObjectInfosQueryObjectInfo,
17
- ObjectInfoResult,
18
- PicklistValue as GraphQLPicklistValue,
19
- } from "../types/objectInfo/objectInfo";
20
- import type { PicklistValue } from "../types/filters/picklist";
21
-
22
- export function graphQLObjectInfoToObjectInfoResult(
23
- objectInfo: GetObjectInfosQueryObjectInfo,
24
- ): ObjectInfoResult {
25
- const { fields, ...rest } = objectInfo;
26
- const fieldsRecord = Object.fromEntries((fields ?? []).map((field) => [field?.ApiName, field]));
27
- return {
28
- ...rest,
29
- fields: fieldsRecord,
30
- };
31
- }
32
-
33
- /** Convert GraphQL objectInfos array to ObjectInfoBatchResponse (REST shape). */
34
- export function graphQLObjectInfosToBatchResponse(
35
- objectInfos: GetObjectInfosQueryObjectInfos,
36
- _requestedApiNames: string[],
37
- ): ObjectInfoBatchResponse {
38
- const results = objectInfos.map((objectInfo) => ({
39
- result: graphQLObjectInfoToObjectInfoResult(objectInfo!),
40
- statusCode: 200,
41
- }));
42
- return { results };
43
- }
44
-
45
- /**
46
- * Extract picklist values for a field from a GraphQL ObjectInfo node (raw response).
47
- * Uses picklistValuesByRecordTypeIDs; prefers the given recordTypeId or first available.
48
- */
49
- export function extractPicklistValuesFromGraphQLObjectInfo(
50
- objectInfo: NonNullable<GetPicklistValuesQueryObjectInfo>,
51
- fieldName: string,
52
- recordTypeId?: string,
53
- ): PicklistValue[] {
54
- const fields = objectInfo.fields;
55
- if (fields == null) return [];
56
- const fieldMap: Record<string, GetPicklistValuesQueryField> = Object.fromEntries(
57
- fields.map((field) => {
58
- return [field?.ApiName, field];
59
- }),
60
- );
61
- const field = fieldMap[fieldName];
62
- if (!field) return [];
63
- const picklistData =
64
- "picklistValuesByRecordTypeIDs" in field ? field.picklistValuesByRecordTypeIDs : undefined;
65
- if (!picklistData) return [];
66
- const rtId = recordTypeId ?? "012000000000000AAA";
67
- const byRecordType = picklistData.find((p) => p!.recordTypeID === rtId) ?? picklistData[0];
68
- return mapPicklistValues(byRecordType?.picklistValues ?? []);
69
- }
70
-
71
- function mapPicklistValues(values: GraphQLPicklistValue[]): PicklistValue[] {
72
- return values.map((item) => ({
73
- ...item,
74
- value: item.value ?? "",
75
- label: item.label ?? "",
76
- }));
77
- }