@salesforce/templates 66.13.5 → 66.13.7

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 (281) hide show
  1. package/lib/templates/project/angularextapp/CHANGELOG.md +258 -0
  2. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/angular.json +1 -1
  3. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/eslint-plugin-angular-graphql.js +148 -0
  4. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/eslint.config.js +9 -1
  5. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package-lock.json +680 -408
  6. package/lib/templates/project/angularextapp/_p_/_m_/_w_/_a_/package.json +2 -2
  7. package/lib/templates/project/angularextapp/package.json +1 -1
  8. package/lib/templates/project/angularextapp/scripts/org-setup-config-schema.mjs +17 -0
  9. package/lib/templates/project/angularextapp/scripts/org-setup-utils.mjs +33 -3
  10. package/lib/templates/project/angularextapp/scripts/org-setup.mjs +535 -3
  11. package/lib/templates/project/angularintapp/CHANGELOG.md +266 -0
  12. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/angular.json +1 -1
  13. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/eslint-plugin-angular-graphql.js +148 -0
  14. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/eslint.config.js +9 -1
  15. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package-lock.json +690 -418
  16. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/package.json +2 -2
  17. package/lib/templates/project/angularintapp/_p_/_m_/_w_/_a_/src/app/features/agentforce/agentforce-embed.service.ts +6 -1
  18. package/lib/templates/project/angularintapp/package.json +1 -1
  19. package/lib/templates/project/angularintapp/scripts/org-setup-config-schema.mjs +17 -0
  20. package/lib/templates/project/angularintapp/scripts/org-setup-utils.mjs +33 -3
  21. package/lib/templates/project/angularintapp/scripts/org-setup.mjs +535 -3
  22. package/lib/templates/project/reactexternalapp/CHANGELOG.md +1409 -0
  23. package/lib/templates/project/reactexternalapp/PRD.md +38 -0
  24. package/lib/templates/project/reactexternalapp/README.md +14 -10
  25. package/lib/templates/project/reactexternalapp/_p_/_m_/_ps_/reactexternalapp_Guest_User_Api_Access.permissionset-meta.xml +25 -0
  26. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package-lock.json +953 -714
  27. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/package.json +9 -7
  28. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/scripts/get-graphql-schema.mjs +8 -5
  29. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_ls_/LanguageSwitcher.tsx +116 -0
  30. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_ls_/__examples__/language-switcher-example.tsx +36 -0
  31. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_ls_/__examples__/vite-config-site-example.ts +44 -0
  32. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_ls_/buildLanguageUrl.ts +158 -0
  33. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_ls_/index.ts +28 -0
  34. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_ls_/languages.ts +46 -0
  35. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/authentication/components/SocialLogin.tsx +141 -0
  36. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/authentication/pages/Login.tsx +2 -0
  37. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/README.md +246 -0
  38. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/apiUtils.ts +56 -0
  39. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/orgApiVersionService.ts +37 -0
  40. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/searchableContentTypesService.ts +116 -0
  41. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/channelResolver.ts +40 -0
  42. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/cmsQueryFragment.ts +97 -0
  43. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/contentTypeSessionCache.ts +134 -0
  44. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/contentTypeUtils.ts +38 -0
  45. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/hooks/useSearchableContentTypes.ts +128 -0
  46. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/index.ts +54 -0
  47. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/parseResponse.ts +65 -0
  48. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/searchChannel.ts +15 -0
  49. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/types.ts +66 -0
  50. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/registry.ts +38 -0
  51. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/sobject/index.ts +19 -0
  52. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/sobject/parseResponse.ts +56 -0
  53. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/sobject/queryFragment.ts +141 -0
  54. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/types.ts +101 -0
  55. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/api/distinctValuesService.ts +84 -0
  56. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/api/searchService.ts +136 -0
  57. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/GlobalSearchBox.tsx +98 -0
  58. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/MergedSearchResults.tsx +294 -0
  59. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/Search.tsx +203 -0
  60. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SearchResults.tsx +88 -0
  61. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SourceSection.tsx +187 -0
  62. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/PaginationControls.tsx +185 -0
  63. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/ScopeSelector.tsx +107 -0
  64. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/SearchBar.tsx +55 -0
  65. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/SortControl.tsx +62 -0
  66. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/ActiveFilters.tsx +61 -0
  67. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/DefaultFilterPanel.tsx +125 -0
  68. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/{_os_/components → search/components/filters}/FilterContext.tsx +7 -20
  69. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/BooleanFilter.tsx +50 -0
  70. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/DateRangeFilter.tsx +160 -0
  71. package/lib/templates/project/{reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters → reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs}/FilterFieldWrapper.tsx +11 -6
  72. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/MultiSelectFilter.tsx +89 -0
  73. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/NumericRangeFilter.tsx +108 -0
  74. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/SelectFilter.tsx +46 -0
  75. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/TextFilter.tsx +52 -0
  76. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/CmsResultRow.tsx +101 -0
  77. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/DefaultResultRow.tsx +109 -0
  78. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/resolveResultRenderer.ts +49 -0
  79. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/config.json +88 -0
  80. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/constants.ts +8 -0
  81. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/{_os_ → search}/hooks/useAsyncData.ts +3 -10
  82. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/hooks/useDistinctValues.ts +59 -0
  83. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/hooks/useSearch.ts +966 -0
  84. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/index.ts +115 -0
  85. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/loadConfig.ts +14 -0
  86. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/queryBuilder.ts +100 -0
  87. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/types.ts +376 -0
  88. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/debounce.ts +17 -0
  89. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/fieldUtils.ts +14 -0
  90. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/filterUtils.ts +285 -0
  91. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/sortUtils.ts +34 -0
  92. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/graphqlClient.ts +24 -8
  93. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/appLayout.tsx +7 -0
  94. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/CustomerWebClientChat.tsx +74 -0
  95. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/{_f_/_os_/components → components}/ObjectBreadcrumb.tsx +7 -2
  96. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/ui/button.tsx +1 -1
  97. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/ui/datePicker.tsx +2 -2
  98. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/components/ui/table.tsx +9 -2
  99. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/index.ts +8 -0
  100. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/pages/AccountObjectDetailPage.tsx +53 -18
  101. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/pages/Home.tsx +3 -27
  102. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/pages/TestChatPage.tsx +26 -0
  103. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/routes.tsx +21 -8
  104. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/types/chat.ts +36 -0
  105. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/types/globals.d.ts +23 -0
  106. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/{_f_/_os_/utils/fieldUtils.ts → utils/accountFields.ts} +9 -0
  107. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/tsconfig.json +2 -2
  108. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/tsconfig.tsbuildinfo +1 -0
  109. package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleSocialLoginConfig.cls +133 -0
  110. package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleSocialLoginConfig.cls-meta.xml +5 -0
  111. package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleSocialLoginConfig_Test.cls +101 -0
  112. package/lib/templates/project/reactexternalapp/_p_/_m_/classes/UIBundleSocialLoginConfig_Test.cls-meta.xml +5 -0
  113. package/lib/templates/project/reactexternalapp/_p_/_m_/package.xml +4 -0
  114. package/lib/templates/project/reactexternalapp/package.json +8 -2
  115. package/lib/templates/project/reactexternalapp/scripts/org-setup-config-schema.mjs +120 -0
  116. package/lib/templates/project/reactexternalapp/scripts/org-setup-dev.mjs +87 -0
  117. package/lib/templates/project/reactexternalapp/scripts/org-setup-utils.mjs +569 -0
  118. package/lib/templates/project/reactexternalapp/scripts/org-setup-xml.mjs +182 -0
  119. package/lib/templates/project/reactexternalapp/scripts/org-setup.config.json +6 -2
  120. package/lib/templates/project/reactexternalapp/scripts/org-setup.mjs +1509 -328
  121. package/lib/templates/project/reactexternalapp/scripts/validate-org-setup-config.mjs +38 -0
  122. package/lib/templates/project/reactinternalapp/CHANGELOG.md +1223 -0
  123. package/lib/templates/project/reactinternalapp/PRD.md +35 -0
  124. package/lib/templates/project/reactinternalapp/README.md +14 -10
  125. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package-lock.json +813 -538
  126. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/package.json +10 -9
  127. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/README.md +246 -0
  128. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/apiUtils.ts +56 -0
  129. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/orgApiVersionService.ts +37 -0
  130. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/api/searchableContentTypesService.ts +116 -0
  131. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/channelResolver.ts +40 -0
  132. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/cmsQueryFragment.ts +97 -0
  133. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/contentTypeSessionCache.ts +134 -0
  134. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/contentTypeUtils.ts +38 -0
  135. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/hooks/useSearchableContentTypes.ts +128 -0
  136. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/index.ts +54 -0
  137. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/parseResponse.ts +65 -0
  138. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/searchChannel.ts +15 -0
  139. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/cms/types.ts +66 -0
  140. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/registry.ts +38 -0
  141. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/sobject/index.ts +19 -0
  142. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/sobject/parseResponse.ts +56 -0
  143. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/sobject/queryFragment.ts +141 -0
  144. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/adapters/types.ts +101 -0
  145. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/api/distinctValuesService.ts +84 -0
  146. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/api/searchService.ts +136 -0
  147. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/GlobalSearchBox.tsx +98 -0
  148. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/MergedSearchResults.tsx +294 -0
  149. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/Search.tsx +203 -0
  150. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SearchResults.tsx +88 -0
  151. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/SourceSection.tsx +187 -0
  152. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/PaginationControls.tsx +185 -0
  153. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/ScopeSelector.tsx +107 -0
  154. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/SearchBar.tsx +55 -0
  155. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/controls/SortControl.tsx +62 -0
  156. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/ActiveFilters.tsx +61 -0
  157. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/DefaultFilterPanel.tsx +125 -0
  158. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/{_os_/components → search/components/filters}/FilterContext.tsx +7 -20
  159. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/BooleanFilter.tsx +50 -0
  160. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/DateRangeFilter.tsx +160 -0
  161. package/lib/templates/project/{reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters → reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs}/FilterFieldWrapper.tsx +11 -6
  162. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/MultiSelectFilter.tsx +89 -0
  163. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/NumericRangeFilter.tsx +108 -0
  164. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/SelectFilter.tsx +46 -0
  165. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/filters/inputs/TextFilter.tsx +52 -0
  166. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/CmsResultRow.tsx +101 -0
  167. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/DefaultResultRow.tsx +109 -0
  168. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/components/results/resolveResultRenderer.ts +49 -0
  169. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/config.json +88 -0
  170. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/constants.ts +8 -0
  171. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/{_os_ → search}/hooks/useAsyncData.ts +3 -10
  172. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/hooks/useDistinctValues.ts +59 -0
  173. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/hooks/useSearch.ts +966 -0
  174. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/index.ts +115 -0
  175. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/loadConfig.ts +14 -0
  176. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/queryBuilder.ts +100 -0
  177. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/types.ts +376 -0
  178. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/debounce.ts +17 -0
  179. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/fieldUtils.ts +14 -0
  180. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/filterUtils.ts +285 -0
  181. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/search/utils/sortUtils.ts +34 -0
  182. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/components/AgentforceConversationClient.tsx +16 -132
  183. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/{_f_/_os_/components → components}/ObjectBreadcrumb.tsx +7 -2
  184. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/components/ui/button.tsx +1 -1
  185. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/components/ui/datePicker.tsx +2 -2
  186. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/components/ui/table.tsx +9 -2
  187. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/pages/AccountObjectDetailPage.tsx +49 -16
  188. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/pages/Home.tsx +3 -27
  189. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/routes.tsx +12 -5
  190. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/{_f_/_os_/utils/fieldUtils.ts → utils/accountFields.ts} +9 -0
  191. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/tsconfig.json +2 -2
  192. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/tsconfig.tsbuildinfo +1 -0
  193. package/lib/templates/project/reactinternalapp/package.json +4 -2
  194. package/lib/templates/project/reactinternalapp/scripts/org-setup-config-schema.mjs +24 -0
  195. package/lib/templates/project/reactinternalapp/scripts/org-setup-dev.mjs +87 -0
  196. package/lib/templates/project/reactinternalapp/scripts/org-setup-utils.mjs +569 -0
  197. package/lib/templates/project/reactinternalapp/scripts/org-setup-xml.mjs +182 -0
  198. package/lib/templates/project/reactinternalapp/scripts/org-setup.mjs +1162 -214
  199. package/lib/templates/uiBundles/angularbasic/angular.json +1 -1
  200. package/lib/templates/uiBundles/angularbasic/eslint-plugin-angular-graphql.js +148 -0
  201. package/lib/templates/uiBundles/angularbasic/eslint.config.js +9 -1
  202. package/lib/templates/uiBundles/angularbasic/package-lock.json +680 -408
  203. package/lib/templates/uiBundles/angularbasic/package.json +2 -2
  204. package/lib/templates/uiBundles/reactbasic/package-lock.json +738 -440
  205. package/lib/utils/template-placeholders.js +14 -0
  206. package/lib/utils/template-placeholders.js.map +1 -1
  207. package/lib/utils/uiBundleTemplateUtils.d.ts +5 -1
  208. package/lib/utils/uiBundleTemplateUtils.js +7 -1
  209. package/lib/utils/uiBundleTemplateUtils.js.map +1 -1
  210. package/package.json +7 -7
  211. package/lib/templates/project/reactexternalapp/AGENT.md +0 -252
  212. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/accountSearchService.ts +0 -46
  213. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/distinctAccountIndustries.graphql +0 -19
  214. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/distinctAccountTypes.graphql +0 -19
  215. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/getAccountDetail.graphql +0 -121
  216. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/searchAccounts.graphql +0 -51
  217. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/AccountObjectDetailPage.tsx +0 -355
  218. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/AccountSearch.tsx +0 -304
  219. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/Home.tsx +0 -34
  220. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/api/objectSearchService.ts +0 -82
  221. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ActiveFilters.tsx +0 -89
  222. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/PaginationControls.tsx +0 -109
  223. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SearchBar.tsx +0 -41
  224. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SortControl.tsx +0 -143
  225. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/BooleanFilter.tsx +0 -78
  226. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateFilter.tsx +0 -128
  227. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateRangeFilter.tsx +0 -70
  228. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/MultiSelectFilter.tsx +0 -97
  229. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/NumericRangeFilter.tsx +0 -167
  230. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SearchFilter.tsx +0 -52
  231. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SelectFilter.tsx +0 -97
  232. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/TextFilter.tsx +0 -93
  233. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useDebouncedCallback.ts +0 -34
  234. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useObjectSearchParams.ts +0 -254
  235. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/debounce.ts +0 -25
  236. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/filterUtils.ts +0 -404
  237. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/sortUtils.ts +0 -38
  238. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/account/accountSearchService.ts +0 -46
  239. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/account/query/distinctAccountIndustries.graphql +0 -19
  240. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/account/query/distinctAccountTypes.graphql +0 -19
  241. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/account/query/searchAccounts.graphql +0 -51
  242. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/api/graphql-operations-types.ts +0 -11260
  243. package/lib/templates/project/reactexternalapp/_p_/_m_/_w_/_a_/src/pages/AccountSearch.tsx +0 -297
  244. package/lib/templates/project/reactexternalapp/scripts/prepare-import-unique-fields.js +0 -122
  245. package/lib/templates/project/reactinternalapp/AGENT.md +0 -252
  246. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/accountSearchService.ts +0 -46
  247. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/distinctAccountIndustries.graphql +0 -19
  248. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/distinctAccountTypes.graphql +0 -19
  249. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/getAccountDetail.graphql +0 -121
  250. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/api/query/searchAccounts.graphql +0 -51
  251. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/AccountObjectDetailPage.tsx +0 -355
  252. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/AccountSearch.tsx +0 -304
  253. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/_ex_/pages/Home.tsx +0 -34
  254. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/api/objectSearchService.ts +0 -82
  255. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/ActiveFilters.tsx +0 -89
  256. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/PaginationControls.tsx +0 -109
  257. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SearchBar.tsx +0 -41
  258. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/SortControl.tsx +0 -143
  259. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/BooleanFilter.tsx +0 -78
  260. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateFilter.tsx +0 -128
  261. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/DateRangeFilter.tsx +0 -70
  262. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/MultiSelectFilter.tsx +0 -97
  263. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/NumericRangeFilter.tsx +0 -167
  264. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SearchFilter.tsx +0 -52
  265. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/SelectFilter.tsx +0 -97
  266. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/components/filters/TextFilter.tsx +0 -93
  267. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useDebouncedCallback.ts +0 -34
  268. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/hooks/useObjectSearchParams.ts +0 -254
  269. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/debounce.ts +0 -25
  270. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/filterUtils.ts +0 -404
  271. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/_f_/_os_/utils/sortUtils.ts +0 -38
  272. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/account/accountSearchService.ts +0 -46
  273. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/account/query/distinctAccountIndustries.graphql +0 -19
  274. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/account/query/distinctAccountTypes.graphql +0 -19
  275. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/account/query/searchAccounts.graphql +0 -51
  276. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/api/graphql-operations-types.ts +0 -11260
  277. package/lib/templates/project/reactinternalapp/_p_/_m_/_w_/_a_/src/pages/AccountSearch.tsx +0 -297
  278. package/lib/templates/project/reactinternalapp/scripts/prepare-import-unique-fields.js +0 -122
  279. /package/lib/templates/project/angularextapp/_p_/_m_/{permissionsets → _ps_}/angularextapp_Guest_User_Api_Access.permissionset-meta.xml +0 -0
  280. /package/lib/templates/project/angularintapp/_p_/_m_/{permissionsets → _ps_}/angularintapp_Access.permissionset-meta.xml +0 -0
  281. /package/lib/templates/project/reactinternalapp/_p_/_m_/{permissionsets → _ps_}/reactinternalapp_Access.permissionset-meta.xml +0 -0
@@ -1,46 +0,0 @@
1
- import SEARCH_ACCOUNTS_QUERY from "./query/searchAccounts.graphql?raw";
2
- import DISTINCT_INDUSTRIES_QUERY from "./query/distinctAccountIndustries.graphql?raw";
3
- import DISTINCT_TYPES_QUERY from "./query/distinctAccountTypes.graphql?raw";
4
- import {
5
- searchObjects,
6
- fetchDistinctValues,
7
- type ObjectSearchOptions,
8
- type PicklistOption,
9
- } from "../../api/objectSearchService";
10
- import type {
11
- SearchAccountsQuery,
12
- SearchAccountsQueryVariables,
13
- DistinctAccountIndustriesQuery,
14
- DistinctAccountTypesQuery,
15
- } from "../../../../api/graphql-operations-types";
16
-
17
- export type AccountSearchResult = NonNullable<SearchAccountsQuery["uiapi"]["query"]["Account"]>;
18
-
19
- export type AccountSearchOptions = ObjectSearchOptions<
20
- SearchAccountsQueryVariables["where"],
21
- SearchAccountsQueryVariables["orderBy"]
22
- >;
23
-
24
- export type { PicklistOption };
25
-
26
- export async function searchAccounts(
27
- options: AccountSearchOptions = {},
28
- ): Promise<AccountSearchResult> {
29
- return searchObjects<AccountSearchResult, SearchAccountsQuery, SearchAccountsQueryVariables>(
30
- SEARCH_ACCOUNTS_QUERY,
31
- "Account",
32
- options,
33
- );
34
- }
35
-
36
- export async function fetchDistinctIndustries(): Promise<PicklistOption[]> {
37
- return fetchDistinctValues<DistinctAccountIndustriesQuery>(
38
- DISTINCT_INDUSTRIES_QUERY,
39
- "Account",
40
- "Industry",
41
- );
42
- }
43
-
44
- export async function fetchDistinctTypes(): Promise<PicklistOption[]> {
45
- return fetchDistinctValues<DistinctAccountTypesQuery>(DISTINCT_TYPES_QUERY, "Account", "Type");
46
- }
@@ -1,19 +0,0 @@
1
- query DistinctAccountIndustries {
2
- uiapi {
3
- aggregate {
4
- Account(groupBy: { Industry: { group: true } }) {
5
- edges {
6
- node {
7
- aggregate @optional {
8
- Industry @optional {
9
- value
10
- displayValue
11
- label
12
- }
13
- }
14
- }
15
- }
16
- }
17
- }
18
- }
19
- }
@@ -1,19 +0,0 @@
1
- query DistinctAccountTypes {
2
- uiapi {
3
- aggregate {
4
- Account(groupBy: { Type: { group: true } }) {
5
- edges {
6
- node {
7
- aggregate @optional {
8
- Type @optional {
9
- value
10
- displayValue
11
- label
12
- }
13
- }
14
- }
15
- }
16
- }
17
- }
18
- }
19
- }
@@ -1,121 +0,0 @@
1
- query GetAccountDetail($id: ID!) {
2
- uiapi {
3
- query {
4
- Account(where: { Id: { eq: $id } }) {
5
- edges {
6
- node {
7
- Id
8
- Name @optional {
9
- value
10
- displayValue
11
- }
12
- Owner @optional {
13
- Name @optional {
14
- value
15
- displayValue
16
- }
17
- }
18
- Phone @optional {
19
- value
20
- displayValue
21
- }
22
- Fax @optional {
23
- value
24
- displayValue
25
- }
26
- Parent @optional {
27
- Name @optional {
28
- value
29
- displayValue
30
- }
31
- }
32
- Website @optional {
33
- value
34
- displayValue
35
- }
36
- Type @optional {
37
- value
38
- displayValue
39
- }
40
- NumberOfEmployees @optional {
41
- value
42
- displayValue
43
- }
44
- Industry @optional {
45
- value
46
- displayValue
47
- }
48
- AnnualRevenue @optional {
49
- value
50
- displayValue
51
- }
52
- Description @optional {
53
- value
54
- displayValue
55
- }
56
- BillingStreet @optional {
57
- value
58
- displayValue
59
- }
60
- BillingCity @optional {
61
- value
62
- displayValue
63
- }
64
- BillingState @optional {
65
- value
66
- displayValue
67
- }
68
- BillingPostalCode @optional {
69
- value
70
- displayValue
71
- }
72
- BillingCountry @optional {
73
- value
74
- displayValue
75
- }
76
- ShippingStreet @optional {
77
- value
78
- displayValue
79
- }
80
- ShippingCity @optional {
81
- value
82
- displayValue
83
- }
84
- ShippingState @optional {
85
- value
86
- displayValue
87
- }
88
- ShippingPostalCode @optional {
89
- value
90
- displayValue
91
- }
92
- ShippingCountry @optional {
93
- value
94
- displayValue
95
- }
96
- CreatedBy @optional {
97
- Name @optional {
98
- value
99
- displayValue
100
- }
101
- }
102
- CreatedDate @optional {
103
- value
104
- displayValue
105
- }
106
- LastModifiedBy @optional {
107
- Name @optional {
108
- value
109
- displayValue
110
- }
111
- }
112
- LastModifiedDate @optional {
113
- value
114
- displayValue
115
- }
116
- }
117
- }
118
- }
119
- }
120
- }
121
- }
@@ -1,51 +0,0 @@
1
- query SearchAccounts(
2
- $first: Int
3
- $after: String
4
- $where: Account_Filter
5
- $orderBy: Account_OrderBy
6
- ) {
7
- uiapi {
8
- query {
9
- Account(first: $first, after: $after, where: $where, orderBy: $orderBy) {
10
- edges {
11
- node {
12
- Id
13
- Name @optional {
14
- value
15
- displayValue
16
- }
17
- Industry @optional {
18
- value
19
- displayValue
20
- }
21
- Type @optional {
22
- value
23
- displayValue
24
- }
25
- Phone @optional {
26
- value
27
- displayValue
28
- }
29
- Owner @optional {
30
- Name @optional {
31
- value
32
- displayValue
33
- }
34
- }
35
- AnnualRevenue @optional {
36
- value
37
- displayValue
38
- }
39
- }
40
- }
41
- pageInfo {
42
- hasNextPage
43
- hasPreviousPage
44
- endCursor
45
- startCursor
46
- }
47
- totalCount
48
- }
49
- }
50
- }
51
- }
@@ -1,355 +0,0 @@
1
- import { useState } from "react";
2
- import { useParams, useNavigate } from "react-router";
3
- import { createDataSDK } from "@salesforce/platform-sdk";
4
- import { AlertCircle, ChevronDown, ChevronRight, FileQuestion } from "lucide-react";
5
- import GET_ACCOUNT_DETAIL from "../api/query/getAccountDetail.graphql?raw";
6
- import type {
7
- GetAccountDetailQuery,
8
- GetAccountDetailQueryVariables,
9
- } from "../../../../api/graphql-operations-types";
10
- import { Alert, AlertTitle, AlertDescription } from "../../../../components/ui/alert";
11
- import { Button } from "../../../../components/ui/button";
12
- import { Card, CardContent } from "../../../../components/ui/card";
13
- import { fieldValue, getAddressFieldLines, formatDateTimeField } from "../../utils/fieldUtils";
14
- import {
15
- Collapsible,
16
- CollapsibleTrigger,
17
- CollapsibleContent,
18
- } from "../../../../components/ui/collapsible";
19
- import { Separator } from "../../../../components/ui/separator";
20
- import { Skeleton } from "../../../../components/ui/skeleton";
21
- import { useAsyncData } from "../../hooks/useAsyncData";
22
- import { ObjectBreadcrumb } from "../../components/ObjectBreadcrumb";
23
-
24
- type AccountNode = NonNullable<
25
- NonNullable<
26
- NonNullable<NonNullable<GetAccountDetailQuery["uiapi"]["query"]["Account"]>["edges"]>[number]
27
- >["node"]
28
- >;
29
-
30
- async function fetchAccountDetail(recordId: string): Promise<AccountNode | null | undefined> {
31
- const data = await createDataSDK();
32
- const result = await data.graphql!.query<GetAccountDetailQuery, GetAccountDetailQueryVariables>({
33
- query: GET_ACCOUNT_DETAIL,
34
- variables: { id: recordId },
35
- });
36
-
37
- if (result.errors?.length) {
38
- throw new Error(result.errors.map((e) => e.message).join("; "));
39
- }
40
-
41
- return result.data?.uiapi?.query?.Account?.edges?.[0]?.node;
42
- }
43
-
44
- export default function AccountObjectDetail() {
45
- const { recordId } = useParams();
46
- const navigate = useNavigate();
47
-
48
- const {
49
- data: account,
50
- loading,
51
- error,
52
- } = useAsyncData(() => fetchAccountDetail(recordId!), [recordId]);
53
-
54
- return (
55
- <div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
56
- <ObjectBreadcrumb
57
- listPath="/accounts"
58
- listLabel="Accounts"
59
- loading={loading}
60
- recordName={
61
- account
62
- ? (fieldValue(account.Name) ?? "")
63
- : error
64
- ? "Error"
65
- : loading
66
- ? undefined
67
- : "Not Found"
68
- }
69
- />
70
-
71
- {/* Loading state */}
72
- {loading && <AccountDetailSkeleton />}
73
-
74
- {/* Error state */}
75
- {error && <AccountDetailError onBack={() => navigate(-1)} />}
76
-
77
- {/* Not found state */}
78
- {!loading && !error && !account && <AccountDetailNotFound onBack={() => navigate(-1)} />}
79
-
80
- {/* Content */}
81
- {account && <AccountDetailContent account={account} />}
82
- </div>
83
- );
84
- }
85
-
86
- function AccountDetailContent({ account }: { account: AccountNode }) {
87
- const billingAddress = getAddressFieldLines({
88
- street: fieldValue(account.BillingStreet),
89
- city: fieldValue(account.BillingCity),
90
- state: fieldValue(account.BillingState),
91
- postalCode: fieldValue(account.BillingPostalCode),
92
- country: fieldValue(account.BillingCountry),
93
- });
94
-
95
- const shippingAddress = getAddressFieldLines({
96
- street: fieldValue(account.ShippingStreet),
97
- city: fieldValue(account.ShippingCity),
98
- state: fieldValue(account.ShippingState),
99
- postalCode: fieldValue(account.ShippingPostalCode),
100
- country: fieldValue(account.ShippingCountry),
101
- });
102
-
103
- const dateTimeOptions = { dateStyle: "medium", timeStyle: "short" } as const;
104
- const createdDate = formatDateTimeField(
105
- fieldValue(account.CreatedDate),
106
- undefined,
107
- dateTimeOptions,
108
- );
109
- const lastModifiedDate = formatDateTimeField(
110
- fieldValue(account.LastModifiedDate),
111
- undefined,
112
- dateTimeOptions,
113
- );
114
-
115
- return (
116
- <>
117
- <h1 className="text-2xl font-bold mb-4">Account: {fieldValue(account.Name)}</h1>
118
-
119
- <Card>
120
- <CardContent className="space-y-8 pt-6">
121
- {/* Top section */}
122
- <div>
123
- <div className="space-y-4">
124
- <FieldRow>
125
- <FieldItem label="Account Owner">{fieldValue(account.Owner?.Name)}</FieldItem>
126
- <FieldItem label="Phone">
127
- <TelephoneField value={fieldValue(account.Phone)} />
128
- </FieldItem>
129
- </FieldRow>
130
- <FieldRow>
131
- <FieldItem label="Account Name">{fieldValue(account.Name)}</FieldItem>
132
- <FieldItem label="Fax">
133
- <TelephoneField value={fieldValue(account.Fax)} />
134
- </FieldItem>
135
- </FieldRow>
136
- <FieldRow>
137
- <FieldItem label="Parent Account">{fieldValue(account.Parent?.Name)}</FieldItem>
138
- <FieldItem label="Website">{fieldValue(account.Website)}</FieldItem>
139
- </FieldRow>
140
- </div>
141
- </div>
142
-
143
- <Separator />
144
-
145
- {/* Additional Information */}
146
- <Section title="Additional Information">
147
- <FieldRow>
148
- <FieldItem label="Type">{fieldValue(account.Type)}</FieldItem>
149
- <FieldItem label="Employees">{fieldValue(account.NumberOfEmployees)}</FieldItem>
150
- </FieldRow>
151
- <FieldRow>
152
- <FieldItem label="Industry">{fieldValue(account.Industry)}</FieldItem>
153
- <FieldItem label="Annual Revenue">{fieldValue(account.AnnualRevenue)}</FieldItem>
154
- </FieldRow>
155
- <FieldItem label="Description">{fieldValue(account.Description)}</FieldItem>
156
- </Section>
157
-
158
- <Separator />
159
-
160
- {/* Address Information */}
161
- <Section title="Address Information">
162
- <FieldRow>
163
- <FieldItem label="Billing Address">
164
- {billingAddress ? billingAddress.map((line, i) => <div key={i}>{line}</div>) : null}
165
- </FieldItem>
166
- <FieldItem label="Shipping Address">
167
- {shippingAddress
168
- ? shippingAddress.map((line, i) => <div key={i}>{line}</div>)
169
- : null}
170
- </FieldItem>
171
- </FieldRow>
172
- </Section>
173
-
174
- <Separator />
175
-
176
- {/* System Information */}
177
- <Section title="System Information">
178
- <FieldRow>
179
- <FieldItem label="Created By">
180
- {[fieldValue(account.CreatedBy?.Name), createdDate].filter(Boolean).join(" ") ||
181
- null}
182
- </FieldItem>
183
- <FieldItem label="Last Modified By">
184
- {[fieldValue(account.LastModifiedBy?.Name), lastModifiedDate]
185
- .filter(Boolean)
186
- .join(" ") || null}
187
- </FieldItem>
188
- </FieldRow>
189
- </Section>
190
- </CardContent>
191
- </Card>
192
- </>
193
- );
194
- }
195
-
196
- function TelephoneField({ value }: { value?: string | null }) {
197
- if (!value) return null;
198
- return (
199
- <a href={`tel:${value}`} className="underline">
200
- {value}
201
- </a>
202
- );
203
- }
204
-
205
- function FieldItem({ label, children }: { label: string; children: React.ReactNode }) {
206
- return (
207
- <div>
208
- <dt className="text-sm text-muted-foreground">{label}</dt>
209
- <dd className="mt-0.5">{children ?? "—"}</dd>
210
- </div>
211
- );
212
- }
213
-
214
- function FieldRow({ children }: { children: React.ReactNode }) {
215
- return <div className="grid grid-cols-2 gap-x-8 gap-y-4">{children}</div>;
216
- }
217
-
218
- function Section({ title, children }: { title: string; children: React.ReactNode }) {
219
- const [open, setOpen] = useState(true);
220
- return (
221
- <Collapsible open={open} onOpenChange={setOpen}>
222
- <CollapsibleTrigger className="flex items-center gap-2 cursor-pointer text-lg font-semibold py-2">
223
- {open ? <ChevronDown className="size-5" /> : <ChevronRight className="size-5" />}
224
- {title}
225
- </CollapsibleTrigger>
226
- <CollapsibleContent>
227
- <div className="mt-2 space-y-4">{children}</div>
228
- </CollapsibleContent>
229
- </Collapsible>
230
- );
231
- }
232
-
233
- function AccountDetailError({ onBack }: { onBack: () => void }) {
234
- return (
235
- <>
236
- <Alert variant="destructive" role="alert">
237
- <AlertCircle />
238
- <AlertTitle>
239
- <h2>Failed to load account</h2>
240
- </AlertTitle>
241
- <AlertDescription>
242
- Something went wrong while loading this account. Please try again later.
243
- </AlertDescription>
244
- </Alert>
245
- <div className="mt-4 flex gap-3">
246
- <Button variant="outline" onClick={onBack}>
247
- ← Back
248
- </Button>
249
- <Button variant="outline" onClick={() => window.location.reload()}>
250
- Retry
251
- </Button>
252
- </div>
253
- </>
254
- );
255
- }
256
-
257
- function AccountDetailNotFound({ onBack }: { onBack: () => void }) {
258
- return (
259
- <Card>
260
- <CardContent className="flex flex-col items-center justify-center py-16 text-center">
261
- <FileQuestion className="size-12 text-muted-foreground mb-4" />
262
- <h2 className="text-lg font-semibold mb-1">Account not found</h2>
263
- <p className="text-sm text-muted-foreground mb-6">
264
- The account you're looking for doesn't exist or may have been deleted.
265
- </p>
266
- <Button variant="outline" onClick={onBack}>
267
- ← Go back
268
- </Button>
269
- </CardContent>
270
- </Card>
271
- );
272
- }
273
-
274
- function AccountDetailSkeleton() {
275
- return (
276
- <>
277
- <Skeleton className="h-8 w-56 mb-4" />
278
-
279
- <Card>
280
- <CardContent className="space-y-8 pt-6">
281
- {/* Top section: field rows */}
282
- <div>
283
- <div className="space-y-4">
284
- <SkeletonFieldRow />
285
- <SkeletonFieldRow />
286
- <SkeletonFieldRow />
287
- </div>
288
- </div>
289
-
290
- <Separator />
291
-
292
- {/* Additional Information */}
293
- <SkeletonSection />
294
-
295
- <Separator />
296
-
297
- {/* Address Information */}
298
- <div className="space-y-4">
299
- <Skeleton className="h-7 w-48 py-2" />
300
- <div className="grid grid-cols-2 gap-x-8 gap-y-4">
301
- <div>
302
- <Skeleton className="h-4 w-28 mb-1.5" />
303
- <Skeleton className="h-5 w-44 mb-1" />
304
- <Skeleton className="h-5 w-36 mb-1" />
305
- <Skeleton className="h-5 w-28" />
306
- </div>
307
- <div>
308
- <Skeleton className="h-4 w-32 mb-1.5" />
309
- <Skeleton className="h-5 w-44 mb-1" />
310
- <Skeleton className="h-5 w-36 mb-1" />
311
- <Skeleton className="h-5 w-28" />
312
- </div>
313
- </div>
314
- </div>
315
-
316
- <Separator />
317
-
318
- {/* System Information */}
319
- <div className="space-y-4">
320
- <Skeleton className="h-7 w-48 py-2" />
321
- <SkeletonFieldRow />
322
- </div>
323
- </CardContent>
324
- </Card>
325
- </>
326
- );
327
- }
328
-
329
- function SkeletonField() {
330
- return (
331
- <div>
332
- <Skeleton className="h-4 w-24 mb-1.5" />
333
- <Skeleton className="h-5 w-40" />
334
- </div>
335
- );
336
- }
337
-
338
- function SkeletonFieldRow() {
339
- return (
340
- <div className="grid grid-cols-2 gap-x-8 gap-y-4">
341
- <SkeletonField />
342
- <SkeletonField />
343
- </div>
344
- );
345
- }
346
-
347
- function SkeletonSection() {
348
- return (
349
- <div className="space-y-4">
350
- <Skeleton className="h-7 w-48 py-2" />
351
- <SkeletonFieldRow />
352
- <SkeletonFieldRow />
353
- </div>
354
- );
355
- }